StockroomAPIOpen the app
Reference

Shapes

The shapes an answer is made of. A purchase order reads the same from every endpoint that returns one, because the API builds it in one place; a field with no value is null, never missing. Ids are integers. Money is a decimal string beside a currency code.

#

Timestamp

string (date-time) or null

ISO 8601, UTC.

Example
"2026-09-11T08:12:44Z"
#

Date

string (date) or null
Example
"2026-09-02"
#

Money

string or null

A decimal string in the accompanying currency.

Example
null
#

Quantity

number or null
Example
24
#

SyncState

What Shopify has heard about this record's stock movement.

Fields
statestringrequired
pendingsyncedfailed
attempted_atTimestamprequired
ISO 8601, UTC.
errorstring or nullrequired
Example
{
  "state": "synced",
  "attempted_at": "2026-09-11T08:12:46Z",
  "error": null
}
#

LocationRef

Fields
idintegerrequired
The Shopify location id.
namestring or nullrequired
Example
{
  "id": 61234567890,
  "name": "Main warehouse"
}
#

Error

Fields
errorobjectrequired
codestringrequired
messagestringrequired
detailsarray of object
fieldstringrequired
codestringrequired
messagestringrequired
Where it appears
Example
{
  "error": {
    "code": "validation_failed",
    "message": "The given data was invalid.",
    "details": []
  }
}
#

Whoami

Fields
shopobjectrequired
idintegerrequired
domainstringrequired
namestring or nullrequired
currencystring or nullrequired
timezonestring or nullrequired
keyobjectrequired
idintegerrequired
namestring or nullrequired
prefixstringrequired
scopesarray of Scoperequired
expires_atstring (date-time) or nullrequired
api_versionstringrequired
Where it appears
Example
{
  "shop": {
    "id": 12,
    "domain": "example.myshopify.com",
    "name": "Example Store",
    "currency": "USD",
    "timezone": "America/Chicago"
  },
  "key": {
    "id": 4,
    "name": "ERP sync",
    "prefix": "srk2_ab12cd34",
    "scopes": [
      "read"
    ],
    "expires_at": "2027-09-11T00:00:00Z"
  },
  "api_version": "2"
}
#

Scope

string
Values
readwrite:purchase_orderswrite:supplierswrite:inventorywrite:manufacturingwebhooks
Example
"read"
#

Supplier

Fields
idintegerrequired
namestringrequired
company_namestring or nullrequired
typestring or nullrequired
contact_namestring or nullrequired
emailstring or nullrequired
email_ccarray of stringrequired
phonestring or nullrequired
currencystring or nullrequired
ISO 4217. Orders for this supplier are priced in it.
account_numberstring or nullrequired
location_account_numbersobjectrequired
Account number per Shopify location id, where it differs.
lead_time_daysinteger or nullrequired
payment_termsstring or nullrequired
min_order_valueMoneyrequired
A decimal string in the accompanying currency.
free_freight_thresholdMoneyrequired
A decimal string in the accompanying currency.
taxablebooleanrequired
ships_directbooleanrequired
Drop-ships to customers.
auto_restockbooleanrequired
exclude_from_reorderbooleanrequired
default_updates_stockboolean or nullrequired
Whether new orders update Shopify stock. Null follows the store default.
addressobjectrequired
line1string or nullrequired
line2string or nullrequired
citystring or nullrequired
provincestring or nullrequired
zipstring or nullrequired
countrystring or nullrequired
bill_to_addressstring or nullrequired
notesstring or nullrequired
match_vendorsarray of stringrequired
match_tagsarray of stringrequired
match_exclude_tagsarray of stringrequired
dropship_tagsarray of stringrequired
archivedbooleanrequired
archived_atTimestamprequired
ISO 8601, UTC.
merged_into_idinteger or nullrequired
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 7,
  "name": "Acme",
  "company_name": null,
  "type": null,
  "contact_name": null,
  "email": "orders@acme.example",
  "email_cc": [],
  "phone": null,
  "currency": "USD",
  "account_number": null,
  "location_account_numbers": {},
  "lead_time_days": 10,
  "payment_terms": null,
  "min_order_value": null,
  "free_freight_threshold": null,
  "taxable": true,
  "ships_direct": false,
  "auto_restock": false,
  "exclude_from_reorder": false,
  "default_updates_stock": null,
  "address": {
    "line1": null,
    "line2": null,
    "city": null,
    "province": null,
    "zip": null,
    "country": null
  },
  "bill_to_address": null,
  "notes": null,
  "match_vendors": [],
  "match_tags": [],
  "match_exclude_tags": [],
  "dropship_tags": [],
  "archived": false,
  "archived_at": null,
  "merged_into_id": null,
  "created_at": "2026-09-01T14:02:11Z",
  "updated_at": "2026-09-01T14:02:11Z"
}
#

SupplierInput

Every field is optional on PATCH; name is required on create.

