A key for one product works only with that product. Domains and proxy use separate keys. Keys are issued by an operator, message @lumisup_robot.
Authentication
Every request carries the key in a header:Key types
- Reseller: every request is automatically scoped to its account. A foreign
user_idreturns404(the existence of other accounts is not revealed). - Operator: passes
user_idexplicitly (body or?user_id=); required for money operations.
Scopes
A reseller key holds a set of scopes. An operator key holds all of them implicitly.
A missing scope →
403 forbidden_scope.
Money operations
Endpoints that move money (create invoice, buy, renew) follow extra rules.Idempotency
Every moneyPOST must carry an Idempotency-Key header (8–200 chars):
- A repeat with the same key returns the original response without re-running the operation.
- Two simultaneous identical requests won’t both execute: the loser gets
409 in_progress. - Missing header →
400 idempotency_key_required.
Daily spend cap
A key may have a daily USD cap (or the global default). Once reached, money operations return402 daily_cap_exceeded until the next UTC day. Operator keys are exempt.
Request signing (optional)
If a key is issued with signing required, every money request must carry:401 invalid_signature.
Rate limits
A bulk request consumes one money “token” per item. On exceed →
429 rate_limited with a Retry-After header (seconds).
Pagination
List endpoints use a cursor:limit: 1–200 (default 50).- Response:
{ "items": [...], "next_cursor": "...", "has_more": true }. Passnext_cursorascursorfor the next page.next_cursor: nullmeans no more pages.
Bulk operations
Bulk endpoints take an array and return a per-item result. They are not atomic: one item failing does not roll back the others.413 batch_too_large. Long bulk purchases run asynchronously: the endpoint returns 202 with a batch_id; poll status via GET /v1/batches/{batch_id}.
Error format
All errors share one JSON shape:Money in responses
Money amounts are always strings ("5.15"), never floats, so there is no precision loss. Send amounts as strings too.