July 2026 · Datasource Pulse

We broke an endpoint on purpose. Slack knew within a minute.

This week we imported one of our own n8n templates into a fresh n8n cloud workspace, pointed it at a web address we knew would fail, and pressed run. About a minute later a Slack channel got the message below. That is the whole product in one sentence: something you depend on broke, and the right room heard about it before any human went looking.

Full disclosure, as usual: the outage was staged. The check points at a URL that answers 404 on purpose, because the only way to trust an alarm is to hear it ring before there is a real fire. Everything else was production grade: a real n8n workspace, the real Datasource Pulse actor on Apify, a real two-cent charge, and a real Slack message.

🚨 Datasource Pulse · Test endpoint · reachable

State: failing · unexpected_response

Expected HTTP 200, got 404.

Automated with this n8n workflow

Recreated as a graphic for legibility. The wording is verbatim from the real alert.

Sixty seconds, four boxes

The workflow is four nodes and no code. A schedule fires. The Apify node runs one Datasource Pulse health pass, which is where the two cents go. An IF node reads the verdict and lets healthy results die quietly. Anything else becomes a Slack message carrying the state, the failure class, and what was expected versus what actually came back.

The part that makes this work is that the verdict is built for branching, not for reading. Every check returns state, failure_class and a one-line message as stable strings, so the entire routing logic in n8n is one condition: state ≠ healthy. No parsing, no regex, no glue function.

Three templates, import and go

The one we fire-drilled above is one of three ready-made workflows. Each is a JSON file you import into n8n, connect your Apify account to with one OAuth click, and point at your own scrapers, keys, or actors. Costs are billed by Apify per check, with no subscription:

  • Scraper health check → Slack · Watches a scraper and the endpoint it feeds, every six hours, and posts unhealthy verdicts to a channel. 2 checks × 4 runs a day ≈ $4.90 a month.
  • Daily HTTP endpoint watchdog → Gmail · Checks a public URL once a day and emails unhealthy verdicts. Replace the keyless smoke test with your own endpoint after setup. 1 check × 1 run a day ≈ $0.61 a month.
  • Actor output drift monitor → email · Checks one Apify actor a day for schema drift, volume drops, and staleness, and emails on anything unhealthy. 1 actor × 1 run a day ≈ $0.61 a month.

Full setup steps, the input JSON reference, and the verdict schema live on the n8n integration page.

Configure checks around what your pipeline needs

Start with the failure you need to detect. For Actor output, green run status does not prove useful data: check expected fields, unexpected empty output and optional volume changes. For an HTTP endpoint, choose the expected status and, when needed, an explicit response condition.

An HTTP check uses one generic_http block with your URL and success condition. An Actor check uses your Actor ID and read-scoped token. Use the Input editor to configure additional access and usage checks where applicable; a generic HTTP availability check is not automatically a quota monitor.

Four things that will bite you, so they bite you here instead

We import-tested these in a clean workspace this week and hit every one of the following. Learn from our morning:

  • Imports merge into whatever workflow is open. Create a fresh empty workflow first, then use Import from File, or you will find three schedules sharing one canvas.
  • Operation names drift between node versions. The current Apify node calls the right operation “Run an Actor and Get Dataset”. If an older tutorial names something close but not identical, trust the dropdown, not the tutorial. Our templates are current as of this week.
  • Create the Apify credential from inside the node. The “Connect to Apify” button in the node panel gets you the right credential type with one OAuth click.
  • Leave Timeout and Build Tag empty. Empty means sensible defaults: wait as long as the check needs, run the newest build.

An alarm you have never heard ring is a liability

Whatever monitoring you set up, in n8n or anywhere else, break something on purpose once. Point a check at a URL that does not exist, watch the alert arrive, then swap in the real thing. The thirty seconds of staged failure is what turns “we have monitoring” into “we have monitoring we have heard.”

Datasource Pulse watches the data sources your product depends on: credentials, quotas, and scraper output quality. One alert when something degrades, one notice when it recovers.