# Silent-Success Watchdog for n8n: a daily audit of empty runs (`fractionalhqforyou/n8n-silent-success-auditor`) Actor

I audit your n8n workflows once a day and name the ones that finished green while producing nothing, which an error trigger can never catch. You get five verdicts per workflow, each with the reason and a link to the execution. Priced per workflow checked, so a dozen cost a few dollars a month.

- **URL**: https://apify.com/fractionalhqforyou/n8n-silent-success-auditor.md
- **Developed by:** [Jessy Mariau](https://apify.com/fractionalhqforyou) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 workflow scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## n8n Silent-Success Auditor

Most n8n monitoring watches for failures. An execution errors, the error trigger fires, somebody goes and fixes it. The run nobody catches is the other one: the schedule fires on time, every node goes green, and zero rows come out the far end. Nothing in n8n treats that as a problem, so the executions list fills up with ticks while the data quietly goes stale.

I built this after one of my own scheduled jobs spent weeks reporting success and writing nothing. This Actor reads the item counts inside your own executions and treats an empty successful run as a fault in its own right.

### What it checks

For every workflow it scans, the Actor asks your n8n API for the last successful execution, opens that execution's run data, and counts the items the final node actually returned. Each workflow lands in one of five states:

| State | Meaning |
|---|---|
| HEALTHY | ran inside its expected window and the final node returned at least the minimum items |
| EMPTY | the last run finished green and produced nothing |
| STALE | nothing has succeeded inside the expected window |
| DARK | no success inside three expected windows, or no successful run retained at all |
| UNREADABLE | the n8n API could not be read for this workflow, so its state is unknown rather than fine |

Every row carries the workflow name, the state, why, minutes since the last success, the final node's name, its item count, the execution id and a link straight to that execution in your instance.

### What you need

1. Your n8n instance URL, for example `https://n8n.example.com`.
2. An n8n API key. Create one in n8n under Settings, then n8n API. It only needs read access to workflows and executions. Apify stores it as a secret and it never appears in the log or the dataset.

The Actor works with self-hosted n8n and n8n Cloud. It uses the official n8n public API, so executions must be retained on your instance for it to read them (check your execution data settings if everything comes back DARK).

### How to run it

Run it once with no API key and you get a demo dataset: one sample row per state, nothing charged, so you can see the output shape before connecting anything.

Leave the watch list empty and it scans every active workflow using the defaults: expected once a day, at least one item from the final node, and a 1.5 grace multiplier before a late run counts as STALE.

For finer control, give it a watch list:

```json
[
  { "workflowId": "abc123", "label": "Nightly CRM sync", "expectEveryMinutes": 1440, "minItems": 1 },
  { "workflowId": "def456", "label": "Hourly price scrape", "expectEveryMinutes": 60, "minItems": 20 },
  { "workflowId": "ghi789", "label": "Weekly cleanup", "expectEveryMinutes": 10080, "minItems": 0 }
]
```

A workflow that legitimately returns nothing most of the time gets `minItems: 0` and is judged on freshness alone.

Schedule the Actor on Apify to run every hour and wire its dataset or the `OUTPUT` summary into Slack, email or a webhook with an Apify integration. The `OUTPUT` record holds a one-line text summary, the tally per state and the list of faults with links.

### Pricing

Pay per event: one charge per workflow scanned, nothing else. Scanning 20 workflows every hour costs 480 events a day. There are no proxies and no browser behind this Actor, so the platform usage on top is tiny.

### Limits

- The Actor reads only the last successful execution per workflow. It does not read failed runs, because your error trigger already covers those.
- Item counts come from the final node executed. A workflow whose useful output happens mid-chain (for example a Slack post followed by a cleanup step) should set `minItems` to match what that final node returns.
- n8n's public API paginates executions and workflows; large instances take a few seconds per hundred workflows.

### Prefer to self-host it?

The same logic ships as a free n8n template on my creator profile, https://n8n.io/creators/fractional-hq, with the verdict engine and the Slack alerts inside a workflow you run on your own instance. This Actor is the hosted version for people who would rather not babysit a second workflow.

### Built by Fractional HQ

I run Fractional HQ, a one-man studio for design and automation. I do not write code by hand: I architect, review and hold the standard while AI agents do the typing. That method runs my own estate, seven brands, a Postgres operations system, more than 100 scheduled jobs, published n8n templates, Zapier Silver certified.

Need this wired into your own alerting, or want the whole monitoring layer built and handed over working? Get in touch: https://fractionalhq.uk/brief

# Actor input Schema

## `n8nBaseUrl` (type: `string`):

The base URL of your n8n instance, e.g. https://n8n.example.com (no trailing path). Leave the example value and no API key to get a demo dataset.

## `n8nApiKey` (type: `string`):

Create one in n8n under Settings > n8n API. It only needs read access to workflows and executions. Without it the Actor runs in demo mode and charges nothing.

## `watchList` (type: `array`):

Leave empty to scan every active workflow with the defaults below. Or list specific workflows with their own expectations: workflowId, label, expectEveryMinutes, minItems.

## `scanOnDemand` (type: `boolean`):

When no watch list is given, only workflows with a Schedule, Cron or Interval trigger are scanned, because a webhook or manual workflow has no cadence to judge. Switch this on to include them anyway.

## `includeInactive` (type: `boolean`):

When no watch list is given, also scan workflows that are switched off.

## `defaultExpectEveryMinutes` (type: `integer`):

How often a healthy workflow should succeed. 1440 = once a day. Used when a workflow has no watch-list entry.

## `defaultMinItems` (type: `integer`):

The smallest number of items the final node of a healthy run returns. Set 0 for workflows that legitimately return nothing; they are then judged on freshness only.

## `graceMultiplier` (type: `number`):

How far past its interval a workflow may drift before it counts as STALE (1.5 = 50% late). DARK is three stale windows.

## Actor input object example

```json
{
  "n8nBaseUrl": "https://your-n8n.example.com",
  "watchList": [],
  "scanOnDemand": false,
  "includeInactive": false,
  "defaultExpectEveryMinutes": 1440,
  "defaultMinItems": 1,
  "graceMultiplier": 1.5
}
```

# Actor output Schema

## `verdicts` (type: `string`):

One row per scanned workflow: state (HEALTHY, EMPTY, STALE, DARK, UNREADABLE), why, minutes since the last success, final node and its item count, and a link to the execution.

## `summary` (type: `string`):

The OUTPUT record: one-line text summary, tally per state, and the list of faults with links.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "n8nBaseUrl": "https://your-n8n.example.com",
    "watchList": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("fractionalhqforyou/n8n-silent-success-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "n8nBaseUrl": "https://your-n8n.example.com",
    "watchList": [],
}

# Run the Actor and wait for it to finish
run = client.actor("fractionalhqforyou/n8n-silent-success-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "n8nBaseUrl": "https://your-n8n.example.com",
  "watchList": []
}' |
apify call fractionalhqforyou/n8n-silent-success-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fractionalhqforyou/n8n-silent-success-auditor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wVYFJ8zSZ0OvaIACB/builds/666tpnMIcI4z0xVHI/openapi.json
