What is PPE (Pay Per Event)?
Apify PPE (Pay Per Event) is a usage-based pricing model where the actor developer defines billable events and sets the price for each event. ApifyForge tracks PPE pricing data across Apify actors in its actor directory at apifyforge.com/actors, with common price points ranging from $0.01-0.10 per result for data extraction, $0.02-0.05 per page for web scraping, and $0.10-1.00 per report for complex intelligence products. As of March 2026, PPE is the standard monetization model for the Apify Store, replacing the older rental pricing model.
Last updated: by ApifyForge
How PPE (Pay Per Event) works
PPE matters because it aligns developer incentives with user outcomes. Users only pay for what they actually receive, which increases trust and adoption. According to Apify's documentation, developers earn 80% of PPE revenue after Apify subtracts the platform compute costs from each run. This revenue share model means that a popular actor processing 100,000 events per month at $0.05 each generates $5,000 in gross revenue and $4,000 for the developer. PPE replaced the older rental pricing model (flat monthly fee for unlimited usage), which Apify is sunsetting in October 2026. All new monetized actors should use PPE pricing. The ApifyForge Cost Calculator at apifyforge.com/tools/cost-calculator helps developers estimate PPE revenue across different usage tiers.
To configure PPE pricing, navigate to your actor in the Apify Console, go to the Monetization tab, and define your event types with their prices. Each event type has a name (e.g., 'result-scraped'), a display name shown to users (e.g., 'Result scraped'), and a price in USD. In your actor code, charge events using Actor.charge({ eventName: 'result-scraped', count: results.length }). This call tells Apify to bill the user for the specified number of events at the configured price. You can also set PPE pricing via the Apify API: PUT /v2/acts/{actorId} with the pricingModel field set to your event definitions.
Code example: import { Actor } from 'apify'; Actor.main(async () => { const results = await scrapeProducts(input.url); await Actor.pushData(results); await Actor.charge({ eventName: 'product-scraped', count: results.length }); }); This charges the user for each product scraped after the data is safely pushed to the dataset. Always push data to the dataset before calling Actor.charge() — if the actor crashes after charging but before pushing data, the user pays for nothing, gets a refund request, and the actor's Store Quality Score drops.
Common PPE pricing mistakes: (1) Charging before delivering results — always push data first, then charge. (2) Overpricing commodity data — if 10 other actors scrape the same website at $0.02 per result, pricing yours at $0.10 kills adoption. Research competitor pricing on the Apify Store and on ApifyForge's comparison pages before setting prices. (3) Ignoring the 14-day rule — PPE pricing changes require a 14-day notice period and can only be modified once per month, so research pricing upfront.
When deciding between PPE and free actors, consider the audience. Free actors with compute-only costs work well for open-source tools and developer utilities where maximum adoption matters. PPE actors work best for data products where each result has clear monetary value to the user — lead lists, price monitoring data, competitive intelligence, and enrichment services.
PPE interacts with Compute Units: users pay both PPE charges (for the value delivered) and compute costs (for the infrastructure used). A well-optimized actor minimizes compute costs while maximizing PPE revenue — for example, using CheerioCrawler instead of PlaywrightCrawler when possible reduces compute costs by 5-10x without affecting PPE revenue. Monitor PPE earnings in the Apify Console under the Earnings tab, which shows revenue per actor, per day, and per user. Related concepts: Compute Unit, Actor, Actor Run, Store Quality Score.