Video understanding
Ask once from an HTTPS URL or upload media and reuse a stable ID across follow-up questions.
Pandan API · video + voice · private beta
Ask questions about video, synthesize streaming speech, or transcribe live audio. Pandan is building one low-latency media stack while labeling the release stage of every surface clearly.
The live video and voice sections below call Pandan runtimes through server-side relays. Neither is a simulated request builder.
Product surface
The badges below are release stages, not marketing labels. Customer video requests use the bearer API documented below. The embedded video and voice playgrounds use same-origin relays so provider credentials never enter the browser.
Ask once from an HTTPS URL or upload media and reuse a stable ID across follow-up questions.
OpenAI-compatible complete audio plus a WebSocket stream producing verified 24 kHz mono PCM.
Binary 16 kHz PCM input with revisable partial transcripts, explicit finalization, and per-decode timing.
Talk to the same NVIDIA VoiceChat runtime used on Pandan's voice page, including live audio, transcripts, and interruption handling.
Live video
This is Pandan's API-backed video playground, not a generated example. Your browser samples the video locally, then Pandan's server relay uploads those frames and streams answers from the optimized runtime.
Opening the docs and preparing frames do not wake a GPU. The playground starts one optimized H100 runtime only after you press Start. It uses the same media-backed chat protocol as the customer API through a protected demo relay; customer applications call /v1/media and /v1/chat/completions with their own project key.
Pricing
The current video endpoint and approved voice evaluations are invited previews. They have protected access, but no self-serve billing gateway yet.
Build and benchmark video plus approved voice previews before production billing begins.
Published rates, spend controls, and service tiers will arrive before any customer is billed.
Quickstart
Request a beta key from Pandan, then keep it on your server. Never ship the key in browser JavaScript.
export PANDAN_API_BASE="https://pandan--pandan-api-api.modal.run"
export PANDAN_API_KEY="your-key"
curl "$PANDAN_API_BASE/v1/models" \
-H "Authorization: Bearer $PANDAN_API_KEY"
Choose a flow
Put an HTTPS video URL directly in a chat completion. Best when you will ask once and discard the context.
Upload bytes once, receive a content-addressed media ID, and reuse it across questions. Best for interviews, inspections, and review workflows.
One-off video
The video must be reachable by HTTPS. MP4 data URLs also work, but repeatedly sending base64 increases request size.
curl "$PANDAN_API_BASE/v1/chat/completions" \
-H "Authorization: Bearer $PANDAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-VL-30B-A3B-Instruct",
"messages": [{
"role": "user",
"content": [
{
"type": "video_url",
"video_url": {"url": "https://example.com/video.mp4"}
},
{"type": "text", "text": "What happens in this video?"}
]
}],
"temperature": 0,
"max_tokens": 128
}'
Reusable video
Uploads are content-addressed: identical bytes return the same ID. MP4, WebM, and QuickTime are accepted up to 256 MiB.
curl "$PANDAN_API_BASE/v1/media" \
-H "Authorization: Bearer $PANDAN_API_KEY" \
-H "Content-Type: video/mp4" \
--data-binary @video.mp4
{
"id": "media_<sha256>_mp4",
"object": "media",
"content_type": "video/mp4",
"bytes": 1549315,
"created": true
}
curl "$PANDAN_API_BASE/v1/chat/completions" \
-H "Authorization: Bearer $PANDAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-VL-30B-A3B-Instruct",
"media_ids": ["media_<sha256>_mp4"],
"messages": [{
"role": "user",
"content": "Where is the person sitting?"
}],
"temperature": 0,
"max_tokens": 128
}'
Python
Standard chat fields work through the OpenAI SDK. Pass Pandan's `media_ids` extension through `extra_body`.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["PANDAN_API_KEY"],
base_url="https://pandan--pandan-api-api.modal.run/v1",
)
response = client.chat.completions.create(
model="Qwen/Qwen3-VL-30B-A3B-Instruct",
messages=[{
"role": "user",
"content": "What changes after the door opens?",
}],
temperature=0,
max_tokens=128,
extra_body={"media_ids": ["media_<sha256>_mp4"]},
)
print(response.choices[0].message.content)
Voice APIs
This is the API-backed experience from Pandan's voice page, placed directly in the docs. It captures and plays live audio while a server-side relay keeps Modal credentials out of the browser.
The hosted relay only accepts sessions from Pandan's own origin. Before exposing it as a customer API, we still need project authentication, quotas, tenant isolation, metering, and a stable public session contract.
Reference
Returns 200 after the model server is ready.
Lists the currently served model in OpenAI format.
Stores image or video bytes and returns a content-addressed media ID.
Checks whether uploaded media exists without returning its bytes.
Runs one-off or media-ID-backed multimodal inference.
Powers Pandan's live full-duplex browser experience with audio, transcript, interruption, and session events.
400 invalid request or media ID · 401 invalid key · 413 media too large · 415 unsupported media · 5xx startup or inference failure. Private-beta limits are key-specific; rate-limit headers are not yet a stable contract.
Runtime behavior
The upload endpoint durably stores and deduplicates the video. The first inference processes its visual content. Follow-up requests reuse the stable media prefix while the GPU remains warm. After scale-to-zero, the media still exists, but GPU processor and prefix caches must warm again.
Observed August 7, 2026 on one Modal H100 using the same 1.55 MB sample video and short deterministic answers. This is a scoped integration measurement, not a general video benchmark.