n8n-core-api — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited n8n-core-api (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
| Aspect | Value |
|---|---|
| Base URL | <N8N_HOST>:<N8N_PORT>/<N8N_PATH>/api/v1/ |
| Authentication | X-N8N-API-KEY header |
| Content-Type | application/json |
| Pagination | Cursor-based (nextCursor field) |
| Max page size | 250 results |
| Default page size | 100 results |
| API Playground | <base-url>/api/v1/docs (Scalar UI) |
| Availability | Requires a paid plan (not available during free trial) |
| Resource | CRUD | Special Operations |
|---|---|---|
| Workflows | GET, POST, PUT, DELETE | activate, deactivate, transfer, tags, versions |
| Executions | GET, DELETE | retry, stop, stop-bulk, tags |
| Credentials | GET, POST, PUT, DELETE | transfer, credential-type schema |
| Users | GET | role management |
| Tags | GET, POST, PUT, DELETE | — |
| Variables | GET, POST, PUT, DELETE | — |
| Projects | GET, POST, PUT, DELETE | user management |
| Audit | POST | security audit |
| Source Control | POST | pull from source control |
NEVER use offset-based pagination -- n8n uses cursor-based pagination exclusively. ALWAYS use the nextCursor value from the response to fetch the next page.
NEVER hardcode API keys in source code or commit them to version control. ALWAYS use environment variables or secret management systems to store API keys.
NEVER use limit values greater than 250 -- the API silently caps at 250 results per page. ALWAYS implement cursor-based pagination for large result sets.
NEVER attempt to delete a running execution -- the API returns an error. ALWAYS stop the execution first with POST /executions/:id/stop, then delete it.
NEVER assume API access is available on free trial instances -- the public REST API requires a paid plan.
ALWAYS include the API key in every request:
X-N8N-API-KEY: <your-api-key>Non-enterprise API keys grant full access to all account resources. Enterprise instances support scope-based restrictions per key. Scopes follow the pattern resource:action:
| Scope Pattern | Example |
|---|---|
workflow:list | List workflows |
workflow:create | Create workflows |
workflow:read | Read single workflow |
workflow:update | Update workflow content |
workflow:delete | Delete workflow |
workflow:activate | Activate workflow |
workflow:deactivate | Deactivate workflow |
workflow:move | Transfer workflow to another project |
execution:list | List executions |
execution:read | Read single execution |
execution:delete | Delete execution |
execution:retry | Retry failed execution |
execution:stop | Stop running execution |
credential:list | List credentials |
credential:create | Create credentials |
credential:update | Update credentials |
credential:delete | Delete credentials |
credential:move | Transfer credentials |
limit (default 100, max 250)data array and nextCursor stringnextCursor as cursor parameter in the next requestnextCursor is null or absent, you have reached the last pageRequest 1: GET /api/v1/workflows?limit=100
Response 1: { "data": [...], "nextCursor": "MTIzNA==" }
Request 2: GET /api/v1/workflows?limit=100&cursor=MTIzNA==
Response 2: { "data": [...], "nextCursor": "NTY3OA==" }
Request 3: GET /api/v1/workflows?limit=100&cursor=NTY3OA==
Response 3: { "data": [...], "nextCursor": null } // Last pageALWAYS check for nextCursor being null or absent to detect the final page. NEVER assume a fixed number of pages.
curl -X GET \
'<BASE_URL>/api/v1/workflows?active=true&limit=100' \
-H 'accept: application/json' \
-H 'X-N8N-API-KEY: <your-api-key>'POST /api/v1/workflows with workflow JSON bodyPOST /api/v1/workflows/:id/activate to activateALWAYS create the workflow first, then activate in a separate call. There is no single-step create-and-activate endpoint.
curl -X POST \
'<BASE_URL>/api/v1/executions/<execution-id>/retry' \
-H 'accept: application/json' \
-H 'X-N8N-API-KEY: <your-api-key>'ALWAYS verify the execution status is error or crashed before retrying. Retrying a successful execution has no effect.
curl -X POST \
'<BASE_URL>/api/v1/workflows/<workflow-id>/transfer' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'X-N8N-API-KEY: <your-api-key>' \
-d '{ "destinationProjectId": "<project-id>" }'cursor=""
while true; do
if [ -z "$cursor" ]; then
response=$(curl -s '<BASE_URL>/api/v1/executions?limit=250' \
-H 'X-N8N-API-KEY: <key>')
else
response=$(curl -s "<BASE_URL>/api/v1/executions?limit=250&cursor=$cursor" \
-H 'X-N8N-API-KEY: <key>')
fi
# Process $response data...
cursor=$(echo "$response" | jq -r '.nextCursor // empty')
[ -z "$cursor" ] && break
done| Variable | Default | Description |
|---|---|---|
N8N_PUBLIC_API_DISABLED | false | Disable the public API entirely |
N8N_PUBLIC_API_ENDPOINT | api | Path prefix for public API endpoints |
N8N_PUBLIC_API_SWAGGERUI_DISABLED | false | Disable Scalar UI API playground |
The interactive API documentation (Scalar UI) is available at:
<base-url>/api/v1/docsThis is available on self-hosted instances by default. Set N8N_PUBLIC_API_SWAGGERUI_DISABLED=true to disable it in production.
Need to manage workflow definitions?
├── List/search workflows → GET /workflows (with query filters)
├── Create new workflow → POST /workflows
├── Update workflow JSON → PUT /workflows/:id
├── Delete workflow → DELETE /workflows/:id
├── Toggle activation → POST /workflows/:id/activate or /deactivate
└── Move to project → POST /workflows/:id/transfer
Need to inspect or manage executions?
├── List executions → GET /executions (filter by status, workflowId)
├── Get execution detail → GET /executions/:id?includeData=true
├── Retry failed → POST /executions/:id/retry
├── Stop running → POST /executions/:id/stop
└── Bulk stop → POST /executions/stop
Need to manage credentials?
├── List credentials → GET /credentials
├── Create credential → POST /credentials
├── Update credential → PUT /credentials/:id
├── Delete credential → DELETE /credentials/:id
├── Get type schema → GET /credential-types/:typeName
└── Move to project → POST /credentials/:id/transfer
Need organizational resources?
├── Tags → /tags (CRUD)
├── Variables → /variables (CRUD)
├── Projects → /projects (CRUD + user management)
└── Users → /users (list, get, role)Running n8n in Docker/remote?
├── YES → Use REST API (only option for remote management)
└── NO (local access to n8n process)
├── Need programmatic integration? → REST API
├── One-off admin task? → CLI (n8n export, n8n import)
└── Backup automation? → CLI for export, API for monitoring~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.