Credits, plans and spend limits
How credits, plans and packs work, what each action costs, what happens at a low or empty balance, and how a monthly spend limit caps auto top-up charges.
Updated
Everything on Wayfern is paid in one credit. One credit has a list value of $0.0125. This guide shows where credits come from, what each action costs, what happens when the balance runs low or empty, and how to cap automatic charges.
Where credits come from
| Plan | Price | Credits each period | Pages open at once | Seats |
|---|---|---|---|---|
| Developer | $19 a month | 1,520 | 20 | 1 |
| Business | $99 a month | 9,000 | 100 | 10 |
| Scale | $499 a month | 46,000 | 400 | 50 |
| Enterprise | Custom | Committed | up to 1,000 | up to 1,000 |
Yearly billing costs 20% less than twelve months. A yearly plan still grants its credits every 30 days.
Credit packs are one-time purchases that never expire: 1,000 credits for $12.50, 5,000 for $55 and 20,000 for $200. Without a plan, packs give you 20 pages at once and one seat.
Wayfern spends the plan grant first. The grant expires at the end of each period. Then it spends pack credits.
What actions cost
| Action | Credits |
|---|---|
| Browser page, per hour open | 8, metered per second, at least 60 seconds per page |
| Residential bandwidth, per GB | 320 |
| Datacenter egress | 0 |
| Search, per provider page | 2 |
| Captcha, per successful solve | 1 |
| Scrape, per page | 1 |
| Extract, per uncached source page | 1 |
| Crawl, per successful page | 1 |
| Map, per started block of 10 URLs | 2 |
| Screenshot | 5 |
| Brand profile or styleguide | 10 |
| Fonts | 5 |
| Screenshot, PDF or JSON output on a page | +4 |
| Summary on a page | +2 |
| Operation call that answers | 1 |
| Operation learn that finds candidates | 3 |
Each Web Data response has a credits field with what that call debited. The live rates are in GET /api/billing/entitlements under costs. See Usage rates.
Low and empty balance
There is no low-balance email. The balance in the dashboard shows Running low when less than 10% is left of what the period started with, grant and packs together.
When the grant and the packs are both empty, and auto top-up is off:
- Web Data, Search and Captcha calls fail with
402 billing_blockedandreason: "insufficient_credits". - A new browser connection closes with code
4005. - A running browser session closes with code
4402at its next 30-second meter tick. Residential bandwidth that cannot be paid closes it with4408. - A running crawl stops as
failed. Its pages stay readable.
Auto top-up
Auto top-up is off by default. When it is on, usage past your balance is billed to your subscription at $0.0125 a credit. It needs a monthly plan paid by card. Yearly plans, crypto plans and packs-only accounts cannot use it. Turn it on in the Usage page of the dashboard.
Monthly spend limit
A spend limit caps what auto top-up can bill in one billing period. Plan fees and credit packs do not count toward it.
- Set it on the Usage page under Monthly spend limit, in whole dollars from $5 to $100,000.
- Wayfern emails the account owner at 80% and at 100% of the limit.
- At the limit, metered calls are refused as at an empty balance, with
reason: "spend_limit_reached". Running browser sessions end at the next meter tick. - The limit resets when the billing period renews.
- When you raise or remove the limit, the stop ends at once. A credit pack also lets work continue, because pack credits are spent before auto top-up.
The billing routes accept a signed-in dashboard session, not a wf_ API token. With a session token:
curl -X POST https://api.wayfern.com/api/billing/spend-limit \
-H "Authorization: Bearer $DASHBOARD_JWT" \
-H "Content-Type: application/json" \
-d '{ "monthlyLimitUsd": 200 }' Send "monthlyLimitUsd": null to remove the limit. The field is required, so a body without it is a 400. The answer is the spendLimit block that GET /api/billing/entitlements also returns.
Track spend from your code
Your API token cannot read the balance, but every Web Data response tells you what it cost. Add it up per job.
import os
import requests
auth = {"Authorization": f"Bearer {os.environ['WAYFERN_API_TOKEN']}"}
spent = 0
for url in ["https://example.com/a", "https://example.com/b"]:
res = requests.post(
"https://api.wayfern.com/api/v1/scrape",
headers=auth,
json={"url": url, "formats": ["markdown", "summary"]},
timeout=180,
)
if res.status_code == 402:
print("stopped:", res.json()["reason"])
break
res.raise_for_status()
spent += res.json()["credits"]
print(f"{spent} credits, ${spent * 0.0125:.4f} at the list rate") Service accounts are not debited. See Spend limits and Usage history and export.