anoman
Sign InGet API Key
Documentation home

POST /v1/videos

Reference · Videos — guarded, asynchronous text-to-video. You get a quote, submit a job, poll it, then download the file.

Overview

How a video job works

  1. GET /v1/videos/models lists the models you can use now, each with a from_price (the cheapest clip it can make).
  2. POST /v1/videos/quote prices your exact request without holding anything.
  3. POST /v1/videos returns 202 with a job. The quoted price is held on your prepaid balance and charged only when the video is delivered. A failed, blocked or expired job is refunded.
  4. Poll GET /v1/videos/{id} until status is completed, then GET /v1/videos/{id}/content redirects (302) to a short-lived download URL.

The price is the provider's price for that clip plus our margin, in US dollars (quote_usd) and, when a rate is available, in Rupiah (quote_idr). Signup credit and passes can't be used for video; it needs topped-up balance.

Free draft: every account with a verified email can make one free draft while the monthly free-draft budget lasts ("free_draft": true: Veo 3.1 Lite, 4 seconds, 720p, no audio).

Request

Body

curl https://api.anoman.io/v1/videos \
  -H "Authorization: Bearer anm-sk-..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2b9e-launch-001" \
  -d '{
    "model": "veo-3.1-lite",
    "prompt": "A calm lake at sunrise, slow aerial push-in",
    "seconds": 4,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "audio": false
  }'
FieldDescription
modelA model id from GET /v1/videos/models, or auto (default) to let the gateway pick by quality.
promptThe text prompt, up to 2,000 characters. Required.
secondsClip length. Each model lists the durations it supports. Required.
resolutione.g. 720p (default) or 1080p, as the model lists.
aspect_ratio16:9 (default), 9:16 or 1:1, as the model lists.
audioAsk for an audio track where the model makes it optional.
qualityFor auto: draft, standard (default) or high.
negative_prompt, seedOptional, where the model supports them.
max_price_usd / max_price_idrRefuse (409 price_changed) if the price is now above what you showed your user.
free_drafttrue for the one free draft (overrides model, length, resolution and audio).

Send an Idempotency-Key header so a retry returns the same job instead of a second hold. Image-to-video is not available yet.

Limits & guards

  • Prompt guard. Child-safety, violent extremism, NSFW and content moderation (English + Bahasa Indonesia) run before anything is held; validated personal data is masked before the prompt leaves.
  • Output check. Frames of every result are checked for nudity before delivery; a blocked result is refunded.
  • Labels. Files are named …-ai-generated.mp4 and carry a C2PA manifest signed by Anoman (self-signed).
  • Where it runs. Generation runs at fal.ai, outside Indonesia (fal does not publish the region), under the model owner's terms (terms on each model).
  • Caps. A daily spend cap and an in-flight cap per workspace; a busy queue returns 503 and nothing is held.

Errors

StatuserrorMeaning
402insufficient_balanceNot enough topped-up balance for this quote.
409price_changedThe price is above your max_price_*.
409free_draft_unavailableThe free draft was already used or isn't available.
429video_daily_cap_reached / concurrent_limitA workspace cap is reached.
503capacity / video_temporarily_unavailableTry again later; nothing was charged.

Response

Illustrative example — the amounts are not a price list; the live quote comes from the API (POST /v1/videos/quote).

{
  "id": "vid_1a2b3c4d5e6f7a8b9c0d1e2f",
  "object": "video",
  "status": "queued",
  "model": "veo-3.1-lite",
  "seconds": 4,
  "_anoman": {
    "quote_usd": "0.1500",
    "quote_idr": 2775,
    "held": true,
    "poll_url": "/v1/videos/vid_1a2b3c4d5e6f7a8b9c0d1e2f",
    "label": "AI-generated"
  }
}

Make videos in the studio

On this page