Skip to content
Docs

03API reference

Version 1.0.0Made from openapi.yaml

Orders

Needs a private key that carries the orders permissions. Server-to-server only.

List orders

GET/orders
Scoped private key (rm_prv_), from a server
orders:read

The 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

NameInTypeDescription
statusquery"pending" | "open" | "closed" | "cancelled"
sourcequery"api" | "manual"
store_order_numberquerystring
refquerystring

The intake_ref you sent.

updated_sincequerystring

ISO 8601 date or time. Lists what changed at or after it, oldest change first.

limitqueryinteger

Default 50. 1 to 100.

cursorquerystring

The next_cursor of the previous page. Opaque; do not build or change one. A cursor belongs to the request that produced it; with other parameters it is bad_cursor.

Up to 2048 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject[]
data[].idrequiredstring
data[].intake_refrequiredstring
data[].sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data[].kindstring | null
data[].statusrequired"pending" | "open" | "closed" | "cancelled"
data[].match_staterequired"unmatched" | "auto" | "manual"
data[].store_order_numberstring | null
data[].store_order_refstring | null
data[].store_cart_refstring | null
data[].dealer_postring | null
data[].pickupboolean
data[].fflobject | null

The FFL as it was when the shopper chose it.

data[].ffl.idstring
data[].ffl.license_numberstring
data[].ffl.namestring
data[].ffl.phonestring | null
data[].ffl.streetstring | null
data[].ffl.citystring
data[].ffl.statestring
data[].ffl.zipstring
data[].ffl.list_as_ofstring | null
data[].cancelled_reasonstring | null
data[].ready_atstring (date-time) | null
data[].shipped_atstring (date-time) | null
data[].delivered_atstring (date-time) | null
data[].trackingstring | null
data[].totalsrequiredobject
data[].totals.currencystring
data[].totals.subtotal_centsinteger | null
data[].totals.shipping_centsinteger | null
data[].totals.tax_centsinteger | null
data[].totals.total_centsinteger | null
data[].linesrequiredobject[]
data[].lines[].line_norequiredinteger
data[].lines[].skustring | null
data[].lines[].titlerequiredstring
data[].lines[].quantityrequiredinteger
data[].lines[].unit_price_centsinteger | null
data[].lines[].product_keystring | null
data[].lines[].ships_torequired"ffl" | "customer"
data[].lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data[].lines[].flaggedstring | null
data[].lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data[].lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data[].lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data[].shopperobject | null

Only for a key with orders:read.

data[].shopper.namestring | null
data[].shopper.emailstring | null
data[].shopper.phonestring | null
data[].billingobject | null

Only for a key with orders:read.

data[].shippingobject | null

Only for a key with orders:read.

data[].received_atrequiredstring (date-time)
data[].updated_atrequiredstring (date-time)
next_cursorrequiredstring | null
Errors400401403429503in the error envelope.

Example

Shell
curl "https://app.getrollmark.com/api/v1/orders" \
  -H "Authorization: Bearer $ROLLMARK_KEY"

Send an order

POST/orders
Scoped private key (rm_prv_), from a server
orders:write

Sends 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

NameInTypeDescription
Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Request body

FieldTypeDescription
intake_refrequiredstring

Your key for the order (a cart id). Makes the call idempotent.

Up to 100 characters.

store_cart_refstring

Up to 60 characters.

store_order_numberstring | null

When given

Up to 40 characters.

store_order_refstring | null

Up to 60 characters.

dealer_postring | null

Up to 25 characters.

shopperrequiredobject
shopper.namerequiredstring
shopper.emailrequiredstring (email)
shopper.phonestring
billingrequiredobject
billing.namestring
billing.line1requiredstring
billing.line2string
billing.cityrequiredstring
billing.staterequiredstring
billing.ziprequiredstring
billing.countryrequiredstring
shippingobject
shipping.namestring
shipping.line1requiredstring
shipping.line2string
shipping.cityrequiredstring
shipping.staterequiredstring
shipping.ziprequiredstring
shipping.countryrequiredstring
fflobject

Required when any line ships to the FFL. id or license_number, any formatting.