Fields
namestring
company_namestring or null
typestring or null
contact_namestring or null
emailstring (email) or null
email_ccarray of string (email) or null
phonestring or null
currencystring or null
account_numberstring or null
location_account_numbersobject or null
lead_time_daysinteger or null
payment_termsstring or null
min_order_valuenumber or string or null
free_freight_thresholdnumber or string or null
taxableboolean
ships_directboolean
auto_restockboolean
exclude_from_reorderboolean
default_updates_stockboolean or null
address_line1string or null
address_line2string or null
citystring or null
provincestring or null
zipstring or null
countrystring or null
bill_to_addressstring or null
notesstring or null
match_vendorsarray of string or null
match_tagsarray of string or null
match_exclude_tagsarray of string or null
dropship_tagsarray of string or null
Example
{
  "name": "Acme Supply Co",
  "company_name": "Acme Supply Co",
  "type": "Manufacturer",
  "contact_name": "Dana Whitfield",
  "email": "orders@acme.example",
  "email_cc": [],
  "phone": "+1 512 555 0142",
  "currency": "USD",
  "account_number": "AC-2231",
  "location_account_numbers": {},
  "lead_time_days": 10,
  "payment_terms": "Net 30",
  "min_order_value": 250,
  "free_freight_threshold": 500,
  "taxable": true,
  "ships_direct": false,
  "auto_restock": true,
  "exclude_from_reorder": false,
  "default_updates_stock": false,
  "address_line1": "500 Congress Ave",
  "address_line2": null,
  "city": "Austin",
  "province": "Texas",
  "zip": "78701",
  "country": "United States",
  "bill_to_address": null,
  "notes": null,
  "match_vendors": [
    "Acme"
  ],
  "match_tags": [],
  "match_exclude_tags": [],
  "dropship_tags": []
}
#

SupplierCatalogRow

Fields
inventory_item_idintegerrequired
supplier_skustring or nullrequired
pack_sizeinteger or nullrequired
pack_unitstring or nullrequired
min_order_qtyinteger or nullrequired
is_primarybooleanrequired
sourcestring or nullrequired
Where the row came from (manual, import, an order).
priceMoneyrequired
A decimal string in the accompanying currency.
price_currencystring or nullrequired
price_listobjectrequired
effectivePriceTierSetrequired
upcomingPriceTierSetrequired
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "inventory_item_id": 44811223344,
  "supplier_sku": "ACME-MUG-BLU",
  "pack_size": 12,
  "pack_unit": "case",
  "min_order_qty": 6,
  "is_primary": true,
  "source": "catalog",
  "price": "12.50",
  "price_currency": "USD",
  "price_list": {
    "effective": {
      "currency": "USD",
      "effective_from": null,
      "source": "api",
      "tiers": [
        {
          "min_qty": 1,
          "price": "12.50"
        }
      ]
    },
    "upcoming": {
      "currency": "USD",
      "effective_from": null,
      "source": "api",
      "tiers": [
        {
          "min_qty": 1,
          "price": "12.50"
        }
      ]
    }
  },
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

PriceTierSet

Fields
currencystring or nullrequired
effective_fromstring or nullrequired
sourcestring or nullrequired
tiersarray of objectrequired
min_qtyintegerrequired
priceMoneyrequired
A decimal string in the accompanying currency.
Example
{
  "currency": "USD",
  "effective_from": null,
  "source": "catalog",
  "tiers": [
    {
      "min_qty": 1,
      "price": "12.50"
    }
  ]
}
#

SupplierCatalogRowInput

One of inventory_item_id or variant_id is required.

Fields
inventory_item_idinteger
variant_idinteger
supplier_skustring or null
pack_sizeinteger or null
pack_unitstring or null
min_order_qtyinteger or null
is_primaryboolean
tiersarray of object
The complete tier set. An empty list removes this supplier's prices for the item.
min_qtyintegerrequired
pricenumber or stringrequired
effective_fromstring (date) or null
Today or later; omitted means now.
Example
{
  "inventory_item_id": 44811223344,
  "variant_id": 40011223344,
  "supplier_sku": "ACME-MUG-BLU",
  "pack_size": 12,
  "pack_unit": "case",
  "min_order_qty": 6,
  "is_primary": true,
  "tiers": [
    {
      "min_qty": 1,
      "price": 12.5
    }
  ],
  "effective_from": "2026-09-11"
}
#

PurchaseOrderStatus

string
Values
draftorderedin_transitpartialreceivedclosed
Example
"draft"
#

PurchaseOrderSummary

A list row - the order without receipts and payments.

