External API v1
The v1 external API lets integrations manage cases, upload and process documents, review redactions, generate exports, and receive webhook notifications. Every endpoint is authenticated with an API key and limited by the scopes granted to that key.
Base URL
All v1 endpoints are served under /api/v1 on the RedactStripes
API host for your environment. Requests and responses use JSON; send
Content-Type: application/json with any request body.
Authentication
Send your API key in the x-api-key header on every request:
curl https://{api-host}/api/v1/me \
-H "x-api-key: rdx_live_..."
- Keys start with
rdx_live_and are 40 to 128 characters long. - The full key is shown only once, when it is created or rotated. Store it in a secret manager.
- A key stops working when it is revoked, when it expires, or when the account or service account that owns it is deactivated.
- Call
GET /api/v1/meto see the key's scopes, organization, and expiry.
Scopes
Each endpoint lists the scope it requires. A key may call an endpoint
only when it holds at least one of the scopes listed for that endpoint.
Scopes are granted when a key is created and cannot exceed the
max_scopes of its service account.
| Scope | Grants |
|---|---|
cases:read | List and read cases |
cases:write | Create, update, delete, and run workflow actions on cases |
documents:read | Read documents, list case documents, get download URLs |
documents:write | Create upload sessions, complete uploads, update and delete documents |
processing:read | Read processing jobs |
processing:write | Start scan, OCR, detection, transcription, and summary jobs |
redactions:read | Read redactions |
redactions:write | Create, update, and delete redactions; submit review decisions |
comments:read | Read document comments |
comments:write | Add document comments |
exports:read | List and read exports, get export download URLs |
exports:write | Create, cancel, and retry exports |
templates:read | Read redaction types, exemptions, and templates |
users:read | List and read users |
users:write | Create, update, deactivate, and invite users |
roles:read | List and read roles |
roles:write | Create, update, and delete roles; assign roles to users |
credentials:read | List service accounts and API keys |
credentials:write | Create, update, and delete service accounts; issue, rotate, and revoke API keys |
webhooks:read | List and read webhook endpoints and deliveries |
webhooks:write | Create, update, and delete webhook endpoints; rotate secrets; replay deliveries |
Requests and responses
Success envelope
Single resources are returned as data. Every response
includes a request_id that you can quote when reporting a
problem.
{
"data": { "id": "case_123", "name": "Records request 2026-014" },
"request_id": "req_01J..."
}
List envelope and pagination
Collections return data as an array and a cursor
for the next page. The cursor is null when there are no
more results. Use limit (default 25, maximum
100) and pass the returned cursor back as the
cursor query parameter.
{
"data": [ { "id": "case_123" } ],
"cursor": "eyJpZCI6...",
"request_id": "req_01J..."
}
Error envelope
{
"error": {
"code": "permission_denied",
"message": "This API key does not have the required scope(s): cases:write"
},
"request_id": "req_01J..."
}
| HTTP status | Code | Meaning |
|---|---|---|
| 400 | validation_error | The request body or parameters are invalid. Details may appear in error.details. |
| 401 | authentication_failed | The x-api-key header is missing, malformed, unknown, revoked, or expired. |
| 403 | permission_denied | The key lacks the scope the endpoint requires, or its owning account is no longer active. |
| 404 | resource_not_found | The resource does not exist in your organization. |
| 409 | conflict, invalid_transition, idempotency_key_reused | The resource state does not allow the change, a workflow transition is not allowed, or an idempotency key was reused with a different body. |
| 423 | locked | The document layer is locked by another editor. error.locked_layers lists the layers. |
| 429 | rate_limited | Too many requests. Wait for the number of seconds in the Retry-After header. |
| 500, 503 | internal_error | An unexpected error or a temporary outage. Retry with the same Idempotency-Key. |
Idempotency
Every POST, PUT, and PATCH request
must include an Idempotency-Key header. Use a unique value
(a UUID is a good choice) for each logical operation and reuse it when
retrying the same request.
- If a request with the same key and the same body was already processed, the stored response is returned with
Idempotency-Replayed: true. - If the same key is sent with a different body, the request fails with
409 idempotency_key_reused. - Keys are kept for 24 hours and are scoped to the API key, the route, and the method.
Rate limits
| Limit | Window |
|---|---|
60 requests per raw x-api-key value | 60 seconds |
| 1,000 requests per API key | 60 seconds |
| 5,000 requests per organization | 60 seconds |