GET /v1/products
List catalog products
| Key | Required. See Authentication. |
|---|---|
| Capability | catalog-feed |
| Scope | catalog.products.read |
| Price | 1 credit; 5 fields included, 1 more per extra field, per page of 100 rows returned. How pricing works. |
| Estimate | Add estimate=true for a free quote. With estimate=true the 200 body is EstimateResponse (a priced quote for exactly this request), not the schema documented under responses.200; nothing is reserved or dispatched. |
| Paging | Follow nextCursor. See Paging. |
Example
curl -s "https://api.compudime.com/v1/products" \
-H "Authorization: Bearer $PUBLIC_API_KEY"
Parameters
| Name | In | Type | Description |
|---|---|---|---|
fields | query | string | Comma-separated catalog products fields to include (see x-compudime-field-catalog), or * for every field the key may see. Omitted: a flat-priced endpoint returns every field; once IT prices the endpoint by field count (includedFields in x-compudime-pricing), an omitted fields returns the standard set at the base price and each field beyond the included count adds extraFieldCost. An unknown or denied field is a free 400 field_not_allowed. |
cursor | query | string | Cursor returned from the previous product page. |
limit | query | integer | How many products to return: any whole number of 1 or more; default 100 (one page). One answer carries at most 10,000 (a safeguard on the size of one answer, not a limit on the listing): a larger limit answers 10,000 and nextCursor. A page can hold fewer rows than limit while nextCursor is set: keep following nextCursor until it is empty. Default: 100. At least 1. |
modifiedSince | query | string (date-time) | Only return products modified at or after this timestamp (compared with lastModifiedUtc), plus every product whose modification time is unknown (lastModifiedUtc empty), which is always returned: it cannot be shown unchanged, so an incremental sync reads it again. Rows are keyed by productCode, so reading one again is harmless. For the next call pass the largest lastModifiedUtc you have received minus one hour, not your own clock: lastModifiedUtc runs on the store's own clock, so no clock difference can skip a change, and the hour covers the hour the store's clocks go back in the fall. |
includeInactive | query | boolean | Whether to list products the product file flags inactive (inactive: true). Default false: the list leaves them out, and a product whose flag the store's agent has not reported yet (inactive: null) is listed. true lists every product, inactive ones included (the list's default until 2026-10-07). Pass the same value on every page of one listing (or leave it out on every page), as with modifiedSince: the cursor continues the listing it came from. With the default, a product that becomes inactive stops appearing, even with modifiedSince; to see the change, read with includeInactive=true. true or false only; anything else is a free 400. Default: false. |
estimate | query | boolean | When true, returns EstimateResponse instead of the normal body and never reserves credits: the request is authenticated, authorized and field-resolved exactly like a real call, then priced by billing (base cost plus extra-field credits for the resolved fields) and returned without dispatching to the store. Free of charge. Default: false. |
Responses
| Status | Description | Body |
|---|---|---|
200 | Projected catalog product page. | ProductListResponse |
400 | The request query is invalid. | Problem |
401 | Public API key is missing, invalid, or revoked. | Problem |
402 | The request was blocked by billing policy: no_api_plan (no plan funds this meter), billing_card_missing, billing_card_failed, usage_exhausted, overage_cap_reached, subscription_paused, sandbox_exhausted, or billing_blocked. A key the store pays for under its approval gets grant_cap_exceeded (the store's monthly limit for your calls) or payer_billing_blocked (the store cannot be charged right now; ask the store owner) instead: what is wrong with the store's billing is not shown to it. | Problem |
403 | The API key is not enabled for this endpoint. | Problem |
405 | The requested method is not allowed for this endpoint. | Problem |
429 | Too many requests from this API key (code rate_limited). Each key has its own request budget at the API edge, refilled continuously; it covers every authenticated endpoint, including the free ones, and is checked before anything is billed or sent to the store. Billed endpoints are also subject to the store plan's per-minute ceiling, which answers the same problem code. Wait at least Retry-After seconds before the next request with this key, then resume; if 429 answers again, back off exponentially (double the wait each time, up to a minute or so) and add random jitter so parallel workers do not retry in step. A 429 is never charged and reserves nothing. Header Retry-After: Whole seconds to wait before retrying with this key: the time until the key's next request token at the edge (never less than 1), or 60 when the store plan's per-minute ceiling refused the call. | Problem |
500 | The API edge encountered an internal error. | Problem |
503 | A required Public API dependency is temporarily unavailable. Also answered, with code endpoint_disabled, while CompuDime has temporarily switched the endpoint off: the whole API, the endpoint's family (x-compudime-family) or this endpoint alone; the detail says which and why. It is checked before anything is validated, reserved or sent to the store, so it is never charged; it is retryable and carries Retry-After. Header Retry-After: Sent with code endpoint_disabled: whole seconds to wait before asking again. A switch has no scheduled end, so this is a polling interval (60), not a promise. | Problem |
Error bodies are problem JSON; every code is listed there.
Fields
Choose with fields=; see Choosing fields.
| All fields | productCode, upc, unitsPerCase, description, smallDescription, brand, department, category, size, pack, price, priceQty, taxable, active, lastModifiedUtc, inactive, lastSold |
|---|---|
| Standard set | productCode, upc, description, smallDescription, brand |
| Second name | unitsPerCase is a second name for upc |
Access level
What your integration's access level changes here.
| Level | Scope | Effect |
|---|---|---|
own | catalog.products.read | The level does not change this operation: own and all return the same data. |
all | catalog.products.read | The level does not change this operation: own and all return the same data. |