Fields
idintegerrequired
numberstringrequired
The merchant-facing number, e.g. PO-1042.
sequential_idinteger or nullrequired
statusPurchaseOrderStatusrequired
draftorderedin_transitpartialreceivedclosed
typestringrequired
purchasereturn
archivedbooleanrequired
archived_atTimestamprequired
ISO 8601, UTC.
sourcestring or nullrequired
How the order was created (manual, api, reorder, import...).
supplierobject or nullrequired
idintegerrequired
namestringrequired
supplier_idinteger or nullrequired
currencystring or nullrequired
exchange_rateobjectrequired
Store currency per 1 unit of the order currency.
ratenumber or nullrequired
base_currencystring or nullrequired
dateDaterequired
sourcestring or nullrequired
referencestring or nullrequired
customer_order_numberstring or nullrequired
supplier_order_numberstring or nullrequired
invoice_numberstring or nullrequired
account_numberstring or nullrequired
notesstring or nullrequired
expected_atDaterequired
payment_due_onDaterequired
payment_statusstring or nullrequired
unpaidpartialpaid
paid_atTimestamprequired
ISO 8601, UTC.
locationLocationRefrequired
updates_stockbooleanrequired
Whether receiving writes stock to Shopify.
ships_to_customerbooleanrequired
ship_to_addressobject or nullrequired
taxobjectrequired
rate_idinteger or nullrequired
namestring or nullrequired
rate_percentnumber or nullrequired
taxes_includedbooleanrequired
charges_taxablebooleanrequired
totalsobjectrequired
currencystring or nullrequired
subtotalMoneyrequired
A decimal string in the accompanying currency.
chargesMoneyrequired
A decimal string in the accompanying currency.
taxMoneyrequired
A decimal string in the accompanying currency.
totalMoneyrequired
A decimal string in the accompanying currency.
linesarray of PurchaseOrderLinerequired
chargesarray of PurchaseOrderChargerequired
shopify_syncSyncStaterequired
What Shopify has heard about this record's stock movement.
sent_atTimestamprequired
ISO 8601, UTC.
ordered_atTimestamprequired
ISO 8601, UTC.
in_transit_atTimestamprequired
ISO 8601, UTC.
received_atTimestamprequired
ISO 8601, UTC.
closed_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 1042,
  "number": "PO-1042",
  "sequential_id": 1042,
  "status": "ordered",
  "type": "purchase",
  "archived": false,
  "archived_at": null,
  "source": "api",
  "supplier": {
    "id": 7,
    "name": "Acme Supply Co"
  },
  "supplier_id": 7,
  "currency": "USD",
  "exchange_rate": {
    "rate": 1.36,
    "base_currency": "USD",
    "date": "2026-09-02",
    "source": "api"
  },
  "reference": "INV-8812",
  "customer_order_number": null,
  "supplier_order_number": "SO-77120",
  "invoice_number": null,
  "account_number": "AC-2231",
  "notes": null,
  "expected_at": "2026-09-20",
  "payment_due_on": "2026-10-02",
  "payment_status": "unpaid",
  "paid_at": null,
  "location": {
    "id": 61234567890,
    "name": "Main warehouse"
  },
  "updates_stock": true,
  "ships_to_customer": false,
  "ship_to_address": null,
  "tax": {
    "rate_id": 1,
    "name": "Acme Supply Co",
    "rate_percent": 8.25,
    "taxes_included": false,
    "charges_taxable": true
  },
  "totals": {
    "currency": "USD",
    "subtotal": "300.00",
    "charges": "0.00",
    "tax": "24.75",
    "total": "324.75"
  },
  "lines": [
    {
      "id": 5001,
      "position": 1,
      "product_title": "Stoneware mug",
      "variant_title": "Blue",
      "sku": "MUG-BLU",
      "supplier_sku": "ACME-MUG-BLU",
      "barcode": "0123456789012",
      "pack_code": "CS12",
      "inventory_item_id": 44811223344,
      "variant_id": 40011223344,
      "product_id": 7011223344,
      "location_id": 61234567890,
      "quantity": 24,
      "cancelled_quantity": 0,
      "received_quantity": 12,
      "outstanding_quantity": 12,
      "unit_cost": "12.50",
      "discount_percent": null,
      "line_total": "300.00",
      "taxable": true,
      "tax_rate_percent": 8.25,
      "weight_grams": 250,
      "supplier_note": null,
      "internal_note": null
    }
  ],
  "charges": [],
  "shopify_sync": {
    "state": "synced",
    "attempted_at": "2026-09-11T08:12:46Z",
    "error": null
  },
  "sent_at": "2026-09-02T14:03:22Z",
  "ordered_at": "2026-09-02T14:05:10Z",
  "in_transit_at": null,
  "received_at": null,
  "closed_at": null,
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

PurchaseOrder

