Video generation API

Video generation, behind one HTTP API.

OmniPort runs the generation pipeline and bills it by the second. Call it through the OpenAI Videos API your SDK already speaks, or through native endpoints that take a resolution tier directly.

  • Drop-in OpenAI SDK
  • Prepaid credits on your account
  • Failed jobs refunded automatically
POST /api/v1/videos
curl https://www.omniportapi.com/api/v1/videos \
  -H "Authorization: Bearer $OMNIPORT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "sora-2",
    "prompt": "a paper boat drifting through a neon city",
    "size": "720x1280",
    "seconds": 8
  }'
# 200 OK
{ "id": "video_9f2c…", "object": "video", "status": "queued" }

Two ways to call it

Same account, same credit balance, same task ownership. Pick the shape that fits your client — you can mix both from the same key.

OpenAI-compatible/api/v1/videos

Point the OpenAI SDK at this host and keep your existing code. Model names, size and seconds are translated to the pipeline for you.

  • POST /api/v1/videostext to video, or with a reference image
  • GET /api/v1/videos/{id}status, progress, errors
  • GET /api/v1/videos/{id}/contentthe finished MP4
Billed per model + secondEndpoints

Nativegenerations

Write against the generation scenarios directly: first / last frame, reference to video, and upscale. You choose the resolution tier; the request goes upstream as-is.

  • POST /api/v1/fl2v/generationsfirst frame, optional last frame
  • POST /api/v1/r2v/generationsimages, video and audio references
  • POST /api/v1/upscale/generationsre-render an existing video at a higher tier
Billed per resolution + secondEndpoints

Every endpoint

All paths are relative to this host and authenticated with a single bearer key. There is no versioned SDK to install.

OpenAI-compatible surface
MethodPathDescription
POST/api/v1/videosCreate a video job. JSON, or multipart with an input_reference file.
GET/api/v1/videosList your videos. limit / after / order.
GET/api/v1/videos/{id}Fetch one video with its status and progress.
GET/api/v1/videos/{id}/contentRedirect to the finished MP4.
DELETE/api/v1/videos/{id}Delete a video. Queued jobs are cancelled and refunded.
GET/api/v1/modelsModels enabled on this deployment.
Native surface
MethodPathDescription
POST/api/v1/fl2v/generationsFirst / last frame to video. Up to 2 images, prompt required.
POST/api/v1/r2v/generationsReference to video. Up to 8 images, 3 videos, 3 audio clips.
POST/api/v1/upscale/generationsUpscale an existing video. Exactly one videoUrls entry.
GET/api/v1/generationsList your tasks. page_num / page_size.
GET/api/v1/generations/{id}Fetch one task. Finished tasks include artifacts.

Pricing

Priced per second of generated video, with a minimum charge per job. Prices are in credits (1 credit = 1 US cent), drawn from your prepaid balance — no invoices, no rounding surprises.

Per model — OpenAI-compatible surface
ModelCredits / secondMinimum credits / job
sora-2210
sora-2-pro420
Per resolution — native surface
TierTypical useCredits / secondMinimum credits / job
480PDrafts and prompt iteration15
768PEveryday output210
1080PHigh detail315
2KFinal delivery525
How billing works
  • The full amount in credits is held when the job is created. If your credit balance does not cover it, the request fails with 402 insufficient_quota and nothing is queued.
  • The pipeline renders at least 5 seconds. A request for seconds: 4 is accepted and billed as 5 seconds.
  • Failed or cancelled jobs are refunded automatically, once per job.
  • Upscale is billed as a single 5-second unit; its real duration follows the source video.
  • Top up in the console — card and PayPal, credited to your account and shared by its keys.
  • Prices above are platform defaults; this deployment's price list has not been configured yet.

Buy credits in packs

Packs are priced in US dollars and credited as credits (1 credit = 1 US cent) on your account. Every job draws from that balance. Buy once — no subscription, and nothing expires.

Prepaid packs
PackYou payYou receiveBonusBest for
Starter$10.001,000 credits—Enough for a few short clips — good for wiring up the API.
Standard$50.005,500 credits+10%10% bonus credit. Where most teams land after the first test.
Pro$200.0024,000 credits+20%20% bonus credit. For continuous rendering across projects.

How a job runs

Generation takes minutes, so every call is asynchronous: submit, poll, download.

  1. CreateSend the prompt and shape. Parameters are validated and the charge is held before anything is queued.
  2. PollRead the job whenever you like. Every read syncs the live status from the pipeline — there is no stale cache to work around.
  3. DeliverFinished jobs point at an MP4 (/content, or artifacts on the native surface). Failures refund themselves.

Auth and errors

One header, one error shape. If your client can parse a JSON error, it can handle every failure this API produces.

Authentication

Authorization: Bearer sk-op-...

Keys are issued by the OmniPort operator. A key spends the credit balance of the account it belongs to, and only sees its own jobs.

Error envelope

{
  "error": {
    "message": "resolution must be one of 480P, 768P, 1080P, 2K.",
    "type": "invalid_request_error",
    "param": "resolution",
    "code": "invalid_value"
  }
}

400 invalid parameter · 401 bad key · 402 out of balance · 404 unknown job · 429 upstream busy.