Discovery (public)
- GET /publishers — filters: country, language, category, service, niche, min_price, max_price, q, sort, page, per_page
- GET /publishers/{domain}
- GET /services · /packages · /countries · /languages · /categories
- GET /availability?publishers=a.com,b.com&niche=
- GET /pricing · /capabilities · /openapi.json
Commerce (bearer credential)
- POST /quotes · GET /quotes/{id}
- POST /orders · GET /orders · GET /orders/{id} · /status · /publications · /report?format=csv · POST /orders/{id}/cancel
- POST /content/validate · POST /content/submissions · GET /content/submissions/{id}
- GET /payments/options · POST /payments/intents · GET /payments/{order} · POST /payments/{order}/confirm (re-reads the verified status only)
- GET /account · /account/limits · POST /account/spending-authorization · GET /approvals/{id}
- GET/POST /webhooks · POST /webhooks/{id}/rotate · /delete · GET /webhooks/{id}/deliveries · GET /events?after=
Order states
AWAITING_APPROVAL (owner asked) → AWAITING_PAYMENT → PAYMENT_PROCESSING → AWAITING_CONTENT (guest post article missing) → REQUIRES_REVIEW (editor) → PUBLISHING_QUEUED → PUBLISHING → PARTIALLY_PUBLISHED → COMPLETED; or FAILED, CANCELLED, REFUNDED. Each publication has its own status, attempts, live URL, failure reason and replacement or credit.
Errors
{"error":{"code":"quote_stale","message":"Prices or availability changed since the quote. Ask for a new quote."}}
# 400 invalid · 401 authentication_required / invalid_token · 402 insufficient_balance · 403 insufficient_scope / not_allowed / outside_agent_scope
# 404 not found · 409 quote_stale / idempotency_conflict · 410 quote expired · 422 validation · 429 rate_limited · 503 paused Idempotency and limits
Send Idempotency-Key on POST /quotes, /orders and /payments/intents: the same key with the same body returns the first response; with a different body it returns 409. Keys are per agent.
Rate limits: 120/min per IP anonymous, 300/min per agent; 429 with Retry-After.
