Products by key (≤200)
const url = 'https://api.oldsteelarsenal.com/v1/catalog/products/batch';const options = { method: 'POST', headers: { 'x-client-id': '<x-client-id>', 'x-signature': '<x-signature>', 'x-timestamp': '<x-timestamp>', 'Content-Type': 'application/json' }, body: '{"keys":["example"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.oldsteelarsenal.com/v1/catalog/products/batch \ --header 'Content-Type: application/json' \ --header 'x-client-id: <x-client-id>' \ --header 'x-signature: <x-signature>' \ --header 'x-timestamp: <x-timestamp>' \ --data '{ "keys": [ "example" ] }'The listing sync’s read: fresh offers from every distributor for the products it lists. A 13-digit UPC with a leading zero is read as its 12-digit UPC-A (reported in keys); unknown keys are absent. Scope: catalog:read.
Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
Examplegenerated
{ "keys": [ "example" ]}Responses
Section titled “ Responses ”Successful Response
object
Requested key → the key it was normalised to, for the ones that changed (a 13-digit UPC with a leading zero is the 12-digit UPC-A).
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" } ]}