Requests
List responses
Every list endpoint is unpaginated by default and paginated on request. Send neitherlimit nor cursor and you get the complete JSON array these
endpoints have always returned:
Parameters
Walking a list
Stop whenhasMore is false. Do not stop on a short page — a page can come
back shorter than limit and still have more behind it.
Why cursors and not page numbers. These lists are ordered newest-first, so
a record created while you are paging lands on page 1 and shifts every
subsequent offset by one — an offset client silently re-reads or skips
records. A cursor anchors to a record rather than a position, so concurrent
writes cannot corrupt a walk. The trade-off is no page numbers and no jumping
to an arbitrary page.
Choosing a page size
Filtering server-side beats paging through everything.GET /reseller/catalog
accepts category, minPrice, maxPrice, zipCode, and search; narrowing
there is far cheaper than fetching every page and filtering locally.
If you do not paginate, do not assume a bounded response size in your client —
no fixed buffers, no hard-coded array-length expectations.
Filtering
Filters are query parameters, and they combine with AND. An unknown query parameter is rejected with400, the same as an unknown body field.
Identifiers
Every resource id is a UUID v4 string.slug, which appears in public URLs and
is a short human-shareable token rather than a UUID.
Timestamps
All timestamps are ISO 8601 in UTC, with milliseconds and a trailingZ.
Money
Monetary values are returned as strings, not numbers.Nulls and optional fields
A field that does not apply isnull rather than absent, so response shapes
stay stable. Two exceptions are genuinely conditional and absent when they do
not apply:
electricity— present only on electricity offersinternet— present only on internet offers
serviceType discriminator ("electricity",
"internet", …), so branch on that rather than probing for the grouped object.
Responses are additive over time. New fields can appear in any response
without notice, so parse permissively and ignore what you do not recognize —
a strict parser that rejects unknown response fields will break on a routine
release. See Versioning.
Idempotency
There is noIdempotency-Key header today. POST /reseller/orders is not
idempotent: two identical requests create two orders.
If a write times out without a response, reconcile before retrying —
GET /reseller/orders will tell you whether the first attempt landed. See
Handling errors.
Reads, PATCH, and DELETE are naturally idempotent and safe to retry.
Next steps
Errors
Every status code and a retry-safe client
Rate limits
What is limited, and what is not
Versioning
What we promise not to break
Authentication
Keys, headers, roles, and rotation