Guides
Rate limits
An account can start 15 generations per rolling 30 minutes. The window counts every clip the account makes, in the Studio as well as through the API.
What counts
| Request | Counts toward the limit |
|---|---|
POST /text-to-video | Yes |
POST /image-to-video | Yes |
GET /video-status | No |
| Studio generations on the same account | Yes |
The window rolls: a slot frees up 30 minutes after the generation that used it, not at a fixed time.
Headers
Generation responses carry the state of the window, so you can slow down before you hit it.
X-RateLimit-LimitintegerGenerations allowed per window: 15.
X-RateLimit-RemainingintegerGenerations left in the current window.
X-RateLimit-Resetunix timeWhen the oldest generation leaves the window.
Retry-AftersecondsOnly on 429: how long to wait.
Response headers
HTTP/2 200
content-type: application/json
x-ratelimit-limit: 15
x-ratelimit-remaining: 11
x-ratelimit-reset: 1792606200When you hit the limit
The API answers 429 Too Many Requests before starting a render, so nothing is charged.
429 Too Many Requests
{
"success": false,
"error": "Rate limit exceeded. You have generated 15 videos in the last 30 minutes. Please wait before trying again.",
"rate_limit": {
"count": 15,
"limit": 15,
"remaining": 0,
"reset_in_seconds": 847,
"reset_at": "2026-10-21 16:30:00"
}
}Retry pattern
Wait for Retry-After, then try again. For batches, keep at most 15 jobs per half hour in your own queue instead of relying on 429s.
import os, time, requests
URL = "https://lannevideo.com/api/v1/text-to-video"
HEADERS = {"Authorization": f"Bearer {os.environ['NB_API_KEY']}"}
def generate(body: dict, attempts: int = 4) -> dict:
for attempt in range(attempts):
resp = requests.post(URL, headers=HEADERS, json=body, timeout=300)
if resp.status_code != 429:
resp.raise_for_status()
return resp.json()
wait = int(resp.headers.get("Retry-After", 60))
time.sleep(wait)
raise RuntimeError("Still rate limited")const URL = "https://lannevideo.com/api/v1/text-to-video";
async function generate(body, attempts = 4) {
for (let i = 0; i < attempts; i++) {
const res = await fetch(URL, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NB_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(300_000),
});
if (res.status !== 429) {
const data = await res.json();
if (!res.ok) throw new Error(`${res.status} ${data.error}`);
return data;
}
const wait = Number(res.headers.get("Retry-After") ?? 60);
await new Promise((r) => setTimeout(r, wait * 1000));
}
throw new Error("Still rate limited");
}