Skip to content

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 Call

Typical onboarding: 2–5 business days from initial call to production keys.