Plans
| Plan | Price | Cached calls | Cold calls | When you hit the cap | Freshness window |
|---|---|---|---|---|---|
| Sandbox | $0 | 25 | 5 (sandbox only) | Subscribe to Standard | 7 days |
| Standard | **1,490/yr · ~17% off) | 2,000 | 100 | Contact for Enterprise | 24 hours |
| Enterprise | Custom | Custom | Custom | Negotiated | Negotiated (typically same-day) |
v1.0 is flat-only. When you exhaust your monthly cold-call budget, the API returns
429 cold_budget_exhausted until the next monthly reset. Metered overage is on the v1.5 roadmap once we have stable cold-call cost telemetry — see Economics.Sandbox is free and indefinite, but it doesn’t run live cold paths —
ki_live_… keys on Sandbox are restricted to cached reads + canned sandbox responses. It exists so you can integrate, test rate-limit handling, and validate response shapes before paying anything. Subscribe to Standard whenever you’re ready to score real domains.Freshness windows
When you callPOST /v1/score and a recent record exists within your tier’s freshness window, you get it back instantly as cache_status: "cached" — no cold-call usage incremented. Only if the record is missing or stale (or you set force_fresh: true on Enterprise) do we run a fresh cold pipeline.
| Plan | Window |
|---|---|
| Standard | 24 hours |
| Enterprise | Negotiated |
force_fresh=true overrides for use cases where the marginal staleness matters.
Async cold scoring
Cold scoring is always async. WhenPOST /v1/score needs to run the cold pipeline, it returns 202 with a job_id and a poll_url — you then poll GET /v1/jobs/{job_id} until status flips to complete. The wait body field is accepted for backwards-compatibility but has no effect. The Python and TypeScript SDKs handle the polling automatically. See Async scoring for the loop, and GET /v1/jobs/{job_id} for the poll response shape.
Sandbox accounts cannot run live cold paths — ki_live_… keys on Sandbox are restricted to cached reads + sandbox responses.
Circuit breakers
Two automatic safety nets cap cold spend on top of the monthly cap:- Per-key cold ceiling — 200 cold calls per hour, per key. Trips
429 { error: "rate limited", reason: "per_key_cold_1h" }. Rotates back open after the hour rolls. - Per-account 24-hour cold ceiling — 2× your tier’s monthly cold-call budget within any 24-hour window. Catches runaway scripts on a fresh key. Returns
429 { reason: "account_cold_24h" }. Email support if you’ve hit this legitimately and we’ll lift the cap by hand.
Watermarks
Every response includes anx_kepler block:
cache_status: "cached" means a stored record within your freshness window was returned. The cold pipeline doesn’t return inline scores — it returns a 202 with a job_id. Once the job completes and you GET /v1/score/{domain}, the response again carries cache_status: "cached" since the fresh score is now in cache.
What’s on the v1.5 roadmap
We deliberately launched narrow. Once we have 60–90 days of real usage data:- Metered overage — opt-in burst capacity beyond your monthly cold-call budget, priced per-call from observed cost.
- Higher-volume plans — if there’s demand, a tier above Standard for customers running thousands of cold calls per month.
- Tighter freshness windows — gated on improved upstream data refresh and our own fetcher cache investments, not just on price.
- Webhooks — async completion notifications instead of polling.

