{"id":"103c8cad-aedd-41b3-84d8-f606186d1f7a","entityType":"agent","slug":"clawhub-nevermind-s-renderio-ffmpeg-api","name":"RenderIO ffmpeg","canonicalUrl":"https://www.xpersona.co/agent/clawhub-nevermind-s-renderio-ffmpeg-api","canonicalPath":"/agent/clawhub-nevermind-s-renderio-ffmpeg-api","generatedAt":"2026-10-10T07:38:12.530Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":null},"description":"Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai... Skill: RenderIO ffmpeg Owner: nevermind-s Summary: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai... Tags: latest:1.0.1 Version history: v1.0.1 | 2026-05-17T20:49:00.557Z | user - Updated API endpoint domain in all cURL examples from api.renderio.dev to renderio.dev - No functional changes to code samples or","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.9K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s178j2wvzjgw6a7m16zyxev96586x2pb:renderio-ffmpeg-api","sourceUrl":"https://clawhub.ai/nevermind-s/renderio-ffmpeg-api","homepage":"https://clawhub.ai/nevermind-s/skills/renderio-ffmpeg-api","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/nevermind-s/renderio-ffmpeg-api","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/nevermind-s/skills/renderio-ffmpeg-api","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":null},"stars":null,"forks":null,"downloads":1857,"packageName":null,"latestVersion":"1.0.1","tractionLabel":"1.9K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:01:36.324Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T00:01:36.895Z","lastCrawledAt":"2026-10-10T00:01:36.324Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T00:01:36.324Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.1","createdAt":"2026-05-17T20:49:00.557Z","changelog":"- Updated API endpoint domain in all cURL examples from api.renderio.dev to renderio.dev - No functional changes to code samples or documentation - File content and workflows remain unchanged","fileCount":3,"zipByteSize":5253},{"version":"1.0.0","createdAt":"2026-05-17T19:51:47.593Z","changelog":"RenderIO FFmpeg API Skill v1.0.0 - Initial release of the RenderIO FFmpeg-as-a-Service API skill. - Provides instructions for authenticating, submitting FFmpeg commands, polling status, and retrieving processed media via the RenderIO API. - Includes clear rules for command formatting and key naming conventions. - Offers ready-to-use code samples in TypeScript and Python. - Features a library of common FFmpeg command recipes for video, audio, and image processing use cases.","fileCount":2,"zipByteSize":4053}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178j2wvzjgw6a7m16zyxev96586x2pb:renderio-ffmpeg-api","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:38:12.530Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nevermind-s-renderio-ffmpeg-api/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":null},"readme":"Skill: RenderIO ffmpeg\n\nOwner: nevermind-s\n\nSummary: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai...\n\nTags: latest:1.0.1\n\nVersion history:\n\nv1.0.1 | 2026-05-17T20:49:00.557Z | user\n\n- Updated API endpoint domain in all cURL examples from api.renderio.dev to renderio.dev\n- No functional changes to code samples or documentation\n- File content and workflows remain unchanged\n\nv1.0.0 | 2026-05-17T19:51:47.593Z | user\n\nRenderIO FFmpeg API Skill v1.0.0\n\n- Initial release of the RenderIO FFmpeg-as-a-Service API skill.\n- Provides instructions for authenticating, submitting FFmpeg commands, polling status, and retrieving processed media via the RenderIO API.\n- Includes clear rules for command formatting and key naming conventions.\n- Offers ready-to-use code samples in TypeScript and Python.\n- Features a library of common FFmpeg command recipes for video, audio, and image processing use cases.\n\nArchive index:\n\nArchive v1.0.1: 3 files, 5253 bytes\n\nFiles: skill-card.md (2277b), skill.md (11222b), _meta.json (138b)\n\nFile v1.0.1:skill.md\n\n---\nname: renderio-api\ndescription: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chained workflows, and webhook delivery. Use this skill whenever the user wants to convert, resize, compress, trim, watermark, extract audio from, or otherwise process media via the RenderIO API.\nallowed-tools: Read, Write, Edit, Bash, WebFetch\n---\n\n# RenderIO API Skill\n\nRenderIO is an FFmpeg-as-a-Service REST API. You send an FFmpeg command over HTTP; RenderIO runs it in a secure cloud sandbox, stores outputs automatically, and returns signed download URLs.\n\n## Setup\n\n```bash\n# Store API key as environment variable\nexport RENDERIO_API_KEY=\"ffsk_your_api_key_here\"\n```\n\nGet a free API key at [renderio.dev/get-api-key](https://renderio.dev/get-api-key).\n\n## The three rules that must never be broken\n\n1. **Double braces for placeholders** — use `{{in_video}}` not `{in_video}`\n2. **Key prefixes** — input keys start with `in_`, output keys start with `out_`\n3. **Every key used in the command must be declared**, and every declared key must appear in the command\n\n```json\n// CORRECT\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/video.mp4\" },\n  \"output_files\": { \"out_video\": \"result.mp4\" }\n}\n\n// WRONG — single braces, missing out_ prefix\n{\n  \"ffmpeg_command\": \"-i {video} result.mp4\",\n  \"input_files\": { \"video\": \"https://example.com/video.mp4\" }\n}\n```\n\n## Core workflow\n\n### 1. Submit a command\n\n```bash\ncurl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n    \"output_files\": { \"out_video\": \"output-720p.mp4\" }\n  }'\n```\n\nResponse: `{ \"command_id\": \"a1b2c3d4-...\" }`\n\n### 2. Poll for completion\n\n```bash\ncurl https://renderio.dev/api/v1/commands/$COMMAND_ID \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\"\n```\n\nStatus values: `QUEUED` → `PROCESSING` → `SUCCESS` or `FAILED` (always uppercase).\n\n### 3. Get output URL\n\n```\nresult.output_files.out_video.storage_url\n```\n\n## TypeScript implementation\n\n```typescript\nconst API_KEY = process.env.RENDERIO_API_KEY!;\nconst BASE = \"https://api.renderio.dev\";\n\ninterface CommandResult {\n  command_id: string;\n  status: \"QUEUED\" | \"PROCESSING\" | \"SUCCESS\" | \"FAILED\";\n  output_files: Record<string, {\n    storage_url: string;\n    filename: string;\n    size_mbytes: number;\n    duration?: number;\n    codec?: string;\n    width?: number;\n    height?: number;\n  }>;\n  total_processing_seconds?: number;\n  error?: string;\n}\n\nasync function runFFmpeg(\n  command: string,\n  inputFiles: Record<string, string>,\n  outputFiles: Record<string, string>,\n): Promise<CommandResult> {\n  const submitRes = await fetch(`${BASE}/api/v1/run-ffmpeg-command`, {\n    method: \"POST\",\n    headers: { \"X-API-KEY\": API_KEY, \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({\n      ffmpeg_command: command,\n      input_files: inputFiles,\n      output_files: outputFiles,\n    }),\n  });\n\n  if (!submitRes.ok) {\n    const err = await submitRes.json();\n    throw new Error(`Submit failed: ${err.message}`);\n  }\n\n  const { command_id } = await submitRes.json();\n\n  // Poll with 2s interval\n  while (true) {\n    await new Promise((r) => setTimeout(r, 2000));\n\n    const pollRes = await fetch(`${BASE}/api/v1/commands/${command_id}`, {\n      headers: { \"X-API-KEY\": API_KEY },\n    });\n    const result: CommandResult = await pollRes.json();\n\n    if (result.status === \"SUCCESS\") return result;\n    if (result.status === \"FAILED\") {\n      throw new Error(`Processing failed: ${result.error ?? \"unknown\"}`);\n    }\n  }\n}\n\n// Usage\nconst result = await runFFmpeg(\n  \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n  { in_video: \"https://example.com/input.mp4\" },\n  { out_video: \"output-720p.mp4\" },\n);\n\nconsole.log(result.output_files.out_video.storage_url);\n```\n\n## Python implementation\n\n```python\nimport os\nimport time\nimport requests\nfrom typing import Any\n\nAPI_KEY = os.environ[\"RENDERIO_API_KEY\"]\nBASE = \"https://api.renderio.dev\"\n\ndef run_ffmpeg(\n    command: str,\n    input_files: dict[str, str],\n    output_files: dict[str, str],\n) -> dict[str, Any]:\n    res = requests.post(\n        f\"{BASE}/api/v1/run-ffmpeg-command\",\n        headers={\"X-API-KEY\": API_KEY},\n        json={\n            \"ffmpeg_command\": command,\n            \"input_files\": input_files,\n            \"output_files\": output_files,\n        },\n    )\n    res.raise_for_status()\n    command_id = res.json()[\"command_id\"]\n\n    while True:\n        time.sleep(2)\n        result = requests.get(\n            f\"{BASE}/api/v1/commands/{command_id}\",\n            headers={\"X-API-KEY\": API_KEY},\n        ).json()\n\n        if result[\"status\"] == \"SUCCESS\":\n            return result\n        if result[\"status\"] == \"FAILED\":\n            raise RuntimeError(f\"Processing failed: {result.get('error', 'unknown')}\")\n\n# Usage\nresult = run_ffmpeg(\n    \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    {\"in_video\": \"https://example.com/input.mp4\"},\n    {\"out_video\": \"output-720p.mp4\"},\n)\nprint(result[\"output_files\"][\"out_video\"][\"storage_url\"])\n```\n\n## Common FFmpeg recipes\n\nCopy-paste ready. Replace URLs and filenames.\n\n### Convert MP4 to WebM\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libvpx-vp9 -crf 30 -b:v 0 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"output.webm\" }\n}\n```\n\n### Resize video to 720p\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"720p.mp4\" }\n}\n```\n\n### Extract audio as MP3\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vn -acodec libmp3lame -ab 192k {{out_audio}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_audio\": \"audio.mp3\" }\n}\n```\n\n### Compress video (reduce file size)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 -crf 28 -preset slow {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"compressed.mp4\" }\n}\n```\n\n### Generate thumbnail at 5 seconds\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -ss 5 -vframes 1 {{out_thumb}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_thumb\": \"thumbnail.jpg\" }\n}\n```\n\n### Trim video (10s to 30s)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -ss 10 -to 30 -c copy {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"trimmed.mp4\" }\n}\n```\n\n### Add image watermark\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -i {{in_logo}} -filter_complex \\\"overlay=10:10\\\" {{out_video}}\",\n  \"input_files\": {\n    \"in_video\": \"https://example.com/input.mp4\",\n    \"in_logo\": \"https://example.com/logo.png\"\n  },\n  \"output_files\": { \"out_video\": \"watermarked.mp4\" }\n}\n```\n\n### Convert to GIF (480px wide, 12fps)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vf \\\"fps=12,scale=480:-1:flags=lanczos\\\" {{out_gif}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_gif\": \"output.gif\" }\n}\n```\n\n### Mute video (remove audio track)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -an -c:v copy {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"muted.mp4\" }\n}\n```\n\n### Stack two videos side by side\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_left}} -i {{in_right}} -filter_complex \\\"[0:v][1:v]hstack=inputs=2\\\" {{out_video}}\",\n  \"input_files\": {\n    \"in_left\": \"https://example.com/left.mp4\",\n    \"in_right\": \"https://example.com/right.mp4\"\n  },\n  \"output_files\": { \"out_video\": \"side-by-side.mp4\" }\n}\n```\n\n## Upload a local file first\n\nWhen the user has a local file (not a URL), upload it first:\n\n```typescript\nasync function uploadFile(filePath: string): Promise<string> {\n  const form = new FormData();\n  form.append(\"file\", new Blob([await fs.readFile(filePath)]), path.basename(filePath));\n\n  const res = await fetch(\"https://renderio.dev/api/v1/files/upload\", {\n    method: \"POST\",\n    headers: { \"X-API-KEY\": API_KEY },\n    body: form,\n  });\n\n  const data = await res.json();\n  return data.storage_url; // use this as the input_files value\n}\n```\n\n## Chained commands (sequential pipeline)\n\nUse the output of one step as the input of the next. Reference previous outputs with `{{out_key}}` in the next step's `input_files`.\n\n```json\nPOST /api/v1/run-chained-ffmpeg-commands\n{\n  \"commands\": [\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 {{out_resized}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_resized\": \"resized.mp4\" }\n    },\n    {\n      \"ffmpeg_command\": \"-i {{in_resized}} -c:v libx264 -crf 28 {{out_final}}\",\n      \"input_files\": { \"in_resized\": \"{{out_resized}}\" },\n      \"output_files\": { \"out_final\": \"final.mp4\" }\n    }\n  ]\n}\n```\n\n## Parallel commands (multiple independent operations)\n\n```json\nPOST /api/v1/run-multiple-ffmpeg-commands\n{\n  \"commands\": [\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1920:1080 {{out_1080p}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_1080p\": \"1080p.mp4\" }\n    },\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 {{out_720p}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_720p\": \"720p.mp4\" }\n    }\n  ]\n}\n```\n\n## Webhook setup (alternative to polling)\n\n```bash\n# Configure once\ncurl -X PUT https://renderio.dev/api/v1/webhook-config \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"https://your-server.com/renderio-webhook\"}'\n\n# Payload your endpoint receives on completion:\n# {\n#   \"data\": {\n#     \"command_id\": \"...\",\n#     \"status\": \"SUCCESS\",\n#     \"output_files\": { \"out_video\": { \"storage_url\": \"...\", ... } }\n#   },\n#   \"timestamp\": 1712345678000\n# }\n```\n\n## Error reference\n\n| Code | Meaning | Fix |\n|---|---|---|\n| `400` | Bad request | Check placeholder syntax and key prefixes |\n| `401` | Unauthorized | Check `X-API-KEY` header and key validity |\n| `429` | Rate limited | Wait `Retry-After` seconds and retry |\n| `404` | Not found | Check `command_id` or `file_id` |\n| `500` | Server error | Safe to retry after a short delay |\n\n## Checklist when generating code for users\n\n- [ ] `RENDERIO_API_KEY` stored as environment variable, never hardcoded\n- [ ] Placeholder syntax uses `{{double_braces}}`\n- [ ] Input keys start with `in_`, output keys start with `out_`\n- [ ] Poll loop handles `QUEUED`, `PROCESSING`, `SUCCESS`, `FAILED`\n- [ ] Output URL accessed via `output_files.out_key.storage_url`\n- [ ] Error handling for both HTTP errors and `FAILED` status\n- [ ] Domain is `api.renderio.dev` (not any other domain)\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7cf35n8yz4spvmzwgravxm3n86wdm8\",\n  \"slug\": \"renderio-ffmpeg-api\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1779050940557\n}\n\nFile v1.0.1:skill-card.md\n\n## Description:\n\nUse the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud by submitting commands, polling results, uploading files, chaining workflows, and configuring webhooks.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nevermind-s](https://clawhub.ai/user/nevermind-s)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use this skill to generate guidance, code samples, shell commands, and request payloads for cloud FFmpeg media-processing workflows through the RenderIO API.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Conflicting API domains for authenticated uploads and webhook setup could send API keys, media, or job metadata to the wrong endpoint.\n\nMitigation: Confirm the correct RenderIO API host before using generated commands, uploads, or webhook configuration.\n\nRisk: Media files and processing metadata leave the user's environment when cloud API workflows are used.\n\nMitigation: Avoid uploading sensitive local media unless the data handling requirements for the RenderIO service are acceptable.\n\nRisk: Generated examples rely on an API key stored in an environment variable.\n\nMitigation: Keep the API key out of source code and logs, and review commands before execution.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/nevermind-s/skills/renderio-ffmpeg-api)\n- [Publisher profile](https://clawhub.ai/user/nevermind-s)\n- [RenderIO API key page](https://renderio.dev/get-api-key)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline JSON, TypeScript, Python, and bash examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces API workflow guidance and example request payloads; generated commands may reference external media URLs, API keys, uploads, and webhooks.]\n\n## Skill Version(s):\n\n1.0.1 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.0: 2 files, 4053 bytes\n\nFiles: skill.md (11238b), _meta.json (138b)\n\nFile v1.0.0:skill.md\n\n---\nname: renderio-api\ndescription: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chained workflows, and webhook delivery. Use this skill whenever the user wants to convert, resize, compress, trim, watermark, extract audio from, or otherwise process media via the RenderIO API.\nallowed-tools: Read, Write, Edit, Bash, WebFetch\n---\n\n# RenderIO API Skill\n\nRenderIO is an FFmpeg-as-a-Service REST API. You send an FFmpeg command over HTTP; RenderIO runs it in a secure cloud sandbox, stores outputs automatically, and returns signed download URLs.\n\n## Setup\n\n```bash\n# Store API key as environment variable\nexport RENDERIO_API_KEY=\"ffsk_your_api_key_here\"\n```\n\nGet a free API key at [renderio.dev/get-api-key](https://renderio.dev/get-api-key).\n\n## The three rules that must never be broken\n\n1. **Double braces for placeholders** — use `{{in_video}}` not `{in_video}`\n2. **Key prefixes** — input keys start with `in_`, output keys start with `out_`\n3. **Every key used in the command must be declared**, and every declared key must appear in the command\n\n```json\n// CORRECT\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/video.mp4\" },\n  \"output_files\": { \"out_video\": \"result.mp4\" }\n}\n\n// WRONG — single braces, missing out_ prefix\n{\n  \"ffmpeg_command\": \"-i {video} result.mp4\",\n  \"input_files\": { \"video\": \"https://example.com/video.mp4\" }\n}\n```\n\n## Core workflow\n\n### 1. Submit a command\n\n```bash\ncurl -X POST https://api.renderio.dev/api/v1/run-ffmpeg-command \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n    \"output_files\": { \"out_video\": \"output-720p.mp4\" }\n  }'\n```\n\nResponse: `{ \"command_id\": \"a1b2c3d4-...\" }`\n\n### 2. Poll for completion\n\n```bash\ncurl https://api.renderio.dev/api/v1/commands/$COMMAND_ID \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\"\n```\n\nStatus values: `QUEUED` → `PROCESSING` → `SUCCESS` or `FAILED` (always uppercase).\n\n### 3. Get output URL\n\n```\nresult.output_files.out_video.storage_url\n```\n\n## TypeScript implementation\n\n```typescript\nconst API_KEY = process.env.RENDERIO_API_KEY!;\nconst BASE = \"https://api.renderio.dev\";\n\ninterface CommandResult {\n  command_id: string;\n  status: \"QUEUED\" | \"PROCESSING\" | \"SUCCESS\" | \"FAILED\";\n  output_files: Record<string, {\n    storage_url: string;\n    filename: string;\n    size_mbytes: number;\n    duration?: number;\n    codec?: string;\n    width?: number;\n    height?: number;\n  }>;\n  total_processing_seconds?: number;\n  error?: string;\n}\n\nasync function runFFmpeg(\n  command: string,\n  inputFiles: Record<string, string>,\n  outputFiles: Record<string, string>,\n): Promise<CommandResult> {\n  const submitRes = await fetch(`${BASE}/api/v1/run-ffmpeg-command`, {\n    method: \"POST\",\n    headers: { \"X-API-KEY\": API_KEY, \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({\n      ffmpeg_command: command,\n      input_files: inputFiles,\n      output_files: outputFiles,\n    }),\n  });\n\n  if (!submitRes.ok) {\n    const err = await submitRes.json();\n    throw new Error(`Submit failed: ${err.message}`);\n  }\n\n  const { command_id } = await submitRes.json();\n\n  // Poll with 2s interval\n  while (true) {\n    await new Promise((r) => setTimeout(r, 2000));\n\n    const pollRes = await fetch(`${BASE}/api/v1/commands/${command_id}`, {\n      headers: { \"X-API-KEY\": API_KEY },\n    });\n    const result: CommandResult = await pollRes.json();\n\n    if (result.status === \"SUCCESS\") return result;\n    if (result.status === \"FAILED\") {\n      throw new Error(`Processing failed: ${result.error ?? \"unknown\"}`);\n    }\n  }\n}\n\n// Usage\nconst result = await runFFmpeg(\n  \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n  { in_video: \"https://example.com/input.mp4\" },\n  { out_video: \"output-720p.mp4\" },\n);\n\nconsole.log(result.output_files.out_video.storage_url);\n```\n\n## Python implementation\n\n```python\nimport os\nimport time\nimport requests\nfrom typing import Any\n\nAPI_KEY = os.environ[\"RENDERIO_API_KEY\"]\nBASE = \"https://api.renderio.dev\"\n\ndef run_ffmpeg(\n    command: str,\n    input_files: dict[str, str],\n    output_files: dict[str, str],\n) -> dict[str, Any]:\n    res = requests.post(\n        f\"{BASE}/api/v1/run-ffmpeg-command\",\n        headers={\"X-API-KEY\": API_KEY},\n        json={\n            \"ffmpeg_command\": command,\n            \"input_files\": input_files,\n            \"output_files\": output_files,\n        },\n    )\n    res.raise_for_status()\n    command_id = res.json()[\"command_id\"]\n\n    while True:\n        time.sleep(2)\n        result = requests.get(\n            f\"{BASE}/api/v1/commands/{command_id}\",\n            headers={\"X-API-KEY\": API_KEY},\n        ).json()\n\n        if result[\"status\"] == \"SUCCESS\":\n            return result\n        if result[\"status\"] == \"FAILED\":\n            raise RuntimeError(f\"Processing failed: {result.get('error', 'unknown')}\")\n\n# Usage\nresult = run_ffmpeg(\n    \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    {\"in_video\": \"https://example.com/input.mp4\"},\n    {\"out_video\": \"output-720p.mp4\"},\n)\nprint(result[\"output_files\"][\"out_video\"][\"storage_url\"])\n```\n\n## Common FFmpeg recipes\n\nCopy-paste ready. Replace URLs and filenames.\n\n### Convert MP4 to WebM\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libvpx-vp9 -crf 30 -b:v 0 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"output.webm\" }\n}\n```\n\n### Resize video to 720p\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"720p.mp4\" }\n}\n```\n\n### Extract audio as MP3\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vn -acodec libmp3lame -ab 192k {{out_audio}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_audio\": \"audio.mp3\" }\n}\n```\n\n### Compress video (reduce file size)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 -crf 28 -preset slow {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"compressed.mp4\" }\n}\n```\n\n### Generate thumbnail at 5 seconds\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -ss 5 -vframes 1 {{out_thumb}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_thumb\": \"thumbnail.jpg\" }\n}\n```\n\n### Trim video (10s to 30s)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -ss 10 -to 30 -c copy {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"trimmed.mp4\" }\n}\n```\n\n### Add image watermark\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -i {{in_logo}} -filter_complex \\\"overlay=10:10\\\" {{out_video}}\",\n  \"input_files\": {\n    \"in_video\": \"https://example.com/input.mp4\",\n    \"in_logo\": \"https://example.com/logo.png\"\n  },\n  \"output_files\": { \"out_video\": \"watermarked.mp4\" }\n}\n```\n\n### Convert to GIF (480px wide, 12fps)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -vf \\\"fps=12,scale=480:-1:flags=lanczos\\\" {{out_gif}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_gif\": \"output.gif\" }\n}\n```\n\n### Mute video (remove audio track)\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -an -c:v copy {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n  \"output_files\": { \"out_video\": \"muted.mp4\" }\n}\n```\n\n### Stack two videos side by side\n```json\n{\n  \"ffmpeg_command\": \"-i {{in_left}} -i {{in_right}} -filter_complex \\\"[0:v][1:v]hstack=inputs=2\\\" {{out_video}}\",\n  \"input_files\": {\n    \"in_left\": \"https://example.com/left.mp4\",\n    \"in_right\": \"https://example.com/right.mp4\"\n  },\n  \"output_files\": { \"out_video\": \"side-by-side.mp4\" }\n}\n```\n\n## Upload a local file first\n\nWhen the user has a local file (not a URL), upload it first:\n\n```typescript\nasync function uploadFile(filePath: string): Promise<string> {\n  const form = new FormData();\n  form.append(\"file\", new Blob([await fs.readFile(filePath)]), path.basename(filePath));\n\n  const res = await fetch(\"https://api.renderio.dev/api/v1/files/upload\", {\n    method: \"POST\",\n    headers: { \"X-API-KEY\": API_KEY },\n    body: form,\n  });\n\n  const data = await res.json();\n  return data.storage_url; // use this as the input_files value\n}\n```\n\n## Chained commands (sequential pipeline)\n\nUse the output of one step as the input of the next. Reference previous outputs with `{{out_key}}` in the next step's `input_files`.\n\n```json\nPOST /api/v1/run-chained-ffmpeg-commands\n{\n  \"commands\": [\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 {{out_resized}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_resized\": \"resized.mp4\" }\n    },\n    {\n      \"ffmpeg_command\": \"-i {{in_resized}} -c:v libx264 -crf 28 {{out_final}}\",\n      \"input_files\": { \"in_resized\": \"{{out_resized}}\" },\n      \"output_files\": { \"out_final\": \"final.mp4\" }\n    }\n  ]\n}\n```\n\n## Parallel commands (multiple independent operations)\n\n```json\nPOST /api/v1/run-multiple-ffmpeg-commands\n{\n  \"commands\": [\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1920:1080 {{out_1080p}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_1080p\": \"1080p.mp4\" }\n    },\n    {\n      \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 {{out_720p}}\",\n      \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n      \"output_files\": { \"out_720p\": \"720p.mp4\" }\n    }\n  ]\n}\n```\n\n## Webhook setup (alternative to polling)\n\n```bash\n# Configure once\ncurl -X PUT https://api.renderio.dev/api/v1/webhook-config \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"https://your-server.com/renderio-webhook\"}'\n\n# Payload your endpoint receives on completion:\n# {\n#   \"data\": {\n#     \"command_id\": \"...\",\n#     \"status\": \"SUCCESS\",\n#     \"output_files\": { \"out_video\": { \"storage_url\": \"...\", ... } }\n#   },\n#   \"timestamp\": 1712345678000\n# }\n```\n\n## Error reference\n\n| Code | Meaning | Fix |\n|---|---|---|\n| `400` | Bad request | Check placeholder syntax and key prefixes |\n| `401` | Unauthorized | Check `X-API-KEY` header and key validity |\n| `429` | Rate limited | Wait `Retry-After` seconds and retry |\n| `404` | Not found | Check `command_id` or `file_id` |\n| `500` | Server error | Safe to retry after a short delay |\n\n## Checklist when generating code for users\n\n- [ ] `RENDERIO_API_KEY` stored as environment variable, never hardcoded\n- [ ] Placeholder syntax uses `{{double_braces}}`\n- [ ] Input keys start with `in_`, output keys start with `out_`\n- [ ] Poll loop handles `QUEUED`, `PROCESSING`, `SUCCESS`, `FAILED`\n- [ ] Output URL accessed via `output_files.out_key.storage_url`\n- [ ] Error handling for both HTTP errors and `FAILED` status\n- [ ] Domain is `api.renderio.dev` (not any other domain)\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7cf35n8yz4spvmzwgravxm3n86wdm8\",\n  \"slug\": \"renderio-ffmpeg-api\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1779047507593\n}","readmeExcerpt":"Skill: RenderIO ffmpeg Owner: nevermind-s Summary: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai... Tags: latest:1.0.1 Version history: v1.0.1 | 2026-05-17T20:49:00.557Z | user - Updated API endpoint domain in all cURL examples from api.renderio.dev to renderio.dev - No functional changes to code samples or","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Store API key as environment variable\nexport RENDERIO_API_KEY=\"ffsk_your_api_key_here\""},{"language":"json","snippet":"// CORRECT\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/video.mp4\" },\n  \"output_files\": { \"out_video\": \"result.mp4\" }\n}\n\n// WRONG — single braces, missing out_ prefix\n{\n  \"ffmpeg_command\": \"-i {video} result.mp4\",\n  \"input_files\": { \"video\": \"https://example.com/video.mp4\" }\n}"},{"language":"bash","snippet":"curl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{"},{"language":"bash","snippet":"curl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n    \"output_files\": { \"out_video\": \"output-720p.mp4\" }\n  }'"},{"language":"bash","snippet":"curl https://renderio.dev/api/v1/commands/$COMMAND_ID \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\""},{"language":"bash","snippet":"curl https://renderio.dev/api/v1/commands/$COMMAND_ID \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"skill.md","content":"---\nname: renderio-api\ndescription: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chained workflows, and webhook delivery. Use this skill whenever the user wants to convert, resize, compress, trim, watermark, extract audio from, or otherwise process media via the RenderIO API.\nallowed-tools: Read, Write, Edit, Bash, WebFetch\n---\n\n# RenderIO API Skill\n\nRenderIO is an FFmpeg-as-a-Service REST API. You send an FFmpeg command over HTTP; RenderIO runs it in a secure cloud sandbox, stores outputs automatically, and returns signed download URLs.\n\n## Setup\n\n```bash\n# Store API key as environment variable\nexport RENDERIO_API_KEY=\"ffsk_your_api_key_here\"\n```\n\nGet a free API key at [renderio.dev/get-api-key](https://renderio.dev/get-api-key).\n\n## The three rules that must never be broken\n\n1. **Double braces for placeholders** — use `{{in_video}}` not `{in_video}`\n2. **Key prefixes** — input keys start with `in_`, output keys start with `out_`\n3. **Every key used in the command must be declared**, and every declared key must appear in the command\n\n```json\n// CORRECT\n{\n  \"ffmpeg_command\": \"-i {{in_video}} -c:v libx264 {{out_video}}\",\n  \"input_files\": { \"in_video\": \"https://example.com/video.mp4\" },\n  \"output_files\": { \"out_video\": \"result.mp4\" }\n}\n\n// WRONG — single braces, missing out_ prefix\n{\n  \"ffmpeg_command\": \"-i {video} result.mp4\",\n  \"input_files\": { \"video\": \"https://example.com/video.mp4\" }\n}\n```\n\n## Core workflow\n\n### 1. Submit a command\n\n```bash\ncurl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"ffmpeg_command\": \"-i {{in_video}} -vf scale=1280:720 -c:v libx264 -crf 23 {{out_video}}\",\n    \"input_files\": { \"in_video\": \"https://example.com/input.mp4\" },\n    \"output_files\": { \"out_video\": \"output-720p.mp4\" }\n  }'\n```\n\nResponse: `{ \"command_id\": \"a1b2c3d4-...\" }`\n\n### 2. Poll for completion\n\n```bash\ncurl https://renderio.dev/api/v1/commands/$COMMAND_ID \\\n  -H \"X-API-KEY: $RENDERIO_API_KEY\"\n```\n\nStatus values: `QUEUED` → `PROCESSING` → `SUCCESS` or `FAILED` (always uppercase).\n\n### 3. Get output URL\n\n```\nresult.output_files.out_video.storage_url\n```\n\n## TypeScript implementation\n\n```typescript\nconst API_KEY = process.env.RENDERIO_API_KEY!;\nconst BASE = \"https://api.renderio.dev\";\n\ninterface CommandResult {\n  command_id: string;\n  status: \"QUEUED\" | \"PROCESSING\" | \"SUCCESS\" | \"FAILED\";\n  output_files: Record<string, {\n    storage_url: string;\n    filename: string;\n    size_mbytes: number;\n    duration?: number;\n    codec?: string;\n    width?: number;\n    height?: number;\n  }>;\n  total_processing_seconds?: number;\n  error?: string;\n}\n\nasync function runFFmpeg(\n  command: string,\n  inputFiles: Record<string, string>,\n  outputFiles: Record<string, string>,\n): Promise<CommandResult> {\n  const submitRes = await fetch(`${BASE}/api/v1/run-ffmpeg-command`, "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7cf35n8yz4spvmzwgravxm3n86wdm8\",\n  \"slug\": \"renderio-ffmpeg-api\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1779050940557\n}"},{"path":"skill-card.md","content":"## Description:\n\nUse the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud by submitting commands, polling results, uploading files, chaining workflows, and configuring webhooks.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nevermind-s](https://clawhub.ai/user/nevermind-s)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use this skill to generate guidance, code samples, shell commands, and request payloads for cloud FFmpeg media-processing workflows through the RenderIO API.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Conflicting API domains for authenticated uploads and webhook setup could send API keys, media, or job metadata to the wrong endpoint.\n\nMitigation: Confirm the correct RenderIO API host before using generated commands, uploads, or webhook configuration.\n\nRisk: Media files and processing metadata leave the user's environment when cloud API workflows are used.\n\nMitigation: Avoid uploading sensitive local media unless the data handling requirements for the RenderIO service are acceptable.\n\nRisk: Generated examples rely on an API key stored in an environment variable.\n\nMitigation: Keep the API key out of source code and logs, and review commands before execution.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/nevermind-s/skills/renderio-ffmpeg-api)\n- [Publisher profile](https://clawhub.ai/user/nevermind-s)\n- [RenderIO API key page](https://renderio.dev/get-api-key)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline JSON, TypeScript, Python, and bash examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces API workflow guidance and example request payloads; generated commands may reference external media URLs, API keys, uploads, and webhooks.]\n\n## Skill Version(s):\n\n1.0.1 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai... Skill: RenderIO ffmpeg Owner: nevermind-s Summary: Use the RenderIO FFmpeg-as-a-Service API to process video, audio, and images in the cloud. Covers submitting commands, polling results, uploading files, chai... Tags: latest:1.0.1 Version history: v1.0.1 | 2026-05-17T20:49:00.557Z | user - Updated API endpoint domain in all cURL examples from api.renderio.dev to renderio.dev - No functional changes to code samples or","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1034,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T00:01:36.895Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:38:12.530Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}