No SDK lock-in, no proprietary upload widget. Point a multipart or resumable request at an endpoint and get a durable object back.
The surface area is intentionally small. Most integrations use three of these.
| Method | Path | Purpose |
|---|---|---|
| POST | /v2/upload/:key | Accept a new file, streaming or single-shot |
| GET | /v2/files/:id | Fetch object metadata and status |
| GET | /v2/files/:id/download | Signed, time-limited download URL |
| DELETE | /v2/files/:id | Remove an object and its replicas |
| POST | /v2/webhooks | Register a delivery endpoint |
Uploads fail for reasons outside your control — flaky mobile networks, dropped connections, background app suspension. The API is built around that reality rather than around it.
Interrupted uploads resume from the last acknowledged byte range, not from zero.
Retried requests with the same key never create a duplicate object.
Delivery is retried with backoff for up to 24 hours if your endpoint is unreachable.
The defaults are the settings we'd want turned on for our own data.
| Area | Default |
|---|---|
| Transport | TLS 1.3, HTTP/2 |
| Object access | Private by default; signed URLs expire in 15 minutes |
| Webhook payloads | Signed with a per-account secret, verified on your side |
| At rest | Server-side encryption, key rotation every 90 days |