StockroomAPIOpen the app
Reference

Suppliers

Suppliers and their per-supplier catalogs: supplier SKU, cost, minimum order quantity and pack size. Archive, unarchive and merge are actions rather than fields; nothing in Stockroom deletes a supplier.

#

List suppliers

GETapi.stockroom.app/v2/suppliers

Archived suppliers are left out unless archived=true (only archived) or archived=all.

Query
limitintegerquery
cursorstringquery
next_cursor from the previous page. A cursor that cannot be read is 400 invalid_cursor.
updated_at_minstring (date-time)query
updated_at_maxstring (date-time)query
created_at_minstring (date-time)query
created_at_maxstring (date-time)query
archivedstringquery
truefalseall
Responses
200
A page of suppliers, oldest update first.
a page of Supplier in data, with next_cursor and has_more
Request
curl "https://api.stockroom.app/v2/suppliers" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": [
    {
      "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"
    }
  ],
  "next_cursor": "eyJpZCI6MTA0Mn0",
  "has_more": true
}
#

Create a supplier

POSTapi.stockroom.app/v2/suppliers
BodyJSON
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
Responses
201
The new supplier.
Supplier in data
Request
curl -X POST "https://api.stockroom.app/v2/suppliers" \
  -H "Authorization: Bearer $STOCKROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "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": []
}'
Body
{
  "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": []
}
Response 201
{
  "data": {
    "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"
  }
}
#

Merge suppliers

POSTapi.stockroom.app/v2/suppliers/merge

Fold source_ids into target_id. Purchase orders and supplier catalog rows move to the target, the target's blank details are filled from the sources, and each source is archived with merged_into_id set. A source with a live Stockroom Network link is refused (merge_network_blocked).

BodyJSON
target_idintegerrequired
source_idsarray of integerrequired
Responses
200
The surviving supplier and what moved.
Supplier in data
Request
curl -X POST "https://api.stockroom.app/v2/suppliers/merge" \
  -H "Authorization: Bearer $STOCKROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "target_id": 7,
  "source_ids": [
    1
  ]
}'
Body
{
  "target_id": 7,
  "source_ids": [
    1
  ]
}
Response 200
{
  "data": {
    "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"
  },
  "moved": {
    "purchase_orders": 3,
    "items": 14,
    "suppliers": 2
  }
}
#

Get a supplier

GETapi.stockroom.app/v2/suppliers/{id}
Path
idintegerpathrequired
Responses
200
The supplier.
Supplier in data
Request
curl "https://api.stockroom.app/v2/suppliers/7" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": {
    "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"
  }
}
#

Update a supplier

PATCHapi.stockroom.app/v2/suppliers/{id}

Partial - only the fields sent change.

Path
idintegerpathrequired
BodyJSON
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
Responses
200
The updated supplier.
Supplier in data
Request
curl -X PATCH "https://api.stockroom.app/v2/suppliers/7" \
  -H "Authorization: Bearer $STOCKROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "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": []
}'
Body
{
  "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": []
}
Response 200
{
  "data": {
    "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"
  }
}
#

Archive a supplier

POSTapi.stockroom.app/v2/suppliers/{id}/archive

An archived supplier is hidden from pickers and lists but keeps its history.

Path
idintegerpathrequired
Responses
200
The archived supplier.
Supplier in data
Request
curl -X POST "https://api.stockroom.app/v2/suppliers/7/archive" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": {
    "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"
  }
}
#

Restore an archived supplier

POSTapi.stockroom.app/v2/suppliers/{id}/unarchive
Path
idintegerpathrequired
Responses
200
The restored supplier.
Supplier in data
Request
curl -X POST "https://api.stockroom.app/v2/suppliers/7/unarchive" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": {
    "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"
  }
}
#

List a supplier's catalog

GETapi.stockroom.app/v2/suppliers/{id}/catalog

The items this supplier is set up to sell - supplier SKU, pack size, minimum order quantity, whether it is the primary supplier, and the price list (effective and upcoming tiers).

Path
idintegerpathrequired
Query
limitintegerquery
cursorstringquery
next_cursor from the previous page. A cursor that cannot be read is 400 invalid_cursor.
updated_at_minstring (date-time)query
updated_at_maxstring (date-time)query
created_at_minstring (date-time)query
created_at_maxstring (date-time)query
Responses
200
A page of catalog rows.
a page of SupplierCatalogRow in data, with next_cursor and has_more
Request
curl "https://api.stockroom.app/v2/suppliers/7/catalog" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": [
    {
      "inventory_item_id": 44811223344,
      "supplier_sku": "ACME-MUG-BLU",
      "pack_size": 12,
      "pack_unit": "case",
      "min_order_qty": 6,
      "is_primary": true,
      "source": "api",
      "price": "12.50",
      "price_currency": "USD",
      "price_list": {
        "effective": {
          "currency": "USD",
          "effective_from": null,
          "source": "api",
          "tiers": [
            {}
          ]
        },
        "upcoming": {
          "currency": "USD",
          "effective_from": null,
          "source": "api",
          "tiers": [
            {}
          ]
        }
      },
      "created_at": "2026-09-01T10:00:00Z",
      "updated_at": "2026-09-11T08:12:44Z"
    }
  ],
  "next_cursor": "eyJpZCI6MTA0Mn0",
  "has_more": true
}
#

Add or update catalog rows

PUTapi.stockroom.app/v2/suppliers/{id}/catalog

Each row names an item by inventory_item_id or variant_id (Shopify ids). Fields left out are left alone. tiers replaces the item's whole price list for this supplier (tiers: [] removes it); is_primary: true makes this the item's primary supplier and clears any other supplier's pin. An unknown or foreign item refuses the whole request before anything is written.

Path
idintegerpathrequired
BodyJSON
rowsarray of SupplierCatalogRowInputrequired
Responses
200
The rows as they now stand.
a page of SupplierCatalogRow in data, with next_cursor and has_more
Request
curl -X PUT "https://api.stockroom.app/v2/suppliers/7/catalog" \
  -H "Authorization: Bearer $STOCKROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rows": [
    {
      "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"
    }
  ]
}'
Body
{
  "rows": [
    {
      "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"
    }
  ]
}
Response 200
{
  "data": [
    {
      "inventory_item_id": 44811223344,
      "supplier_sku": "ACME-MUG-BLU",
      "pack_size": 12,
      "pack_unit": "case",
      "min_order_qty": 6,
      "is_primary": true,
      "source": "api",
      "price": "12.50",
      "price_currency": "USD",
      "price_list": {
        "effective": {
          "currency": "USD",
          "effective_from": null,
          "source": "api",
          "tiers": [
            {}
          ]
        },
        "upcoming": {
          "currency": "USD",
          "effective_from": null,
          "source": "api",
          "tiers": [
            {}
          ]
        }
      },
      "created_at": "2026-09-01T10:00:00Z",
      "updated_at": "2026-09-11T08:12:44Z"
    }
  ]
}
#

Remove an item from a supplier's catalog

DELETEapi.stockroom.app/v2/suppliers/{id}/catalog/{inventory_item_id}

Removes the association and this supplier's prices for the item. Purchase order lines already written keep their values.

Path
idintegerpathrequired
inventory_item_idintegerpathrequired
Responses
200
Removed.
200 answer, in data
inventory_item_idintegerrequired
deletedbooleanrequired
Request
curl -X DELETE "https://api.stockroom.app/v2/suppliers/7/catalog/44811223344" \
  -H "Authorization: Bearer $STOCKROOM_KEY"
Response 200
{
  "data": {
    "inventory_item_id": 44811223344,
    "deleted": true
  }
}