Appearance
3. Catalog
The products your account can order, with your price and the states each can ship to.
Read first: Catalog and availability.
Base URL https://api.axiomscript.com. Every request is signed; see Authentication and signing.
The SKUs this partner can order, with their resolved prices
GET/api/inbound/{partnerSlug}/catalog
Every active product you are set up to order, each with the clinic price YOUR partner account resolves to. A SKU you are not priced for is omitted rather than returned at zero. An item is orderable when unavailableUntil is null AND backordered is false; a backordered item is refused product_backordered, and an item carrying a future unavailableUntil is an upcoming launch, refused product_not_yet_available until then. availableStates lists the states the account-level ship-state rules allow; routing rules held for one particular clinic are not reflected, so POST /orders/check is the final word for a given clinic.
Parameters
partnerSlugstringpathrequiredThe partner's Axiom-issued slug (e.g. acme-health).
Responses
| Status | Meaning |
|---|---|
200 | The partner's orderable catalog |
401 | Missing, expired, or invalid HMAC signature / timestamp |
403 | production_not_enabled. You signed with a production key, but Axiom has not yet flipped the production gate on your partner account. Holding a production key is deliberately not enough to place live orders. Contact Axiom to enable it. |
423 | partner_inactive or tenant_suspended. Your partner account is deactivated or suspended, so no request will be served until it is reinstated. |
429 | Per-partner rate limit exceeded |
Response fields (200)
oktruerequired
catalogarray of objectrequired
catalog[].skustringrequired
catalog[].aliasesarray of stringoptionalAlternate SKU strings this partner may also send for this product on an order. sku is the canonical one and always works; these are accepted as well, case-insensitively. Usually empty. A product we rename keeps its old string here so orders already in flight do not start failing.
catalog[].namestring | nulloptional
catalog[].strengthstring | nulloptional
catalog[].formFactorstringrequiredFree text from the catalog, for example Vial, Pen, Cartridge, Nasal Spray, Capsule, Tablet or Supply. Do not rely on a fixed list or on letter case.
catalog[].imageUrlstring | nulloptional
catalog[].unavailableUntilstring (date-time) | nulloptionalWhen set, the SKU is an upcoming launch: order create rejects it with product_not_yet_available until this instant. Null means no launch hold (the item can still be backordered).
catalog[].backorderedbooleanoptionalOut of stock right now. Order create rejects this SKU with product_backordered. Separate from unavailableUntil: that one is a launch hold that ends on a date, this one has no end date and only a person clears it. Both can apply at once.
catalog[].expectedBackAtstring (date-time) | nulloptionalA SUGGESTED return date, present only when the SKU is backordered and we have an estimate. INFORMATIONAL ONLY: the SKU does not become orderable when this passes. Do not schedule a retry on it and assume the order will succeed.
catalog[].clinicPriceCentsintegerrequiredWhat the clinic is charged for one unit, in cents, for YOUR partner account.
catalog[].pricingSourcestringrequiredWhich tier or override the price resolved from.
catalog[].availableStatesarray of stringoptionalThe two-letter state codes this SKU can ship to for YOUR account today, sorted: the states to offer. Territories appear when we can ship there. An empty list means no state qualifies at account level right now. It changes as pharmacies are licensed and as state restrictions are added or lifted, so read it fresh rather than caching it for days. Routing rules we hold for a single clinic are not reflected here, because this list is for your whole account, and such a rule can narrow or widen what that clinic can order. POST /orders/check with the clinic is the final word for a given clinic and state.
retiredarray of objectrequiredSKUs you could order that have been RETIRED for good, for 90 days after the retirement. A separate list on purpose: nothing in it can be ordered (an order for one is refused 422 product_retired), and a SKU is never in both lists. Only a SKU your account was entitled to when it was retired appears here. Always present; [] when there are none. No replacement is named.
retired[].skustringrequired
retired[].retiredAtstring (date-time)required
Request
http
GET /api/inbound/acme-health/catalog
Host: api.axiomscript.com
X-Axiom-Timestamp: 1767225600
X-Axiom-Signature: sha256=<hex>Response 200
json
{
"ok": true,
"catalog": [
{
"sku": "EXAMPLE-SKU-1",
"name": "Example Product",
"strength": "10mg",
"formFactor": "vial",
"imageUrl": null,
"unavailableUntil": null,
"backordered": false,
"expectedBackAt": null,
"aliases": [],
"clinicPriceCents": 17000,
"pricingSource": "attribution_lane",
"availableStates": [
"TX"
]
}
],
"retired": []
}