Fields
receiptsarray of Receiptrequired
paymentsarray of Paymentrequired
idintegerrequired
numberstringrequired
The merchant-facing number, e.g. PO-1042.
sequential_idinteger or nullrequired
statusPurchaseOrderStatusrequired
draftorderedin_transitpartialreceivedclosed
typestringrequired
purchasereturn
archivedbooleanrequired
archived_atTimestamprequired
ISO 8601, UTC.
sourcestring or nullrequired
How the order was created (manual, api, reorder, import...).
supplierobject or nullrequired
idintegerrequired
namestringrequired
supplier_idinteger or nullrequired
currencystring or nullrequired
exchange_rateobjectrequired
Store currency per 1 unit of the order currency.
ratenumber or nullrequired
base_currencystring or nullrequired
dateDaterequired
sourcestring or nullrequired
referencestring or nullrequired
customer_order_numberstring or nullrequired
supplier_order_numberstring or nullrequired
invoice_numberstring or nullrequired
account_numberstring or nullrequired
notesstring or nullrequired
expected_atDaterequired
payment_due_onDaterequired
payment_statusstring or nullrequired
unpaidpartialpaid
paid_atTimestamprequired
ISO 8601, UTC.
locationLocationRefrequired
updates_stockbooleanrequired
Whether receiving writes stock to Shopify.
ships_to_customerbooleanrequired
ship_to_addressobject or nullrequired
taxobjectrequired
rate_idinteger or nullrequired
namestring or nullrequired
rate_percentnumber or nullrequired
taxes_includedbooleanrequired
charges_taxablebooleanrequired
totalsobjectrequired
currencystring or nullrequired
subtotalMoneyrequired
A decimal string in the accompanying currency.
chargesMoneyrequired
A decimal string in the accompanying currency.
taxMoneyrequired
A decimal string in the accompanying currency.
totalMoneyrequired
A decimal string in the accompanying currency.
linesarray of PurchaseOrderLinerequired
chargesarray of PurchaseOrderChargerequired
shopify_syncSyncStaterequired
What Shopify has heard about this record's stock movement.
sent_atTimestamprequired
ISO 8601, UTC.
ordered_atTimestamprequired
ISO 8601, UTC.
in_transit_atTimestamprequired
ISO 8601, UTC.
received_atTimestamprequired
ISO 8601, UTC.
closed_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "receipts": [
    {
      "id": 311,
      "purchase_order_id": 1042,
      "received_at": null,
      "voided_at": null,
      "source": "api",
      "location": {
        "id": 61234567890,
        "name": "Main warehouse"
      },
      "invoice": {
        "reference": "INV-8812",
        "date": "2026-09-02",
        "total": "324.75"
      },
      "exchange_rate": 1.36,
      "rejected_disposition": "replace",
      "note": "Two cartons short; supplier notified.",
      "lines": [
        {
          "id": 5001,
          "line_id": 5001,
          "quantity": 24,
          "surplus_quantity": 0,
          "rejected_quantity": 0,
          "unit_cost": "12.50",
          "landed_unit_cost": "13.10",
          "allocated_charge_amount": "0.60"
        }
      ],
      "shopify_sync": {
        "state": "synced",
        "attempted_at": "2026-09-11T08:12:46Z",
        "error": null
      },
      "created_at": "2026-09-01T10:00:00Z",
      "updated_at": "2026-09-11T08:12:44Z"
    }
  ],
  "payments": [
    {
      "id": 52,
      "amount": "324.75",
      "currency": "USD",
      "paid_on": "2026-09-30",
      "method": "bank_transfer",
      "reference": "Wire 4471",
      "note": "Paid by wire.",
      "created_at": "2026-09-01T10:00:00Z"
    }
  ],
  "id": 1042,
  "number": "PO-1042",
  "sequential_id": 1042,
  "status": "ordered",
  "type": "purchase",
  "archived": false,
  "archived_at": null,
  "source": "api",
  "supplier": {
    "id": 7,
    "name": "Acme Supply Co"
  },
  "supplier_id": 7,
  "currency": "USD",
  "exchange_rate": {
    "rate": 1.36,
    "base_currency": "USD",
    "date": "2026-09-02",
    "source": "api"
  },
  "reference": "INV-8812",
  "customer_order_number": null,
  "supplier_order_number": "SO-77120",
  "invoice_number": null,
  "account_number": "AC-2231",
  "notes": null,
  "expected_at": "2026-09-20",
  "payment_due_on": "2026-10-02",
  "payment_status": "unpaid",
  "paid_at": null,
  "location": {
    "id": 61234567890,
    "name": "Main warehouse"
  },
  "updates_stock": true,
  "ships_to_customer": false,
  "ship_to_address": null,
  "tax": {
    "rate_id": 1,
    "name": "Acme Supply Co",
    "rate_percent": 8.25,
    "taxes_included": false,
    "charges_taxable": true
  },
  "totals": {
    "currency": "USD",
    "subtotal": "300.00",
    "charges": "0.00",
    "tax": "24.75",
    "total": "324.75"
  },
  "lines": [
    {
      "id": 5001,
      "position": 1,
      "product_title": "Stoneware mug",
      "variant_title": "Blue",
      "sku": "MUG-BLU",
      "supplier_sku": "ACME-MUG-BLU",
      "barcode": "0123456789012",
      "pack_code": "CS12",
      "inventory_item_id": 44811223344,
      "variant_id": 40011223344,
      "product_id": 7011223344,
      "location_id": 61234567890,
      "quantity": 24,
      "cancelled_quantity": 0,
      "received_quantity": 12,
      "outstanding_quantity": 12,
      "unit_cost": "12.50",
      "discount_percent": null,
      "line_total": "300.00",
      "taxable": true,
      "tax_rate_percent": 8.25,
      "weight_grams": 250,
      "supplier_note": null,
      "internal_note": null
    }
  ],
  "charges": [],
  "shopify_sync": {
    "state": "synced",
    "attempted_at": "2026-09-11T08:12:46Z",
    "error": null
  },
  "sent_at": "2026-09-02T14:03:22Z",
  "ordered_at": "2026-09-02T14:05:10Z",
  "in_transit_at": null,
  "received_at": null,
  "closed_at": null,
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

PurchaseOrderLine

Fields
idintegerrequired
positioninteger or nullrequired
product_titlestring or nullrequired
variant_titlestring or nullrequired
skustring or nullrequired
supplier_skustring or nullrequired
barcodestring or nullrequired
pack_codestring or nullrequired
inventory_item_idinteger or nullrequired
variant_idinteger or nullrequired
Shopify variant id; null on a custom line.
product_idinteger or nullrequired
location_idinteger or nullrequired
A per-line destination, when the order routes lines to different locations.
quantityQuantityrequired
cancelled_quantityQuantityrequired
received_quantityQuantityrequired
outstanding_quantityQuantityrequired
unit_costMoneyrequired
A decimal string in the accompanying currency.
discount_percentnumber or nullrequired
line_totalMoneyrequired
A decimal string in the accompanying currency.
taxablebooleanrequired
tax_rate_percentnumber or nullrequired
weight_gramsnumber or nullrequired
supplier_notestring or nullrequired
internal_notestring or nullrequired
Example
{
  "id": 1042,
  "position": 1,
  "product_title": "Stoneware mug",
  "variant_title": "Blue",
  "sku": "MUG-BLU",
  "supplier_sku": "ACME-MUG-BLU",
  "barcode": "0123456789012",
  "pack_code": "CS12",
  "inventory_item_id": 44811223344,
  "variant_id": 40011223344,
  "product_id": 7011223344,
  "location_id": 61234567890,
  "quantity": 24,
  "cancelled_quantity": 0,
  "received_quantity": 12,
  "outstanding_quantity": 12,
  "unit_cost": "12.50",
  "discount_percent": null,
  "line_total": "300.00",
  "taxable": true,
  "tax_rate_percent": 8.25,
  "weight_grams": 250,
  "supplier_note": null,
  "internal_note": null
}
#

PurchaseOrderCharge

