Get a presigned URL to upload a large PDF directly
const url = 'https://api.sealpost.app/v1/files/presign';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"example","bytes":1,"mime":"application/pdf"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.sealpost.app/v1/files/presign \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "bytes": 1, "mime": "application/pdf" }'Scope envelopes:write. Returns upload_url and the exact headers to send with the
PUT (they carry the server-side encryption under the tenant’s key and are part of the
signature). The URL lives 15 minutes. Then call POST /files/{id}/complete.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The file size you will upload.
Responses
Section titled “Responses”Where to PUT the bytes.
object
PUT the bytes here.
Send these headers on the PUT exactly; they are part of the signature.
object
The path to POST once the upload is done.
Example generated
{ "file_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "upload_url": "https://example.com", "headers": { "additionalProperty": "example" }, "expires_at": "2026-04-15T12:00:00Z", "then": "example"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
The request could not be read (malformed JSON, bad header).
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
No key, an unknown key, or a revoked or expired key.
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
The key is valid but lacks the scope, or a test key tried a live-only action.
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
The request was read but a value is invalid, or an Idempotency-Key was reused with a different body.
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
The key is over its per-minute budget (600 live, 60 test, sliding window).
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.
Seconds to wait before retrying.
Requests allowed per minute for this key (600 live, 60 test).
Requests remaining in the current window.
Seconds until the window has capacity again.
Something failed on our side. The request_id is in our logs.
RFC 9457 problem details plus a stable code and the request_id.
object
https://sealpost.app/errors/{code}
Human-readable, safe to show to a developer, never contains secrets or signer data.
The request path.
Stable machine-readable code from the catalogue (docs/errors.md).
Field-level detail on validation_failed.
object
JSON pointer-ish path, e.g. scopes[2].
Example
{ "type": "https://sealpost.app/errors/insufficient_scope", "title": "Forbidden", "status": 403, "detail": "This key lacks the api_keys:write scope.", "code": "insufficient_scope", "request_id": "req_01J9ZK3V8Q4M2XQ7W0E5D1R6TA"}Headers
Section titled “Headers”Unique id of this request (req_…). Quote it in support requests.