Pricing & quotas
Every /scrape and /analyse request spends credits from a monthly pool tied to your plan. Each plan also caps how many requests you can run at once. Both limits are enforced on those hot paths. Map is not metered.
Credit cost per engine
Section titled “Credit cost per engine”Cost is charged per URL, keyed by the engine you request (a multi-URL request costs the sum).
| Engine | Credits / URL |
|---|---|
html | 1 |
analyse | 3 |
browser | 5 |
analyse is one fetch + one LLM pass. Map is not metered.
credits is the monthly pool (reset at the start of each UTC month, no rollover); concurrency caps simultaneous in-flight scrapes per user. New accounts start on free.
| Plan | Price / mo | Monthly credits | Concurrency |
|---|---|---|---|
free | $0 | 1,000 | 2 |
starter | $49 | 25,000 | 5 |
growth | $149 | 150,000 | 15 |
scale | $499 | 750,000 | 40 |
Manage your subscription on the billing page. The same catalog is available programmatically at GET /billing/plans.
Checking usage
Section titled “Checking usage”GET /usage (Clerk-authenticated, like the rest of /me/*) returns the current period’s quota state:
{ plan: 'free' | 'starter' | 'growth' | 'scale'; period: string; // UTC "YYYY-MM" creditsLimit: number; creditsUsed: number; creditsRemaining: number; concurrencyLimit: number;}The dashboard’s billing page is a visual wrapper over this.
Hitting a limit
Section titled “Hitting a limit”| Status | Body | Cause |
|---|---|---|
402 | { "error": "credit quota exceeded", "creditsLimit", "creditsUsed", "creditsRemaining": 0 } | The request would exceed your monthly credit pool. Upgrade your plan or wait for the next period. |
429 | { "error": "concurrency limit exceeded", "concurrencyLimit" } | Too many scrapes already in flight for your account. A Retry-After: 5 header is set — back off and retry. |