> ## Documentation Index
> Fetch the complete documentation index at: https://rendobar-docs-compose-gallery.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# API quickstart guide

> Submit your first ffmpeg job, poll to completion, and download the result. Under 5 minutes from API key to finished MP4.

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
__html: JSON.stringify({
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://rendobar.com/docs/quickstart/#article",
  "headline": "API quickstart guide",
  "description": "Submit your first ffmpeg job, poll to completion, and download the result. Under 5 minutes from API key to finished MP4.",
  "datePublished": "2026-03-20",
  "dateModified": "2026-05-24",
  "author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" },
  "publisher": { "@type": "Organization", "@id": "https://rendobar.com/#organization" },
  "isPartOf": { "@id": "https://rendobar.com/#website" }
})
}}
/>

Get an API key, submit an [`ffmpeg`](/jobs/ffmpeg) job, poll until complete, download the output.

## 1. Get an API key

Sign up at [app.rendobar.com](https://app.rendobar.com) and create a key from **Settings → API keys**. Keys start with `rb_`. New accounts get \$5 in free [credits](/concepts/credits).

Prefer the terminal? Skip steps 2–4 and use [the CLI](/cli) instead.

## 2. Submit a job

<CodeGroup>
  ```ts SDK theme={null}
  import { createClient, outputUrl } from "@rendobar/sdk";

  const client = createClient({ apiKey: "rb_YOUR_KEY" });

  const created = await client.jobs.create({
    type: "ffmpeg",
    params: {
      command: "ffmpeg -i https://example.com/video.mp4 -vf scale=1280:720 -c:v libx264 -preset fast -crf 23 output.mp4",
    },
  });

  const job = await client.jobs.wait(created.id);
  console.log(outputUrl(job));
  ```

  ```python Python theme={null}
  import requests

  res = requests.post(
      "https://api.rendobar.com/jobs",
      headers={"Authorization": "Bearer rb_YOUR_KEY"},
      json={
          "type": "ffmpeg",
          "params": {
              "command": "ffmpeg -i https://example.com/video.mp4 -vf scale=1280:720 -c:v libx264 -preset fast -crf 23 output.mp4",
          },
      },
  )
  print(res.json()["data"]["id"])  # job_abc123
  ```

  ```bash cURL theme={null}
  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://example.com/video.mp4 -vf scale=1280:720 -c:v libx264 -preset fast -crf 23 output.mp4"
      }
    }'
  ```
</CodeGroup>

Put input URLs directly in `-i` flags. The output format is inferred from the trailing filename (`output.mp4` → MP4).

Response:

```json theme={null}
{ "data": { "id": "job_abc123", "status": "waiting" } }
```

## 3. Poll for completion

```bash theme={null}
curl https://api.rendobar.com/jobs/job_abc123 \
  -H "Authorization: Bearer rb_YOUR_KEY"
```

Statuses: `waiting → dispatched → running → complete | failed | cancelled`. See [job lifecycle](/concepts/job) for what each status means. Poll every 1–2 seconds.

For push instead of poll, configure a [webhook](/guides/webhooks).

## 4. Download the result

When `status` is `complete`, the response contains an `output` object. The file to download is `output.file.url`, signed and valid for one hour:

```json theme={null}
{
  "data": {
    "id": "job_abc123",
    "status": "complete",
    "output": {
      "data": null,
      "file": {
        "url": "https://r2.rendobar.com/...",
        "path": "output.mp4",
        "type": "video",
        "size": 4194304,
        "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 }
      },
      "files": [
        {
          "url": "https://r2.rendobar.com/...",
          "path": "output.mp4",
          "type": "video",
          "size": 4194304,
          "meta": { "format": "mp4", "width": 1280, "height": 720, "durationMs": 30000 }
        }
      ],
      "expiresAt": 1735689600000
    },
    "cost": { "amount": 50000000, "currency": "USD", "formatted": "$0.05" }
  }
}
```

Every job type returns this same `output` shape: `data` for a computed answer, `file` for the headline result, `files` for the full list. Re-fetch the job to refresh the URLs after they expire.

## What's next

* [Rendobar CLI](/cli): skip the curl, run `rb ffmpeg` from your terminal
* [FFmpeg](/jobs/ffmpeg): full guide with the security model and examples
* [Webhooks](/guides/webhooks): push events instead of polling
* [Credits and billing](/concepts/credits): plans, balance, billing
* [MCP](/mcp-server): drive Rendobar from an AI agent

Need more credits? See [pricing](https://rendobar.com/pricing/) for plan and credit-pack options.

## Related

* [FFmpeg guide](/jobs/ffmpeg): security model, allowed flags, worked examples
* [Job lifecycle](/concepts/job): the six statuses and what triggers each
* [Pricing and plans](https://rendobar.com/pricing/): Free vs Pro and credit-pack pricing
* [All supported FFmpeg operations](https://rendobar.com/features/): full feature index
