Command Deck
Tenant Data API
Read your fulfillment data and push orders & inventory adjustments. One REST API, scoped to your tenant, with cursor pagination and per-key rate limits.
Authentication
Every request needs a tenant API key as a bearer token. Mint and revoke keys in Admin → API keys; the raw key is shown once. Read keys can call every GET; a write key is required for POST.
| Base URL | https://{tenant}.cartforge.io/api/v1 |
| Header | Authorization: Bearer cd_… |
| Pagination | Cursor — responses carry { data, nextCursor } |
| Rate limit | Per key; x-ratelimit-* headers, 429 on burst |
| Spec | openapi.json (OpenAPI 3.1) |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/inventory?level=facility"x-ratelimit-limit: 60 x-ratelimit-remaining: 59
/api/v1/productsreadList products
Your master catalog (the source of truth). Cursor-paginated.
| Parameter | Type | |
|---|---|---|
| cursorquery | string | Opaque next-page cursor from a prior response. |
| limitquery | integer | Page size (default 50, max 200). |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/products?limit=2"{
"data": [
{ "id": "…", "sku": "GRN-VITC-500", "title": "Vitamin C 500mg", "barcode": "0864…" }
],
"nextCursor": "b1c2…"
}/api/v1/inventoryreadList inventory / ATP
Stock levels. `available` = on_hand − reserved = Available To Promise. Choose the aggregation with `level`.
| Parameter | Type | |
|---|---|---|
| levelquery | enum | bin (default, per location/lot) · facility (ATP per facility+variant) · master (ATP per variant). |
| skuquery | string | Filter to one SKU. |
| facilityCodequery | string | Filter to one facility (level=facility). |
| cursorquery | string | Next-page cursor. |
| limitquery | integer | Page size (max 200). |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/inventory?level=facility&sku=GRN-VITC-500"{
"data": [
{ "facilityCode": "US_MN_01", "sku": "GRN-VITC-500",
"onHand": 120, "reserved": 18, "available": 102 }
],
"nextCursor": null
}/api/v1/inventorywriteAdjust inventory
Write a signed adjustment (cycle count / correction) by SKU + facility + location. Idempotent by `idempotencyKey`; emits `inventory.updated` so channels resync.
| Parameter | Type | |
|---|---|---|
| skurequiredbody | string | Variant SKU. |
| facilityCoderequiredbody | string | Facility code. |
| locationCoderequiredbody | string | Bin/location code. |
| deltarequiredbody | integer | Non-zero signed change (e.g. -3, +10). |
| lotNumberbody | string | Lot, for lot-tracked items. |
| reasonbody | string | Free-text note stored on the ledger. |
| idempotencyKeyrequiredbody | string | ≥8 chars; safe retries. |
curl -X POST \
-H "Authorization: Bearer $CD_KEY" -H "Content-Type: application/json" \
"https://{tenant}.cartforge.io/api/v1/inventory" \
-d '{"sku":"GRN-VITC-500","facilityCode":"US_MN_01","locationCode":"A-01-03","delta":-3,"idempotencyKey":"cc-2026-07-06-001"}'{ "applied": true, "sku": "GRN-VITC-500", "delta": -3 }/api/v1/ordersreadList orders
Orders across every channel, with status and fulfilling facility.
| Parameter | Type | |
|---|---|---|
| cursorquery | string | Next-page cursor. |
| limitquery | integer | Page size (max 200). |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/orders?limit=1"{
"data": [
{ "id": "…", "displayName": "#1042", "status": "shipped", "facilityId": "…" }
],
"nextCursor": "…"
}/api/v1/orderswriteIngest an order
Push an order in. It's normalized, routed to a facility, and reserves stock. Deduped by (channel, externalOrderId).
| Parameter | Type | |
|---|---|---|
| salesChannelCoderequiredbody | string | Inbound code of the channel (or facilityCode). |
| order.externalOrderIdrequiredbody | string | Your order id (dedupe key). |
| order.shippingMethodbody | string | Determines the carrier at wave time. |
| order.shipTobody | object | Destination address. |
| order.lines[]requiredbody | array | { sku, qty } items. |
curl -X POST \
-H "Authorization: Bearer $CD_KEY" -H "Content-Type: application/json" \
"https://{tenant}.cartforge.io/api/v1/orders" \
-d '{"salesChannelCode":"web-mn","order":{"externalOrderId":"1042","shippingMethod":"UPS Ground","lines":[{"sku":"GRN-VITC-500","qty":2}]}}'{ "orderId": "…", "outcome": "allocated" }/api/v1/purchase-ordersreadList purchase orders
POs (source: QuickBooks / manual / api) with received quantities.
| Parameter | Type | |
|---|---|---|
| cursorquery | string | Next-page cursor. |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/purchase-orders"{ "data": [ { "id": "…", "status": "partially_received", "source": "quickbooks" } ], "nextCursor": null }/api/v1/shipmentsreadList shipments
Shipments with carrier, service, tracking, and status.
| Parameter | Type | |
|---|---|---|
| cursorquery | string | Next-page cursor. |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/shipments"{ "data": [ { "id": "…", "carrier": "ups", "trackingNumber": "1Z…", "status": "shipped" } ], "nextCursor": null }/api/v1/eventsreadList events
The domain event log (order.shipped, inventory.updated, …) — the same events delivered to your webhooks.
| Parameter | Type | |
|---|---|---|
| cursorquery | string | Next-page cursor. |
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/events"{ "data": [ { "id": "…", "type": "order.shipped", "aggregateId": "…" } ], "nextCursor": null }/api/v1/exportreadFull export
Your entire tenant dataset as one JSON document (portability).
curl -H "Authorization: Bearer $CD_KEY" \
"https://{tenant}.cartforge.io/api/v1/export"{ "organizationId": "…", "tables": { "variant": [ … ], "order": [ … ], "inventory_level": [ … ] } }