diff --git a/authentication.mdx b/authentication.mdx
index 9143887..41d023a 100644
--- a/authentication.mdx
+++ b/authentication.mdx
@@ -1,25 +1,44 @@
---
title: "Authentication"
-description: "Authenticate Rendobar API requests with a Bearer API key. Same keys cover REST, MCP, and the CLI. OAuth available for MCP clients."
+description: "Authenticate API requests with a Bearer API key. Same keys cover REST, MCP, and the CLI. OAuth available for MCP clients with native support."
sidebarTitle: "Authentication"
icon: "key"
+keywords: ["rendobar authentication", "api key", "bearer token", "rb_ key", "mcp oauth", "rest api auth"]
---
+
+
Every Rendobar API request needs an API key in the `Authorization` header:
```bash
curl https://api.rendobar.com/jobs \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
-Keys start with `rb_live_` (production) or `rb_test_` (test mode). Get one from [app.rendobar.com](https://app.rendobar.com) → **Settings → API keys**. Test-mode jobs run end to end but don't consume credits.
+Keys start with `rb_`. Get one from [app.rendobar.com](https://app.rendobar.com) → **Settings → API keys**.
## Three credential types
| Type | Where to use it |
|---|---|
-| **API key** (`rb_live_*` / `rb_test_*`) | REST API, MCP, CLI in CI |
-| **Session cookie** (`rb_session`) | Dashboard browser sessions only — set automatically when you sign in |
+| **API key** (`rb_*`) | REST API, MCP, CLI in CI |
+| **Session cookie** (`rb_session`) | Dashboard browser sessions only (set automatically when you sign in) |
| **OAuth 2.1 token** | MCP clients with native OAuth support, or the CLI's `rb login` browser flow |
## Use a key
@@ -28,12 +47,12 @@ Keys start with `rb_live_` (production) or `rb_test_` (test mode). Get one from
```bash cURL
curl https://api.rendobar.com/jobs \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
```javascript JavaScript
const res = await fetch("https://api.rendobar.com/jobs", {
- headers: { "Authorization": "Bearer rb_live_YOUR_KEY" },
+ headers: { "Authorization": "Bearer rb_YOUR_KEY" },
});
```
@@ -41,7 +60,7 @@ const res = await fetch("https://api.rendobar.com/jobs", {
import requests
res = requests.get(
"https://api.rendobar.com/jobs",
- headers={"Authorization": "Bearer rb_live_YOUR_KEY"},
+ headers={"Authorization": "Bearer rb_YOUR_KEY"},
)
```
@@ -54,13 +73,13 @@ Keys are scoped to an organization, not a user. Each key has a name. There's no
```bash
# Create
curl -X POST https://api.rendobar.com/api-keys \
- -H "Authorization: Bearer rb_live_EXISTING_KEY" \
+ -H "Authorization: Bearer rb_EXISTING_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "CI Pipeline" }'
# Revoke
curl -X DELETE https://api.rendobar.com/api-keys/KEY_ID \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
Revoked keys return `401 UNAUTHORIZED` immediately.
@@ -69,9 +88,9 @@ Revoked keys return `401 UNAUTHORIZED` immediately.
Every authenticated request resolves to:
-- `userId` — the authenticated user (when via session or OAuth)
-- `orgId` — the active organization
-- `plan` — current plan; controls rate limits, allowed job types, balance
+- `userId`: the authenticated user (when via session or OAuth)
+- `orgId`: the active organization
+- `plan`: current plan; controls [rate limits](/support/limits), allowed job types, [balance](/concepts/credits)
Used for rate limiting, plan enforcement, and credit checks on every request.
@@ -95,3 +114,11 @@ HTTP `401`. Other auth-adjacent errors live in [Error codes](/support/errors).
- [CLI authentication](/cli/authentication)
- [MCP overview](/mcp/overview)
- [Error codes](/support/errors)
+
+## Related
+
+- [Quickstart](/quickstart): submit your first job in under five minutes
+- [CLI authentication](/cli/authentication): `rb login` browser flow and CI key usage
+- [MCP overview](/mcp/overview): how API keys and OAuth work for AI agents
+- [Plan limits](/support/limits): rate limits and concurrency by plan
+- [Pricing](https://rendobar.com/pricing/): Free vs Pro and credit packs
diff --git a/changelog/2026-03-20.mdx b/changelog/2026-03-20.mdx
index d48bbdb..e25017b 100644
--- a/changelog/2026-03-20.mdx
+++ b/changelog/2026-03-20.mdx
@@ -1,9 +1,36 @@
---
title: "Documentation site launch, 2026-03-20"
-description: "Explore the initial docs launch: raw.ffmpeg reference, webhook guide, and MCP integration docs. Powered by Mintlify with an AI-optimized content layer."
+description: "View the initial docs launch with the raw.ffmpeg reference, webhook guide, and MCP integration docs. Powered by Mintlify with AI-optimized content."
icon: "sparkles"
+keywords: ["rendobar changelog", "rendobar releases", "docs launch", "rendobar 2026"]
---
+
+
-Rendobar documentation is now live at [rendobar.com/docs](https://rendobar.com/docs). Includes the `raw.ffmpeg` reference, a webhooks guide, and MCP integration docs for AI agents. The site is powered by Mintlify with an interactive API playground and AI-optimized content.
+Rendobar documentation is now live at [rendobar.com/docs](https://rendobar.com/docs). Includes the [`raw.ffmpeg` reference](/job-types/raw-ffmpeg), a [webhooks guide](/guides/webhooks), and [MCP integration docs](/mcp/overview) for AI agents. The site is powered by Mintlify with an interactive API playground and AI-optimized content.
+
+## Related
+
+- [Quickstart](/quickstart): submit your first job in under five minutes
+- [raw.ffmpeg reference](/job-types/raw-ffmpeg): the live job type and its parameters
+- [MCP overview](/mcp/overview): connect any MCP-compatible agent to Rendobar
+- [Full release history](https://rendobar.com/changelog/): every shipped update on the marketing site
+- [Pricing](https://rendobar.com/pricing/): Free vs Pro and credit packs
diff --git a/cli/authentication.mdx b/cli/authentication.mdx
index 4ee9cc2..ddf5e1a 100644
--- a/cli/authentication.mdx
+++ b/cli/authentication.mdx
@@ -1,10 +1,28 @@
---
title: "Authenticate the CLI"
-description: "Sign in via browser OAuth, paste an API key for non-interactive use, or set RENDOBAR_API_KEY for CI. Tokens auto-refresh."
+description: "Sign in via browser OAuth, paste an API key for non-interactive use, or set RENDOBAR_API_KEY for CI. Tokens auto-refresh every hour."
icon: "key"
-keywords: ["rb login", "rendobar cli auth", "rendobar api key", "rendobar oauth"]
+keywords: ["rb login", "rendobar cli auth", "rendobar api key", "rendobar oauth", "rb whoami"]
---
+
+
The CLI reads credentials from three sources, in priority order:
1. `RENDOBAR_API_KEY` environment variable
@@ -31,7 +49,7 @@ If port `14832` is in use, login fails fast. Use `--key` instead.
For SSH sessions, headless containers, or any environment without a browser:
```bash
-rb login --key rb_live_xxxxxxxxxxxxxxxxxxxxxxxx
+rb login --key rb_xxxxxxxxxxxxxxxxxxxxxxxx
```
The CLI verifies the key against the API, then saves it. Keys must start with `rb_`. Get one from [app.rendobar.com](https://app.rendobar.com) → Settings → API keys.
@@ -41,7 +59,7 @@ The CLI verifies the key against the API, then saves it. Keys must start with `r
`RENDOBAR_API_KEY` beats any saved credential and writes nothing to disk:
```bash
-export RENDOBAR_API_KEY=rb_live_xxx
+export RENDOBAR_API_KEY=rb_xxx
rb ffmpeg -i input.mp4 -c:v libx264 -crf 23 out.mp4
```
@@ -69,7 +87,7 @@ After OAuth login the file looks like:
After `--key`:
```json
-{ "type": "apikey", "apiKey": "rb_live_..." }
+{ "type": "apikey", "apiKey": "rb_..." }
```
Treat the file as a secret. The CLI does not chmod it for you.
@@ -89,10 +107,10 @@ rb logout
rb login
```
-There's no profile system. To run a single command against a different account or test mode, set the env var inline:
+There's no profile system. To run a single command against a different account, set the env var inline:
```bash
-RENDOBAR_API_KEY=rb_test_xxx rb ffmpeg -i clip.mp4 -c:v libx264 out.mp4
+RENDOBAR_API_KEY=rb_xxx rb ffmpeg -i clip.mp4 -c:v libx264 out.mp4
```
## Sign out
@@ -123,3 +141,11 @@ Hits `/orgs/current` and prints org, plan, balance. Useful as a CI sanity check
- [Commands](/cli/commands)
- [CI/CD](/cli/ci-cd)
- [Authentication (API)](/authentication)
+
+## Related
+
+- [API authentication](/authentication): keys, OAuth, and session cookies across REST and MCP
+- [Commands reference](/cli/commands): every `rb` flag and exit code
+- [CI/CD](/cli/ci-cd): full GitHub Actions and GitLab CI snippets
+- [Troubleshooting](/cli/troubleshooting): `invalid_grant`, port conflicts, and refresh failures
+- [CLI source repo](https://github.com/rendobar/cli): release tags and issues
diff --git a/cli/ci-cd.mdx b/cli/ci-cd.mdx
index aeea520..5c5e945 100644
--- a/cli/ci-cd.mdx
+++ b/cli/ci-cd.mdx
@@ -1,11 +1,29 @@
---
title: "Use the CLI in CI/CD"
-description: "Install rb in GitHub Actions, GitLab CI, or Docker. Authenticate from a secret, pin a version, parse JSON output, verify provenance."
+description: "Install rb in GitHub Actions, GitLab CI, or Docker. Authenticate from a secret, pin a version, parse JSON output, verify build provenance."
sidebarTitle: "CI/CD"
icon: "infinity"
-keywords: ["rendobar github actions", "rendobar cli ci", "rendobar gitlab", "rendobar docker"]
+keywords: ["rendobar github actions", "rendobar cli ci", "rendobar gitlab", "rendobar docker", "rb ci secret"]
---
+
+
Three rules for any CI: pin the CLI version, authenticate from a secret, pick an output mode you can parse.
## GitHub Actions
@@ -90,10 +108,10 @@ docker run --rm -v $(pwd):/work -w /work \
## Authenticate from a secret
-`RENDOBAR_API_KEY` is the only auth path for CI. It beats any saved credential and writes nothing to disk. Don't run `rb login` in CI — the browser flow will hang.
+`RENDOBAR_API_KEY` is the only auth path for CI. It beats any saved credential and writes nothing to disk. Don't run `rb login` in CI. The browser flow will hang.
```bash
-export RENDOBAR_API_KEY=rb_live_xxx
+export RENDOBAR_API_KEY=rb_xxx
rb whoami # confirm before running anything else
```
@@ -149,3 +167,11 @@ The CLI does not expose `--idempotency-key`. If a retried CI step shouldn't doub
- [Authentication](/cli/authentication)
- [Commands](/cli/commands)
- [Troubleshooting](/cli/troubleshooting)
+
+## Related
+
+- [CLI overview](/cli/overview): pick between CLI, SDK, and raw HTTP
+- [Authentication](/cli/authentication): `RENDOBAR_API_KEY` as the only CI-safe auth path
+- [Commands reference](/cli/commands): exit codes for boolean assertions
+- [raw.ffmpeg reference](/job-types/raw-ffmpeg): the API the CLI invokes per run
+- [Changelog](https://rendobar.com/changelog/): pin a release tag with confidence
diff --git a/cli/commands.mdx b/cli/commands.mdx
index 535048b..7b487cd 100644
--- a/cli/commands.mdx
+++ b/cli/commands.mdx
@@ -1,12 +1,30 @@
---
title: "Commands reference"
-description: "Every rb command, every flag, every exit code. Covers ffmpeg, login, logout, whoami, doctor, and update."
+description: "View every rb command, flag, and exit code. Covers ffmpeg, login, logout, whoami, doctor, and update across 6 subcommands."
sidebarTitle: "Commands"
icon: "list"
-keywords: ["rb commands", "rendobar cli reference", "rb ffmpeg flags", "rb exit codes"]
+keywords: ["rb commands", "rendobar cli reference", "rb ffmpeg flags", "rb exit codes", "rb doctor"]
mode: "wide"
---
+
+
Reference for every `rb` command. Use the [overview](/cli/overview) for narrative.
## Global flags
@@ -73,7 +91,7 @@ Runs FFmpeg in the cloud. Pass real FFmpeg arguments after the subcommand. Globa
Local input files (`-i ./clip.mp4`) upload automatically before submission and are rewritten to short-lived URLs. Remote inputs (`-i https://...`) pass through as-is.
-The trailing positional argument (the FFmpeg output filename) is the local path the result downloads to. With `--no-wait` no download happens — only the job ID prints.
+The trailing positional argument (the FFmpeg output filename) is the local path the result downloads to. With `--no-wait` no download happens. Only the job ID prints.
Job-failure exits `1` and writes the API error to stderr. Insufficient credits exits `2` with a top-up link.
@@ -111,7 +129,7 @@ Credential paths and storage details: [Authentication](/cli/authentication).
```bash
rb login
-rb login --key rb_live_xxx
+rb login --key rb_xxx
```
---
@@ -164,3 +182,11 @@ Exits `2` if not authenticated, `1` if the API call fails.
- [Authentication](/cli/authentication)
- [CI/CD](/cli/ci-cd)
- [Troubleshooting](/cli/troubleshooting)
+
+## Related
+
+- [CLI overview](/cli/overview): narrative quickstart for `rb ffmpeg`
+- [Authentication](/cli/authentication): `rb login` flow and credential storage
+- [CI/CD](/cli/ci-cd): parse `--json` output and authenticate from a secret
+- [raw.ffmpeg reference](/job-types/raw-ffmpeg): the underlying API call
+- [Changelog](https://rendobar.com/changelog/): release notes for every `rb` version
diff --git a/cli/installation.mdx b/cli/installation.mdx
index 2b4b11a..4363819 100644
--- a/cli/installation.mdx
+++ b/cli/installation.mdx
@@ -1,10 +1,28 @@
---
title: "Install the CLI"
-description: "Install the rb binary on macOS, Linux, or Windows. Pin a version, change the install path, run inside Docker, or uninstall."
+description: "Install the rb binary on macOS, Linux, or Windows in one command. Pin a version, change the install path, run inside Docker, or uninstall."
icon: "download"
-keywords: ["install rendobar cli", "rb install", "rendobar windows install", "rendobar docker"]
+keywords: ["install rendobar cli", "rb install", "rendobar windows install", "rendobar docker", "rb doctor"]
---
+
+
Install the `rb` binary in one command, on any of the three supported platforms.
@@ -123,3 +141,11 @@ The uninstaller removes the binary and the PATH entry. Add `RENDOBAR_PURGE=1` to
- [Troubleshooting](/cli/troubleshooting)
For version history and release notes, see the [changelog](https://rendobar.com/changelog/).
+
+## Related
+
+- [CLI overview](/cli/overview): what the `rb` binary does and when to pick it
+- [Authentication](/cli/authentication): `rb login`, API keys, CI credentials
+- [CI/CD](/cli/ci-cd): pin a version and authenticate from a secret
+- [Troubleshooting](/cli/troubleshooting): install, PATH, and Gatekeeper fixes
+- [Changelog](https://rendobar.com/changelog/): version history and release notes
diff --git a/cli/overview.mdx b/cli/overview.mdx
index 683d521..a7e21e2 100644
--- a/cli/overview.mdx
+++ b/cli/overview.mdx
@@ -3,9 +3,27 @@ title: "CLI overview and quickstart"
sidebarTitle: "Overview"
description: "Run FFmpeg in the cloud from your terminal. Pass real ffmpeg flags; the CLI uploads local files, runs the job, and downloads the result."
icon: "terminal"
-keywords: ["rb cli", "rendobar command line", "ffmpeg cli", "cloud ffmpeg"]
+keywords: ["rb cli", "rendobar command line", "ffmpeg cli", "cloud ffmpeg", "rb ffmpeg"]
---
+
+
The Rendobar CLI runs FFmpeg in the cloud from your shell. You write the same `ffmpeg` command you'd run locally, prefixed with `rb`.
@@ -73,3 +91,11 @@ The CLI does one thing: run FFmpeg jobs. It does not bundle filter chaining, bat
- [Commands](/cli/commands)
- [CI/CD](/cli/ci-cd)
- [Troubleshooting](/cli/troubleshooting)
+
+## Related
+
+- [Installation](/cli/installation): one-line install, pin a version, Docker, uninstall
+- [Commands reference](/cli/commands): every `rb` subcommand, flag, and exit code
+- [CI/CD](/cli/ci-cd): GitHub Actions, GitLab CI, and Docker recipes
+- [raw.ffmpeg reference](/job-types/raw-ffmpeg): the API the CLI calls under the hood
+- [FFmpeg in the cloud](https://rendobar.com/ffmpeg/): supported operations on the marketing site
diff --git a/cli/troubleshooting.mdx b/cli/troubleshooting.mdx
index a935c53..cb67c27 100644
--- a/cli/troubleshooting.mdx
+++ b/cli/troubleshooting.mdx
@@ -3,9 +3,27 @@ title: "CLI troubleshooting"
description: "Fix common rb CLI errors: install failures, PATH issues, port conflicts, macOS Gatekeeper, expired tokens, rate limits, update rollback."
sidebarTitle: "Troubleshooting"
icon: "stethoscope"
-keywords: ["rb cli error", "rendobar cli not found", "rendobar login failed", "rb doctor"]
+keywords: ["rb cli error", "rendobar cli not found", "rendobar login failed", "rb doctor", "rb update failed"]
---
+
+
Run this first:
```bash
@@ -48,7 +66,7 @@ xattr -d com.apple.quarantine $(which rb)
## Login
-**Port 14832 in use.** Another process holds the OAuth callback port. Free it (`lsof -i :14832`) or skip the browser flow: `rb login --key rb_live_xxx`.
+**Port 14832 in use.** Another process holds the OAuth callback port. Free it (`lsof -i :14832`) or skip the browser flow: `rb login --key rb_xxx`.
**Login timed out.** The browser flow waits 120 seconds. Re-run `rb login`. If your network blocks loopback HTTP (some corporate firewalls do), use `--key` instead.
@@ -61,7 +79,7 @@ xattr -d com.apple.quarantine $(which rb)
**`Not authenticated. Run rb login or set RENDOBAR_API_KEY`.** No credentials saved or file corrupt. Pick one:
- Interactive: `rb login`
-- CI: `export RENDOBAR_API_KEY=rb_live_xxx`
+- CI: `export RENDOBAR_API_KEY=rb_xxx`
- Inspect what the CLI sees: `rb whoami`
**Insufficient credits.** Exits `2` with a top-up link. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billing). Check balance with `rb whoami`.
@@ -74,7 +92,7 @@ rb ffmpeg --json -i in.mp4 -c:v libx264 out.mp4 | jq .
`error.code` and `error.message` are the canonical failure reason.
-**Local input file isn't being uploaded.** The CLI treats arguments after `-i` as inputs. A local input is detected only when the path is after `-i`, doesn't look like a URL, and exists on disk. Custom filter graphs reading files via `movie=` won't be detected — upload manually and pass a URL.
+**Local input file isn't being uploaded.** The CLI treats arguments after `-i` as inputs. A local input is detected only when the path is after `-i`, doesn't look like a URL, and exists on disk. Custom filter graphs reading files via `movie=` won't be detected. Upload manually and pass a URL.
## Update
@@ -140,3 +158,11 @@ A TLS error like `unable to verify the first certificate` is the symptom.
- [Authentication](/cli/authentication)
- [Commands](/cli/commands)
- [API errors](/support/errors)
+
+## Related
+
+- [Installation](/cli/installation): re-install steps, PATH variables, version pinning
+- [Authentication](/cli/authentication): `rb login` and credential-file layout
+- [Commands](/cli/commands): exit codes, output modes, every flag
+- [API errors](/support/errors): the canonical `error.code` catalogue
+- [CLI source repo](https://github.com/rendobar/cli): file a bug or check the latest release
diff --git a/concepts/credits.mdx b/concepts/credits.mdx
index 350f35c..dd7647d 100644
--- a/concepts/credits.mdx
+++ b/concepts/credits.mdx
@@ -1,20 +1,39 @@
---
title: "Credits and billing"
sidebarTitle: "Credits"
-description: "Get per-job nanodollar billing from a prepaid balance. Free plan ships with $5, Pro is $9/mo. Credits never expire and failed jobs cost nothing."
+description: "Get per-job nanodollar billing from a prepaid balance. Free plan grants $5, Pro is $9/mo. Credits never expire. Every terminal job pays actual compute."
icon: "coins"
+keywords: ["credit-based billing", "nanodollar pricing", "rendobar credits", "video api credits", "prepaid balance"]
---
-Per-job billing from a prepaid credit balance. New accounts get $5 free. Failed jobs are never charged.
+
+
+Per-job billing from a prepaid credit balance. New accounts get $5 free. Every terminal job is charged for the compute it consumed, including jobs that fail.
## Plans
| | Free | Pro |
|---|---|---|
| Price | $0/mo | $9/mo |
-| Signup credits | $5 (one-time) | — |
-| Monthly credits included | — | $5 |
-| Credit-purchase bonus | — | +20% |
+| Signup credits | $5 (one-time) | - |
+| Monthly credits included | - | $5 |
+| Credit-purchase bonus | - | +20% |
| Concurrent jobs | 1 | 25 |
| API requests/min | 30 | 300 |
| Max input file | 100 MB | 2 GB |
@@ -28,7 +47,7 @@ For a full pricing breakdown and plan comparison, see [rendobar.com/pricing/](ht
## Credit packs
-$10 / $25 / $50 / $100 (or custom, $10 minimum). Pro adds **+20%** to every purchase — buy $25, get $30. Credits never expire.
+$10 / $25 / $50 / $100 (or custom, $10 minimum). Pro adds **+20%** to every purchase. Buy $25, get $30. Credits never expire.
## How it works: nanodollar billing
@@ -39,16 +58,20 @@ Every job is billed in nanodollars (one-billionth of a US dollar) drawn from you
## Credit lifecycle
-1. **Pre-check.** Submit triggers a balance check against the estimated cost. No deduction. Insufficient balance returns `402 INSUFFICIENT_CREDITS`.
+1. **Submit gate.** Submit is atomic. If your balance is greater than zero and you are under your concurrent-job limit, the job runs. We do not estimate cost up front. Insufficient balance returns `402 INSUFFICIENT_CREDITS`.
2. **Execution.** Job runs. Balance untouched.
-3. **Debit.** On success, actual cost is computed (real compute time or output duration) and atomically deducted.
-4. **Refund.** Failure or cancellation never deducts. Failed jobs cost zero.
+3. **Debit on terminal status.** Every terminal job (`complete`, `failed`, or `cancelled`) is charged based on actual provider cost, infrastructure cost, and margin. The debit is atomic with the status update.
+4. **No auto-refund.** Failed jobs are still charged for the compute they consumed. If you believe a job failed due to a platform bug, contact support. Refunds are issued at our discretion via the dispute process.
+
+## Negative balance
+
+Because the submit gate checks `balance > 0` rather than an estimate, a single long-running job can drive your balance briefly negative when the terminal debit lands. When that happens, your subscription flips to `past_due` and further submits are blocked with `402 INSUFFICIENT_CREDITS` until you top up. Once your balance is positive again, normal billing resumes.
## Cost model
-`raw.ffmpeg` bills per compute second — wall-clock time FFmpeg ran your command, excluding upload/download. Typical cost: ~$0.05/min.
+`raw.ffmpeg` bills per compute second, which is the wall-clock time FFmpeg ran your command, excluding upload and download. Typical cost: ~$0.05/min. The same per-second rate applies whether the job completes successfully or fails partway through.
-Before submitting, the API checks your balance covers the estimated cost. If not:
+If your balance is at or below zero when you submit:
```json
{ "error": { "code": "INSUFFICIENT_CREDITS", "message": "Not enough credits for this job" } }
@@ -59,21 +82,28 @@ HTTP `402`. Top up at [app.rendobar.com/billing](https://app.rendobar.com/billin
## Check your balance
```bash
-curl https://api.rendobar.com/billing/balance \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+curl https://api.rendobar.com/billing/state \
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
```json
-{ "data": { "balance": 5000000000, "rollover": 0 } }
+{
+ "data": {
+ "balance": { "amount": 5.0 },
+ "plan": { "slug": "free", "name": "Free" },
+ "subscription": { "status": "active", "cancelAtPeriodEnd": false },
+ "isPro": false
+ }
+}
```
-`balance` is in nanodollars (1 USD = 1,000,000,000). The dashboard shows it in dollars.
+`balance.amount` is in dollars. Internally balances are stored in nanodollars (1 USD = 1,000,000,000).
## Usage tracking
```bash
curl "https://api.rendobar.com/billing/usage?start=2026-02-01&end=2026-02-09" \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
Returns daily usage by job type: count, amount charged, and compute seconds.
@@ -81,11 +111,18 @@ Returns daily usage by job type: count, amount charged, and compute seconds.
## Practical advice
- **Start on Free.** $5 signup grant covers many hundreds of small jobs.
-- **Use `rb_test_*` keys while building.** Test-mode runs the full pipeline, returns real output, and doesn't deduct credits.
- **Store `cost.nanodollars` from every response.** Reconcile against your monthly invoice.
## See also
-- [Job lifecycle](/concepts/job-lifecycle) — where the debit happens
-- [Limits](/support/limits) — full quota table
-- [raw.ffmpeg reference](/job-types/raw-ffmpeg) — the live cost model
+- [Job lifecycle](/concepts/job-lifecycle): where the debit happens
+- [Limits](/support/limits): full quota table
+- [raw.ffmpeg reference](/job-types/raw-ffmpeg): the live cost model
+
+## Related
+
+- [Plan limits and quotas](/support/limits): exact rate, file, and storage caps per plan
+- [Job lifecycle](/concepts/job-lifecycle): when the debit lands and what statuses mean
+- [Error codes](/support/errors): `INSUFFICIENT_CREDITS`, `PLAN_LIMIT`, and friends
+- [Pricing](https://rendobar.com/pricing/): plan comparison and credit packs
+- [FAQ on cost](/support/faq): common pricing and billing questions
diff --git a/concepts/job-lifecycle.mdx b/concepts/job-lifecycle.mdx
index 3d1d206..eecea8d 100644
--- a/concepts/job-lifecycle.mdx
+++ b/concepts/job-lifecycle.mdx
@@ -1,10 +1,29 @@
---
title: "Job lifecycle"
-description: "Explore job status transitions from waiting to complete, what triggers each state, timeout behavior, retries, and real-time update consumption."
+description: "View job status transitions across 6 states from waiting to complete, what triggers each, timeout behavior, retries, and real-time updates."
sidebarTitle: "Job lifecycle"
icon: "rotate"
+keywords: ["job lifecycle", "job status", "waiting complete failed", "video processing job states", "rendobar status"]
---
+
+
Every job moves through six statuses:
```
@@ -18,13 +37,13 @@ waiting → dispatched → running → complete
| `waiting` | Saved, queued for dispatch |
| `dispatched` | Sent to the execution provider (Trigger.dev) |
| `running` | Provider has started processing |
-| `complete` | Finished successfully — output available |
-| `failed` | Errored — see `error.code` and `error.message` |
+| `complete` | Finished successfully. Output available |
+| `failed` | Errored. See `error.code` and `error.message` |
| `cancelled` | Cancelled before completion |
## Each transition
-**Submission → `waiting`.** Auth, rate limit, plan, credit pre-check, schema validation. If all pass, job is saved.
+**Submission → `waiting`.** Auth, [rate limit](/support/limits), plan, [credit pre-check](/concepts/credits), schema validation. If all pass, job is saved.
**Dispatch → `dispatched`.** Routed to an available provider. The provider receives presigned URLs for input download and output upload.
@@ -55,15 +74,15 @@ To manually retry a failed job:
```bash
curl -X POST https://api.rendobar.com/jobs/job_abc/retry \
- -H "Authorization: Bearer rb_live_YOUR_KEY"
+ -H "Authorization: Bearer rb_YOUR_KEY"
```
## Real-time updates
Two ways to stop polling:
-- **[Webhooks](/guides/webhooks)** — push events to your server. Recommended for production.
-- **WebSocket (dashboard)** — the dashboard streams creation, status, progress, and balance over a per-org hub. Currently dashboard-only; programmatic clients should use webhooks.
+- **[Webhooks](/guides/webhooks)**: push events to your server. Recommended for production.
+- **WebSocket (dashboard)**: the dashboard streams creation, status, progress, and balance over a per-org hub. Currently dashboard-only. Programmatic clients should use webhooks.
## See also
@@ -71,3 +90,11 @@ Two ways to stop polling:
- [Webhooks](/guides/webhooks)
- [Error codes](/support/errors)
- [How credits work](/concepts/credits)
+
+## Related
+
+- [Webhooks](/guides/webhooks): push status changes to your server instead of polling
+- [Credits and billing](/concepts/credits): when and how the terminal debit lands
+- [Error codes](/support/errors): every `error.code` returned by failed jobs
+- [Raw FFmpeg](/guides/raw-ffmpeg): what runs between `dispatched` and `complete`
+- [Changelog](https://rendobar.com/changelog/): platform changes that affect job behavior
diff --git a/docs.json b/docs.json
index c694619..10a9611 100644
--- a/docs.json
+++ b/docs.json
@@ -194,10 +194,16 @@
"og:image": "https://rendobar.com/brand/og-default.jpg",
"og:image:width": "1200",
"og:image:height": "630",
- "og:image:alt": "Rendobar — Serverless media processing API",
+ "og:image:alt": "Rendobar: Media processing API for developers and agents",
"og:image:type": "image/jpeg",
"twitter:card": "summary_large_image",
"twitter:site": "@rendobar",
+ "twitter:image": "https://rendobar.com/brand/og-default.jpg",
+ "twitter:image:alt": "Rendobar: Media processing API for developers and agents",
+ "twitter:creator": "@rendobar",
+ "format-detection": "telephone=no",
+ "theme-color": "#0A0A0A",
+ "author": "Rendobar",
"robots": "index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
}
},
diff --git a/guides/raw-ffmpeg.mdx b/guides/raw-ffmpeg.mdx
index 96d9898..a131b51 100644
--- a/guides/raw-ffmpeg.mdx
+++ b/guides/raw-ffmpeg.mdx
@@ -1,8 +1,9 @@
---
title: "Raw FFmpeg guide"
sidebarTitle: "Raw FFmpeg"
-description: "Run any FFmpeg command in the cloud. Whitelisted flags, sandboxed execution, signed download URL. Same FFmpeg syntax you already know."
+description: "Run any FFmpeg command in the cloud. ~120 whitelisted flags, 8-layer sandboxed execution, signed download URL. Same FFmpeg syntax you know."
icon: "terminal"
+keywords: ["ffmpeg guide", "ffmpeg in cloud", "ffmpeg sandboxed execution", "ffmpeg flags whitelist", "raw ffmpeg api"]
---