APIBeta
Documents

Upload a document

POST
/v1/documents

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.

Authorization

apiKey
headerAuthorizationBearer <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).

Request Body

multipart/form-data
  1. body
file*file

The document: .idml, .docx, .pptx, .xlsx, .html, .srt, .txt, .xml, .json, .xliff or .xlf, .pdf, up to 100 MB. One file per call

Formatbinary
sourceLanguage*string

BCP 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

Items1 <= items <= 50
folderId?|

Identifier of the folder of the document. The root of the team when absent

Response Body

The document, not indexed yet

application/json
  1. response
id*integer

Identifier of the document

filename*string

Name of the file as it was uploaded

fileType*string

Format of the file

wordCount*|

Words in the source text. Null until the document has been indexed

revision*integer

Revision number, starting at 1. Uploading a new version of the file adds one

status*string

Where 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.

Value in"UPLOADED""INDEXED""INDEXING_ERROR"
indexingError*|

Why the indexing failed, written for a person. Null unless the status is INDEXING_ERROR

createdAt*string

When the document was uploaded

Formatdate-time
updatedAt*|

When the document last changed. Null if it never did

Formatdate-time
language*

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

Example Request
curl -X POST 'https://api.redokun.com/v1/documents' \  -F 'file=string' \  -F 'sourceLanguage=string' \  -F 'targetLanguages=[  {    "code": "string"  }]'
Example Response
{  "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"    }  ]}