Complete a document upload
POST/v1/documents/{documentId}/complete
Completes an upload after its bytes were PUT: the document appears in the trip's Documents tab — internal (visibility: staff) unless you release it with visibility: traveler, optionally into a folder (folderId), as dropping a file on a visible folder does. The recorded size and type are the ones storage received. Nothing uploaded yet is a 422 upload_missing; a second completion a 409 already_complete. Undo with POST /changes/{changeId}/revert: it deletes the upload while nobody has changed it since.
Permissions: documents:write · Kind: write · Cost: 1 unit · MCP tool complete_document_upload
Undoable: the response carries Bymundi-Change-Id; revert it with POST /v1/changes/{changeId}/revert.
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
documentId |
uuid | yes |
Body
| Field | Type | Required | Description |
|---|---|---|---|
visibility |
"staff" | "traveler" | staff (the default) keeps it internal; traveler releases it to the trip's travelers. default "staff" |
|
folderId |
uuid | null | File it in this folder of the trip; null or absent = loose. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
object |
"document" | yes | |
id |
uuid | yes | |
tripId |
uuid | yes | |
folderId |
uuid | null | yes | The folder it is filed in; null = loose (in no folder). |
name |
string | yes | |
mimeType |
string | yes | |
byteSize |
integer | yes | ≥ 0 |
status |
"pending" | "ready" | yes | pending: reserved, the upload is not complete — never listed. ready: a document. |
visibility |
"staff" | "traveler" | yes | staff: internal, only the agency sees it. traveler: released to the trip's travelers. |
visibleToTravelersNow |
boolean | yes | Released AND the trip is published: the traveler's app shows it right now. |
visibleAt |
string | null | yes | When it was last released to travelers; null while internal. |
visibleBy |
object | null | yes | |
visibleBy.id |
string | yes | |
visibleBy.name |
string | null | yes | |
uploadedBy |
object | null | yes | |
uploadedBy.id |
string | yes | |
uploadedBy.name |
string | null | yes | |
createdAt |
string | yes | |
updatedAt |
string | yes | |
appUrl |
string | null | yes | The trip's Documents tab in bymundi. |
Errors
Errors are problem details. Besides the refusals described above, any call like this one can return:
invalid_request— Invalid requestunauthorized— Missing or invalid API keyinsufficient_scope— Missing permissionrate_limited— Rate limit reachednot_found— Not foundidempotency_key_reused— Idempotency-Key reusedrequest_in_progress— Request in progress