Files

Upload a part

Sends one part of a resumable upload. Parts are idempotent, so a failed part is simply re-sent.

PUT /v1/files/uploads/:session/parts/:n

Permission

The key must be granted files.write

A key without it gets 403 insufficient_scope, with the missing permission named in details.

The body is the raw slice of the file, not JSON. Re-sending a part number overwrites it, so a part whose response was lost is simply sent again rather than restarting the upload.

Path parameters

Field Type Description
session required string The session from the upload you started.
n required integer Which part, counting from 1.

Request

curl https://api.veruapis.com/v1/files/uploads/:session/parts/:n \
  -X PUT \
  -H "Authorization: Bearer vak_live_..." \
  -H "Idempotency-Key: $(uuidgen)"

Idempotency-Key is required on every write. Retrying with the same key returns the original response rather than repeating the operation, so a timeout is something you retry rather than something you investigate.

Response

Field Type Description
part integer
etag string The stored part's validator.
{
  "data": { "part": 1, "etag": "9f3c2e8d1a4b" },
  "meta": { "request_id": "req_01j8z9...", "timestamp": "2026-09-02T10:00:00Z" }
}
Worth knowing

Send the raw slice as the body, not JSON. Parts count from 1, and re-sending a number overwrites it, so a part whose response was lost is simply sent again.

Errors

Every failure uses the same shape, with a stable string code you can branch on. See the error reference.

Related

PUT /v1/files/uploads/:session/parts/:n

session
n
Sends this body to your own workspace, for real. Edit it before running.