API Documentation
Everything you need to integrate RendrSink into your media pipeline. API keys are issued during the partnership onboarding process.
Authentication required — All API endpoints require a Bearer token (fv_live_...) issued during onboarding. To request API access, book a discovery call.
Quick Start
Upload your first asset in under a minute.
Upload an asset via cURL
# Upload a new media asset for processing curl -X POST https://api.rendrsink.com/v1/assets \ -H "Authorization: Bearer fv_live_sk_a1b2c3d4e5f6..." \ -H "Content-Type: multipart/form-data" \ -F "file=@/path/to/video.mp4" \ -F "profile=web-optimized-1080p" \ -F "webhook_url=https://yourapp.com/webhooks/rendrsink"
Response
{
"asset_id": "ast_7xKm2pQrV9nL4wYz",
"status": "processing",
"estimated_ms": 3200,
"profile": "web-optimized-1080p",
"created_at": "2026-03-28T14:22:01.847Z",
"webhook_url": "https://yourapp.com/webhooks/rendrsink"
}
Install an SDK
Node.js
npm install @rendrsink/sdk
Python
pip install rendrsink
Go
go get github.com/rendrsink/rendrsink-go
API Reference
Base URL: https://api.rendrsink.com
Endpoints
| Method | Endpoint |
|---|---|
| POST | /v1/assets |
| GET | /v1/assets/:id |
| GET | /v1/assets/:id/derivatives |
| DELETE | /v1/assets/:id |
| POST | /v1/assets/:id/reprocess |
| GET | /v1/profiles |
| POST | /v1/profiles |
| GET | /v1/usage |
Detailed Example
POST /v1/assets — Upload a new asset for processing
Request Headers
Authorization: Bearer fv_live_sk_a1b2c3d4e5f6... Content-Type: multipart/form-data X-Idempotency-Key: idem_unique_request_id_here
Request Body (multipart/form-data)
{
"file": <binary>, // Required. Max 5 GB.
"profile": "web-optimized-1080p", // Required. Processing profile slug.
"webhook_url": "https://...", // Optional. HTTPS endpoint for events.
"metadata": { // Optional. Arbitrary key-value pairs.
"project": "campaign-q2",
"source": "studio-upload"
},
"priority": "high", // Optional. "low" | "normal" | "high"
"derivatives": [ // Optional. Override profile defaults.
{ "format": "webm", "width": 1920 },
{ "format": "mp4", "width": 1280, "quality": 85 }
]
}
Response 201 Created
{
"asset_id": "ast_7xKm2pQrV9nL4wYz",
"status": "processing",
"estimated_ms": 3200,
"profile": "web-optimized-1080p",
"priority": "high",
"file": {
"name": "video.mp4",
"size_bytes": 48291840,
"mime_type": "video/mp4",
"duration_ms": 124500,
"dimensions": { "width": 3840, "height": 2160 }
},
"metadata": {
"project": "campaign-q2",
"source": "studio-upload"
},
"derivatives_requested": 2,
"webhook_url": "https://yourapp.com/webhooks/rendrsink",
"created_at": "2026-03-28T14:22:01.847Z"
}
Error Responses
// 400 Bad Request { "error": { "code": "invalid_profile", "message": "Profile 'nonexistent' does not exist.", "doc_url": "https://docs.rendrsink.com/errors/invalid_profile" } } // 413 Payload Too Large { "error": { "code": "file_too_large", "message": "File exceeds the 5 GB limit.", "max_bytes": 5368709120 } } // 429 Too Many Requests { "error": { "code": "rate_limited", "message": "Rate limit exceeded. Retry after 2s.", "retry_after_ms": 2000 } }
Webhook Events
RendrSink delivers signed webhook payloads via HTTP POST to the URL specified during asset upload or configured at the account level. All payloads include an X-FV-Signature header for verification.
Event Types
| Event | Description |
|---|---|
| asset.processing | Asset ingestion started |
| asset.processed | All derivatives generated successfully |
| asset.failed | Processing failed with error details |
| asset.delivered | Derivatives delivered to CDN/storage |
| thumbnail.generated | Thumbnail extraction completed |
Example Webhook Payload
// POST https://yourapp.com/webhooks/rendrsink // Headers: // Content-Type: application/json // X-FV-Signature: sha256=9f3a8b2c1d... // X-FV-Event: asset.processed // X-FV-Delivery-ID: dlv_Qm8nR4tW2xYp { "event": "asset.processed", "timestamp": "2026-03-28T14:22:05.103Z", "asset_id": "ast_7xKm2pQrV9nL4wYz", "processing_ms": 3147, "profile": "web-optimized-1080p", "derivatives": [ { "derivative_id": "drv_Lm3nP7qR2wXz", "format": "webm", "width": 1920, "height": 1080, "size_bytes": 12485632, "url": "https://cdn.rendrsink.com/drv_Lm3nP7qR2wXz.webm" }, { "derivative_id": "drv_Kp9mQ4sT1vWy", "format": "mp4", "width": 1280, "height": 720, "size_bytes": 8291456, "url": "https://cdn.rendrsink.com/drv_Kp9mQ4sT1vWy.mp4" } ], "thumbnails": [ { "timestamp_ms": 0, "url": "https://cdn.rendrsink.com/ast_7xKm2pQrV9nL4wYz/thumb_0.jpg" }, { "timestamp_ms": 62250, "url": "https://cdn.rendrsink.com/ast_7xKm2pQrV9nL4wYz/thumb_mid.jpg" } ], "metadata": { "project": "campaign-q2", "source": "studio-upload" } }
SDK Examples
Official SDKs handle authentication, retries, multipart uploads, and webhook signature verification out of the box.
Node.js
import { RendrSink } from '@rendrsink/sdk'; const fv = new RendrSink({ apiKey: process.env.RENDRSINK_API_KEY, region: 'us-east-1', // optional, defaults to closest maxRetries: 3, // optional, defaults to 3 }); // Upload an asset const asset = await fv.assets.upload({ file: './media/video.mp4', profile: 'web-optimized-1080p', webhookUrl: 'https://yourapp.com/webhooks/rendrsink', metadata: { project: 'campaign-q2', source: 'studio-upload', }, }); console.log(asset.assetId); // "ast_7xKm2pQrV9nL4wYz" console.log(asset.status); // "processing" console.log(asset.estimatedMs); // 3200 // Poll for completion (or use webhooks) const result = await fv.assets.waitForProcessing(asset.assetId, { pollIntervalMs: 1000, timeoutMs: 60000, }); // List derivatives const derivatives = await fv.assets.listDerivatives(asset.assetId); for (const d of derivatives) { console.log(`${d.format} ${d.width}x${d.height} — ${d.url}`); } // Verify webhook signature const isValid = fv.webhooks.verify( req.body, req.headers['x-fv-signature'], process.env.RENDRSINK_WEBHOOK_SECRET );
Python
import rendrsink import os fv = rendrsink.Client( api_key=os.environ["RENDRSINK_API_KEY"], region="us-east-1", ) # Upload an asset asset = fv.assets.upload( file="./media/video.mp4", profile="web-optimized-1080p", webhook_url="https://yourapp.com/webhooks/rendrsink", metadata={ "project": "campaign-q2", "source": "studio-upload", }, ) print(asset.asset_id) # "ast_7xKm2pQrV9nL4wYz" print(asset.status) # "processing" print(asset.estimated_ms) # 3200 # Wait for completion result = fv.assets.wait_for_processing( asset.asset_id, poll_interval_ms=1000, timeout_ms=60000, ) # List derivatives derivatives = fv.assets.list_derivatives(asset.asset_id) for d in derivatives: print(f"{d.format} {d.width}x{d.height} — {d.url}") # Verify webhook in Flask from flask import request is_valid = fv.webhooks.verify( payload=request.data, signature=request.headers.get("X-FV-Signature"), secret=os.environ["RENDRSINK_WEBHOOK_SECRET"], )
Need API access?
API keys are provisioned during the partnership onboarding process. Schedule a 30-minute technical discovery call with our solutions engineering team to scope your requirements and get credentials issued.
Book a Discovery CallTypical onboarding: 2–5 business days from initial call to production keys.