03API reference
Catalog
The store's products as it lists them. Public keys work from a browser; private keys also from a server.
Search the store's products
/productsA search of the key's own store, best match first, or (with updated_since) the listings changed since a time,
oldest change first. Both kinds of key get the public columns; a public key's search cannot match a
distributor's item number.
Paging. limit is 1 to 60 (default 20). If more is left, next_cursor is a string; pass it as cursor with
the same other parameters. The cursor names a position in a total order, so it survives a catalog rebuild: a row
never appears twice and a row that was there is not skipped. To mirror a whole catalog, use
updated_since=1970-01-01 and follow next_cursor; later, call again with the time you started that walk.
An empty q with no filter returns no products.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
q | query | string | Search text, cut to 120 characters. If nothing matches and the last word ends in a plural "s", it is tried once more without it. |
limit | query | integer | Default 20. 1 to 60. |
in_stock | query | string |
|
category | query | string | A category id. Lists without |
type | query | string | A type id. |
firearm | query | "yes" | "no" | |
updated_since | query | string | ISO 8601 date or time. Lists the listings changed at or after it, oldest change first, and names those no longer visible in |
cursor | query | string | The Up to 2048 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
| Field | Type | Description |
|---|---|---|
queryrequired | string | |
totalrequired | integer | null | Matches for a search. Null for an |
productsrequired | object[] | |
products[].keyrequired | string | |
products[].upc | string | null | |
products[].mfrPart | string | |
products[].model | string | |
products[].manufacturer | string | |
products[].brand | string | null | |
products[].titlerequired | string | |
products[].description | string | |
products[].features | string[] | |
products[].specs | object[] | |
products[].specs[].label | string | |
products[].specs[].value | string | |
products[].images | (string (uri))[] | |
products[].category | object | null | |
products[].category.id | string | |
products[].category.name | string | |
products[].type | object | null | |
products[].type.id | string | |
products[].type.name | string | |
products[].attrs | object | |
products[].firearmrequired | boolean | |
products[].weightOz | number | null | |
products[].dimsIn | number[] | null | 3 to 3 items. |
products[].prop65 | object | null | |
products[].prop65.message | string | |
products[].casePack | object | null | |
products[].casePack.rounds | number | |
products[].casePack.boxes | number | |
products[].casePack.roundsPerBox | number | |
products[].pricerequired | object | What the price shows. Only |
products[].price.displayrequired | "show" | "cart" | "contact" | "signin" | "none" | |
products[].price.amount | number | Dollars. |
products[].inStockrequired | boolean | |
products[].restrictedStates | string[] | |
products[].groundOnly | boolean | |
products[].adultSignature | boolean | |
removed | string[] | Only with |
next_cursorrequired | string | null | Pass as |
Example
One product
/products/{key}One product of the key's store, public columns only. Returned only if it is active, not switched off by a brand rule and not hidden from the store.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
keyrequired | path | string | The product key, URL-encoded ( |
Responses
Headers: X-Request-Id
| Field | Type | Description |
|---|---|---|
productrequired | object | |
product.keyrequired | string | |
product.upc | string | null | |
product.mfrPart | string | |
product.model | string | |
product.manufacturer | string | |
product.brand | string | null | |
product.titlerequired | string | |
product.description | string | |
product.features | string[] | |
product.specs | object[] | |
product.specs[].label | string | |
product.specs[].value | string | |
product.images | (string (uri))[] | |
product.category | object | null | |
product.category.id | string | |
product.category.name | string | |
product.type | object | null | |
product.type.id | string | |
product.type.name | string | |
product.attrs | object | |
product.firearmrequired | boolean | |
product.weightOz | number | null | |
product.dimsIn | number[] | null | 3 to 3 items. |
product.prop65 | object | null | |
product.prop65.message | string | |
product.casePack | object | null | |
product.casePack.rounds | number | |
product.casePack.boxes | number | |
product.casePack.roundsPerBox | number | |
product.pricerequired | object | What the price shows. Only |
product.price.displayrequired | "show" | "cart" | "contact" | "signin" | "none" | |
product.price.amount | number | Dollars. |
product.inStockrequired | boolean | |
product.restrictedStates | string[] | |
product.groundOnly | boolean | |
product.adultSignature | boolean |
Example
One product with what only the store may see (private key)
/staff/products/{key}The product with cost, MAP, MSRP, total quantity and the distributors' offers. It does not apply the hidden or inactive filters, so it also answers for a product the store has hidden. A public key gets 403.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
keyrequired | path | string | The product key, URL-encoded ( |
Responses
Headers: X-Request-Id
| Field | Type | Description |
|---|---|---|
productrequired | object | |
product.keyrequired | string | |
product.upc | string | null | |
product.mfrPart | string | |
product.model | string | |
product.manufacturer | string | |
product.brand | string | null | |
product.titlerequired | string | |
product.description | string | |
product.features | string[] | |
product.specs | object[] | |
product.specs[].label | string | |
product.specs[].value | string | |
product.images | (string (uri))[] | |
product.category | object | null | |
product.category.id | string | |
product.category.name | string | |
product.type | object | null | |
product.type.id | string | |
product.type.name | string | |
product.attrs | object | |
product.firearmrequired | boolean | |
product.weightOz | number | null | |
product.dimsIn | number[] | null | 3 to 3 items. |
product.prop65 | object | null | |
product.prop65.message | string | |
product.casePack | object | null | |
product.casePack.rounds | number | |
product.casePack.boxes | number | |
product.casePack.roundsPerBox | number | |
product.pricerequired | object | What the price shows. Only |
product.price.displayrequired | "show" | "cart" | "contact" | "signin" | "none" | |
product.price.amount | number | Dollars. |
product.inStockrequired | boolean | |
product.restrictedStates | string[] | |
product.groundOnly | boolean | |
product.adultSignature | boolean | |
product.costrequired | number | null | |
product.maprequired | number | null | |
product.msrprequired | number | null | |
product.totalQtyrequired | number | null | |
product.offersrequired | object[] | |
product.offers[].distributorrequired | string | |
product.offers[].skurequired | string | |
product.offers[].cost | string | null | The distributor's cost in dollars as a decimal string (for example "51.25"), as the database returns it. The product-level cost, map and msrp are numbers. |
product.offers[].qty | number | null | |
product.offers[].status | string | null |