Going to production
The quickstart gets one envelope signed. This page covers what changes when real traffic arrives: paging through results, hitting a limit, and the decisions worth making before your first customer signs.
Pagination
List endpoints take limit and offset. limit defaults to 25 and is capped at 100 — a larger value is rejected rather than silently clamped, so a request that asks for too much fails loudly instead of quietly returning a short page.
curl 'https://api.sign.quathos.com/api/v1/envelopes?limit=25&offset=0&status=sent' \
-H "Authorization: Bearer $QUATHOS_SIGN_TOKEN"Responses carry the page in items and the full count under the same filters in total, so you can paginate without fetching everything first:
{
"items": [ /* … */ ],
"total": 137,
"limit": 25,
"offset": 0
}let offset = 0;
const limit = 100; // maximum accepted
const all = [];
for (;;) {
const res = await fetch(
`https://api.sign.quathos.com/api/v1/envelopes?limit=${limit}&offset=${offset}`,
{ headers: { Authorization: `Bearer ${process.env.QUATHOS_SIGN_TOKEN}` } }
);
const page = await res.json();
all.push(...page.items);
offset += limit;
if (offset >= page.total) break;
}Filters apply to total as well
total is the count matching the same search, status and label filters you sent — not the size of your whole account. Change a filter and the page count changes with it.Rate limits
Limits protect the endpoints that are exposed to the open internet or that cost money to serve: authentication, the signing flow, public verification, public signing links, checkout, member invitations and voucher redemption. When you exceed one, the response is 429 with detail: "rate_limited" and a Retry-After header giving the seconds until the window resets.
Plan quotas are not rate limits
402, not 429, and backing off will not fix it — the account needs quota. Handle the two separately: retry the 429, surface the 402 to a human.Pre-launch checklist
- Give each environment its own token: Label integration tokens
sig_test_and production onessig_live_, so a misplaced credential is easy to spot and revoke without touching the others. The label does not isolate data: a staging service still emails real signers. See Authentication. - Send an Idempotency-Key on every write: Generate it once per logical operation and reuse it on retries. The same key with a different payload returns
409rather than silently creating a second envelope. See Errors. - Branch on the detail code, never on the message: Codes are part of the contract; wording is not, and it may be localized. See the error reference.
- Treat webhooks as the source of truth for state changes: Polling the envelope endpoint on a timer works but wastes your rate budget and adds latency. Verify the signature and deduplicate on
X-Webhook-Id. See Webhooks. - Back off on 429 using Retry-After: The response carries the number of seconds until the window resets. Honor it instead of retrying immediately with a fixed delay.
- Store the envelope id, not just your own reference: Every later call — status, evidence dossier, download — is keyed by it.
Not available yet
Worth knowing before you design around something that does not exist. When any of these ship, this section shrinks.
- No sandbox environment. The
sig_test_prefix labels a token; it does not isolate data, emails or credits. - No cursor pagination. Offset paging is stable enough at current page sizes, but a resource created mid-iteration can shift rows between pages. If exactness matters, filter by a fixed status or narrow the window.