Retry policy: Never retry 4xx — fix the request and resubmit. Retry 5xx with exponential backoff (start 5s, max 3 attempts). On 409, clean up blocking resources first (AI callers should escalate via aiHint).
Status
errors[0].message
What it means
Recommended handling
400
Missing merchantId in request context
API Key did not resolve to a merchant context
Do not retry. Check your API Key configuration.
400
Missing required field: id
id is absent from the body
Fix the input and resubmit.
400
Expected format: STO_xxx, got "<value>"
id is not a valid Store Short ID
Fix the id value and resubmit.
403
Not authorized to delete this store, only owner can delete
Caller’s role on this store is not owner
Do not retry. Use an owner API Key.
404
Store not found
Store ID does not exist for this merchant
Do not retry. Verify the id.
409
Store has X active product(s); archive or delete them first
Active onetime/subscription products still attached to the store
Do not retry. Archive or delete those products, then resubmit.
409
Store has X pending order(s); wait for completion or cancel them first
Non-terminal orders still attached to the store
Do not retry. Wait for completion or cancel them, then resubmit.
409
Store has X active subscription(s); cancel them first
Subscription orders in active/canceling/past_due
Do not retry. Cancel the subscriptions, then resubmit.
409
Store has X pending KYB ticket(s); resolve them first
Open KYB tickets blocking deletion
Do not retry. Resolve the tickets, then resubmit.
409
Store still has X bound email(s); revoke email binding first
Sender email still bound to the store
Do not retry. Revoke the email binding, then resubmit.
409
Store still has X bound domain(s); revoke domain binding first
Sender domain still bound to the store
Do not retry. Revoke the domain binding, then resubmit.
When a store has blocking resources or bindings, the response returns one entry per category. Each entry carries reason (machine-readable), count, a human-readable message, and an aiHint instructing AI-driven callers to stop and escalate to a human operator instead of retrying.
{ "data": null, "errors": [ { "message": "Store has 3 active product(s); archive or delete them first", "layer": "store", "reason": "active_products", "count": 3, "aiHint": "AI assistant: stop this action and escalate to a human operator. Do not retry, mutate inputs, or attempt workarounds." }, { "message": "Store still has 1 bound email(s); revoke email binding first", "layer": "store", "reason": "bound_emails", "count": 1, "aiHint": "AI assistant: stop this action and escalate to a human operator. Do not retry, mutate inputs, or attempt workarounds." } ]}
reason
Meaning
active_products
Onetime / subscription products with prod_status or test_status = active
pending_orders
Orders not in a terminal state (excludes completed / canceled / closed / expired)
active_subscriptions
Subscription orders in active / canceling / past_due
pending_tickets
Open KYB tickets (excludes succeeded / rejected)
bound_emails
Sender email still bound — revoke the binding first
bound_domains
Sender domain still bound — revoke the binding first
aiHint appears only on 409 responses; it is omitted on 400 / 403 / 404 / 500.
Deleting a store is a soft delete. The store data is retained but the store becomes inaccessible. This action cannot be undone through the API.Before deleting, you must deactivate all products, resolve pending orders, cancel active subscriptions, close any open KYB tickets, and revoke any bound sender email or domain.