Conventions
Objects, paging, idempotency, errors and rate limits.
Objects
- JSON with
snake_casefields. Every object has anobjectfield (client,request,document…) and a prefixed id (cli_…,req_…,doc_…). - Times are ISO 8601 in UTC (
2026-09-28T14:03:11.204Z); dates without a time areYYYY-MM-DD. - New fields can appear at any time within
v1; ignore fields you don't know. Fields are never renamed or removed within a version.
Paging
Lists return { "object": "list", "data": [...], "has_more": true, "next_cursor": "cli_…" }. Pass limit (1–100, default 25) and, for the next page, starting_after=<next_cursor>. Lists are ordered oldest first by id, so paging is stable while new records arrive. The audit log is newest first and pages with before_sequence.
Idempotency
Send an Idempotency-Key header (any unique string up to 255 characters, such as a UUID) with POST requests. If a network error makes you retry, the same key within 24 hours returns the first response (with Idempotent-Replayed: true) instead of doing the work twice. Reusing a key with a different body returns 409.
Errors
Errors use RFC 9457 problem details with Content-Type: application/problem+json:
{
"type": "https://sealio.ca/docs/developers/errors#validation-failed",
"title": "Validation failed",
"status": 422,
"detail": "Check the client details.",
"request_id": "req_…",
"errors": { "fields": { "displayName": ["Enter the client’s name."] } }
}| Status | Meaning |
|---|---|
| 400 | The query or body isn't well formed (bad limit, not JSON). |
| 401 | Missing, unknown, revoked or expired key, or a key for the other market. |
| 403 | The key's scopes or its creator's role don't allow this, or the IP address isn't allowed. |
| 404 | Not found (or not in your firm). |
| 409 | Conflict with the current state, such as sending a request twice or reusing an idempotency key. |
| 413 / 415 | Body over 256 KB, or not application/json. |
| 422 | Validation failed; errors has details. |
| 429 | Rate limit reached; wait for Retry-After seconds. |
| 500 | Our fault. Retry, and quote the request_id if it keeps happening. |
Every response has a Request-Id header.
Rate limits
300 requests a minute per key and 1,000 per firm. Each response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds).