Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,35 @@ Monetizing your Actor on the Apify platform involves several key steps:

## Monetization models

### Rental pricing model
### Pay-per-event pricing model

![rental model example](images/rental-model.png)
![pay per event model example](images/ppe-model.png)

- _How it works_: you offer a free trial period and set a monthly fee. Users on Apify paid plans can continue using the Actor after the trial. You earn 80% of the monthly rental fees.
- _Example_: you set a 7-day free trial and $30/month rental. If 3 users start using your Actor:
- 1st user on a paid plan pays $30 after the trial (you earn $24).
- 2nd user starts their trial but pays next month.
- 3rd user on a free plan finishes the trial without upgrading to a paid plan and can’t use the Actor further.
- _How it works_: you charge users based on specific events triggered programmatically by your Actor's code. You earn 80% of the revenue minus platform usage costs.
- - _Profit calculation_: `profit = (0.8 * revenue) - platform usage costs`
- _Event cost example_: you set the following events for your Actor:
- `Actor start per 1 GB of memory` at $0.005
- `Pages scraped` at $0.002
- `Page opened with residential proxy` at $0.002 - this is on top of `Pages scraped`
- `Page opened with a browser` at $0.002 - this is on top of `Pages scraped`
- _Example_:
- User A:
- Started the Actor 10 times = $0.05
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure "started 10 times" seems a bit weird - maybe "Started the Actor with 10 GB of memory"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, we can change it to

Suggested change
- Started the Actor 10 times = $0.05
- Started the Actor with 10GB of memory= $0.05

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am for this, just don't forget to change it in the second example as well if so 😅

Copy link
Contributor Author

@TC-MO TC-MO Oct 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes yes of course, I wouldn't forget that! makes new commit...furiously

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To me, as a user and a mere mortal who doesn't know much about the platform, I can relate to wording "started the Actor 10 times" more than to "started the Actor with 10 GB of memory". Maybe we could combine both to be specific and super clear?

Started the Actor 10 times, each time with 1 GB of memory = $0.05

- Scraped 1,000 pages = $2.00
- 500 of those were scraped using residential proxy = $1.00
- 300 of those were scraped using browser = $0.60
- This comes up to $3.65 of total revenue
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Note / question]: Even-though I get why we want to have "more complicated" examples in docs, so devs know that they can create that - maybe having only "start" / "result" and for example "call 3rd party API" or "call AI model" can make it clear that you can do simple things with it? From my PoV, for customer less events make pricing more clear.
Or maybe just mention it to developer somewhere? That more simple & transparent pricing make Actor more attractive to customers
WDYT?

Or maybe add second example with only start + result?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think both approaches can work, perhaps we should in each case have a simple start & more advanced example so users can see what is the happy path, and what is a bit more complex scenario?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But perhaps this is getting out of scope of this PR. Maybe we focus here on just reorganization & I'll open separate issue to work further on simplified examples?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, probably a separate issue

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, let's reorganize here, and we can add simple vs complex examples later on.

- User B:
- Started the Actor 5 times = $0.025
- Scraped 500 pages = $1.00
- 200 of those were scraped using residential proxy = $0.40
- 100 of those were scraped using browser = $0.20
- This comes up to $1.625 of total revenue
- That means if platform usage costs are $0.365 for user A and $0.162 for user B your profit is $4.748
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a bit weird that we have this breakdown:

Cost breakdown_:
  - Compute unit: $0.3 per CU
  - Residential proxies: $13 per GB
  - SERPs proxy: $3 per 1,000 SERPs
  - Data transfer (external): $0.20 per GB
  - Dataset storage: $1 per 1,000 GB-hours

in PPR and not here - the models are quite similar, actually PPR is currently PPE simplified (and will be fully consumed by it in the future).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can add similar breakdown there, I guess the weirdness now stems from the change of order, it used to be

Rental
PPR
PPE

so we built on the knowledge above, now this is a bit disjointed, I'll try to address this

Copy link
Contributor Author

@TC-MO TC-MO Oct 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Last question I guess, should we use current prices that can be seen at apify.com/pricing? If yes, which tier? I would say FREE tier makes most sense to me and it seems to be what we used before? I guess since then the pricing has changed especially for proxies

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we say it is "example", we can use whichever (that will help us if prices change in the future - maybe we can say something like "current prices are visible in the console") - I would use FREE tier, since it is used in the calculations


:::info Rental pricing details
:::info Pay-per-event details