ffl.idstring
ffl.license_numberstring
linesrequiredobject[]

1 to 200 items.

lines[].skustring
lines[].upcstring

Pattern `^[0-9]{8,14}$`.

lines[].mpnstring
lines[].manufacturerstring
lines[].titlerequiredstring
lines[].quantityrequiredinteger

1 to 10000.

lines[].unit_price_centsinteger

At least 0.

lines[].needs_fflboolean

A hint. The library decides; a disagreement is flagged store_disagrees.

totalsobject
totals.currencystring

3 to 3 characters.

totals.subtotal_centsinteger
totals.shipping_centsinteger
totals.tax_centsinteger
totals.total_centsinteger

Responses

Headers: Idempotent-Replay

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors400401403409413422429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Content-Type: application/json" \
  -d '{"intake_ref":"…","shopper":{"name":"…","email":"[email protected]"},"billing":{"line1":"…","city":"…","state":"…","zip":"…","country":"…"},"lines":[{"title":"…","quantity":1}]}'

One order

GET/orders/{id}
Scoped private key (rm_prv_), from a server
orders:read

The order with its lines, where each line stands and whether it can still be changed. Needs the orders:read permission.

Parameters

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors401403404429503in the error envelope.

Example

Shell
curl "https://app.getrollmark.com/api/v1/orders/<id>" \
  -H "Authorization: Bearer $ROLLMARK_KEY"

Where each line stands

GET/orders/{id}/fill
Scoped private key (rm_prv_), from a server
orders:read

For 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.order_idrequiredstring
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].quantityrequiredinteger
data.lines[].staterequired"from_shelf" | "not_ordered" | "partly_ordered" | "on_po" | "ordered" | "shipped" | "at_shop" | "delivered"
data.lines[].coveredrequiredinteger
data.lines[].distributor_ordersrequiredobject[]
data.lines[].distributor_orders[].idstring
data.lines[].distributor_orders[].po_numberstring
data.lines[].distributor_orders[].distributorstring
data.lines[].distributor_orders[].statusstring
data.lines[].distributor_orders[].quantityinteger
data.lines[].distributor_orders[].shipped_quantityinteger
data.lines[].distributor_orders[].received_quantityinteger
Errors401403404429503in the error envelope.

Example

Shell
curl "https://app.getrollmark.com/api/v1/orders/<id>/fill" \
  -H "Authorization: Bearer $ROLLMARK_KEY"

Match an order to your store's order

POST/orders/{id}/match
Scoped private key (rm_prv_), from a server
orders:write

