Credits and pricing
Every call is paid for in credits from your Pengu Insights account, the same balance the app uses. There is no separate API subscription and nothing to set up: a key spends the credits of the account that created it.
What a credit is
A credit is the unit the whole product is priced in. Plans include a monthly allowance, and each tool costs a fixed number of credits that reflects what the underlying data actually costs to produce. Cheap lookups cost half a credit; a full keyword export of a domain costs nine.
The API tells you the price of every call in two places: the meta object of every successful response, and the X-Credits-Charged and X-Credits-Remaining response headers, so you can meter usage without parsing the body.
meta on every response
{
"data": { "...": "..." },
"meta": {
"credits_charged": 2.5,
"credits_remaining": 497.5,
"request_id": "e701ba5b-5985-43e2-9720-5c3f342dd64f"
}
}
Plans
| Plan | Price | Credits per month | Max results per call | API and MCP |
|---|---|---|---|---|
| Free | 0 € | 40 | 25 | No |
| Starter | 39 € / month | 500 | 50 | No |
| Pro | 69 € / month | 1,200 | 100 | Included |
| Agency | 129 € / month | 3,000 | 200 | Included |
The API and the MCP server are part of the Pro and Agency plans. On Free and Starter you can still revoke keys you created earlier, but not create new ones, and requests with an existing key return 403 plan_required.
Annual billing gives two months free. Credits reset at the start of each billing period. "Max results per call" caps the limit and posts parameters: ask for 100 keywords on Starter and you get 50, with the price unchanged, so pick the plan by how deep you need to go rather than by how many calls you make.
Change plan in the app under Settings » Billing. Upgrades apply immediately and the new allowance is available to your keys straight away.
Price per endpoint
SEO endpoints are a flat price per call whatever limit you pass. Social endpoints scale with how many posts or ads you ask for, because that is what drives the cost of collecting them. Prices are rounded to the nearest half credit.
| Endpoint | Credits | Notes |
|---|---|---|
POST /v1/serp | 0.5 | Includes the AI Overview and People Also Ask |
POST /v1/keywords/ideas | 2.5 | Any limit up to your plan cap |
POST /v1/domains/overview | 2 | |
POST /v1/domains/pages | 2 | |
POST /v1/domains/backlinks | 4.5 | |
POST /v1/domains/competitors | 3.5 | |
POST /v1/domains/keywords | 4.5 | |
POST /v1/social/instagram/profile | 0.5 + 0.4 per post | 12 posts = 5 credits |
POST /v1/social/instagram/hashtag | 0.4 per post | 20 posts = 7.5 credits |
POST /v1/social/tiktok/search | 0.6 per post | 20 posts = 11.5 credits |
POST /v1/social/facebook/ads | 0.9 per ad | 10 ads = 9 credits |
POST /v1/social/instagram/post | 0.5 | One post with media links |
POST /v1/media/transcript | 1 (direct URL) or 1.5 (Instagram URL) | Videos up to 25 MB |
POST /v1/youtube/transcript | 1 | |
POST /v1/youtube/search | 0.5 | |
GET /v1/me, GET /v1/tools | 0 |
GET /v1/tools returns this table as JSON, with the input schema of every tool, so a client can show prices before making a call.
Refunds
A call is charged before the data is fetched, so an account can never run past its balance. If the call then fails for any reason on our side, including a timeout or a data source returning nothing, the exact amount is refunded in the same request and the error body says so. Only successful responses cost credits.
Validation errors (400) are checked before anything is charged. A 404 not_found, for example a domain with no organic presence in the chosen country, is also refunded.
Daily cap per key
Every key has a daily credit cap, set when the key is created to a fifth of your plan's monthly credits (240 a day on Pro, 600 on Agency). It exists so an automation with a bug cannot spend the whole month in an afternoon. Raise it, lower it or remove it per key in Settings » Developers; the counter resets at 00:00 UTC.
When a call would push a key past its cap you get a 429 daily_cap_reached with the cap, today's spend and the reset time, and nothing is charged. Every successful response also carries meta.daily with the same three numbers, so a client can slow down before hitting the wall.
meta.daily on every response
{
"meta": {
"credits_charged": 2.5,
"credits_remaining": 497.5,
"daily": { "used": 38.5, "cap": 240, "resets_at": "2026-09-10T00:00:00.000Z" }
}
}
Running out
When a call would cost more than you have left you get a 402 with the amount required and your remaining balance, and nothing is charged.
402 insufficient_credits
{
"error": {
"code": "insufficient_credits",
"message": "This call costs 9 credits and your balance is 4.5.",
"details": { "required_credits": 9, "remaining_credits": 4.5 }
},
"request_id": "..."
}
Check GET /v1/me before a batch job, or read X-Credits-Remaining on each response and stop when it gets low.
