Skip to content
Use Actors

Automations

Run Actors on a schedule or after another run, get Slack, Discord, email, Google Sheets, or webhook messages when a run finishes, filter the results, and add an AI step.

An automation does something by itself when its trigger fires. It has one trigger, and then either the Actors it runs with optional filters, an AI step, and deliveries, or a single message or request about the run that triggered it. For example:

  • every Monday at 9:00, run two saved inputs, keep only new items, and email a short summary;
  • when a run of an Actor fails, post to Slack;
  • when a run succeeds, call your webhook, or start another Actor.

Open Automations in the side menu to see all of them in one list, with their trigger, next run, last run, and the AI cost of the last run. An Actor's Automations tab and a saved input's Automations tab list the ones that react to or run that Actor or saved input.

Every schedule is an automation with a schedule trigger and nothing else, and every webhook (including Slack, Discord, email, and Google Sheets messages, and webhooks created through the API, but not the one-off ad-hoc webhooks of a single run) is an automation that reacts to a run, so they are all listed here. Old Schedules, AI Workflows, Integrations, Run alerts, and Webhooks links open the matching automation or list.

Create an automation

Start from any of these:

  • New automation in Automations, or on an Actor's or saved input's Automations tab, which picks that Actor for you. … → Schedule in an Actor's header does the same.
  • Automate this at the bottom of an Actor's Input tab. With one of your saved inputs selected and unchanged, the editor opens with it as the first run. Otherwise you save the form as a new saved input first.
  • Ask AI in New automation, or describe what you want in the AI chat.

Recipes

New automation offers the common cases as one-click recipes. Each one fills in the trigger and where to send, and opens the editor so you can check it and save:

RecipeWhenThen
Notify me on Slack when a run failsA run of the Actor failsA Slack message about the run
Email me the resultsA run of the Actor succeedsAn email with the run's details and the first results
Send results to Google SheetsA run of the Actor succeedsIts results written to a sheet
Call a webhook when a run finishesA run of the Actor finishesA webhook POST to your URL
Start another actor after this oneA run of the Actor succeedsA run of another Actor or saved input

Automations that react to a run

The first four recipes have no run steps: they react to the run that finished and send one message or request about it, right when it finishes. Their When can also be any run in your account, a run that starts, or a build of your Actor, and their Then is one of:

  • Slack, Discord, or Email: a message with the Actor, status, duration, result count, cost, and optionally the first results and your own text. See Slack, Discord and Email.
  • Google Sheets: the run's results, added below the existing rows or replacing the tab. See Google Sheets.
  • Webhook: a POST with the run event, or your own payload and headers templates. See Webhooks.

They are stored as webhooks, so the Webhooks API lists them too, and they keep its delivery rules (retries, signatures, delivery history). To send one run's results to several places, create one automation per place, or add run steps and use the deliveries below.

The editor for automations with run steps has six sections. Only Name, When, and Run are required. Create automation saves it and opens its page, where Run once now lets you check the results right away.

Name is shown in the list, in notifications, and in emails. Until you type one, it is suggested from the first Actor and its saved input.

1. When

ChoiceRuns
ManuallyOnly when you press Run now, call the API, or another automation starts it.
On a scheduleAt the times you pick: Hourly, Daily, Weekly, Monthly, or Custom (a cron expression). The default is daily at 9:00.
After another run finishesWhen one of your runs of an Actor finishes. Pick the Actor, then Any run of this actor or only the runs of one of your saved inputs, and the outcomes (Succeeded, Failed, Timed out, Aborted).

For a schedule, Next runs previews the next three times and about how many runs a month that makes. The Time zone starts as your browser's; change it if the runs should follow another one. The schedule follows daylight saving in that time zone. Runs start up to about a minute after the scheduled time, and a time missed during an outage is skipped, not caught up.

An automation that runs after another run finishes starts once per finished run. It never starts itself, and a chain of automations that start each other stops after 3.

Input from the finished run

When the trigger is After another run finishes, a step's input can use values from the run that finished, written as {{…}} variables inside text fields of the input, for example {"datasetId": "{{resource.defaultDatasetId}}"}. The variables are those of webhook payload templates: {{resource.…}} (the finished run), {{eventData.…}}, {{actorRunId}}, {{defaultDatasetId}}, and so on. A variable that is the whole text is replaced by its value; inside other text it is inserted as text. With the other triggers, {{…}} in an input is left as written.

2. Run

Add up to 10 Actors. They all start at the same time.

For each run, pick the Actor (search the Store and your own Actors, or paste an Actor ID) and its Input. The Input dropdown is the one from the Actor's page (see Saved inputs):

  • A saved input runs as it is when the automation fires. If you edit the saved input later, the automation runs the new version.
  • An example or preset is saved as one of your saved inputs when you save the automation, so later changes to the example don't change what your automation runs.
  • Defaults runs with the Actor's prefilled input.

