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.

request
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:

response · 200 OK
{
  "items": [ /* … */ ],
  "total": 137,
  "limit": 25,
  "offset": 0
}
Node.js · paging through everything
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

Running out of plan quota or credits returns 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

  1. Give each environment its own token: Label integration tokens sig_test_ and production ones sig_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.
  2. 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 409 rather than silently creating a second envelope. See Errors.
  3. 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.
  4. 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.
  5. 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.
  6. 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.