diff --git a/.github/workflows/validate-frontmatter.yml b/.github/workflows/validate-frontmatter.yml
index 3fd2224..6a07894 100644
--- a/.github/workflows/validate-frontmatter.yml
+++ b/.github/workflows/validate-frontmatter.yml
@@ -14,6 +14,7 @@ on:
- "scripts/validate-nav-and-redirects.mjs"
- "scripts/check-plan-limits.mjs"
- "scripts/check-webhooks-guide.mjs"
+ - "scripts/check-template-links.mjs"
- "package.json"
pull_request:
paths:
@@ -24,6 +25,7 @@ on:
- "scripts/validate-nav-and-redirects.mjs"
- "scripts/check-plan-limits.mjs"
- "scripts/check-webhooks-guide.mjs"
+ - "scripts/check-template-links.mjs"
- "package.json"
jobs:
@@ -43,3 +45,5 @@ jobs:
run: node scripts/check-plan-limits.mjs
- name: Check webhooks guide matches the webhook contract
run: node scripts/check-webhooks-guide.mjs
+ - name: Check template links and titles against the n8n templates repo
+ run: node scripts/check-template-links.mjs
diff --git a/automation/activepieces.mdx b/automation/activepieces.mdx
new file mode 100644
index 0000000..2d230ba
--- /dev/null
+++ b/automation/activepieces.mdx
@@ -0,0 +1,173 @@
+---
+title: "Run media jobs from Activepieces"
+sidebarTitle: "Activepieces"
+description: "Install the Rendobar piece on Activepieces, add an API key, and run media jobs that pause the flow until they finish, with a trigger for finished jobs."
+icon: "puzzle-piece"
+keywords: ["activepieces", "activepieces piece", "rendobar activepieces", "@rendobar/piece-rendobar", "activepieces video processing", "activepieces ffmpeg", "activepieces waitpoint", "activepieces custom piece"]
+canonical: "https://rendobar.com/docs/automation/activepieces"
+---
+
+
+
+The Rendobar piece runs FFmpeg commands, compression, captions and image generation from an Activepieces flow, and a trigger starts a flow when a job finishes. **Run a Media Job** pauses the flow while the job runs, so an hour-long render holds no worker and does not count against the flow's timeout.
+
+```text
+@rendobar/piece-rendobar
+```
+
+
+
+
+
+## Before you start
+
+- A Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under **Settings > API keys**.
+- Platform admin access to Activepieces 0.36.1 or later. The piece installs from npm rather than from the Activepieces catalog, and installing a custom piece is a paid feature on Activepieces Cloud.
+- An Activepieces that Rendobar can reach over HTTPS, for flows that pause and for the instant trigger. Without one, **Run a Media Job** polls instead and **Finished Job (Polling)** replaces the trigger.
+
+## Install the piece
+
+
+
+ In the platform admin, select **Pieces** under **Setup**.
+
+
+ Select **Install Piece**. Keep **Package Type** on **NPM Registry**, enter `@rendobar/piece-rendobar` as the package name, and confirm.
+
+
+ Rendobar appears in the list with its package name and the installed version.
+
+
+
+
+
+
+
+## Add your API key
+
+Add a Rendobar step to a flow and create a connection with your API key, which starts with `rb_`. The piece checks the key against your account when you save the connection.
+
+Use an API key rather than an OAuth token. **Finished Job** registers a webhook on your account, and Rendobar refuses webhook management over OAuth. If you restrict the key's [scopes](/concepts/scopes), keep `webhooks:write` for that trigger.
+
+## Run a job
+
+Add **Run a Media Job** and pick a **Job Type**. The form below it is built from that job type's live schema, so a new job type shows up without a piece update.
+
+- **Input Media** has one field per file the job reads. `ffmpeg` and `ffprobe` name their files inside the command, so they get a map from file name to URL instead.
+- **Parameters** are the job's own settings. A job type with several models shows **Variant** first, and the fields change to match.
+- **Deliver To** writes the output to buckets connected on the [Storage page](https://app.rendobar.com/storage), optionally under a **Delivery Folder or Path**.
+
+
+
+
+
+For a file produced earlier in the flow, run **Upload File** first and put its `url` in a media field. The upload goes straight to storage through a presigned URL, so the bytes never pass through the API.
+
+### What comes out
+
+Every job-shaped action and trigger returns the same flat row, so a table built on one step works with the others.
+
+| Column | Holds |
+|---|---|
+| `id`, `type`, `status` | The job, its type and its status |
+| `succeeded` | Whether the job completed |
+| `file_url`, `file_size_bytes` | The headline output file |
+| `data` | A job-specific result, such as a probe report or a transcript |
+| `files` | Every output file |
+| `cost_formatted`, `duration_ms` | What the job cost and how long it ran |
+| `deliveries` | One entry per bucket under **Deliver To**, with `status`, `path`, `url` and `reason` |
+
+`cost_formatted` can be `null` on a row read the moment a job completes, because billing settles a moment later. A later read carries it.
+
+## Wait for a long job
+
+
+
+
+
+**Wait for the Result** is on by default. The step creates a waitpoint, sends its resume URL as the job's callback, and pauses the flow. A paused flow holds no worker and does not count against the run timeout, which is 10 minutes on Activepieces Cloud. A pause can last 30 days, longer than any job runs.
+
+When the job ends, Rendobar's callback resumes the flow. The step then re-reads the job over your connection rather than trusting the callback body.
+
+If Rendobar cannot reach this Activepieces from the internet, there is nowhere to call back to. The step polls instead for up to **Maximum Wait (seconds)**, 300 by default, then returns the job as it stands. Keep that below the flow timeout. The job keeps running on Rendobar either way.
+
+Turn **Wait for the Result** off to submit and move on, then pick up the result with [Finished Job](#start-a-flow-when-a-job-finishes). Two more settings shape the step:
+
+- **Fail This Step if the Job Fails** is on by default, so a failed job runs the flow's error path. Turn it off to branch on `succeeded` instead.
+- **Idempotency Key** is derived from the run, the step and the submission when left empty. An automatic retry then settles on the job it already created instead of billing a second one.
+
+## Start a flow when a job finishes
+
+**Finished Job** registers a webhook on your Rendobar account when the flow is turned on, and deletes it when the flow is turned off. **Outcome** picks which jobs start the flow:
+
+| Outcome | Starts on |
+|---|---|
+| Succeeded only | `job.completed`. This is the default |
+| Failed only | `job.failed` |
+| Any finished job, including cancelled | `job.completed`, `job.failed` or `job.cancelled` |
+| Storage deliveries settled | `job.deliveries_settled`, once every bucket under **Deliver To** has resolved |
+
+**Job Type** narrows it to one type, such as `compress.target`. The flow receives the same row **Get Job** returns, read fresh from the API. Each flow with this trigger uses one of the 10 [webhook endpoints](/guides/webhooks) an organization can have.
+
+**Finished Job (Polling)** does the same on a timer, for an Activepieces that Rendobar cannot reach.
+
+## Actions
+
+| Action | What it does |
+|---|---|
+| Run a Media Job | Submit a job and, by default, pause until it finishes |
+| Upload File | Put a file from the flow into Rendobar and get a `url` a job can read |
+| Get Job | Read a job's status, output and cost |
+| Find Jobs | List recent jobs, filtered by status and type |
+| Get Job Logs | Read what the runner reported, to diagnose a failure |
+| Get Account | Read the plan, credit balance and limits |
+| Cancel Job | Stop a job that has not started running |
+| Share Output | Create a shareable link to a completed job's output file |
+| Find Storage Connections | List the buckets connected on the Storage page |
+| List Storage Files | List folders and files in a connected bucket, each with a `storage://` URI |
+| Custom API Call | Call any other Rendobar endpoint with the connection's key |
+
+## Troubleshooting
+
+
+
+ Installing a custom piece needs platform admin access, and on Activepieces Cloud it is a paid feature. On a self-hosted platform, check that Activepieces is 0.36.1 or later.
+
+
+ Activepieces builds the resume URL from `AP_FRONTEND_URL`. When that points at `localhost` or a private address, Rendobar cannot reach it, so the step polls. Set it to the platform's public HTTPS address and restart Activepieces.
+
+
+ Rendobar could not register the webhook, and the error names the reason. A key without the `webhooks:write` scope is refused, and so is an OAuth token. If this Activepieces is not reachable from the internet, use **Finished Job (Polling)**.
+
+
+ The job id reached the step empty. A reference such as `{{step_1.id}}` resolves to nothing when the step name is wrong, so pick the value again from the data selector.
+
+
+ Activepieces caps a step file at 10 MB on Cloud. Turn **Download the Output File** off and pass `file_url` to the next step, which most steps accept.
+
+
+
+## See also
+
+- [Callbacks](/guides/callbacks): the per-job URL the waitpoint listens on
+- [Storage connections](/storage): the buckets **Deliver To** writes to
+- [Package on npm](https://www.npmjs.com/package/@rendobar/piece-rendobar): versions and release notes
+- [Source on GitHub](https://github.com/rendobar/activepieces-piece): MIT licensed
+
+Next step: add **Run a Media Job** to a flow, pick `ffmpeg`, and run a command against a public video URL.
diff --git a/automation/http.mdx b/automation/http.mdx
new file mode 100644
index 0000000..aadbc02
--- /dev/null
+++ b/automation/http.mdx
@@ -0,0 +1,165 @@
+---
+title: "Run jobs from any automation tool over HTTP"
+sidebarTitle: "Any tool over HTTP"
+description: "Submit jobs from Make, Zapier or any tool with an HTTP step, receive the result on a webhook, and re-read the job before you use its file."
+icon: "globe"
+keywords: ["make video api", "zapier video processing", "make http module ffmpeg", "zapier ffmpeg", "webhooks by zapier video", "automation http request video", "callback url automation", "no-code ffmpeg api"]
+canonical: "https://rendobar.com/docs/automation/http"
+---
+
+
+
+Any automation tool that can send an HTTP request and receive a webhook can run Rendobar jobs. One workflow submits the job with a callback URL, and a second workflow starts when Rendobar calls that URL as the job ends.
+
+Use this for Make, Zapier, and self-hosted n8n with community nodes turned off. With the [n8n node](/automation/n8n) or the [Activepieces piece](/automation/activepieces), one workflow waits for the job itself, so use those guides instead.
+
+
+
+
+
+## Submit a job
+
+Send `POST https://api.rendobar.com/jobs` with your API key and a JSON body:
+
+```bash
+curl -X POST https://api.rendobar.com/jobs \
+ -H "Authorization: Bearer rb_YOUR_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "type": "ffmpeg",
+ "params": {
+ "command": "ffmpeg -i https://cdn.rendobar.com/assets/examples/sample.mp4 -vf scale=-2:720 -c:v libx264 -crf 28 output.mp4"
+ },
+ "callback": { "url": "https://hooks.example.com/rendobar-finished" },
+ "idempotencyKey": "row-42"
+ }'
+```
+
+The response names the job:
+
+```json
+{ "data": { "id": "job_a1b2c3d4", "status": "waiting" } }
+```
+
+- **`callback.url`** is the webhook URL of your second workflow. It must be public HTTPS.
+- **`idempotencyKey`** makes a repeated submission return the first job instead of billing a second one. Use a value unique to the record, such as a row id, so a retried step is safe.
+
+Store the job `id` with your record if the second workflow needs to find the record again.
+
+## Receive the result
+
+When the job completes, fails or is cancelled, Rendobar POSTs the job to `callback.url`. These terminal events always fire, so the second workflow always runs. A completed job, shortened to the fields most workflows map:
+
+```json
+{
+ "version": "1",
+ "event": "job.completed",
+ "deliveryId": "whd_x1y2z3",
+ "timestamp": 1707436815000,
+ "orgId": "org_abc123",
+ "data": {
+ "jobId": "job_a1b2c3d4",
+ "jobType": "ffmpeg",
+ "status": "complete",
+ "output": {
+ "data": null,
+ "file": {
+ "url": "https://r2.rendobar.com/...",
+ "path": "output.mp4",
+ "type": "video",
+ "size": 15234567
+ },
+ "expiresAt": 1707440415000
+ }
+ }
+}
+```
+
+Branch on `event`. A `job.failed` delivery carries `data.error.message` in place of `output`. A job with storage destinations also sends `job.deliveries_settled` once every bucket has resolved.
+
+## Re-read the job before you use it
+
+Anyone who learns the callback URL can post to it. Before the second workflow uses the file, fetch the job with your own key:
+
+```bash
+curl https://api.rendobar.com/jobs/job_a1b2c3d4 \
+ -H "Authorization: Bearer rb_YOUR_KEY"
+```
+
+Check that `data.status` is `complete`, then take `data.output.file.url` from this response. The URL expires, so copy the file to its destination in the same workflow.
+
+A tool with a code step can verify the signature instead. Set `callback.verify` to `true` and check `X-Rendobar-Signature` as the [callbacks guide](/guides/callbacks#secure-it) shows.
+
+## Set it up in your tool
+
+Build the receiving workflow first, so its webhook URL exists when you write the request body.
+
+
+
+ 1. Create a scenario that starts with **Webhooks > Custom webhook**. Add a webhook and copy its URL.
+ 2. In the scenario that submits jobs, add **HTTP > Make a request**. Set **URL** to `https://api.rendobar.com/jobs` and **Method** to `POST`.
+ 3. Under **Headers**, add `Authorization` with the value `Bearer rb_YOUR_KEY`.
+ 4. Set **Body content type** to `application/json`, choose **JSON string** as the body input method, and paste the request body with the webhook URL as `callback.url`. Turn on **Parse response** to map `data.id`.
+ 5. Submit one job so the webhook learns the payload's fields.
+ 6. In the receiving scenario, add another **Make a request** that sends `GET` to `https://api.rendobar.com/jobs/` followed by the mapped `data.jobId`, with the same header.
+
+
+ Webhooks by Zapier is available on the Professional, Team and Enterprise plans.
+
+ 1. Create a Zap that starts with **Webhooks by Zapier** and the **Catch Hook** event. Copy the webhook URL it gives you.
+ 2. In the Zap that submits jobs, add **Webhooks by Zapier** with the **Custom Request** event. Set **Method** to `POST` and **URL** to `https://api.rendobar.com/jobs`.
+ 3. Paste the request body into **Data**, with the Catch Hook URL as `callback.url`.
+ 4. Under **Headers**, add `Authorization` with `Bearer rb_YOUR_KEY`, and `Content-Type` with `application/json`.
+ 5. Submit one job, then test the Catch Hook trigger so Zapier learns the payload's fields.
+ 6. In the catching Zap, add another **Custom Request** that sends `GET` to `https://api.rendobar.com/jobs/` followed by the caught `data.jobId`, with the same `Authorization` header.
+
+
+ Any tool with an HTTP request step and a webhook trigger follows the same shape:
+
+ 1. A second workflow that starts on a webhook trigger. Its URL goes in `callback.url`.
+ 2. A `POST` to `https://api.rendobar.com/jobs` with the `Authorization` and `Content-Type` headers and the JSON body above.
+ 3. In the second workflow, a `GET` to `https://api.rendobar.com/jobs/{jobId}` with the same `Authorization` header before the file is used.
+
+
+
+## Troubleshooting
+
+
+
+ The `Authorization` header is missing or the key is wrong. The value is `Bearer`, a space, then the key, which starts with `rb_`.
+
+
+ The account balance is below the job's estimated cost. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billing).
+
+
+ Rendobar could not deliver to `callback.url`. It must be a public HTTPS address, and the receiving workflow must be turned on. Fetch the job and read `data.callback.status`: `delivered` means your tool accepted the POST, and `failed` means every retry was refused.
+
+
+ Delivery is at least once, so a retried delivery can repeat an event. Skip any `deliveryId` you have already handled, and filter on `event` so `job.deliveries_settled` does not run the completed branch again.
+
+
+
+## See also
+
+- [Callbacks](/guides/callbacks): the payload, the headers and the signature
+- [Webhooks](/guides/webhooks): events for every job in the organization at one endpoint
+- [FFmpeg job](/jobs/ffmpeg): how a command names its inputs and outputs
+- [Errors](/support/errors): every error code the API returns
+
+Next step: build the receiving workflow, then submit one job with its webhook URL as `callback.url`.
diff --git a/automation/index.mdx b/automation/index.mdx
new file mode 100644
index 0000000..65d3180
--- /dev/null
+++ b/automation/index.mdx
@@ -0,0 +1,84 @@
+---
+title: "Automate media jobs without code"
+description: "Run Rendobar video and image jobs from n8n or Activepieces, start from ready-made templates, and wait for long jobs without polling."
+sidebarTitle: "Overview"
+icon: "diagram-project"
+keywords: ["rendobar automation", "no-code video processing", "n8n video automation", "activepieces video processing", "make video api", "zapier video api", "workflow automation ffmpeg", "video automation templates"]
+canonical: "https://rendobar.com/docs/automation"
+---
+
+
+
+Run Rendobar jobs from an automation platform instead of code. A workflow submits the job, waits without holding a worker, and hands the finished file to the next step, such as Google Drive, Slack or YouTube.
+
+
+
+
+
+## Platforms
+
+
+
+ A verified node for n8n Cloud and self-hosted n8n, with a trigger and AI Agent tool support.
+
+
+ A piece for self-hosted and paid Activepieces. Flows pause until the job finishes.
+
+
+ Make, Zapier, or any tool that can send a request and receive a webhook.
+
+
+ Import a finished n8n workflow, connect your accounts and run it.
+
+
+
+## Start from a template
+
+
+
+ A new sheet row becomes a 9:16 quote video with music, set in a font made for its language.
+
+
+ A form takes a video URL and a command. Failed jobs post the FFmpeg error to Slack.
+
+
+
+## How waiting works
+
+Media jobs run for seconds or for hours, which is longer than most platforms let one step run. Every integration here waits the same way. The job carries a callback URL, the workflow stops, and Rendobar calls that URL when the job ends. Nothing polls in between.
+
+| | n8n | Activepieces | Any tool over HTTP |
+|---|---|---|---|
+| Install | From the nodes panel | **Install Piece** in the platform admin | Nothing to install |
+| Runs on | n8n Cloud and self-hosted n8n | Self-hosted, or a paid Activepieces Cloud plan | Any tool with an HTTP step |
+| Waits with | A Wait node the callback resumes | A waitpoint the callback resumes | A second workflow the callback starts |
+| Starts a workflow when a job ends | Rendobar Trigger | Finished Job trigger | A webhook trigger |
+
+The callback tells the workflow a job ended. Each guide then re-reads the job with your own API key before using the file. [Callbacks](/guides/callbacks) covers the payload and its signature.
+
+## Before you start
+
+Every integration authenticates with a Rendobar API key. Create one in the [dashboard](https://app.rendobar.com) under **Settings > API keys**. A key created before September 13, 2026 cannot read [storage connections](/storage), so make a new one if a workflow reads from your bucket or delivers to it.
+
+## See also
+
+- [Callbacks](/guides/callbacks): the per-job URL every platform waits on
+- [Webhooks](/guides/webhooks): events for every job in the organization
+- [Jobs](/concepts/job): the statuses a job moves through and the output shape
+- [Storage connections](/storage): read inputs from your bucket and deliver outputs to it
diff --git a/n8n.mdx b/automation/n8n.mdx
similarity index 88%
rename from n8n.mdx
rename to automation/n8n.mdx
index dbad0c7..e9dabdd 100644
--- a/n8n.mdx
+++ b/automation/n8n.mdx
@@ -4,7 +4,7 @@ sidebarTitle: "n8n"
description: "Install the verified Rendobar node on n8n Cloud or self-hosted n8n, add an API key, then run media jobs, wait without polling and hand the node to an AI Agent."
icon: "circle-nodes"
keywords: ["n8n", "n8n node", "rendobar n8n", "n8n cloud ffmpeg", "n8n video processing", "n8n compress video", "n8n captions", "verified community node", "n8n ai agent video", "@rendobar/n8n-nodes-rendobar"]
-canonical: "https://rendobar.com/docs/n8n"
+canonical: "https://rendobar.com/docs/automation/n8n"
---