Going to production

The quickstart gets one envelope signed. This page covers what changes when real traffic arrives: how to page through results, what happens when you hit a limit, and the handful of decisions worth making before your first customer signs something.

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

  • Use a test token in every environment that is not production

    The environment is baked into the token prefix and cannot be changed after creation. A staging service holding a qsign_live_ token will email real signers. Authentication.

  • Send an Idempotency-Key on every write

    Generate it once per logical operation and reuse it on retries. Same key with a different payload returns 409 rather than silently creating a second envelope. Errors.

  • Branch on the detail code, never on the message

    Codes are part of the contract; wording is not, and it may be localized. 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. 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 official SDKs. The API is REST; the examples throughout these docs are cURL, Node.js and Python, and the client code is yours to write.
  • No embedded signing. Signers sign on a link we host, carrying your customer’s branding. There is no iframe or drop-in component for signing inside your own application.
  • 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.