Define a private fulfilment-status pipeline and assign it to orders
/admin/api/internal-order-statuses
List every internal order status ordered by sort_order ascending, then id. Each entry is annotated with assigned_order_count, the number of orders currently assigned to it.
/admin/api/internal-order-statuses
Create a new internal order status. color must be one of the badge palette values and defaults to neutral; sort_order defaults to 0.
/admin/api/internal-order-statuses/{id}
Partial update of an internal order status. Any field may be omitted; omitted fields are left unchanged.
/admin/api/internal-order-statuses/{id}
Delete an internal order status. Any orders assigned to it have their internal_status_id cleared; the response reports how many were affected.
/admin/api/internal-order-statuses/reorder
Bulk reorder statuses. Accepts a list of {id, sort_order} pairs and updates each row's sort_order atomically. IDs not mentioned are left unchanged.
/admin/api/internal-order-statuses
List every internal order status ordered by sort_order ascending, then id. Each entry is annotated with assigned_order_count, the number of orders currently assigned to it.
[
{
"id": 1,
"name": "Awaiting stock",
"color": "warning",
"sort_order": 0,
"created_at": "2026-04-15T09:00:00Z",
"updated_at": "2026-04-15T09:00:00Z",
"assigned_order_count": 12
},
{
"id": 2,
"name": "Packed",
"color": "success",
"sort_order": 10,
"created_at": "2026-04-15T09:05:00Z",
"updated_at": "2026-04-15T09:05:00Z",
"assigned_order_count": 3
}
]
curl "https://yourshop.zeroshop.io/admin/api/internal-order-statuses" \
-H "Authorization: Bearer zspat_..."
import requests
resp = requests.get(
"https://yourshop.zeroshop.io/admin/api/internal-order-statuses",
headers={"Authorization": "Bearer zspat_..."}
)
statuses = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/internal-order-statuses", {
headers: { "Authorization": "Bearer zspat_..." }
});
const statuses = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/internal-order-statuses")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer zspat_..."
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
statuses = JSON.parse(resp.body)
/admin/api/internal-order-statuses
Create a new internal order status. color must be one of the badge palette values and defaults to neutral; sort_order defaults to 0.
{
"name": "Packed",
"color": "success",
"sort_order": 10
}
{
"id": 2,
"name": "Packed",
"color": "success",
"sort_order": 10,
"created_at": "2026-05-03T10:00:00Z",
"updated_at": "2026-05-03T10:00:00Z",
"assigned_order_count": 0
}
curl -X POST "https://yourshop.zeroshop.io/admin/api/internal-order-statuses" \
-H "Authorization: Bearer zspat_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Packed",
"color": "success",
"sort_order": 10
}'
import requests
resp = requests.post(
"https://yourshop.zeroshop.io/admin/api/internal-order-statuses",
headers={"Authorization": "Bearer zspat_..."},
json={
"name": "Packed",
"color": "success",
"sort_order": 10
}
)
status = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/internal-order-statuses", {
method: "POST",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Packed",
color: "success",
sort_order: 10
})
});
const status = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/internal-order-statuses")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = {
name: "Packed",
color: "success",
sort_order: 10
}.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
status = JSON.parse(resp.body)
/admin/api/internal-order-statuses/{id}
Partial update of an internal order status. Any field may be omitted; omitted fields are left unchanged.
{
"name": "Packed & labeled"
}
{
"id": 2,
"name": "Packed & labeled",
"color": "success",
"sort_order": 10,
"created_at": "2026-04-15T09:05:00Z",
"updated_at": "2026-05-03T10:05:00Z",
"assigned_order_count": 3
}
curl -X PATCH "https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2" \
-H "Authorization: Bearer zspat_..." \
-H "Content-Type: application/json" \
-d '{"name": "Packed & labeled"}'
import requests
resp = requests.patch(
"https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2",
headers={"Authorization": "Bearer zspat_..."},
json={"name": "Packed & labeled"}
)
status = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2", {
method: "PATCH",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({ name: "Packed & labeled" })
});
const status = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2")
req = Net::HTTP::Patch.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = { name: "Packed & labeled" }.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
status = JSON.parse(resp.body)
/admin/api/internal-order-statuses/{id}
Delete an internal order status. Any orders assigned to it have their internal_status_id cleared; the response reports how many were affected.
{
"deleted": true,
"affected_orders": 3
}
curl -X DELETE "https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2" \
-H "Authorization: Bearer zspat_..."
import requests
resp = requests.delete(
"https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2",
headers={"Authorization": "Bearer zspat_..."}
)
result = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2", {
method: "DELETE",
headers: { "Authorization": "Bearer zspat_..." }
});
const result = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/2")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer zspat_..."
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
result = JSON.parse(resp.body)
/admin/api/internal-order-statuses/reorder
Bulk reorder statuses. Accepts a list of {id, sort_order} pairs and updates each row's sort_order atomically. IDs not mentioned are left unchanged.
{
"items": [
{
"id": 2,
"sort_order": 0
},
{
"id": 1,
"sort_order": 10
}
]
}
curl -X POST "https://yourshop.zeroshop.io/admin/api/internal-order-statuses/reorder" \
-H "Authorization: Bearer zspat_..." \
-H "Content-Type: application/json" \
-d '{
"items": [
{"id": 2, "sort_order": 0},
{"id": 1, "sort_order": 10}
]
}'
import requests
requests.post(
"https://yourshop.zeroshop.io/admin/api/internal-order-statuses/reorder",
headers={"Authorization": "Bearer zspat_..."},
json={
"items": [
{"id": 2, "sort_order": 0},
{"id": 1, "sort_order": 10}
]
}
)
await fetch("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/reorder", {
method: "POST",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
items: [
{ id: 2, sort_order: 0 },
{ id: 1, sort_order: 10 }
]
})
});
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/internal-order-statuses/reorder")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = {
items: [
{ id: 2, sort_order: 0 },
{ id: 1, sort_order: 10 }
]
}.to_json
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
We value your privacy
We use cookies for essential site functionality and, with your consent, analytics to understand how our platform is used. No personal data is shared with third parties. See our Privacy Policy for details.