Upload a document
Creates a document of the team from a file, owned by the account of the key, with one translation per target language. The file is checked at once (format, size, readable content), but its text is indexed afterwards: the document answers with status UPLOADED and no wordCount. Poll GET /v1/documents/{id} until the status is INDEXED, when the translation can start, or INDEXING_ERROR, when the file could not be processed.
The body is multipart/form-data: file holds the document, the other parts are text, and targetLanguages is a JSON array, sent either as a text field or as an application/json part with a filename (e.g. curl -F 'targetLanguages=@langs.json;type=application/json'). Each target language lists the email addresses of its translators, possibly none. An address of a member of the team (a manager, the caller included, or a translator) is assigned as it is. Any other address is invited to the team as a translator, within the translator seats of the plan, and receives the invitation by email. A translator invited by a call that fails later stays invited.
apiKeyAuthorizationBearer <token>The key the team leader created in Redokun, sent as Authorization: Bearer rdk_.... A read key is rejected on every call that writes (any method other than GET, HEAD or OPTIONS).
multipart/form-data- body
file*fileThe document: .idml, .docx, .pptx, .xlsx, .html, .srt, .txt, .xml, .json, .xliff or .xlf, .pdf, up to 100 MB. One file per call
binarysourceLanguage*stringBCP 47 tag of the language of the text, as GET /v1/languages lists it
targetLanguages*array<>The languages to translate into, with their translators, as a JSON array in a text field or an application/json part. Together, the languages can list at most 50 different translator email addresses
1 <= items <= 50folderId?|Identifier of the folder of the document. The root of the team when absent
The document, not indexed yet
application/json- response
id*integerIdentifier of the document
filename*stringName of the file as it was uploaded
fileType*stringFormat of the file
wordCount*|Words in the source text. Null until the document has been indexed
revision*integerRevision number, starting at 1. Uploading a new version of the file adds one
status*stringWhere the document is in its processing. INDEXING_ERROR occurs when something went wrong with the indexing process. UPLOADED occurs when the document has been uploaded but not yet indexed or indexing is still in progress. INDEXED occurs when the document has been indexed and translation can start.
"UPLOADED""INDEXED""INDEXING_ERROR"indexingError*|Why the indexing failed, written for a person. Null unless the status is INDEXING_ERROR
createdAt*stringWhen the document was uploaded
date-timeupdatedAt*|When the document last changed. Null if it never did
date-timelanguage*Language of the source text
links*array<>The resources related to this one. Follow these links instead of building the URLs yourself, so a change of path does not break the client
curl -X POST 'https://api.redokun.com/v1/documents' \ -F 'file=string' \ -F 'sourceLanguage=string' \ -F 'targetLanguages=[ { "code": "string" }]'{ "id": 981, "filename": "brochure.docx", "fileType": "DOCX", "wordCount": null, "revision": 1, "status": "UPLOADED", "createdAt": "2026-10-22T09:15:03+00:00", "updatedAt": null, "language": { "name": "English", "code": "en" }, "links": [ { "rel": "self", "href": "https://api.redokun.com/v1/documents/981" } ]}List the documents of the team GET
The documents of the team from every folder, newest first, one page at a time. Follow the `next` link until there is none to walk through them. Documents added or removed while you walk can shift the pages, so a document can be skipped or appear twice. Besides `self`, the `links` of a page point to the other pages, with the same `limit`: `first` and `last` are always there, `prev` and `next` only when such a page exists. With no document, `last` is the same page as `first`.
List languages GET
The languages the account can translate from and into