API & endpoints

Errors, limits, and what a call costs

Status codes, plan rejections, rate limits, and how audits draw on your weekly allowance and credits — including when a failed run is refunded.

Last updated 2026-08-08

Transport status codes

StatusMeaningWhat to do
401Missing or invalid bearer token.Check the header. Read WWW-Authenticate for where to authenticate.
204CORS preflight succeeded.Nothing — this is OPTIONS.
429Rate limited.Honour Retry-After.
200JSON-RPC responded.The call may still have failed — see below.

200 does not mean it worked

A tool that refuses still returns 200. JSON-RPC reports transport success; the refusal is in the body. Never treat a 200 as "the audit ran" — parse the result.

Refusals in the body

Three you should handle explicitly:

  • `plan_required` — the tool is above the account's plan. The message names the required plan and the upgrade URL. Returned by fix_app, submit_directories and monitor_ai_visibility.
  • Weekly limit reached — the allowance is spent and usage credits are off or empty. Turn on usage credits or top up.
  • Gate errors — the URL failed admission: unparseable, a blocked host, or over the plan's app limit.

What a call costs

Audits are metered against a weekly allowance first, then pay-as-you-go credits. Read-only tools cost nothing.

ActionChargedFree
scan_appYes — single-page audit
audit_appYes — deep crawl, the most expensive action
fix_appYes — pull request run
monitor_ai_visibilityYes — one probe set
get_scan, get_audit, list_apps, scan_history, explain_check, get_accountFree

A run that fails is refunded. If scan_app ends in an error the charge is returned automatically, and a cancelled or failed deep audit unwinds its charge from the stash held on the run — you are not billed for work that produced nothing.

Rate limits

Limits are per-account and generous for normal use; the deep-audit page budget is set by your plan rather than by a request cap. If you are driving Actuant in a loop, poll get_audit at a couple of seconds, not continuously — a crawl takes minutes and nothing changes between polls faster than that.