API reference
Inventory
List locations
/locationsRequired scopes:read_inventory
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Page size, 1–250 (default 50). default 50 · min 1 · max 250 |
cursor | string | next_cursor from the previous page. |
updated_since | string<date-time> | Only objects changed at or after this ISO-8601 time. |
created_since | string<date-time> | Only objects created at or after this ISO-8601 time. |
Example request
curl "https://api.sellorchard.com/v1/locations?limit=50" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200Locations.
ShowHide response schema
dataarray of LocationrequiredShowHide item attributes
objectstringrequiredidintegerrequiredId.
namestringrequiredName.
typestringrequiredKind of place.
One of:
warehouseshopotheraddressAddress | any | nullrequiredShowHide child attributes
One of the following:
Address
first_namestring | nullFirst name.
last_namestring | nullLast name.
companystring | nullCompany.
line1string | nullLine1.
line2string | nullLine2.
citystring | nullCity.
regionstring | nullRegion.
postcodestring | nullPostcode.
countrystring | nullISO 3166-1 alpha-2 country code.
phonestring | nullPhone.
any | null
phonestring | nullrequiredPhone.
fulfils_onlinebooleanrequiredIts stock counts for online orders.
pickupbooleanrequiredOffers local pickup.
priorityintegerrequiredFulfilment priority (lower first).
is_activebooleanrequiredActive.
is_defaultbooleanrequiredThe main location.
timezonestring | nullrequiredIANA time zone.
created_atstring<date-time> | nullrequiredCreated.
updated_atstring<date-time> | nullrequiredLast changed.
has_morebooleanrequiredMore pages after this one.
next_cursorstring | nullrequiredPass as
cursorfor the next page; null on the last page.
{
"data": [
{
"object": "location",
"id": 1,
"name": "Main warehouse",
"type": "warehouse",
"address": {
"first_name": null,
"last_name": null,
"company": null,
"line1": "1 Main St",
"line2": "Apt 2",
"city": "Austin",
"region": "TX",
"postcode": "73301",
"country": "US",
"phone": "+15125550199"
},
"phone": null,
"fulfils_online": true,
"pickup": false,
"priority": 0,
"is_active": true,
"is_default": true,
"timezone": "America/Chicago",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"has_more": false,
"next_cursor": null
}Error responses
- 400
invalid_requestMalformed request (e.g. a bad cursor). - 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
List inventory levels
/inventory-levelsLevels of tracked variants, one row per variant and location; pages (limit, cursor) count variants. updated_since: variants with a level changed since then.
Required scopes:read_inventory
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Page size, 1–250 (default 50). default 50 · min 1 · max 250 |
cursor | string | next_cursor from the previous page. |
updated_since | string<date-time> | Only objects changed at or after this ISO-8601 time. |
created_since | string<date-time> | Only objects created at or after this ISO-8601 time. |
variant_ids | string | Comma-separated variant ids (up to 250). |
location_id | integer | Only this location. |
Example request
curl "https://api.sellorchard.com/v1/inventory-levels?limit=50" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200Levels (one per variant and location), paged by variant.
ShowHide response schema
dataarray of InventoryLevelrequiredShowHide item attributes
objectstringrequiredvariant_idintegerrequiredVariant.
location_idintegerrequiredLocation.
on_handintegerrequiredUnits on hand at the location.
updated_atstring<date-time> | nullrequiredLast change at this location (null when never recorded).
has_morebooleanrequiredMore pages after this one.
next_cursorstring | nullrequiredPass as
cursorfor the next page; null on the last page.
{
"data": [
{
"object": "inventory_level",
"variant_id": 311,
"location_id": 1,
"on_hand": 42,
"updated_at": "2026-11-03T09:30:00Z"
}
],
"has_more": false,
"next_cursor": null
}Error responses
- 400
invalid_requestMalformed request (e.g. a bad cursor). - 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Adjust stock at a location
/inventory-levels/adjustAdds (or takes away) units. Fires inventory.updated.
Required scopes:write_inventory
Headers
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | Any unique string (e.g. a UUID, up to 255 characters). A retry with the same key and body within 24 hours gets the first response again (Idempotent-Replayed: true); the same key with a different body is a 409 conflict. |
Request body
location_idintegerrequiredLocation.
variant_idintegerrequiredTracked variant.
deltaintegerrequiredUnits to add (negative: take away). Stock never goes below 0.
reasonstring | nullNote on the inventory movement.
Example request
curl -X POST "https://api.sellorchard.com/v1/inventory-levels/adjust" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"location_id": 1,
"variant_id": 311,
"delta": -3
}'Response200The level after the change.
ShowHide response schema
dataInventoryLevelrequiredShowHide child attributes
objectstringrequiredvariant_idintegerrequiredVariant.
location_idintegerrequiredLocation.
on_handintegerrequiredUnits on hand at the location.
updated_atstring<date-time> | nullrequiredLast change at this location (null when never recorded).
{
"data": {
"object": "inventory_level",
"variant_id": 311,
"location_id": 1,
"on_hand": 42,
"updated_at": "2026-11-03T09:30:00Z"
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 409
conflictThe Idempotency-Key was used with a different request, or that request is still running. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Set stock at a location
/inventory-levels/setSets the units on hand (recorded as a count). Fires inventory.updated.
Required scopes:write_inventory
Headers
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | Any unique string (e.g. a UUID, up to 255 characters). A retry with the same key and body within 24 hours gets the first response again (Idempotent-Replayed: true); the same key with a different body is a 409 conflict. |
Request body
location_idintegerrequiredLocation.
variant_idintegerrequiredTracked variant.
on_handintegerrequiredUnits on hand (a count).
reasonstring | nullNote on the inventory movement.
Example request
curl -X POST "https://api.sellorchard.com/v1/inventory-levels/set" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"location_id": 1,
"variant_id": 311,
"on_hand": 40
}'Response200The level after the change.
ShowHide response schema
dataInventoryLevelrequiredShowHide child attributes
objectstringrequiredvariant_idintegerrequiredVariant.
location_idintegerrequiredLocation.
on_handintegerrequiredUnits on hand at the location.
updated_atstring<date-time> | nullrequiredLast change at this location (null when never recorded).
{
"data": {
"object": "inventory_level",
"variant_id": 311,
"location_id": 1,
"on_hand": 42,
"updated_at": "2026-11-03T09:30:00Z"
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 409
conflictThe Idempotency-Key was used with a different request, or that request is still running. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.