> ## Documentation Index
> Fetch the complete documentation index at: https://docs.keplerinsights.us/llms.txt
> Use this file to discover all available pages before exploring further.

# Plans & limits

> One paid plan, a free Sandbox, and Enterprise.

V1 ships with one paid plan. We'll add more once usage patterns are clear — see the [v1.5 roadmap](#whats-on-the-v15-roadmap) below.

## 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**   | \*\*$149/mo** (or $1,490/yr · \~17% off) | 2,000        | 100              | Contact for Enterprise | 24 hours                        |
| **Enterprise** | Custom                                   | Custom       | Custom           | Negotiated             | Negotiated (typically same-day) |

<Note>
  **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](/economics).
</Note>

<Note>
  **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.
</Note>

## Freshness windows

When you call `POST /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 |

**Why 24 hours?** It's an honest floor given how the underlying data behaves. Firmographic providers (employee count, funding, revenue) refresh weekly at best; LinkedIn-derived signals update irregularly; press coverage is the only near-realtime input. Advertising "1-hour freshness" would imply a refresh velocity our data sources don't actually deliver. Enterprise contracts can negotiate shorter windows + per-key `force_fresh=true` overrides for use cases where the marginal staleness matters.

## Async cold scoring

Cold scoring is always async. When `POST /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](/endpoints/async) for the loop, and [`GET /v1/jobs/{job_id}`](/endpoints/jobs) 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:

1. **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.
2. **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.

Both checks happen before the scoring pipeline starts, so a tripped breaker costs zero.

## Watermarks

Every response includes an `x_kepler` block:

```json theme={null}
"x_kepler": {
  "tier": "standard",
  "cache_status": "cached",
  "freshness_window_hours": 24
}
```

`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.

If you need anything on this list before it ships, go [Enterprise](mailto:team@keplerinsights.us) — we can wire bespoke arrangements there immediately.