{ 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Request body

FieldTypeDescription
store_order_numberrequiredstring

Up to 40 characters.

store_order_refstring

Up to 60 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors400401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/match" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Content-Type: application/json" \
  -d '{"store_order_number":"…"}'

Cancel an order

POST/orders/{id}/cancel
Scoped private key (rm_prv_), from a server
orders:write

{ 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Request body

FieldTypeDescription
reasonrequiredstring

3 to 300 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors400401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/cancel" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"…"}'

Mark ready to ship

POST/orders/{id}/ready
Scoped private key (rm_prv_), from a server
orders:write

Only 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/ready" \
  -H "Authorization: Bearer $ROLLMARK_KEY"

Mark shipped

POST/orders/{id}/ship
Scoped private key (rm_prv_), from a server
orders:write
Idempotency-Key required

{ 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyrequiredheaderstring

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)

FieldTypeDescription
trackingstring

Up to 120 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors400401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/ship" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Idempotency-Key: <one id per action>" \
  -H "Content-Type: application/json" \
  -d '{}'

Finish as delivered

POST/orders/{id}/deliver
Scoped private key (rm_prv_), from a server
orders:write

After it shipped. The order is then closed. Needs the orders:write permission.

Parameters

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/deliver" \
  -H "Authorization: Bearer $ROLLMARK_KEY"

Add an item to an order

POST/orders/{id}/lines
Scoped private key (rm_prv_), from a server
orders:write

{ 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Request body

FieldTypeDescription
product_keyrequiredstring
quantityrequiredinteger

1 to 10000.

unit_price_centsinteger | null

At least 0.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
data.added_line_norequiredinteger
data.warningstring | null
Errors400401403404409429503in the error envelope.

Example

Shell
curl -X POST "https://app.getrollmark.com/api/v1/orders/<id>/lines" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_key":"…","quantity":1}'

Change a line

PATCH/orders/{id}/lines/{line_no}
Scoped private key (rm_prv_), from a server
orders:write

{ 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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

line_norequiredpathinteger

At least 1.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Request body

FieldTypeDescription
quantityinteger

1 to 10000.

unit_price_centsinteger | null

At least 0.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors400401403404409429503in the error envelope.

Example

Shell
curl -X PATCH "https://app.getrollmark.com/api/v1/orders/<id>/lines/<line_no>" \
  -H "Authorization: Bearer $ROLLMARK_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Remove a line

DELETE/orders/{id}/lines/{line_no}
Scoped private key (rm_prv_), from a server
orders:write

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

NameInTypeDescription
idrequiredpathstring

The order id, ref:<intake_ref> or store:<store_order_number>.

line_norequiredpathinteger

At least 1.

Idempotency-Keyheaderstring

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 Idempotent-Replay: true. The same key with a different method, path or body is 409 idempotency_conflict. A refusal is not kept, so a corrected request can use the same key.

1 to 255 characters.

Responses

Headers: X-Request-Id, X-RateLimit-Remaining

FieldTypeDescription
datarequiredobject
data.idrequiredstring
data.intake_refrequiredstring
data.sourcerequired"api" | "manual"

api for an order a store sent, manual for one entered by hand in Rollmark.

data.kindstring | null
data.statusrequired"pending" | "open" | "closed" | "cancelled"
data.match_staterequired"unmatched" | "auto" | "manual"
data.store_order_numberstring | null
data.store_order_refstring | null
data.store_cart_refstring | null
data.dealer_postring | null
data.pickupboolean
data.fflobject | null

The FFL as it was when the shopper chose it.

data.ffl.idstring
data.ffl.license_numberstring
data.ffl.namestring
data.ffl.phonestring | null
data.ffl.streetstring | null
data.ffl.citystring
data.ffl.statestring
data.ffl.zipstring
data.ffl.list_as_ofstring | null
data.cancelled_reasonstring | null
data.ready_atstring (date-time) | null
data.shipped_atstring (date-time) | null
data.delivered_atstring (date-time) | null
data.trackingstring | null
data.totalsrequiredobject
data.totals.currencystring
data.totals.subtotal_centsinteger | null
data.totals.shipping_centsinteger | null
data.totals.tax_centsinteger | null
data.totals.total_centsinteger | null
data.linesrequiredobject[]
data.lines[].line_norequiredinteger
data.lines[].skustring | null
data.lines[].titlerequiredstring
data.lines[].quantityrequiredinteger
data.lines[].unit_price_centsinteger | null
data.lines[].product_keystring | null
data.lines[].ships_torequired"ffl" | "customer"
data.lines[].ship_reasonrequired"firearm" | "receiver" | "library_not_firearm" | "store_hint" | "staff_override"
data.lines[].flaggedstring | null
data.lines[].fill"shelf" | "dropship" | null

Filled from the shelf or by drop-ship; null when not decided.

data.lines[].added_by_staffboolean

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[].editableboolean

Only on a single order.

data.lines[].locked_reasonstring | null

Only on a single order. Why the line cannot be changed.

data.shopperobject | null

Only for a key with orders:read.

data.shopper.namestring | null
data.shopper.emailstring | null
data.shopper.phonestring | null
data.billingobject | null

Only for a key with orders:read.

data.shippingobject | null

Only for a key with orders:read.

data.received_atrequiredstring (date-time)
data.updated_atrequiredstring (date-time)
Errors401403404409429503in the error envelope.

Example

Shell
curl -X DELETE "https://app.getrollmark.com/api/v1/orders/<id>/lines/<line_no>" \
  -H "Authorization: Bearer $ROLLMARK_KEY"
Rollmark is made by Illumina Studios LLC. It was built at Ironcrest Arms LLC. Sample dealers, license numbers and costs in these docs are made up. Questions: [email protected].