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

PlanPriceCredits each periodPages open at onceSeats
Developer$19 a month1,520201
Business$99 a month9,00010010
Scale$499 a month46,00040050
EnterpriseCustomCommittedup to 1,000up 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

ActionCredits
Browser page, per hour open8, metered per second, at least 60 seconds per page
Residential bandwidth, per GB320
Datacenter egress0
Search, per provider page2
Captcha, per successful solve1
Scrape, per page1
Extract, per uncached source page1
Crawl, per successful page1
Map, per started block of 10 URLs2
Screenshot5
Brand profile or styleguide10
Fonts5
Screenshot, PDF or JSON output on a page+4
Summary on a page+2
Operation call that answers1
Operation learn that finds candidates3

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_blocked and reason: "insufficient_credits".
  • A new browser connection closes with code 4005.
  • A running browser session closes with code 4402 at its next 30-second meter tick. Residential bandwidth that cannot be paid closes it with 4408.
  • 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.