03API reference
Orders
Needs a private key that carries the orders permissions. Server-to-server only.
/ordersList ordersPOST/ordersSend an orderGET/orders/{id}One orderGET/orders/{id}/fillWhere each line standsPOST/orders/{id}/matchMatch an order to your store's orderPOST/orders/{id}/cancelCancel an orderPOST/orders/{id}/readyMark ready to shipPOST/orders/{id}/shipMark shippedPOST/orders/{id}/deliverFinish as deliveredPOST/orders/{id}/linesAdd an item to an orderPATCH/orders/{id}/lines/{line_no}Change a lineDELETE/orders/{id}/lines/{line_no}Remove a lineList orders
/ordersThe store's orders, oldest change first, with cursor paging. Lines are included without their fill state (read one order for that). The shopper's details are included for a key with orders:read, which every call here needs. Needs the orders:read permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | "pending" | "open" | "closed" | "cancelled" | |
source | query | "api" | "manual" | |
store_order_number | query | string | |
ref | query | string | The intake_ref you sent. |
updated_since | query | string | ISO 8601 date or time. Lists what changed at or after it, oldest change first. |
limit | query | integer | Default 50. 1 to 100. |
cursor | query | string | The Up to 2048 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object[] | |
data[].idrequired | string | |
data[].intake_refrequired | string | |
data[].sourcerequired | "api" | "manual" |
|
data[].kind | string | null | |
data[].statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data[].match_staterequired | "unmatched" | "auto" | "manual" | |
data[].store_order_number | string | null | |
data[].store_order_ref | string | null | |
data[].store_cart_ref | string | null | |
data[].dealer_po | string | null | |
data[].pickup | boolean | |
data[].ffl | object | null | The FFL as it was when the shopper chose it. |
data[].ffl.id | string | |
data[].ffl.license_number | string | |
data[].ffl.name | string | |
data[].ffl.phone | string | null | |
data[].ffl.street | string | null | |
data[].ffl.city | string | |
data[].ffl.state | string | |
data[].ffl.zip | string | |
data[].ffl.list_as_of | string | null | |
data[].cancelled_reason | string | null | |
data[].ready_at | string (date-time) | null | |
data[].shipped_at | string (date-time) | null | |
data[].delivered_at | string (date-time) | null | |
data[].tracking | string | null | |
data[].totalsrequired | object | |
data[].totals.currency | string | |
data[].totals.subtotal_cents | integer | null | |
data[].totals.shipping_cents | integer | null | |
data[].totals.tax_cents | integer | null | |
data[].totals.total_cents | integer | null | |
data[].linesrequired | object[] | |
data[].lines[].line_norequired | integer | |
data[].lines[].sku | string | null | |
data[].lines[].titlerequired | string | |
data[].lines[].quantityrequired | integer | |
data[].lines[].unit_price_cents | integer | null | |
data[].lines[].product_key | string | null | |
data[].lines[].ships_torequired | "ffl" | "customer" | |
data[].lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data[].lines[].flagged | string | null | |
data[].lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data[].lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data[].lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data[].lines[].editable | boolean | Only on a single order. |
data[].lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data[].shopper | object | null | Only for a key with |
data[].shopper.name | string | null | |
data[].shopper.email | string | null | |
data[].shopper.phone | string | null | |
data[].billing | object | null | Only for a key with |
data[].shipping | object | null | Only for a key with |
data[].received_atrequired | string (date-time) | |
data[].updated_atrequired | string (date-time) | |
next_cursorrequired | string | null |
Example
Send an order
/ordersSends an order with the intake contract of the FFL Checkout API (checkout-api.md, section 3): pending until matched, or open and matched at once when it carries store_order_number. Idempotent on intake_ref, and on Idempotency-Key. The answer has the shopper's details only if the key also has orders:read. At most 256 KB; no card data, ever. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Request body
| Field | Type | Description |
|---|---|---|
intake_refrequired | string | Your key for the order (a cart id). Makes the call idempotent. Up to 100 characters. |
store_cart_ref | string | Up to 60 characters. |
store_order_number | string | null | When given Up to 40 characters. |
store_order_ref | string | null | Up to 60 characters. |
dealer_po | string | null | Up to 25 characters. |
shopperrequired | object | |
shopper.namerequired | string | |
shopper.emailrequired | string (email) | |
shopper.phone | string | |
billingrequired | object | |
billing.name | string | |
billing.line1required | string | |
billing.line2 | string | |
billing.cityrequired | string | |
billing.staterequired | string | |
billing.ziprequired | string | |
billing.countryrequired | string | |
shipping | object | |
shipping.name | string | |
shipping.line1required | string | |
shipping.line2 | string | |
shipping.cityrequired | string | |
shipping.staterequired | string | |
shipping.ziprequired | string | |
shipping.countryrequired | string | |
ffl | object | Required when any line ships to the FFL. |
ffl.id | string | |
ffl.license_number | string | |
linesrequired | object[] | 1 to 200 items. |
lines[].sku | string | |
lines[].upc | string | Pattern `^[0-9]{8,14}$`. |
lines[].mpn | string | |
lines[].manufacturer | string | |
lines[].titlerequired | string | |
lines[].quantityrequired | integer | 1 to 10000. |
lines[].unit_price_cents | integer | At least 0. |
lines[].needs_ffl | boolean | A hint. The library decides; a disagreement is flagged |
totals | object | |
totals.currency | string | 3 to 3 characters. |
totals.subtotal_cents | integer | |
totals.shipping_cents | integer | |
totals.tax_cents | integer | |
totals.total_cents | integer |
Responses
Headers: Idempotent-Replay
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
One order
/orders/{id}The order with its lines, where each line stands and whether it can still be changed. Needs the orders:read permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Where each line stands
/orders/{id}/fillFor each line: not ordered, partly ordered, on a PO, ordered, shipped, at the shop or delivered, with the distributor orders behind it. Needs the orders:read permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.order_idrequired | string | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].quantityrequired | integer | |
data.lines[].staterequired | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | |
data.lines[].coveredrequired | integer | |
data.lines[].distributor_ordersrequired | object[] | |
data.lines[].distributor_orders[].id | string | |
data.lines[].distributor_orders[].po_number | string | |
data.lines[].distributor_orders[].distributor | string | |
data.lines[].distributor_orders[].status | string | |
data.lines[].distributor_orders[].quantity | integer | |
data.lines[].distributor_orders[].shipped_quantity | integer | |
data.lines[].distributor_orders[].received_quantity | integer |
Example
Match an order to your store's order
/orders/{id}/match{ store_order_number, store_order_ref? }. Makes a pending order open. The same number again is 200; another number is 409 already_matched; an order staff cancelled is 409 order_cancelled; a number another order has is 409 store_order_number_in_use. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Request body
| Field | Type | Description |
|---|---|---|
store_order_numberrequired | string | Up to 40 characters. |
store_order_ref | string | Up to 60 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Cancel an order
/orders/{id}/cancel{ reason }, 3 to 300 characters; the store can read it. A closed order is 409 order_closed; one already cancelled is 409 order_cancelled. An order that had shipped keeps its shipment on record. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Request body
| Field | Type | Description |
|---|---|---|
reasonrequired | string | 3 to 300 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Mark ready to ship
/orders/{id}/readyOnly an open order that ships to an FFL (a transfer). An order with no FFL is 409 not_a_transfer. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Mark shipped
/orders/{id}/ship{ tracking? }. Sets shipped_at once and never clears it. A shipment marked shipped counts toward Rollmark Transfers billing, so an Idempotency-Key is required. Shipping again with the same tracking is 200; with another it is 409 already_shipped. Only an open order that ships to an FFL. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Keyrequired | header | string | Required on this call, because it counts toward billing. See the other calls for how the key works. 1 to 255 characters. |
Request body (optional)
| Field | Type | Description |
|---|---|---|
tracking | string | Up to 120 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Finish as delivered
/orders/{id}/deliverAfter it shipped. The order is then closed. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Add an item to an order
/orders/{id}/lines{ product_key, quantity, unit_price_cents? }: an item of the store's catalog, routed (to the FFL or the customer) by the product library. A pending or open order only. The price is the store's price unless given. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Request body
| Field | Type | Description |
|---|---|---|
product_keyrequired | string | |
quantityrequired | integer | 1 to 10000. |
unit_price_cents | integer | null | At least 0. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) | |
data.added_line_norequired | integer | |
data.warning | string | null |
Example
Change a line
/orders/{id}/lines/{line_no}{ quantity?, unit_price_cents? }. A line that is on a distributor order that was sent, is ready, failed, or filled from the shelf is 409 line_locked, with the reason; a cancelled or closed order is 409 order_cancelled or order_closed. Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
line_norequired | path | integer | At least 1. |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Request body
| Field | Type | Description |
|---|---|---|
quantity | integer | 1 to 10000. |
unit_price_cents | integer | null | At least 0. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |
Example
Remove a line
/orders/{id}/lines/{line_no}The same lock rule as changing it. The last line of an order cannot be removed (cancel the order). Needs the orders:write permission.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | The order id, |
line_norequired | path | integer | At least 1. |
Idempotency-Key | header | string | 1 to 255 printable characters (a UUID is fine). The first request with a key runs and its answer is kept for 24 hours; the same request again gets the same answer with 1 to 255 characters. |
Responses
Headers: X-Request-Id, X-RateLimit-Remaining
| Field | Type | Description |
|---|---|---|
datarequired | object | |
data.idrequired | string | |
data.intake_refrequired | string | |
data.sourcerequired | "api" | "manual" |
|
data.kind | string | null | |
data.statusrequired | "pending" | "open" | "closed" | "cancelled" | |
data.match_staterequired | "unmatched" | "auto" | "manual" | |
data.store_order_number | string | null | |
data.store_order_ref | string | null | |
data.store_cart_ref | string | null | |
data.dealer_po | string | null | |
data.pickup | boolean | |
data.ffl | object | null | The FFL as it was when the shopper chose it. |
data.ffl.id | string | |
data.ffl.license_number | string | |
data.ffl.name | string | |
data.ffl.phone | string | null | |
data.ffl.street | string | null | |
data.ffl.city | string | |
data.ffl.state | string | |
data.ffl.zip | string | |
data.ffl.list_as_of | string | null | |
data.cancelled_reason | string | null | |
data.ready_at | string (date-time) | null | |
data.shipped_at | string (date-time) | null | |
data.delivered_at | string (date-time) | null | |
data.tracking | string | null | |
data.totalsrequired | object | |
data.totals.currency | string | |
data.totals.subtotal_cents | integer | null | |
data.totals.shipping_cents | integer | null | |
data.totals.tax_cents | integer | null | |
data.totals.total_cents | integer | null | |
data.linesrequired | object[] | |
data.lines[].line_norequired | integer | |
data.lines[].sku | string | null | |
data.lines[].titlerequired | string | |
data.lines[].quantityrequired | integer | |
data.lines[].unit_price_cents | integer | null | |
data.lines[].product_key | string | null | |
data.lines[].ships_torequired | "ffl" | "customer" | |
data.lines[].ship_reasonrequired | "firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override" | |
data.lines[].flagged | string | null | |
data.lines[].fill | "shelf" | "dropship" | null | Filled from the shelf or by drop-ship; null when not decided. |
data.lines[].added_by_staff | boolean | True for a line added after the order arrived. |
data.lines[].fill_state | "from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered" | null | Only on a single order. Where the line stands with the distributors. |
data.lines[].editable | boolean | Only on a single order. |
data.lines[].locked_reason | string | null | Only on a single order. Why the line cannot be changed. |
data.shopper | object | null | Only for a key with |
data.shopper.name | string | null | |
data.shopper.email | string | null | |
data.shopper.phone | string | null | |
data.billing | object | null | Only for a key with |
data.shipping | object | null | Only for a key with |
data.received_atrequired | string (date-time) | |
data.updated_atrequired | string (date-time) |