Customize opens the form so you can change fields for this automation only. Only the fields you change are stored; every other field still comes from the saved input, so later edits to it reach the automation. Reset drops your changes. On an Actor without a saved input, the input is stored with the automation; use Save as new… in the Input menu to reuse it elsewhere.

Run options sets Max results, Max cost per run, Memory, and Timeout (seconds) for this run. Empty fields use the saved input's options, then the Actor's defaults. Max results also reaches the Actor's own result-limit field when its input leaves that field empty. There is no default spending cap: a run is capped only by a Max cost per run you set here or in the saved input, or by the Actor's own minimum cap.

Each run is a normal run on your account, billed like any other run. It shows in Runs, counts toward your concurrency, and fires the automations that react to the Actor's runs. In an automation that keeps, uses AI, or sends, a run that can't start because your run slots are full waits for a free slot; in a plain scheduled automation it fails to start, as a schedule did.

3. Keep

Optional filters on the items the runs return, applied after all runs finished:

FilterDoes
Only when there are resultsSkips sending when the runs found nothing.
Only new items since the last runCompares with the previous run's items by a Key field, such as url or id (up to 5, separated by commas). The first run counts every item as new. When nothing is new, nothing is sent.
Only rows where…Keeps the items that match every condition, for example price is less than 500. Up to 10 conditions. Use dots for nested fields, such as address.city.

The operators are is greater than, is less than, equals, is not, is at least, is at most, contains, doesn't contain, is set, and is empty. Number comparisons also read prices written as text, such as €1,299.00. Text comparisons ignore case.

For "only new items", Scrape.ly stores a short hash of the key field values of the last run, never the items themselves.

4. AI step

Turn on Add an AI step to let AI work on the kept items before they are sent. Pick a Mode and write an Instruction (up to 2,000 characters):

ModeDoesExample instruction
SummarizeWrites a short text about the results.The 5 best new places and why, in short bullet points.
FilterDecides whether to send at all. If the answer is unclear, the results are sent anyway.Only send if a flat under €1,500 with a balcony appeared.
Compare with last runCompares with the previous run's results and says what changed.Which prices went down since the last run, and by how much?
ExtractPulls structured fields out of the results, as JSON.From each description, get the company size and the tech stack.

The AI step reads up to 200 items per Actor run, and up to about 200,000 characters of them in all. When the items don't fit, each one is shortened, keeping fields such as price, area, and place first, and the AI is told it sees a sample. The AI reads the rows themselves; nothing is calculated in code, so ask for a summary, a short list, or a decision rather than exact totals over many rows.

What the AI step costs

The AI step is billed per use, like the AI chat, and you see every charge:

  • Each run in the run history has an AI cost column, and the run's page shows AI cost: $… next to the AI output.
  • The automation list shows the AI cost of each automation's last run.
  • Billing → Current period has an Automation AI steps line with the total and the Cost per run, each linked to its run.

If your balance can't cover it, the AI step is skipped, the run still finishes, and the deliveries send the results digest instead. The run notes "AI step skipped: not enough credits".

5. Send

Without a delivery, results stay in the run history. Add up to 10 places to send them:

DeliverySends
DashboardA notification in the dashboard that opens the run.
EmailAn email to your account address, or to an address you enter. A new address gets a confirmation email first; nothing is sent to it until the link is opened. The results digest is a table per Actor; Email columns picks the title and up to 4 columns for each one, otherwise the email picks the most useful fields itself.
SlackA message to the Slack workspace and channel you connected under Settings → Connections.
DiscordA message through a Discord channel webhook URL.
Google SheetsAppends the kept items as rows. Share the sheet with Scrape.ly first, as described in Google Sheets. Optional Sheet tab.
WebhookA signed POST with the run and its items to your URL.
Run another automationStarts another of your automations.

Sends picks what a delivery contains: AI text, the Results digest (result counts per Actor, links to each run and dataset, and the first 5 items), or Both. AI text needs the AI step. Google Sheets always gets the items, and Run another automation just starts the other one.

Webhook and Discord URLs are stored encrypted and shown masked afterwards; leave the field empty when editing to keep the saved URL. Email, Slack, Discord, and Google Sheets deliveries follow the same limits as the messages about a run.

Webhook payload

A webhook delivery is a POST with Content-Type: application/json and this body:

.json
{
  "userId": "uSrIdExAmPlE123",
  "createdAt": "2026-10-20T07:01:12.000Z",
  "eventType": "AUTOMATION.RUN.SUCCEEDED",
  "eventData": {
    "automationId": "593d12cc-c97c-4ef0-bd5d-a49512326805",
    "automationRunId": "3c246aa2b45548c8b1be",
    "status": "SUCCEEDED",
    "startedAt": "2026-10-20T07:00:00.000Z",
    "actorRunIds": ["ece86a572f094bef8", "d5afaf264d5a443cb"]
  },
  "resource": {
    "...": "the automation run: steps, filter result, aiOutput, aiCostUsd",
    "automation": { "id": "593d12cc-c97c-4ef0-bd5d-a49512326805", "name": "Daily digest" },
    "message": "the delivery's content as Markdown",
    "items": [ "up to 100 kept items" ],
    "url": "link to the run in the dashboard"
  }
}