Fields
idintegerrequired
kindstringrequired
shippingother
labelstring or nullrequired
amountMoneyrequired
A decimal string in the accompanying currency.
currencystring or nullrequired
amount_in_order_currencyMoneyrequired
A decimal string in the accompanying currency.
tax_amountMoneyrequired
A decimal string in the accompanying currency.
billed_by_supplierbooleanrequired
allocation_methodstring or nullrequired
valuequantityweightcustomnone
Example
{
  "id": 1042,
  "kind": "shipping",
  "label": "Freight",
  "amount": "324.75",
  "currency": "USD",
  "amount_in_order_currency": "18.00",
  "tax_amount": "0.00",
  "billed_by_supplier": false,
  "allocation_method": "value"
}
#

Payment

Fields
idintegerrequired
amountMoneyrequired
A decimal string in the accompanying currency.
currencystring or nullrequired
paid_onDaterequired
methodstring or nullrequired
referencestring or nullrequired
notestring or nullrequired
created_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 52,
  "amount": "324.75",
  "currency": "USD",
  "paid_on": "2026-09-30",
  "method": "bank_transfer",
  "reference": "Wire 4471",
  "note": "Paid by wire.",
  "created_at": "2026-09-01T10:00:00Z"
}
#

HistoryRow

Fields
typestringrequired
created, sent, ordered, in_transit, receipt, closed, reopened, payment and so on.
atTimestamprequired
ISO 8601, UTC.
bystring or nullrequired
The admin user's name.
viaobject or nullrequired
typestringrequired
idintegerrequired
namestring or nullrequired
dataobject or nullrequired
Example
{
  "type": "ordered",
  "at": "2026-09-02T14:05:10Z",
  "by": "Dana Whitfield",
  "via": null,
  "data": {}
}
#

PurchaseOrderInput

Every field is optional on PATCH. On create, supplier_id and at least one line are what an order needs.

Fields
supplier_idinteger
numberstring or null
Leave out to let the store's numbering assign one.
currencystring or null
typestring
purchasereturn
return_reasonstring or null
return_source_po_idinteger or null
location_idinteger or null
Shopify location id the order ships to.
tax_rate_idinteger or null
taxes_includedboolean
charges_taxableboolean
referencestring or null
customer_order_numberstring or null
supplier_order_numberstring or null
invoice_numberstring or null
account_numberstring or null
notesstring or null
expected_atstring (date) or null
payment_due_onstring (date) or null
ship_to_overridestring or null
bill_to_overridestring or null
ships_to_customerboolean
updates_stockboolean
chargesarray of PurchaseOrderChargeInput
Example
{
  "supplier_id": 7,
  "number": "PO-1042",
  "currency": "USD",
  "type": "purchase",
  "return_reason": null,
  "return_source_po_id": null,
  "location_id": 61234567890,
  "tax_rate_id": null,
  "taxes_included": false,
  "charges_taxable": true,
  "reference": "INV-8812",
  "customer_order_number": null,
  "supplier_order_number": "SO-77120",
  "invoice_number": null,
  "account_number": "AC-2231",
  "notes": null,
  "expected_at": "2026-09-20",
  "payment_due_on": "2026-10-02",
  "ship_to_override": null,
  "bill_to_override": null,
  "ships_to_customer": false,
  "updates_stock": true,
  "lines": [
    {
      "id": 5001,
      "variant_id": 40011223344,
      "inventory_item_id": 44811223344,
      "product_title": "Stoneware mug",
      "variant_title": "Blue",
      "sku": "MUG-BLU",
      "supplier_sku": "ACME-MUG-BLU",
      "barcode": "0123456789012",
      "pack_code": "CS12",
      "location_id": 61234567890,
      "quantity": 24,
      "unit_cost": 12.5,
      "discount_percent": null,
      "weight_grams": 250,
      "taxable": true,
      "tax_rate_id": null,
      "supplier_note": null,
      "internal_note": null
    }
  ],
  "charges": []
}
#

PurchaseOrderLineInput

Name the product by variant_id or inventory_item_id; with neither, it is a custom line and product_title is required.

Fields
idinteger or null
On PATCH, the existing line to keep and update.
variant_idinteger or null
inventory_item_idinteger or null
product_titlestring or null
variant_titlestring or null
skustring or null
supplier_skustring or null
barcodestring or null
pack_codestring or null
location_idinteger or null
Per-line destination (Shopify location id).
quantitynumberrequired
unit_costnumber or string or null
discount_percentnumber or null
weight_gramsnumber or null
taxableboolean or null
tax_rate_idinteger or null
supplier_notestring or null
internal_notestring or null
Example
{
  "id": 1042,
  "variant_id": 40011223344,
  "inventory_item_id": 44811223344,
  "product_title": "Stoneware mug",
  "variant_title": "Blue",
  "sku": "MUG-BLU",
  "supplier_sku": "ACME-MUG-BLU",
  "barcode": "0123456789012",
  "pack_code": "CS12",
  "location_id": 61234567890,
  "quantity": 24,
  "unit_cost": 12.5,
  "discount_percent": null,
  "weight_grams": 250,
  "taxable": true,
  "tax_rate_id": null,
  "supplier_note": null,
  "internal_note": null
}
#

PurchaseOrderChargeInput

Fields
kindstringrequired
shippingother
labelstringrequired
amountnumber or stringrequired
currencystring or null
billed_by_supplierboolean or null
allocation_methodstring or null
valuequantityweightcustomnone
custom_splitarray of number or null
Example
{
  "kind": "shipping",
  "label": "Freight",
  "amount": 324.75,
  "currency": "USD",
  "billed_by_supplier": false,
  "allocation_method": "value",
  "custom_split": []
}
#

Receipt

