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.
Get your API key
Create an account and get your API key from the dashboard. Each key is prefixed with nxt_.
Create a description job
Submit a video URL and specify your webhook endpoint to receive results.
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"]
}
}'
Receive webhook with results
Once processing completes, we'll POST the results to your webhook URL with HMAC signature.
{
"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
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/resultPOST /api/demo/v1/video-descriptions/{job_id}/replay-webhook— replay forwarded webhook to your receiverGET /api/demo/v1/webhook-secret— get webhook secret for signature verification
Create demo job (example)
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
/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
/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
You submit job with
source.providerconfig - 2 Our API calls your endpoint with signed request
- 3 You verify signature and return presigned URL
- 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.