eventType is AUTOMATION.RUN.FAILED when every Actor run failed without results. The request carries User-Agent: Scrapely-Webhook/1.0, an X-Scrapely-Webhook signature, an X-Scrapely-Webhook-Dispatch-Id, and X-Scrapely-Request-Origin: AUTOMATION, plus the same headers under the X-Apify-… names so receivers written for Apify-compatible webhooks work unchanged. The signature uses a platform key you can't verify, so put a secret in your URL's query string and check it in your endpoint. Failed deliveries (network errors, 429, 5xx) are tried 3 times in all. Every webhook delivery is listed in the webhook dispatch log. See Webhook delivery for every field.

6. Options

OptionDefaultDoes
Skip if the previous run is still goingOnA firing while the previous run, or any of its Actor runs, is still going is skipped and shows as Skipped in the run history.
Alert me if it failsOnAn email and a dashboard notification when a run fails. See Notifications.

An automation that keeps, uses AI, or sends waits up to 2 hours for its Actor runs. After that, it filters and sends what the runs have produced so far. Over the API you can change this wait and how many items are read per run; see Options.

Run history

The automation's page shows its setup and its Runs table, the last 30 runs:

ColumnShows
StartedWhen, and what started it: On schedule, Started by hand, After another run, or Started by another automation
StepsHow many Actor runs succeeded, and their items
ResultWhat the filters kept, how many items were new, or why nothing was sent
AI costThe AI step's cost for this run
SentWhether the deliveries went out, and how many failed
StatusRunning, Processing, Sending, Succeeded, Failed, or Skipped

Open a run to see each Actor run with links to its run and data, the filter result, the AI output and its cost, and each delivery with its error, if any. A failed delivery has Edit delivery; a failed run has Run again and Edit setup.

Run now starts a run whatever the trigger, also while the automation is paused. Pause and Resume stop and restart a scheduled or after-run automation. Duplicate makes a paused copy, saved delivery URLs included. Delete… stops the automation and deletes its run history; the Actor runs and their data stay.

For an automation that reacts to a run, the page shows the delivery history instead: each message or request with its event, the run, and the response or error. Send test sends one with sample data.

An automation that an administrator disabled shows Disabled by an administrator, with the reason. Until an administrator enables it again, it can't run, be resumed, or be duplicated, and the API answers 403 automation-admin-disabled. You can still edit or delete it.

Slack and GitHub are connected under Settings → Connections.

Convert a webhook to an automation

Older Trigger actor and Trigger saved input webhooks start another run by calling the API when a run finishes. They keep working. An automation with run steps does the same without an integration token, and shows the started runs in its run history. Such a webhook's page in Automations has Convert to automation:

  1. Scrape.ly checks the webhook first and shows what the automation would do, for example: "An automation named “…” starts … after a run of … succeeds, as this webhook does now."
  2. Convert creates an automation that runs after the same runs finish and starts the same Actor or saved input with the same input and run options.
  3. The webhook is then deleted and its integration token is revoked. Anything else that uses that token stops working.

Input with variables such as "{{resource.defaultDatasetId}}" inside JSON strings carries over, because steps can take input from the finished run. A webhook can't be converted when its payload isn't a JSON object (for example a variable outside quotation marks), when it turns off variables in strings, when it fires on events other than a finished run, or when it watches every run of your account or a single run. The dialog then says why, and nothing changes.

From the AI chat

Ask the AI chat (AI Chat in the side menu) for what you want, for example "every morning, run my two job searches and send me a summary on Slack". The chat prepares the automation and shows a card to confirm, with the trigger, the runs, the filters, the AI step, and where it sends. An automation with an AI step says "AI step billed like the AI chat" on the card.

  • Confirm creates it as shown.
  • Open in editor opens the editor in a new tab, filled in from the chat, so you can check and change everything before you save. Webhook and Discord URLs never pass through the chat; enter them in the editor. The draft stays in this browser for an hour.

The chat can also edit, pause, and resume your automations, with a confirmation card first. When you ask it to run one, the run starts right away, unless it's expected to cost more than $3; then the chat shows a card to approve first.

Limits

  • Automations and schedules share your plan's schedule limit (see Account & billing).
  • Up to 10 Actors, 10 filter conditions, and 10 deliveries per automation.
  • The last 30 runs are kept per automation.
  • Webhook delivery URLs must be public; private and internal addresses are rejected.
  • Automations that react to a run count toward your plan's webhook limit (100 by default), not the schedule limit.

Use the API

Everything in the editor is available in the Automations API, with any API key that has the automations:write scope (see API keys & permissions). Automations that react to a run are created and edited with the Webhooks API and listed by GET /v2/automations?include=webhooks. Schedule-only clients keep working with the Schedules API.

What's next