ActorStack.dev

Pay-per-event Actor pricing, from the developer's side

Charging per delivered row changes what you are allowed to ship. If an error row costs the user money, every bug becomes a billing dispute.

By Oswaldo Carabano6 min read

Short answer

Pay-per-event pricing charges the user for each result an Actor produces rather than for compute time. That aligns cost with value, but it makes correctness a billing question: an error row that gets charged is a refund request. Both Actors here route failures to a separate `errors` dataset that is never charged, and charge each row as it is produced rather than in a lump at the end.

Key points

  • Per-event pricing means the user pays for output, so an empty run costs essentially nothing.
  • Error rows must be free, or every transient failure becomes a support conversation.
  • Charging per row as it is produced rather than at the end means an aborted run bills only for what it delivered.
  • Apify does not permit a literal $0 event, so a start event priced at $0.00001 is the closest available approximation to free.
  • Pricing per row also disciplines the schema: a field nobody uses is still being paid for.
On this page6 sections

Pay-per-event pricing looks like a billing decision. It is really a constraint on what you are allowed to ship: once the user is charged per row, every defect in your output is a line on an invoice, and the argument about whether a row was worth paying for is one you will always lose.

How the model works

Instead of charging for compute time, the Actor declares named events with prices, and charges one each time it produces the corresponding result. The Nextdoor Actor charges per business, per city, per recommendation and per post; the coches.net Actor charges per listing and per dealer profile.

EventPriceWhat the user is buying
actor-start$0.00001The platform minimum. Effectively free.
business$0.008One business with 34 fields.
recommendation$0.002One neighbor recommendation, classified by kind.
listing$0.002One car listing with 55 fields.
dealer$0.004One dealer profile with business contact details.

The immediate consequence for the user is that cost scales with value received rather than with how inefficient the Actor happens to be. A run that finds nothing costs nothing, and a slow implementation is the developer's problem instead of the customer's.

Why error rows have to be free

Consider the alternative honestly. A target site rate-limits you mid-run, forty rows fail, and each one is charged. The user paid for forty rows containing an error message. That is not a pricing edge case, it is a refund request — and it will arrive every single time anything transient goes wrong, which on the public web is weekly.

So failures go to a separate errors dataset, with the reason attached, and they are never charged. Two benefits fall out of one decision: the billing question disappears, and the main dataset stays clean because failures were never in it.

Charging incrementally, not at the end

Charging as each row is produced rather than accumulating and billing at completion matters for one specific case: the run that does not complete. A user who aborts at 30%, or whose run hits a spend limit, has received 30% of the rows — and under incremental charging that is exactly what they pay for.

It also means a spend limit works the way people assume it does. The Actor stops cleanly at the limit instead of continuing to produce rows it cannot charge for, or producing half a row.

The $0.00001 start event

Apify does not permit an event priced at literally zero, so the minimum is $0.00001 — a hundred-thousandth of a dollar. It exists purely to satisfy that constraint, and it is documented rather than hidden, because an unexplained charge on a run that returned nothing is the kind of detail that costs trust out of proportion to its size.

Ten thousand empty runs would cost ten cents. It is as close to free as the platform allows, and saying so plainly is cheaper than being asked.

Choosing what counts as an event

The interesting design work. An event should correspond to a unit the user would recognise as a thing they wanted — a business, a listing, a dealer — and its price should reflect roughly what it cost to produce.

Which is why a Nextdoor business is $0.008 and a recommendation is $0.002: the business row requires discovery plus extraction across 34 fields, while a recommendation is additional content on a page already fetched. Pricing them identically would either overcharge for recommendations or subsidise them from the business price, and both distort what users ask for.

There is a discipline in this that has nothing to do with money: a field nobody uses is still being paid for. Per-row pricing makes you notice.

What this means if you are buying

  • Check whether error rows are charged. If the documentation does not say, assume they are.
  • Check when charges apply. Per row as produced, or in a lump at the end? It only matters when a run fails, which is when it matters most.
  • Run the smallest possible first job. Under per-event pricing that costs cents and tells you the real fill rates for your specific target, not the documented average.
  • Set a spend limit anyway. A distance-ordered directory or an unbounded facet expansion can produce more rows than you expected — as measured here.

Frequently asked questions

What is pay-per-event Actor pricing?
A model where the user is charged for each result the Actor produces — a business, a listing, a dealer profile — rather than for the compute time the run consumed.
Do I pay for failed rows?
Not with these Actors. Anything that fails goes to a separate `errors` dataset with the reason, and it is never charged.
Why is there a charge for starting the Actor at all?
Because the platform does not allow a literal $0 event. $0.00001 is the minimum, which makes a run that finds nothing cost a hundred-thousandth of a dollar.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Platform docschecked 18 Aug 2026
    Monetize your ActorApify
  2. Platform docschecked 18 Aug 2026
    Actor pricing modelsApify
  3. Operator claimchecked 18 Aug 2026
    Nextdoor Business & Reviews Scraper — Actor README and input schemaActorStack / Apify Store
  4. Operator claimchecked 18 Aug 2026
    Coches.net Car Listings & Dealer Scraper — Actor README and input schemaActorStack / Apify Store
A white measuring tape curving across a dark background, showing the numbers 15 to 45.
EngineeringExplainer

Measured fill rates

A field list is a promise. A fill rate is a measurement. This is what happened when one Actor's numbers were re-measured at n=741 instead of n=30.

6 min
A laptop screen showing a plain text-mode terminal with a command prompt.
EngineeringExplainer

robots.txt as a spec

A site's robots.txt is the only machine-readable statement it makes about crawling. Treating it as the specification — and downloading it on every run — is why a scraper survives.

7 min
Racks of network equipment in a dimly lit server room, lit blue by their indicators.
EngineeringExplainer

Cache metadata

Shared caching makes runs fast and cheap and quietly destroys trust — unless the row itself reports where it came from and when.

5 min