If you want more details about rental pricing, refer to our [rental pricing documentation](/platform/actors/publishing/monetize/rental).
If you want more details about PPE pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).

:::

Expand All @@ -59,35 +75,19 @@ If you want more details about PPR pricing, refer to our [PPR documentation](/pl

:::

### Pay-per-event pricing model
### Rental pricing model

![pay per event model example](images/ppe-model.png)
![rental model example](images/rental-model.png)

- _How it works_: you charge users based on specific events triggered programmatically by your Actor's code. You earn 80% of the revenue minus platform usage costs.
- - _Profit calculation_: `profit = (0.8 * revenue) - platform usage costs`
- _Event cost example_: you set the following events for your Actor:
- `Actor start per 1 GB of memory` at $0.005
- `Pages scraped` at $0.002
- `Page opened with residential proxy` at $0.002 - this is on top of `Pages scraped`
- `Page opened with a browser` at $0.002 - this is on top of `Pages scraped`
- _Example_:
- User A:
- Started the Actor 10 times = $0.05
- Scraped 1,000 pages = $2.00
- 500 of those were scraped using residential proxy = $1.00
- 300 of those were scraped using browser = $0.60
- This comes up to $3.65 of total revenue
- User B:
- Started the Actor 5 times = $0.025
- Scraped 500 pages = $1.00
- 200 of those were scraped using residential proxy = $0.40
- 100 of those were scraped using browser = $0.20
- This comes up to $1.625 of total revenue
- That means if platform usage costs are $0.365 for user A and $0.162 for user B your profit is $4.748
- _How it works_: you offer a free trial period and set a monthly fee. Users on Apify paid plans can continue using the Actor after the trial. You earn 80% of the monthly rental fees.
- _Example_: you set a 7-day free trial and $30/month rental. If 3 users start using your Actor:
- 1st user on a paid plan pays $30 after the trial (you earn $24).
- 2nd user starts their trial but pays next month.
- 3rd user on a free plan finishes the trial without upgrading to a paid plan and can’t use the Actor further.

:::info Pay-per-event details
:::info Rental pricing details

If you want more details about PPE pricing, refer to our [PPE documentation](/platform/actors/publishing/monetize/pay-per-event).
If you want more details about rental pricing, refer to our [rental pricing documentation](/platform/actors/publishing/monetize/rental).

:::

Expand Down
4 changes: 2 additions & 2 deletions sources/platform/actors/publishing/monetize/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ Apify Store allows you to monetize your web scraping, automation and AI Agent pr
Actors in Apify Store can be published under one of the following pricing models:

1. _Free_: Users can run the Actor without any additional charges beyond the platform usage costs generated by the Actor.
1. _Rental_: Users pay for the platform usage costs. However, after a trial period, they need to pay a flat monthly fee to the developer to continue using the Actor.
1. _Pay per result (PPR)_: Users don't pay for the platform usage costs. Instead, they pay the developer based on the number of results produced by the Actor.
1. _Pay per event (PPE)_: Users don't pay for the platform usage cost the Actor generates. Instead, they pay based on specific events that are programmatically triggered from the Actor's source code. These events are defined by the developer and can include actions such as generating a single result or starting an Actor.
1. _Pay per result (PPR)_: Users don't pay for the platform usage costs. Instead, they pay the developer based on the number of results produced by the Actor.
1. _Rental_: Users pay for the platform usage costs. However, after a trial period, they need to pay a flat monthly fee to the developer to continue using the Actor.

For a detailed comparison of pricing models from the perspective of your users, refer to [Actors in Store](/platform/actors/running/actors-in-store) page.

Expand Down
28 changes: 14 additions & 14 deletions sources/platform/actors/publishing/monetize/pay_per_event.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Pay per event
description: Learn how to monetize your Actor with pay-per-event (PPE) pricing, charging users for specific actions like Actor starts, dataset items, or API calls, and understand how to set profitable, transparent event-based pricing.
slug: /actors/publishing/monetize/pay-per-event
sidebar_position: 3
sidebar_position: 1
---

**Learn how to monetize your Actor with pay-per-event (PPE) pricing, charging users for specific actions like Actor starts, dataset items, or API calls, and understand how to set profitable, transparent event-based pricing.**
Expand All @@ -12,7 +12,7 @@ sidebar_position: 3
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

The PPE pricing model offers a flexible monetization option for Actors on Apify Store. Unlike pay per result, PPE allows you to charge users based on specific events triggered programmatically by your Actor's code.
The PPE pricing model offers a flexible monetization option for Actors on Apify Store. Unlike [pay per result](/platform/actors/publishing/monetize/pay-per-result), PPE allows you to charge users based on specific events triggered programmatically by your Actor's code.

PPE lets you define pricing for individual events. You can charge for specific events directly from your Actor using the [JS](/sdk/js/reference/class/Actor#charge)/[Python](/sdk/python/reference/class/Actor#charge) SDK, or by calling the [PPE charging API](/api/v2/post-charge-run) directly. Common events include Actor start, dataset item creation, and external API calls.

Expand Down Expand Up @@ -108,7 +108,7 @@ async def charge_for_api_product_detail():

async def main():
await Actor.init()

# API call, or any other logic that you want to charge for

charge_result = await charge_for_api_product_detail()
Expand Down Expand Up @@ -185,7 +185,7 @@ Set memory limits using `minMemoryMbytes` and `maxMemoryMbytes` in your [`actor.

```json
{
"actorSpecification": 1,
"actorSpecification": 1,
"name": "name-of-my-scraper",
"version": "0.0",
"minMemoryMbytes": 512,
Expand Down Expand Up @@ -213,15 +213,15 @@ import { Actor } from 'apify';

const processUrl = async (url) => {
const response = await fetch(url);

if (response.status === 404) {
// Charge for the work done and return error item in one call
await Actor.pushData({
url: url,
error: "404",
errorMessage: "Page not found"
}, 'scraped-result');

return;
}

Expand All @@ -232,7 +232,7 @@ await Actor.init();

const input = await Actor.getInput();
const { urls } = input;

for (const url of urls) {
await processUrl(url);
}
Expand All @@ -251,30 +251,30 @@ import requests

async def process_url(url):
response = requests.get(url)

if response.status_code == 404:
# Charge for the work done and return error item in one call
await Actor.push_data({
'url': url,
'error': '404',
'errorMessage': 'Page not found'
}, 'scraped-result')

return

# Rest of the process_url function

async def main():
await Actor.init()

input_data = await Actor.get_input()
urls = input_data.get('urls', [])

for url in urls:
await process_url(url)

# Rest of the Actor logic

await Actor.exit()
```

Expand All @@ -294,7 +294,7 @@ However, we acknowledge that some events don't produce tangible results (such as
Examples:

- _`post` event_: Each charge adds one social media post to the dataset
- _`profile` event_: Each charge adds one user profile to the dataset
- _`profile` event_: Each charge adds one user profile to the dataset
- _`processed-image` event_: Each charge adds one processed image to the dataset
- _`ai-analysis` event_: Each charge processes one document through an AI workflow (no tangible output, but valuable processing)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Pricing and costs
description: Learn how to set Actor pricing and calculate your costs, including platform usage rates, discount tiers, and profit formulas for PPE and PPR monetization models.
slug: /actors/publishing/monetize/pricing-and-costs
sidebar_position: 3
sidebar_position: 4
---

**Learn how to set Actor pricing and calculate your costs, including platform usage rates, discount tiers, and profit formulas for PPE and PPR monetization models.**
Expand Down
4 changes: 2 additions & 2 deletions sources/platform/actors/publishing/monetize/rental.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Rental pricing model
description: Learn how to monetize your Actor with the rental pricing model, offering users a free trial and a flat monthly fee, and understand how profit is calculated and the limitations of this approach.
slug: /actors/publishing/monetize/rental
sidebar_position: 1
sidebar_position: 3
---

**Learn how to monetize your Actor with the rental pricing model, offering users a free trial and a flat monthly fee, and understand how profit is calculated and the limitations of this approach.**
Expand Down Expand Up @@ -46,7 +46,7 @@ We recommend using the [pay-per-result](/platform/actors/publishing/monetize/pay
You make your Actor rental with _7-day free trial_ and then _$30/month_. During the first calendar month, three users start to use your Actor:

- _User 1 (paid plan)_: Starts free trial on the 15th
- _User 2 (paid plan)_: Starts free trial on the 25th
- _User 2 (paid plan)_: Starts free trial on the 25th
- _User 3 (free plan)_: Starts free trial on the 20th

The first user pays their first rent 7 days after the free trial, i.e., on the 22nd of the month. The second user only starts paying the rent next month. The third user is on the Apify free plan, so after the free trial ends on the 27th of the month, they are not charged and cannot use the Actor further until they get a paid plan.
Expand Down