Pricing
You pay for data, not for asking
One credit is one successful, non-empty, uncached request unless an endpoint says otherwise — and every endpoint says so, in machine-readable form, in the OpenAPI spec.
Free
Evaluating whether the data is good enough.
$0forever
1,000 credits, once
- A one-time grant on signup — not a monthly renewal
- Every endpoint, no feature gating
- No card required
- Cache hits still cost nothing
Credit packs
most commonA product in production with real volume.
From $25one-time, no subscription
25,000 credits and up
$1.00 per 1,000
- Credits never expire and there is nothing to cancel
- Async jobs, batching, and webhook subscriptions
- Buy again whenever you run low
- A daily spend cap, with remaining headroom on every account read
Enterprise
Buying through a security review.
Custom
Committed volume
- DPA, documented retention windows, zero-retention mode
- SSO and SAML
- Published uptime history and an SLA
- Dedicated proxy pools
Every plan unlocks every endpoint. Only volume is priced — there is no feature behind a tier.
What a credit buys
Three of the six rows below cost nothing. That is not a promotion — it is the settlement stage of the execution pipeline, and it runs on every request.
| One channel or profile lookup | 1 credit |
| One video transcript | 1 credit |
| One page of a channel’s uploads | 1 credit |
| The same call with render=true | 3× the endpoint price |
| A cache hit on any of the above | 0 credits |
| A request that fails upstream | 0 credits |
| A request that returns nothing | 0 credits |
Prepaid packs
Buy credits when you need them. Packs never expire, there is nothing to cancel, and there is no subscription to hold alongside them.
| Credits | Price | Effective rate |
|---|---|---|
| 25,000 | $25 | $1.00 / 1k |
| 100,000 | $100 | $1.00 / 1k |
| 500,000 | $500 | $1.00 / 1k |
Running out mid-job is the failure mode nobody plans for, so GET /v1/account/usage-forecast reports your burn rate and the date the balance runs dry.
Not negotiable
The parts of this page that are not a draft
Pricing can change. These cannot — each one is a clause in the specification with a test behind it.
You are never charged for a failed request.
Upstream blocks, timeouts, rate limits, not-founds, schema drift, and our own internal errors all refund in full before the error reaches you.
You are never charged for an empty result.
A profile with no posts, a video with no captions, a search with no hits — you still get a 200, and creditsCharged reads 0.
Cache hits cost 0 credits.
Pass cache_max_age=7d to say how stale you will tolerate. A hit never invokes a scraper and never bills.
An invalid API key is an auth error, not a billing error.
A wrong key returns 401. A 402 always means the key is valid and the balance is not. The two are never confused.
Every endpoint's price is machine-readable.
x-credit-cost sits on every operation in openapi.json, so an agent can compute spend from the spec alone.
A balance can never go negative.
Charges are a conditional database update. Run a thousand concurrent requests against a balance of one and exactly one succeeds.
Per-tenant cache isolation is standard.
Not an enterprise upsell. Turn it on and your team reads and writes only its own scope, permanently.
Hard daily spend caps.
Set a ceiling in credits per UTC day. Requests past it fail with 429 before any charge is taken, not after.
Questions about the bill
- What happens when a request fails halfway through a batch?
- That target is refunded and the batch keeps going. The job reports the credits it actually charged, which is the count of targets that returned usable data.
- Do I get charged for a request that returns an empty list?
- No. An empty result is refunded in full and you still receive a 200 with creditsCharged reading 0. That includes profiles with no posts, videos with no captions, and searches with no hits.
- How do cache hits work?
- Pass cache_max_age to say how stale a copy you will accept — anything older is treated as a miss and fetched live. A hit never invokes a scraper and never bills. Adding cache_max_age cannot fragment the cache, because presentation-only parameters are excluded from the cache key.
- Can I stop a runaway integration from draining my balance?
- Set a daily credit cap. Requests past it fail with 429 before any charge is taken. The cap counts gross spend for the UTC day, so refunds do not quietly restore headroom.
- Why did I get a 402 when my key is fine?
- You would not. A 402 means the key is valid and the balance is not. An unrecognised, missing, or revoked key is always a 401 — authentication, authorization and billing are three separate outcomes here.