Fields
idintegerrequired
purchase_order_idintegerrequired
received_atTimestamprequired
ISO 8601, UTC.
voided_atTimestamprequired
ISO 8601, UTC.
sourcestring or nullrequired
admin, pos, api, import...
locationLocationRefrequired
invoiceobjectrequired
referencestring or nullrequired
dateDaterequired
totalMoneyrequired
A decimal string in the accompanying currency.
exchange_ratenumber or nullrequired
rejected_dispositionstring or nullrequired
replaceremove
notestring or nullrequired
linesarray of objectrequired
idintegerrequired
line_idinteger or nullrequired
The purchase order line.
quantityQuantityrequired
surplus_quantityQuantityrequired
rejected_quantityintegerrequired
unit_costMoneyrequired
A decimal string in the accompanying currency.
landed_unit_costMoneyrequired
A decimal string in the accompanying currency.
allocated_charge_amountMoneyrequired
A decimal string in the accompanying currency.
shopify_syncSyncStaterequired
What Shopify has heard about this record's stock movement.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 311,
  "purchase_order_id": 1042,
  "received_at": null,
  "voided_at": null,
  "source": "api",
  "location": {
    "id": 61234567890,
    "name": "Main warehouse"
  },
  "invoice": {
    "reference": "INV-8812",
    "date": "2026-09-02",
    "total": "324.75"
  },
  "exchange_rate": 1.36,
  "rejected_disposition": "replace",
  "note": "Two cartons short; supplier notified.",
  "lines": [
    {
      "id": 5001,
      "line_id": 5001,
      "quantity": 24,
      "surplus_quantity": 0,
      "rejected_quantity": 0,
      "unit_cost": "12.50",
      "landed_unit_cost": "13.10",
      "allocated_charge_amount": "0.60"
    }
  ],
  "shopify_sync": {
    "state": "synced",
    "attempted_at": "2026-09-11T08:12:46Z",
    "error": null
  },
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

ReceiptInput

Fields
location_idintegerrequired
Shopify location the goods arrived at.
received_atstring (date) or null
notestring or null
invoice_referencestring or null
invoice_totalnumber or string or null
invoice_datestring (date) or null
exchange_ratenumber or null
Store currency per 1 unit of the order currency, if it differs from the order's.
route_to_destinationsboolean or null
Receive each line at its own location_id instead of one location.
rejected_dispositionstring or null
What happens to rejected units - keep them outstanding for a replacement, or remove them from the order.
replaceremove
linesarray of objectrequired
Every line to receive against. Zero quantity is allowed (nothing arrived on that line).
line_idintegerrequired
quantitynumberrequired
rejectedinteger or null
unit_costnumber or string or null
A receive-time cost correction.
bin_locationstring or null
lot_numberstring or null
lot_expirystring (date) or null
lot_manufacturedstring (date) or null
lot_idinteger or null
unorderedarray of object
Items that arrived without a line. Added to the order and received in one step.
variant_idinteger or null
inventory_item_idinteger or null
product_titlestring or null
variant_titlestring or null
skustring or null
barcodestring or null
quantitynumberrequired
unit_costnumber or string or null
Example
{
  "location_id": 61234567890,
  "received_at": "2026-09-11",
  "note": "Two cartons short; supplier notified.",
  "invoice_reference": "INV-8812",
  "invoice_total": 324.75,
  "invoice_date": "2026-09-11",
  "exchange_rate": 1.36,
  "route_to_destinations": false,
  "rejected_disposition": "replace",
  "lines": [
    {
      "line_id": 5001,
      "quantity": 24,
      "rejected": null,
      "unit_cost": 12.5,
      "bin_location": "A-12",
      "lot_number": null,
      "lot_expiry": "2026-09-11",
      "lot_manufactured": "2026-09-11",
      "lot_id": null
    }
  ],
  "unordered": []
}
#

StockAdjustment

Fields
idintegerrequired
numberstring or nullrequired
sequential_idinteger or nullrequired
statusstringrequired
draftappliedcancelled
sourcestring or nullrequired
reasonstring or nullrequired
Shopify's adjustment reason.
reason_labelstring or nullrequired
The merchant's own word for it, when they used one.
notestring or nullrequired
locationLocationRefrequired
stocktake_idinteger or nullrequired
reversal_of_idinteger or nullrequired
linesarray of objectrequired
idintegerrequired
positioninteger or nullrequired
product_titlestring or nullrequired
variant_titlestring or nullrequired
skustring or nullrequired
barcodestring or nullrequired
inventory_item_idinteger or nullrequired
variant_idinteger or nullrequired
deltaintegerrequired
quantity_beforeinteger or nullrequired
Available at draft time, when a snapshot was taken.
quantity_afterinteger or nullrequired
unit_costMoneyrequired
A decimal string in the accompanying currency.
lot_idinteger or nullrequired
lot_unitsinteger or nullrequired
shopify_syncSyncStaterequired
What Shopify has heard about this record's stock movement.
applied_atTimestamprequired
ISO 8601, UTC.
cancelled_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 88,
  "number": "ADJ-88",
  "sequential_id": 1042,
  "status": "applied",
  "source": "api",
  "reason": "correction",
  "reason_label": "Correction",
  "note": "Two cartons short; supplier notified.",
  "location": {
    "id": 61234567890,
    "name": "Main warehouse"
  },
  "stocktake_id": null,
  "reversal_of_id": null,
  "lines": [
    {
      "id": 5001,
      "position": 1,
      "product_title": "Stoneware mug",
      "variant_title": "Blue",
      "sku": "MUG-BLU",
      "barcode": "0123456789012",
      "inventory_item_id": 44811223344,
      "variant_id": 40011223344,
      "delta": -3,
      "quantity_before": 42,
      "quantity_after": 39,
      "unit_cost": "12.50",
      "lot_id": null,
      "lot_units": null
    }
  ],
  "shopify_sync": {
    "state": "synced",
    "attempted_at": "2026-09-11T08:12:46Z",
    "error": null
  },
  "applied_at": "2026-09-11T08:12:44Z",
  "cancelled_at": null,
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

