Admin API
Webhooks
Subscriptions to store events and their delivery log.
Webhook subscriptions (an app token sees only its own)
GET/admin/2026-11/webhooks
Query parameters
limitintegerItems per page, 1 to 250.
Default 50 · 1 to 250
afterstringCursor from a previous next_cursor.
Up to 512 characters
app_idID (app_...)
Response 200
dataarray of objectrequireddata[].idID (whs_...)requireddata[].app_idID (app_...)requireddata[].urlstringrequireddata[].topicsarray of enumrequiredOne of
order.createdorder.paidorder.cancelledorder.fulfilledorder.refundedrefund.processedrefund.failedproduct.createdproduct.updatedproduct.deletedinventory.lowinventory.out_of_stockcustomer.createdcustomer.updatedcheckout.completeddata[].api_versionstringrequireddata[].statusenumrequiredOne of
activepauseddata[].paused_reasonstring or nullrequireddata[].delivery_ratenumber or nullrequiredShare of deliveries in the last 7 days that succeeded.
data[].created_attimestamprequiredhas_morebooleanrequirednext_cursorstring or nullrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/webhooks \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"data": [
{
"id": "whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"app_id": "app_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"url": "https://example.com",
"topics": [
"order.created"
],
"api_version": "string",
"status": "active",
"paused_reason": "string",
"delivery_rate": 1,
"created_at": "2026-11-04T10:00:00.000Z"
}
],
"has_more": false,
"next_cursor": "eyJpZCI6Ii4uLiJ9"
}Subscribe a URL to topics; the signing secret is shown once
POST/admin/2026-11/webhooks
scope write_webhooksIdempotency-Key required
Headers
Idempotency-KeystringrequiredUnique key for this request. Retries with the same key return the first response.
At least 1 characters · Up to 255 characters
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
app_idID (app_...)Required with a seller session; an app token always uses its own app.
urlstringrequiredUp to 500 characters
topicsarray of enumrequiredOne of
order.createdorder.paidorder.cancelledorder.fulfilledorder.refundedrefund.processedrefund.failedproduct.createdproduct.updatedproduct.deletedinventory.lowinventory.out_of_stockcustomer.createdcustomer.updatedcheckout.completedUp to 15 items
Response 201
webhookobjectrequiredwebhook.idID (whs_...)requiredwebhook.app_idID (app_...)requiredwebhook.urlstringrequiredwebhook.topicsarray of enumrequiredOne of
order.createdorder.paidorder.cancelledorder.fulfilledorder.refundedrefund.processedrefund.failedproduct.createdproduct.updatedproduct.deletedinventory.lowinventory.out_of_stockcustomer.createdcustomer.updatedcheckout.completedwebhook.api_versionstringrequiredwebhook.statusenumrequiredOne of
activepausedwebhook.paused_reasonstring or nullrequiredwebhook.delivery_ratenumber or nullrequiredShare of deliveries in the last 7 days that succeeded.
webhook.created_attimestamprequiredsecretstringrequiredShown only once.
Errors
| 400 | idempotency_key_required | Every POST needs an Idempotency-Key header. |
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 422 | idempotency_key_reused | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X POST https://api.storelyne.com/admin/2026-11/webhooks \
-H "Authorization: Bearer pat_live_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"topics": [
"order.created"
]
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.com",
"topics": [
"order.created"
]
}),
});
const data = await res.json();{
"webhook": {
"id": "whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"app_id": "app_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"url": "https://example.com",
"topics": [
"order.created"
],
"api_version": "string",
"status": "active",
"paused_reason": "string",
"delivery_rate": 1,
"created_at": "2026-11-04T10:00:00.000Z"
},
"secret": "string"
}Change the URL or topics, or pause and resume
PATCH/admin/2026-11/webhooks/{id}
Path parameters
idID (whs_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
urlstringUp to 500 characters
topicsarray of enumOne of
order.createdorder.paidorder.cancelledorder.fulfilledorder.refundedrefund.processedrefund.failedproduct.createdproduct.updatedproduct.deletedinventory.lowinventory.out_of_stockcustomer.createdcustomer.updatedcheckout.completedstatusenumOne of
activepaused
Response 200
idID (whs_...)requiredapp_idID (app_...)requiredurlstringrequiredtopicsarray of enumrequiredOne of
order.createdorder.paidorder.cancelledorder.fulfilledorder.refundedrefund.processedrefund.failedproduct.createdproduct.updatedproduct.deletedinventory.lowinventory.out_of_stockcustomer.createdcustomer.updatedcheckout.completedapi_versionstringrequiredstatusenumrequiredOne of
activepausedpaused_reasonstring or nullrequireddelivery_ratenumber or nullrequiredShare of deliveries in the last 7 days that succeeded.
created_attimestamprequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X PATCH https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"topics": [
"order.created"
],
"status": "active"
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.com",
"topics": [
"order.created"
],
"status": "active"
}),
});
const data = await res.json();{
"id": "whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"app_id": "app_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"url": "https://example.com",
"topics": [
"order.created"
],
"api_version": "string",
"status": "active",
"paused_reason": "string",
"delivery_rate": 1,
"created_at": "2026-11-04T10:00:00.000Z"
}Remove a subscription
DEL/admin/2026-11/webhooks/{id}
Path parameters
idID (whs_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Response 204
No body.
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X DELETE https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();No body.
Delivery log, newest first
GET/admin/2026-11/webhooks/{id}/deliveries
Path parameters
idID (whs_...)required
Query parameters
limitintegerItems per page, 1 to 250.
Default 50 · 1 to 250
afterstringCursor from a previous next_cursor.
Up to 512 characters
Response 200
dataarray of objectrequireddata[].idID (whd_...)requireddata[].event_idstringrequireddata[].topicstringrequireddata[].statusenumrequiredOne of
pendingsucceededfaileddata[].attemptsintegerrequireddata[].status_codeinteger or nullrequireddata[].duration_msinteger or nullrequireddata[].response_excerptstringrequiredFirst 2 KB of the last response.
data[].next_attempt_attimestamp or nullrequireddata[].created_attimestamprequiredhas_morebooleanrequirednext_cursorstring or nullrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/deliveries \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/deliveries', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"data": [
{
"id": "whd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"event_id": "string",
"topic": "string",
"status": "pending",
"attempts": 1,
"status_code": 1,
"duration_ms": 1,
"response_excerpt": "string",
"next_attempt_at": "2026-11-04T10:00:00.000Z",
"created_at": "2026-11-04T10:00:00.000Z"
}
],
"has_more": false,
"next_cursor": "eyJpZCI6Ii4uLiJ9"
}Send a delivery again now
POST/admin/2026-11/webhooks/{id}/deliveries/{delivery_id}/resend
scope write_webhooksIdempotency-Key required
Path parameters
idID (whs_...)requireddelivery_idID (whd_...)required
Headers
Idempotency-KeystringrequiredUnique key for this request. Retries with the same key return the first response.
At least 1 characters · Up to 255 characters
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Response 202
idID (whd_...)requiredevent_idstringrequiredtopicstringrequiredstatusenumrequiredOne of
pendingsucceededfailedattemptsintegerrequiredstatus_codeinteger or nullrequiredduration_msinteger or nullrequiredresponse_excerptstringrequiredFirst 2 KB of the last response.
next_attempt_attimestamp or nullrequiredcreated_attimestamprequired
Errors
| 400 | idempotency_key_required | Every POST needs an Idempotency-Key header. |
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 422 | idempotency_key_reused | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X POST https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/deliveries/whd_01JCG8ZQ5S7T0V4X8K2M3N6P9R/resend \
-H "Authorization: Bearer pat_live_..." \
-H "Idempotency-Key: $(uuidgen)"const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/deliveries/whd_01JCG8ZQ5S7T0V4X8K2M3N6P9R/resend', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await res.json();{
"id": "whd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"event_id": "string",
"topic": "string",
"status": "pending",
"attempts": 1,
"status_code": 1,
"duration_ms": 1,
"response_excerpt": "string",
"next_attempt_at": "2026-11-04T10:00:00.000Z",
"created_at": "2026-11-04T10:00:00.000Z"
}Send a webhook.test event to this URL now
POST/admin/2026-11/webhooks/{id}/test
scope write_webhooksIdempotency-Key required
Path parameters
idID (whs_...)required
Headers
Idempotency-KeystringrequiredUnique key for this request. Retries with the same key return the first response.
At least 1 characters · Up to 255 characters
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Response 202
idID (whd_...)requiredevent_idstringrequiredtopicstringrequiredstatusenumrequiredOne of
pendingsucceededfailedattemptsintegerrequiredstatus_codeinteger or nullrequiredduration_msinteger or nullrequiredresponse_excerptstringrequiredFirst 2 KB of the last response.
next_attempt_attimestamp or nullrequiredcreated_attimestamprequired
Errors
| 400 | idempotency_key_required | Every POST needs an Idempotency-Key header. |
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 422 | idempotency_key_reused | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X POST https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/test \
-H "Authorization: Bearer pat_live_..." \
-H "Idempotency-Key: $(uuidgen)"const res = await fetch('https://api.storelyne.com/admin/2026-11/webhooks/whs_01JCG8ZQ5S7T0V4X8K2M3N6P9R/test', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Idempotency-Key': crypto.randomUUID(),
},
});
const data = await res.json();{
"id": "whd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"event_id": "string",
"topic": "string",
"status": "pending",
"attempts": 1,
"status_code": 1,
"duration_ms": 1,
"response_excerpt": "string",
"next_attempt_at": "2026-11-04T10:00:00.000Z",
"created_at": "2026-11-04T10:00:00.000Z"
}