Products across every distributor (paged)
const url = 'https://api.oldsteelarsenal.com/v1/catalog/products?in_stock=false&include_discontinued=false&sort=key&offset=0&limit=100&count=false';const options = { method: 'GET', headers: { 'x-client-id': '<x-client-id>', 'x-signature': '<x-signature>', 'x-timestamp': '<x-timestamp>' }};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.oldsteelarsenal.com/v1/catalog/products?in_stock=false&include_discontinued=false&sort=key&offset=0&limit=100&count=false' \ --header 'x-client-id: <x-client-id>' \ --header 'x-signature: <x-signature>' \ --header 'x-timestamp: <x-timestamp>'One row per product — a UPC, or <distributor>:<sku> for an offer with no UPC — with every live offer and this service’s best_offer. Filters match OFFERS (a product is listed when one of its offers meets them all): brand (brand_key, repeatable), product_class, distributor, department (<distributor>:<code>), min_cost / max_cost, in_stock, ffl_required, q (UPC / SKU / mfg number / text), include_discontinued. sort=key pages by cursor (the full scan); brand / cost / qty page by offset. count=true adds the total. Scope: catalog:read.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters”Header Parameters
Section titled “Header Parameters”Responses
Section titled “ Responses ”Successful Response
object
object
object
The brand folded for matching: case, punctuation and ‘&’ vs ‘and’ ignored, spelling kept (‘s and w’ ≠ ‘smith and wesson’) except for the brand synonyms the service keeps (‘holosun technologies’ → ‘holosun’).
Manufacturer price-policy mark when the distributor ships one (ss: ‘M’ = enforceable MAP, ‘U’ = suggested MSRP, ‘’ = no policy — render ‘’ as ‘no policy’, never as MAP $0). Always ‘’ for rsr.
Handgun / Long Gun / Other Firearm / Ammunition / Accessory, from this distributor’s own department code — the one class table; a client keeps none of its own.
Any optimized field is set.
The product title: the optimized one when set, else the distributor’s (original.description).
The UPC, or <distributor>:<sku> for an offer with no UPC (an orphan is its own product).
The long description: the optimized one when set, else the distributor’s (original.long_description).
Optimized search result snippet; empty when none.
Every live (not Deleted) offer on the product, discontinued ones included and flagged.
object
The brand folded for matching: case, punctuation and ‘&’ vs ‘and’ ignored, spelling kept (‘s and w’ ≠ ‘smith and wesson’) except for the brand synonyms the service keeps (‘holosun technologies’ → ‘holosun’).
Manufacturer price-policy mark when the distributor ships one (ss: ‘M’ = enforceable MAP, ‘U’ = suggested MSRP, ‘’ = no policy — render ‘’ as ‘no policy’, never as MAP $0). Always ‘’ for rsr.
Handgun / Long Gun / Other Firearm / Ammunition / Accessory, from this distributor’s own department code — the one class table; a client keeps none of its own.
object
The distributor’s title (the merged short description), whatever is served.
The distributor’s long copy (the best offer in merge order that has any; the content bench’s own when locked).
Optimized short description; empty when none (distributors have no such field).
Units on hand across every distributor: the sum of the current (not discontinued) offers’ qty. Raw distributor counts — a client’s own buffers and exclusions are its to apply.
Example
{ "products": [ { "best_offer": { "map_policy": "" }, "content_locked": false, "content_optimized": false, "long_description": "", "meta_description": "", "offers": [ { "map_policy": "" } ], "short_description": "", "total_qty": 0 } ]}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "ctx": {}, "input": "example", "loc": [ "example" ], "msg": "example", "type": "example" } ]}