API v1 Stable

Video Description API Documentation

Generate AI-powered titles, descriptions, and tags for any video. Async processing with webhook delivery, free sandbox for testing. Prefer a UI? Use the Descrideo web portal to upload videos and manage jobs.

Prefer a UI? Use our Video Generator to upload videos and get results without writing code.

Quick Start

Get started with Descrideo API in 3 simple steps. Generate your first video description in under 5 minutes.

1

Get your API key

Create an account and get your API key from the dashboard. Each key is prefixed with nxt_.

Create account →
2

Create a description job

Submit a video URL and specify your webhook endpoint to receive results.

Request POST
curl -X POST https://api.descrideo.com/v1/video-descriptions \
  -H "X-API-Key: nxt_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "source": {
      "type": "direct_url",
      "url": "https://example.com/video.mp4"
    },
    "frames": 20,
    "generation_mode": "vision",
    "webhook": {
      "url": "https://your-app.com/webhooks/video"
    },
    "client_context": {
      "lang": "en",
      "output_fields": ["title", "description", "tags"]
    }
  }'
3

Receive webhook with results

Once processing completes, we'll POST the results to your webhook URL with HMAC signature.

Webhook Payload
{
  "job_id": "01HXYZ123ABC",
  "status": "succeeded",
  "result": {
    "title": "Mountain Hiking Adventure in Swiss Alps",
    "description": "A breathtaking journey through...",
    "tags": ["hiking", "mountains", "switzerland", "nature"]
  },
  "billing": {
    "token_cost": 1.23,
    "base_cost": 1.0,
    "transcription_cost": 0.23,
    "franchise_cost": 0.0
  },
  "meta": {
    "generation_mode": "vision_audio",
    "transcription": {
      "enabled": true,
      "status": "completed",
      "seconds": 45.5
    }
  },
  "timing_ms": {
    "probe": 500,
    "audio": 3200,
    "frames": 2100,
    "ai": 8100,
    "webhook": 120
  }
}

Authentication

All API requests require authentication via Bearer token in the Authorization header.

Authorization: Bearer nxt_your_api_key_here

Security: Never expose your API key in client-side code. Always make API calls from your backend server.

Sandbox Testing

Test your webhook integration for free using our sandbox environment. Sandbox jobs simulate the full workflow without actual video processing.

Sandbox Benefits

  • Free daily quota - no tokens required
  • Real webhook deliveries with HMAC signatures
  • No video URL required
  • Webhook replay for debugging
Sandbox Request POST
POST /v1/sandbox/video-descriptions

{
  "frames": 10,
  "webhook": {
    "url": "https://your-app.com/webhooks/video"
  },
  "client_context": {
    "lang": "en",
    "output_fields": ["title", "description", "tags"],
    "custom_instructions": "Focus on technical details"
  }
}

Demo API (Gateway)

Demo API lets you integrate against a real async workflow with webhook delivery before you go live. Use it to validate your direct video URL access and webhook receiver.

Limits: 1 job/day per demo API key, frames=10 only, lang=en only (other languages return 422). Custom instructions are allowed.

Endpoints

  • POST /api/demo/v1/video-descriptions — create a demo job (direct URL only)
  • GET /api/demo/v1/video-descriptions/{job_id} — get status/result
  • POST /api/demo/v1/video-descriptions/{job_id}/replay-webhook — replay forwarded webhook to your receiver
  • GET /api/demo/v1/webhook-secret — get webhook secret for signature verification

Create demo job (example)

Request POST
curl -X POST https://your-portal.com/api/demo/v1/video-descriptions \
  -H "X-API-Key: demo_your_demo_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "source": {
      "type": "direct_url",
      "url": "https://example.com/video.mp4"
    },
    "frames": 10,
    "webhook": {
      "url": "https://your-app.com/webhooks/demo"
    },
    "client_context": {
      "lang": "en",
      "output_fields": ["title", "description", "tags"],
      "custom_instructions": "Make the description more detailed"
    }
  }'

Webhook signatures

Demo API forwards webhooks to your URL using the same signature headers as the main API: X-Nxt-Timestamp and X-Nxt-Signature. Use GET /api/demo/v1/webhook-secret to retrieve the secret used for verification.

Create Description Job

POST /v1/video-descriptions

Request Body

Parameter Type Required Description
source object Yes Video source configuration
type string * direct_url or source_provider
url string * Direct URL to the video file (when type=direct_url)
provider object * Source Provider endpoint config (when type=source_provider)
webhook.url string Yes URL to receive results
client_context.output_fields array No Fields to generate: title, description, tags
client_context.lang string No Output language (ISO 639-1), default: en
frames integer Yes Number of frames to extract: 10, 20, or 30. Required for vision and vision_audio modes. Not used in audio mode.
generation_mode string No vision (default), vision_audio, or audio. Determines analysis mode.
transcription object No Audio transcription settings. Required fields depend on generation_mode.
enabled boolean * Enable audio transcription. Auto-enabled for vision_audio/audio modes.
segments integer * Number of audio segments to sample: 10, 20, or 30
segment_sec number * Duration of each segment in seconds (5–60)
client_context.custom_instructions string No Custom AI instructions for output style

Response

Returns 202 Accepted with job ID.

{
  "job_id": "01HXYZ123ABC",
  "status": "queued"
}

Get Job Status

GET /v1/video-descriptions/{job_id}

Poll job status. Useful for monitoring progress if webhooks aren't suitable.

Job Statuses

queued

Job waiting for processing

resolving_source

Resolving video access

probing

Analyzing video metadata

extracting_audio

Extracting audio segments

transcribing_audio

Transcribing audio to text

extracting_frames

Extracting video frames

ai_request

AI generating descriptions

succeeded

Processing complete

failed

Processing failed

Webhook Security

All webhooks are signed using HMAC-SHA256. Verify signatures to ensure authenticity.

Signature Headers

X-Nxt-Timestamp: 1707400000
X-Nxt-Signature: sha256=abc123def456...

Verification Example (Python)

import hmac
import hashlib

def verify_webhook(raw_body: bytes, timestamp: str, signature_header: str, secret: str) -> bool:
    # Signature header format: "sha256="
    expected_sig = signature_header.removeprefix("sha256=")
    message = raw_body + timestamp.encode()
    computed = hmac.new(secret.encode(), message, hashlib.sha256).hexdigest()
    return hmac.compare_digest(computed, expected_sig)

Tip: Get your webhook secret from GET /v1/webhook-secret

Source Provider Pattern

For private videos, use the Source Provider pattern. Your endpoint acts as an access broker, returning presigned URLs when our API needs to fetch video.

Flow

  1. 1 You submit job with source.provider config
  2. 2 Our API calls your endpoint with signed request
  3. 3 You verify signature and return presigned URL
  4. 4 Our API fetches video from presigned URL

Security: Your videos stay private. We only access them via temporary presigned URLs you control.

Error Handling

The API returns standard HTTP status codes with detailed error messages.

Status Meaning
400 Bad Request - Invalid parameters
401 Unauthorized - Invalid API key
402 Payment Required - Insufficient tokens
404 Not Found - Resource doesn't exist
429 Rate Limited - Too many requests
500 Internal Error - Server issue

Billing & Tokens

Base cost per successful job is 1 token. Audio transcription is an add-on billed per 10 seconds of sampled audio. Final cost is reported in the webhook billing.token_cost field.

Prepaid Mode

Buy token bundles upfront. Tokens are reserved at job creation and captured on success.

Postpaid Mode

Pay at the end of billing cycle. Set optional monthly limits to control spending.