OtterKit uses prepaid credits, and 1 credit is $0.01. There is no subscription. The same credits pay for endpoints created from the CLI, MCP server, console, and Mac app, and the Mac app itself is free.
| What | Cost |
|---|---|
| Tunnel | 1 credit ($0.01) per connected hour. Billing pauses while disconnected. |
| Webhook endpoint | 1 credit ($0.01) per hour while the endpoint is live. |
| Pulse | 1 credit per 100 runs (scheduled calls or check-ins). |
| Cap on every endpoint | 300 credits ($3) per rolling 30 days. Usage beyond the cap is free. |
| First charge | 1 credit when the endpoint is created (the first hour, or first 100 runs). |
| Auto-stop | Default 24h for tunnels and webhooks; set with --ttl, or "never". |
| Custom domains, email inboxes, replay | No extra charge. |
Credit packs#
New accounts get 10 free credits. Buy more on the console's billing page↗:
| Pack | Price | Credits |
|---|---|---|
| Starter | $5 | 500 |
| Builder | $20 | 2,200 (includes 200 bonus) |
| Scale | $50 | 6,000 (includes 1,000 bonus) |
Fair use and running out of credits#
Each webhook endpoint serves up to 100,000 requests per rolling 30 days, then answers 429 until the window rolls. This is a limit, not a price.
When your balance hits zero, a tunnel stops. A webhook endpoint instead enters a 72-hour grace standby: it keeps answering senders and buffers up to 200 requests, while forwarding and history pause. Grace time isn't billed. Top up within 72 hours and everything resumes on its own.
Pricing API#
Read current pricing programmatically. No token is needed.
/api/agent/pricing{
"currency": "credits",
"note": "1 credit = $0.01 USD. Buy credits at https://console.otterkit.com/billing",
"tunnel": {
"description": "Expose a local port to the internet.",
"hourlyCredits": 1,
"monthlyCapCredits": 300,
"billing": "1 credit per connected hour (first hour charged at provision). Never bills more than 300 credits per rolling 30 days (~$3/mo always-on). Sessions run until stopped; pass ttl (default 24h, or \"never\") for an optional auto-stop."
},
"webhook": {
"description": "Capture incoming HTTP requests without a local server. Same pricing.",
"hourlyCredits": 1,
"monthlyCapCredits": 300,
"billing": "..."
}
}