StockAdjustmentInput

location_id and lines are required on create; on PATCH every field is optional and lines replaces the set.

Fields
location_idinteger
Shopify location id.
reasonstring or null
correctioncycle_count_availablereceivedrestockdamagedshrinkagepromotionother
notestring or null
linesarray of object
variant_idinteger or null
inventory_item_idinteger or null
product_titlestring or null
variant_titlestring or null
skustring or null
barcodestring or null
deltaintegerrequired
lot_idinteger or null
lot_numberstring or null
lot_unitsinteger or null
Example
{
  "location_id": 61234567890,
  "reason": "correction",
  "note": "Two cartons short; supplier notified.",
  "lines": [
    {
      "variant_id": 40011223344,
      "inventory_item_id": 44811223344,
      "product_title": "Stoneware mug",
      "variant_title": "Blue",
      "sku": "MUG-BLU",
      "barcode": "0123456789012",
      "delta": -3,
      "lot_id": null,
      "lot_number": null,
      "lot_units": null
    }
  ]
}
#

Product

Fields
idintegerrequired
The Shopify product id.
titlestring or nullrequired
handlestring or nullrequired
vendorstring or nullrequired
product_typestring or nullrequired
statusstring or nullrequired
tagsarray of stringrequired
optionsarray of objectrequired
image_urlstring or nullrequired
variants_countintegerrequired
variantsarray of Variant or nullrequired
Present on GET /products/{id} and with include=variants; otherwise null.
shopify_updated_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 7011223344,
  "title": "Stoneware mug",
  "handle": "stoneware-mug",
  "vendor": "Acme",
  "product_type": "Kitchen",
  "status": "active",
  "tags": [],
  "options": [
    {}
  ],
  "image_url": "https://cdn.shopify.com/s/files/1/0001/products/mug-blue.jpg",
  "variants_count": 3,
  "variants": [],
  "shopify_updated_at": "2026-09-11T08:12:40Z",
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

Variant

Fields
idintegerrequired
The Shopify variant id.
product_idinteger or nullrequired
inventory_item_idinteger or nullrequired
titlestring or nullrequired
product_titlestring or nullrequired
skustring or nullrequired
barcodestring or nullrequired
positioninteger or nullrequired
priceMoneyrequired
A decimal string in the accompanying currency.
compare_at_priceMoneyrequired
A decimal string in the accompanying currency.
unit_costMoneyrequired
A decimal string in the accompanying currency.
unit_cost_currencystring or nullrequired
weight_gramsnumber or nullrequired
inventory_trackedbooleanrequired
inventory_policystring or nullrequired
taxableboolean or nullrequired
image_urlstring or nullrequired
shopify_updated_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 40011223344,
  "product_id": 7011223344,
  "inventory_item_id": 44811223344,
  "title": "Blue",
  "product_title": "Stoneware mug",
  "sku": "MUG-BLU",
  "barcode": "0123456789012",
  "position": 1,
  "price": "12.50",
  "compare_at_price": null,
  "unit_cost": "12.50",
  "unit_cost_currency": "USD",
  "weight_grams": 250,
  "inventory_tracked": true,
  "inventory_policy": "deny",
  "taxable": true,
  "image_url": "https://cdn.shopify.com/s/files/1/0001/products/mug-blue.jpg",
  "shopify_updated_at": "2026-09-11T08:12:40Z",
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

Location

Fields
idintegerrequired
The Shopify location id.
namestring or nullrequired
activebooleanrequired
fulfillment_servicestring or nullrequired
addressobjectrequired
line1string or nullrequired
line2string or nullrequired
citystring or nullrequired
province_codestring or nullrequired
zipstring or nullrequired
countrystring or nullrequired
country_codestring or nullrequired
phonestring or nullrequired
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 61234567890,
  "name": "Main warehouse",
  "active": true,
  "fulfillment_service": "manual",
  "address": {
    "line1": "500 Congress Ave",
    "line2": null,
    "city": "Austin",
    "province_code": "TX",
    "zip": "78701",
    "country": "United States",
    "country_code": "US",
    "phone": "+1 512 555 0142"
  },
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

InventoryLevel

Fields
idintegerrequired
inventory_item_idintegerrequired
location_idintegerrequired
The Shopify location id.
availableinteger or nullrequired
on_handinteger or nullrequired
committedinteger or nullrequired
incominginteger or nullrequired
shopify_updated_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 44811223344,
  "inventory_item_id": 44811223344,
  "location_id": 61234567890,
  "available": 42,
  "on_hand": 42,
  "committed": 0,
  "incoming": 24,
  "shopify_updated_at": "2026-09-11T08:12:40Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

WebhookEvent

string
Values
*purchase_order.createdpurchase_order.updatedpurchase_order.orderedpurchase_order.in_transitpurchase_order.receipt_recordedpurchase_order.receivedpurchase_order.closedpurchase_order.reopenedpurchase_order.archivedpurchase_order.deletedpurchase_order.overduereceipt.voidedsupplier.createdsupplier.updatedsupplier.archivedsupplier.mergedstock_adjustment.appliedstock_adjustment.cancelledstock_adjustment.updateditem.low_stockitem.out_of_stockitem.reorder_pointitem.overstockwebhook.test
Example
"*"
#

Webhook

