Pay
Pay-Per-Event Pricing and Billing Explained
How Devil Scrapes Actor pricing works — the actor-start fee, per-result price, spend caps, and why PPE beats compute-unit billing for buyers.
Every Devil Scrapes Actor is priced Pay-Per-Event (PPE): a small flat fee to start the run, plus a price per result actually delivered. No data lands, you pay only the start fee. This page explains exactly how that billing works, how to cap it, and why it’s a better deal for you than the compute-based pricing most scraping tools still use.
The two charges
- Actor-start fee — a flat charge (commonly $0.20 across our fleet) fired once when the run boots, regardless of outcome. It covers the container warm-up, the proxy handshake, the initial request — the fixed cost of standing the scraper up, whether or not it finds anything.
- Result price — charged per item that actually lands in your dataset, typically $1–$5 per 1,000 results depending on the Actor. This is the variable cost: the more we deliver, the more it costs, in direct proportion.
Concretely, for google-ads-transparency (start fee $0.20, $3.00 / 1,000 results): a run that returns 1,000 ad rows costs $0.20 + (1,000 / 1,000 × $3.00) = $3.20. A run on the same input that happens to match zero ads costs $0.20 — nothing more.
That “no data, no charge beyond the warm-up” behavior isn’t a courtesy discount — it’s the whole point of PPE. You’re not paying for compute time spent looking; you’re paying for rows that showed up.
Where to find the exact price
Every Actor’s Store page and README carries a Pricing table with the exact per-event prices for that specific Actor — don’t assume the fleet-typical $1–$5/1,000 range applies uniformly; some Actors cost more per row because the underlying extraction is heavier (rendering a page vs. hitting a lightweight endpoint), and some cost less. The number on the listing is the number you’ll be billed, before you click Run.
Capping what a single run can cost
If you’re calling an Actor from an automated pipeline against an input whose match count you don’t fully control — a broad search term, a domain with an unknown number of ads — cap the spend up front:
maxTotalChargeUsd— stop the run once total PPE charges for that run reach this dollar figure.maxItems— stop the run once it’s returned this many result rows.
Both are accepted as query parameters (or SDK-equivalent options) on the run-start endpoints covered in Run any DevilScrapes Actor via the API:
curl -X POST "https://api.apify.com/v2/acts/DevilScrapes~google-ads-transparency/runs?maxTotalChargeUsd=10&maxItems=2000" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchDomains": ["nike.com"]}'
This run stops itself once either ceiling is hit, whichever comes first, and you keep whatever rows already landed — a capped run still delivers a usable partial dataset, not nothing.
How this interacts with your Apify plan and credits
PPE charges draw against your Apify account’s usage balance — the same balance funded by your monthly plan allowance or by any credits on the account (new accounts get free trial credit to cover early runs). You don’t need a specific plan tier to use PPE Actors; it works identically on the free tier and on paid plans. What changes between plans is mostly account-level ceilings (concurrent runs, memory limits, storage retention) — not how any individual Actor is priced.
Why PPE beats compute-unit billing, for you
Before Pay-Per-Event, most Apify Actors billed on raw compute time — CPU-seconds and memory-seconds consumed, independent of what the scrape actually returned. That model quietly punishes the buyer in a specific way: a target that’s slow to respond, or that makes us retry through backoff and proxy rotation to get past a block, burns compute time whether or not you end up with usable data. You’d pay more for us fighting harder against the same target, with no guarantee of a better outcome.
PPE flips the incentive the right way. We absorb the retries, the backoff, the fingerprint rotation, the proxy switches — all the mechanics of getting past a block — as our own cost, not yours. You pay for the outcome: rows that landed in your dataset, plus one small fixed fee to stand the run up. If a target has a rough day and forces five retries per page, that’s on us, not on your invoice.
FAQ
What exactly is the actor-start fee for?
It covers the fixed cost of booting the run — spinning up the container, resolving a proxy session, making the first request — regardless of how many results come back. It’s charged once per run, not once per result.
Do I pay for a run that fails outright?
A run that fails because we couldn’t complete the scrape at all (a hard block, an unrecoverable error) is a bug on our side, not intended behavior — our monitoring (see Maintenance and support) exists to catch that quickly. A run that succeeds but legitimately finds zero matching results is different: that’s a correct SUCCEEDED outcome, and you’re charged only the actor-start fee.
Can I set a hard ceiling so a run never overspends?
Yes — pass maxTotalChargeUsd (dollar ceiling) or maxItems (row-count ceiling) when starting the run. The run stops itself once either limit is reached and you keep the partial results already delivered.
Does Pay-Per-Event cost more than the old compute-based pricing?
It shifts the risk, not necessarily the average price. Under compute billing you pay for effort regardless of outcome; under PPE you pay for delivered rows plus one small fixed fee. For a target that behaves normally, the two land in a similar place; for a target that fights back, PPE protects you from paying more for our retries.
Where do I see exact historical charges for my runs?
Your Apify account’s Billing / Usage section in the Console breaks down charges by Actor and by event type (actor-start vs. result), so you can audit exactly what a given run cost and why.
Still stuck?
Open the Issues tab on the Actor's Apify listing, or write to us. Real engineers answer.