Upload a part
Sends one part of a resumable upload. Parts are idempotent, so a failed part is simply re-sent.
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" }
}
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.
Every failure uses the same shape, with a stable string code you can branch on. See the error reference.
Related
- DELETE Abort an upload
- POST Complete an upload
- POST Create a folder
- POST Start an upload
- DELETE Delete a file
- DELETE Delete a folder
- GET Download a file
- GET Get file metadata
- GET Get upload status
- GET List files
- GET List folders
- GET List file permissions
- POST Share a file
- DELETE Revoke file access
- PATCH Rename or move a file
- PATCH Rename or move a folder