Endpoint
Video status
GET
https://lannevideo.com/api/v1/video-statusRead a generation you own: where it stands, its MP4 URL and the credits it used. Calls to this endpoint do not count toward the rate limit.
Request
curl "https://lannevideo.com/api/v1/video-status?video_id=48213" \
-H "Authorization: Bearer $NB_API_KEY"import os
import requests
resp = requests.get(
"https://lannevideo.com/api/v1/video-status",
headers={"Authorization": f"Bearer {os.environ['NB_API_KEY']}"},
params={
"video_id": 48213,
},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+
const res = await fetch("https://lannevideo.com/api/v1/video-status?video_id=48213", {
headers: {
Authorization: `Bearer ${process.env.NB_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}`);
console.log(data);<?php
$ch = curl_init('https://lannevideo.com/api/v1/video-status?video_id=48213');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('NB_API_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status !== 200) {
throw new RuntimeException($data['error'] ?? "HTTP $status");
}
print_r($data);Query parameters
video_idintegerrequiredResponse
200 OK
{
"success": true,
"video": {
"id": 48213,
"status": "completed",
"title": "Text to Video",
"description": "Slow push-in on a barista pouring latte art…",
"mode": "text-to-video",
"resolution": "768P",
"duration_seconds": 8,
"output_url": "https://…/48213.mp4",
"thumbnail_url": "https://…/48213.jpg",
"credits_used": 8,
"created_at": "2026-10-21 14:02:11",
"updated_at": "2026-10-21 14:03:40",
"processing_started_at": "2026-10-21 14:02:12",
"processing_completed_at": "2026-10-21 14:03:40"
}
}video.statusstringSee the values below.
video.output_urlstring | nullMP4 file once the status is
completed.video.descriptionstringThe prompt that was sent.
video.modestringtext-to-video or image-to-video.video.*_atstringTimestamps,
YYYY-MM-DD HH:MM:SS, server time.Status values
| Status | Meaning |
|---|---|
queued | Accepted, waiting for a render slot. |
processing | The model is rendering. Reading the status also refreshes it from the model. |
completed | Done. output_url is set. |
failed | The render did not finish. Start a new generation. |
Recover after a timeout
If your client stopped waiting on a generation, poll the status every 10 seconds until it settles. Keep the video_id from the generation response, or find the clip in your dashboard.
import os, time, requests
def wait_for_video(video_id: int, timeout: int = 600) -> str:
headers = {"Authorization": f"Bearer {os.environ['NB_API_KEY']}"}
deadline = time.time() + timeout
while time.time() < deadline:
video = requests.get(
"https://lannevideo.com/api/v1/video-status",
headers=headers, params={"video_id": video_id}, timeout=30,
).json()["video"]
if video["status"] == "completed":
return video["output_url"]
if video["status"] == "failed":
raise RuntimeError(f"Video {video_id} failed")
time.sleep(10)
raise TimeoutError(f"Video {video_id} still rendering")async function waitForVideo(videoId, timeoutMs = 600_000) {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
const res = await fetch(
`https://lannevideo.com/api/v1/video-status?video_id=${videoId}`,
{ headers: { Authorization: `Bearer ${process.env.NB_API_KEY}` } },
);
const { video } = await res.json();
if (video.status === "completed") return video.output_url;
if (video.status === "failed") throw new Error(`Video ${videoId} failed`);
await new Promise((r) => setTimeout(r, 10_000));
}
throw new Error(`Video ${videoId} still rendering`);
}Errors
| Status | When |
|---|---|
| 400 | video_id is missing. |
| 401 | No key, or the key is invalid. |
| 403 | The video belongs to another account. |
| 404 | No video with this id. |