Endpoints
Base path: /agents/v1
Core read endpoints
GET /healthGET /readinessGET /auth/whoamiGET /adoption/metricsGET /metricsGET /incidentsGET /lifecycleGET /diagnostics/bundleGET /productsGET /variantsGET /variants/showGET /subscriptionsGET /subscriptions/showGET /transfersGET /transfers/showGET /donationsGET /donations/showGET /ordersGET /orders/showGET /entriesGET /entries/showGET /assetsGET /assets/showGET /categoriesGET /categories/showGET /tagsGET /tags/showGET /global-setsGET /global-sets/showGET /addresses(only whenPLUGIN_AGENTS_ENABLE_ADDRESSES_API=true)GET /addresses/show(only whenPLUGIN_AGENTS_ENABLE_ADDRESSES_API=true)GET /content-blocksGET /content-blocks/showGET /users(only whenPLUGIN_AGENTS_ENABLE_USERS_API=true)GET /users/show(only whenPLUGIN_AGENTS_ENABLE_USERS_API=true)GET /changesGET /sectionsGET /sync-state/lagPOST /sync-state/checkpoint- Deprecated aliases (still supported during transition):
GET /consumers/lagPOST /consumers/checkpoint
GET /templatesGET /starter-packsGET /schemaGET /capabilitiesGET /openapi.json
Root aliases (guarded, same auth/scope behavior):
GET /capabilities->/agents/v1/capabilitiesGET /openapi.json->/agents/v1/openapi.json
Webhook reliability endpoints
GET /webhooks/dlqPOST /webhooks/dlq/replay
Control endpoints (experimental)
Available only when PLUGIN_AGENTS_WRITES_EXPERIMENTAL=true:
GET /control/policiesPOST /control/policies/upsertGET /control/approvalsPOST /control/approvals/requestPOST /control/approvals/decideGET /control/executionsPOST /control/policy-simulatePOST /control/actions/executeGET /control/audit
Key parameter notes
Products
status=live|pending|disabled|expired|allsort=updatedAt|createdAt|titleqlimit(1..200)cursor,updatedSincelowStock=true|false|1|0|yes|no|on|off(full-sync mode only)lowStockThreshold(integer >= 0, default10; used withlowStock=true)fields(comma-separated projection paths)filter(comma-separatedpath:valueexpressions; supports~valuecontains and*wildcard)- Product items include
hasUnlimitedStockandtotalStock
Variants
status=live|pending|disabled|expired|allq,sku,productIdlimitcursor,updatedSincefieldsfilter/variants/showrequires exactly one ofidorsku(optionalproductId)- Variant list and detail payloads include
stock,hasUnlimitedStock, andisAvailable
Subscriptions
status=active|expired|suspended|canceled|allq,reference,userId,planIdlimitcursor,updatedSincefieldsfilter/subscriptions/showrequires exactly one ofidorreference
Transfers
status,q,originLocationId,destinationLocationIdlimitcursor,updatedSincefieldsfilter/transfers/showrequiresid
Donations
status=live|pending|disabled|expired|allq,skulimitcursor,updatedSincefieldsfilter/donations/showrequires exactly one ofidorsku
Orders
statuslastDayslimitcursor,updatedSincefieldsfilter/orders/showrequires exactly one ofidornumber
Entries
section,type,status,search/qlimitcursor,updatedSincefieldsfilter/entries/showrequires exactly one ofidorslug
Assets / Categories / Tags / Global Sets
/assets:q,volume,kind,limit,cursor,updatedSince,fields,filter/assets/show: exactly one ofidorfilename(optionalvolume)/categories:q,group,limit,cursor,updatedSince,fields,filter/categories/show: exactly one ofidorslug(optionalgroup)/tags:q,group,limit,cursor,updatedSince,fields,filter/tags/show: exactly one ofidorslug(optionalgroup)/global-sets:q,limit,cursor,updatedSince,fields,filter/global-sets/show: exactly one ofidorhandle
Addresses / Content Blocks
/addresses(flag-gated):q,ownerId,countryCode,postalCode,limit,cursor,updatedSince,fields,filter/addresses/show: exactly one ofidoruid(optionalownerId)/content-blocks:q,ownerId,fieldId,limit,cursor,updatedSince,fields,filter/content-blocks/show: exactly one ofidoruid(optionalownerId,fieldId)
Users
status=active|inactive|pending|suspended|locked|credentialed|allgroup,qlimitcursor,updatedSincefieldsfilter/users/showrequires exactly one ofidorusername
Changes
types(products,variants,subscriptions,transfers,donations,orders,entries,assets,categories,tags,globalsets,addresses,contentblocks,users)cursor,updatedSincelimitfieldsfilter
Incidents
severity(all|warn|critical, defaultall)limit(1..200, default50)- payload is strict-redacted and derived from runtime reliability signals
Sync-state checkpoint request body
POST /sync-state/checkpoint accepts:
integrationKey(optional for dedicated credentials; when provided it must match the authenticated credential id)resourceType(required)cursor(optional)updatedSince(optional RFC3339-like datetime)checkpointAt(optional; defaults to now)metadata(optional object)
Notes:
- dedicated sync-state credentials default
integrationKeyto their credential id when omitted - the legacy default token may only write arbitrary
integrationKeyvalues when it is the sole configured runtime credential
Schema catalog query params
GET /schema supports:
version(defaults tov1)endpoint(optional endpoint key likeproducts.list)
Webhook DLQ query/body params
GET /webhooks/dlq:status=failed|queued,limitPOST /webhooks/dlq/replay: eitheridormode=all(+ optionallimitfor all-mode)
Approvals request body requirements
POST /control/approvals/request requires:
actionType- provenance metadata fields:
metadata.sourcemetadata.agentIdmetadata.traceId
Request/response examples
Set once:
export BASE_URL="https://your-site.tld"
export AGENTS_API_KEY="<token>"GET /auth/whoami
Happy path:
curl -sS "$BASE_URL/agents/v1/auth/whoami" \
-H "Authorization: Bearer $AGENTS_API_KEY"Example response (200):
{
"ok": true,
"data": {
"credentialId": "cred_8f9f4d",
"label": "integration-bot",
"scopes": ["auth:read", "products:read", "schema:read"]
},
"requestId": "req_01HSW2Y9Q6X"
}Common error (403 FORBIDDEN, missing scope):
{
"error": {
"code": "FORBIDDEN",
"message": "Missing required scope: auth:read"
},
"requestId": "req_01HSW2YB9T0"
}GET /products
Happy path:
curl -sS "$BASE_URL/agents/v1/products?status=live&limit=2&fields=id,title,updatedAt" \
-H "Authorization: Bearer $AGENTS_API_KEY"Example response (200):
{
"ok": true,
"data": [
{ "id": 101, "title": "Trail Shoes", "updatedAt": "2026-03-04T10:11:12Z" },
{ "id": 102, "title": "City Backpack", "updatedAt": "2026-03-04T10:09:30Z" }
],
"pagination": {
"hasMore": true,
"nextCursor": "cursor_01HSW30FA8"
},
"requestId": "req_01HSW30M1FE"
}Common error (400 INVALID_REQUEST, invalid limit):
{
"error": {
"code": "INVALID_REQUEST",
"message": "Query parameter `limit` must be between 1 and 200"
},
"requestId": "req_01HSW31AQ9J"
}POST /sync-state/checkpoint
Happy path:
curl -sS -X POST "$BASE_URL/agents/v1/sync-state/checkpoint" \
-H "Authorization: Bearer $AGENTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"resourceType": "product",
"cursor": "cursor_01HSW33Y1K",
"metadata": { "source": "nightly-sync" }
}'Example response (200):
{
"ok": true,
"data": {
"integrationKey": "acme-ingestor",
"resourceType": "product",
"cursor": "cursor_01HSW33Y1K",
"checkpointAt": "2026-03-04T11:12:13Z"
},
"requestId": "req_01HSW34W21A"
}If you send integrationKey, it must match the authenticated credential id; otherwise omit it and let the runtime bind it automatically.
Common error (403 FORBIDDEN, missing syncstate:write):
{
"error": {
"code": "FORBIDDEN",
"message": "Missing required scope: syncstate:write"
},
"requestId": "req_01HSW35J6TV"
}POST /webhooks/dlq/replay
Happy path (single item):
curl -sS -X POST "$BASE_URL/agents/v1/webhooks/dlq/replay" \
-H "Authorization: Bearer $AGENTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id": 42}'Example response (200):
{
"ok": true,
"data": {
"replayed": 1,
"mode": "single",
"ids": [42]
},
"requestId": "req_01HSW37F8DG"
}Common error (400 INVALID_REQUEST, invalid replay body):
{
"error": {
"code": "INVALID_REQUEST",
"message": "Provide either `id` or `mode=all`"
},
"requestId": "req_01HSW3859NE"
}GET /diagnostics/bundle
Happy path:
curl -sS "$BASE_URL/agents/v1/diagnostics/bundle" \
-H "Authorization: Bearer $AGENTS_API_KEY"Example response (200, abbreviated):
{
"ok": true,
"data": {
"summary": {
"status": "ok",
"warningCount": 0,
"errorCount": 0
},
"checks": {
"auth": { "status": "ok" },
"readiness": { "status": "ok" },
"smoke": { "status": "ok" }
}
},
"requestId": "req_01HSW39YE6W"
}Common error (403 FORBIDDEN, missing scope):
{
"error": {
"code": "FORBIDDEN",
"message": "Missing required scope: diagnostics:read"
},
"requestId": "req_01HSW3ATMWF"
}