Fields
idintegerrequired
urlstringrequired
descriptionstring or nullrequired
eventsarray of WebhookEventrequired
statusstringrequired
activepauseddisabled
api_versionintegerrequired
consecutive_failuresintegerrequired
last_delivered_atTimestamprequired
ISO 8601, UTC.
last_failed_atTimestamprequired
ISO 8601, UTC.
disabled_atTimestamprequired
ISO 8601, UTC.
disabled_reasonstring or nullrequired
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 3,
  "url": "https://erp.example.com/hooks/stockroom",
  "description": "ERP sync",
  "events": [
    "purchase_order.received",
    "receipt.voided"
  ],
  "status": "active",
  "api_version": 2,
  "consecutive_failures": 0,
  "last_delivered_at": "2026-09-11T08:12:44Z",
  "last_failed_at": null,
  "disabled_at": null,
  "disabled_reason": null,
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

WebhookWithSecret

Fields
secretstringrequired
Shown once. Verify deliveries with it.
idintegerrequired
urlstringrequired
descriptionstring or nullrequired
eventsarray of WebhookEventrequired
statusstringrequired
activepauseddisabled
api_versionintegerrequired
consecutive_failuresintegerrequired
last_delivered_atTimestamprequired
ISO 8601, UTC.
last_failed_atTimestamprequired
ISO 8601, UTC.
disabled_atTimestamprequired
ISO 8601, UTC.
disabled_reasonstring or nullrequired
created_atTimestamprequired
ISO 8601, UTC.
updated_atTimestamprequired
ISO 8601, UTC.
Where it appears
Example
{
  "secret": "whsec_9f86d081884c7d659a2feaa0c55ad015",
  "id": 3,
  "url": "https://erp.example.com/hooks/stockroom",
  "description": "ERP sync",
  "events": [
    "*"
  ],
  "status": "active",
  "api_version": 2,
  "consecutive_failures": 0,
  "last_delivered_at": "2026-09-11T08:12:44Z",
  "last_failed_at": null,
  "disabled_at": null,
  "disabled_reason": null,
  "created_at": "2026-09-01T10:00:00Z",
  "updated_at": "2026-09-11T08:12:44Z"
}
#

WebhookInput

Fields
urlstring (uri)required
eventsarray of WebhookEventrequired
descriptionstring or null
Where it appears
Example
{
  "url": "https://erp.example.com/hooks/stockroom",
  "events": [
    "*"
  ],
  "description": "ERP sync"
}
#

WebhookDelivery

Fields
idintegerrequired
webhook_idintegerrequired
event_idstring or nullrequired
eventstring or nullrequired
attemptintegerrequired
statusstringrequired
succeededfailed
status_codeinteger or nullrequired
duration_msinteger or nullrequired
errorstring or nullrequired
next_attempt_atTimestamprequired
ISO 8601, UTC.
created_atTimestamprequired
ISO 8601, UTC.
Example
{
  "id": 3,
  "webhook_id": 3,
  "event_id": "evt_01J9Z8K3M4N5P6Q7R8S9T0V1W2",
  "event": "purchase_order.received",
  "attempt": 1,
  "status": "succeeded",
  "status_code": 200,
  "duration_ms": 412,
  "error": null,
  "next_attempt_at": null,
  "created_at": "2026-09-01T10:00:00Z"
}
#

WebhookEnvelopePayload

What a webhook delivery POSTs. data is the full v2 object as the matching GET would return it - a PurchaseOrder for purchase_order.* (with a receipt beside it on .receipt_recorded), a Receipt with its purchase_order for receipt.voided, a Supplier, a StockAdjustment, or an ItemCondition for item.*.

Fields
idstringrequired
The event id - the dedupe key. Also in X-Stockroom-Event-Id.
eventWebhookEventrequired
*purchase_order.createdpurchase_order.updatedpurchase_order.orderedpurchase_order.in_transitpurchase_order.receipt_recordedpurchase_order.receivedpurchase_order.closedpurchase_order.reopenedpurchase_order.archivedpurchase_order.deletedpurchase_order.overduereceipt.voidedsupplier.createdsupplier.updatedsupplier.archivedsupplier.mergedstock_adjustment.appliedstock_adjustment.cancelledstock_adjustment.updateditem.low_stockitem.out_of_stockitem.reorder_pointitem.overstockwebhook.test
api_versionintegerrequired
occurred_atstring (date-time)required
shopobjectrequired
idintegerrequired
domainstringrequired
dataobjectrequired
Example
{
  "id": "evt_01J9Z8K3M4N5P6Q7R8S9T0V1W2",
  "event": "purchase_order.received",
  "api_version": 2,
  "occurred_at": "2026-09-11T08:12:44Z",
  "shop": {
    "id": 12,
    "domain": "example.myshopify.com"
  },
  "data": {}
}
#

ItemCondition

The data of an item.* event: one item at one location crossing a threshold. threshold is the level that was crossed (the low stock level, the reorder point or the overstock level); item.out_of_stock has none. Out of stock and low stock read the shelf count; the reorder point reads available plus incoming, the way the Reorder page does.

Fields
inventory_item_idintegerrequired
variant_idinteger or nullrequired
product_idinteger or nullrequired
skustring or nullrequired
product_titlestring or nullrequired
variant_titlestring or nullrequired
locationobjectrequired
idintegerrequired
namestring or nullrequired
availableintegerrequired
incomingintegerrequired
thresholdinteger or nullrequired
Example
{
  "inventory_item_id": 44811223344,
  "variant_id": 40011223344,
  "product_id": 7011223344,
  "sku": "MUG-BLU",
  "product_title": "Stoneware mug",
  "variant_title": "Blue",
  "location": {
    "id": 61234567890,
    "name": "Main warehouse"
  },
  "available": 3,
  "incoming": 24,
  "threshold": 5
}