Orders
Order status
Returns the current state of one order or up to 100 orders in the standard format, plus clear extra fields: the refund, the reason, and whether cancel or refill is possible right now. The same projection feeds order_details and webhooks, so they always agree.
https://notpanel.com/api/v3action=status- API key required
- Rate limited
- Body:
application/x-www-form-urlencoded
Parameters
Always sent
keystringRequired- Your API key.
actionstringRequiredstatusMust be the literal string "status".
Send order or orders.
orderintegerOne of these- One order number. Orders placed before 2026-08-25 can still be read with the id they were given then; the reply uses the order number.
ordersstring (CSV)One of these- Up to 100 comma-separated order numbers. When both are sent,
orderswins.
curl -X POST https://notpanel.com/api/v3 \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "key=YOUR_API_KEY&action=status&order=1234568"const res = await fetch("https://notpanel.com/api/v3", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
action: "status",
order: "1234568",
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://notpanel.com/api/v3",
data={
"key": "YOUR_API_KEY",
"action": "status",
"order": "1234568",
},
)
print(res.json())<?php
$body = http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'status',
'order' => '1234568',
]);
$response = file_get_contents('https://notpanel.com/api/v3', false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $body,
'ignore_errors' => true,
],
]));
print_r(json_decode($response, true));
Replace YOUR_API_KEY with the key from your API page.
{
"charge": "0.87",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD",
"order": 1234568,
"status_key": "partial",
"refund": "0.13",
"reason_code": "partially_delivered",
"reason": "Part of the order was delivered. The rest was refunded.",
"can_cancel": false,
"cancel_available": false,
"cancel_state": null,
"can_refill": true,
"refill_available_at": null,
"updated_at": "2026-10-03T12:00:00Z"
}Errors
- 400
{"error":"Missing required parameter: order","error_code":"MISSING_PARAMETER","retryable":false,"details":{"param":"order"}}Neither order nor orders was sent.
- 400
{"error":"Maximum 100 IDs per request","error_code":"TOO_MANY_IDS","retryable":false}More than 100 order numbers in orders.
- 404
{"error":"Order not found","error_code":"ORDER_NOT_FOUND","retryable":false}The order does not exist or belongs to another account. Both cases give the same answer.
Response fields
The first five fields keep the standard shape that panel scripts read, and order repeats the number. The others are additions.
Response fields
chargestring- What the order costs you now, in USD, as a string. It is net of any refund.
start_countstring- The count when delivery started, or
"0"when it is not known. statusstring- The status word. See Status values.
remainsstring- Quantity not delivered yet. A completed order always shows
"0". currencystring- Always
USD. orderinteger- The order number.
status_keystring- Stable lowercase form of the status, for logic.
refundstring- Money returned to your wallet for this order, as a string;
0.00when nothing was refunded. reason_codestring | null- Why the order ended the way it did, or
null. See Reason codes. reasonstring | null- A fixed English sentence for
reason_code, ornull. can_cancelbooleantruewhen a cancel is possible right now, instant or as a request.cancel_availablebooleantruewhile the order can be canceled right now for a full refund: in the first seconds after placement, or while it waits and was never sent.cancel_statestring | nullrequestedorrefusedafter a cancel request, otherwisenull.can_refillbooleantruewhen a refill can be requested now.refill_available_atstring | null- When the next refill becomes possible, or
null. updated_atstring- When the order last changed.
Status values
- Pending
status_key=pendingPending— accepted and not sent yet. For the first 15 seconds the order can be canceled for free. - Processing
status_key=processingProcessing— sent and waiting for delivery to begin. An order whose send is not confirmed also shows as processing. - In progress
status_key=in_progressDelivery is in flight.
- Completed
status_key=completedCompleted— fully delivered.remainsis always"0". - Partial
status_key=partialPartial— part of the order was delivered and the rest was refunded. Refill may be available. - Canceled
status_key=cancelledCanceled— nothing more will be delivered and the charge was refunded in full or in part.reason_codesays why.
Reason codes
When an order ends early, reason_code says why and reason holds the fixed sentence. The money is in refund, never in the sentence. Treat an unknown code as a generic reason: new codes can be added.
Reason codes and sentences
customer_canceled- You canceled this order. The charge was refunded.
canceled_on_request- Canceled at your request. The charge was refunded.
canceled_on_request_partial- Canceled at your request. Part of the order was delivered. The rest was refunded.
canceled_overdue- Canceled because it took too long. The charge was refunded.
delivery_canceled- This order was canceled. The charge was refunded.
partially_delivered- Part of the order was delivered. The rest was refunded.
link_invalid- The link is wrong or private. The charge was refunded.
link_busy- This link already had an active order. The charge was refunded.
service_unavailable- The service was not available. The charge was refunded.
quantity_rejected- The quantity was not accepted. The charge was refunded.
details_rejected- The order details were not accepted. The charge was refunded.
price_changed- The price changed before the order started. The charge was refunded.
start_failed- The order could not be started. The charge was refunded.
not_started_in_time- The order could not be started in time. The charge was refunded.
admin_refund- Refunded by support.
admin_completed- Marked completed by support.
legacy_canceled- Canceled.
legacy_refunded- Refunded.
Refunds and charge
key=YOUR_API_KEY&action=status&order=1234569{
"charge": "0.00",
"start_count": "0",
"status": "Canceled",
"remains": "1000",
"currency": "USD",
"order": 1234569,
"status_key": "cancelled",
"refund": "1.20",
"reason_code": "customer_canceled",
"reason": "You canceled this order. The charge was refunded.",
"can_cancel": false,
"cancel_available": false,
"cancel_state": null,
"can_refill": false,
"refill_available_at": null,
"updated_at": "2026-10-03T10:00:09Z"
}Many orders at once
With orders the reply is an object keyed by each requested id. Every id gets either its status object or an error object, and the HTTP status stays 200. Up to 100 ids per request.
key=YOUR_API_KEY&action=status&orders=1234567,1234568,999{
"999": {
"error": "Order not found",
"error_code": "ORDER_NOT_FOUND",
"retryable": false
},
"1234567": {
"charge": "1.20",
"start_count": "3572",
"status": "Completed",
"remains": "0",
"currency": "USD",
"order": 1234567,
"status_key": "completed",
"refund": "0.00",
"reason_code": null,
"reason": null,
"can_cancel": false,
"cancel_available": false,
"cancel_state": null,
"can_refill": false,
"refill_available_at": "2026-10-03T18:35:00Z",
"updated_at": "2026-10-03T12:35:00Z"
},
"1234568": {
"charge": "0.87",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD",
"order": 1234568,
"status_key": "partial",
"refund": "0.13",
"reason_code": "partially_delivered",
"reason": "Part of the order was delivered. The rest was refunded.",
"can_cancel": false,
"cancel_available": false,
"cancel_state": null,
"can_refill": true,
"refill_available_at": null,
"updated_at": "2026-10-03T12:00:00Z"
}
}