PL Log inOpen Studio
Preview version. Model catalog, prices, calculator and docs are live. Generation goes live at launch.

After Sora 2: Which Video Models to Use and How to Port Your Code

The sora-2 API is off. A Sora 2 alternative for each job (Veo 3.1, Seedance 2.5, Wan 3.0, Kling 3.0) and a field-by-field port of Videos API code.

Sora is closed, both the app and the API. If your product or workflow depended on it, the replacement depends on what you used Sora for. Text-to-video with sound: Veo 3.1 (Quality), Seedance 2.5 (from $0.261 per second) or Wan 3.0 (from $0.0777 per second). Shots of 25-30 seconds: Seedance 2.5 or Wan 3.0. A recurring character: Seedance 2.5 with references, or Nano Banana Pro stills animated by Kling 3.0. Reworking a finished clip: Seedance 2.5 in edit mode.

In Kadraris all of these run in the same browser Studio and through the same API key, funded from one prepaid balance that never runs out on a date and needs no plan. This guide gives the timeline, a job-by-job map, the code migration and costs.

Port your Videos API calls first

If you are here because production code broke, start with this. The Sora flow was three calls: POST /v1/videos, then poll GET /v1/videos/{id} until completed, then fetch GET /v1/videos/{id}/content. In Kadraris every video model sits behind one endpoint, and model settings go inside input.

Sora Videos APIKadraris
POST /v1/videosPOST /v1/generate
model: "sora-2" or "sora-2-pro""seedance-2.5", "veo-3.1", "wan-3.0", "kling-3.0"
promptinput.prompt
seconds (string, e.g. "8")input.duration (integer)
input_reference (upload)input.image_url (public first-frame URL)
polling GET /v1/videos/{id}webhook_url, with GET /v1/tasks/{id} as backup
completedsucceeded
GET /v1/videos/{id}/contentoutput[0].url (download it; links expire)

The size field splits into two:

Sora sizeinput.resolutioninput.aspect_ratio
1280x720720p16:9
720x1280720p9:16
1792x1024 (pro)1080p16:9
1024x1792 (pro)1080p9:16

Each model accepts its own ranges. A field that is unknown or out of range returns 422 before any charge:

  • Seedance 2.5: duration 4-30; resolution 480p, 720p, 1080p; ratios include 16:9, 9:16, 1:1 and adaptive.
  • Veo 3.1: duration fixed at 8; aspect_ratio 16:9 or 9:16 only; resolution up to 4k.
  • Wan 3.0: duration 2-30; note the uppercase resolution values 720P, 1080P, 2K, 4K.
  • Kling 3.0: duration 3-15; generate_audio off unless you set it.

The full schema for any model is at GET /v1/models/{id}.

A drop-in Python function

This keeps Sora-style arguments and translates them:

python
import os
import requests

SIZE_MAP = {
    "1280x720": ("720p", "16:9"),
    "720x1280": ("720p", "9:16"),
    "1792x1024": ("1080p", "16:9"),
    "1024x1792": ("1080p", "9:16"),
}

def generate_from_sora_params(prompt, seconds="8",
                              size="1280x720", image_url=None):
    resolution, aspect_ratio = SIZE_MAP[size]
    body = {
        "model": "seedance-2.5",
        "input": {
            "prompt": prompt,
            "duration": int(seconds),
            "resolution": resolution,
            "aspect_ratio": aspect_ratio,
            "generate_audio": True,
        },
        "webhook_url": "https://your-server.example/hooks/kadraris",
    }
    if image_url:
        body["input"]["image_url"] = image_url
    r = requests.post(
        "https://kadraris.com/v1/generate",
        headers={"Authorization":
                 f"Bearer {os.environ['KADRARIS_API_KEY']}"},
        json=body,
        timeout=30,
    )
    r.raise_for_status()
    task = r.json()
    return task["id"], task["estimated_cost"]

task_id, cost = generate_from_sora_params(
    "A runner crosses a stone bridge in morning mist, "
    "camera follows from the side, soft footsteps, birds",
    seconds="12",
    size="1280x720",
)
print(task_id, cost)

And as curl:

bash
curl https://kadraris.com/v1/generate \
  -H "Authorization: Bearer $KADRARIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5",
    "input": {
      "prompt": "A runner crosses a stone bridge in morning mist, camera follows from the side, soft footsteps, birds",
      "duration": 12,
      "resolution": "720p",
      "aspect_ratio": "16:9",
      "generate_audio": true
    },
    "webhook_url": "https://your-server.example/hooks/kadraris"
  }'

You get a 202 with the task id and estimated_cost, so the price is known before rendering starts.

Replace the polling loop

In many Sora integrations the polling loop was the busiest code. With webhook_url in the request, your server is called once the job is over. The payload is identical to GET /v1/tasks/{id}; x-kadraris-signature holds an HMAC-SHA256 (hex) computed over the unparsed body with the secret from your dashboard.

  • Check the signature against the raw bytes, before you parse JSON.
  • Return 2xx quickly and fetch output[0].url in a background job, since result links expire.
  • Keep a slow fallback poller on GET /v1/tasks/{id} for tasks that have not reported back after a few minutes.
  • A failed task costs $0. Its hold is released completely.

Ready-made receivers for FastAPI and Node.js: async AI video with webhooks. Reference: generate and webhooks.

Which model replaces which Sora job

What you used Sora forUse instead
prompt-only clips with audioVeo 3.1 (Quality), Seedance 2.5, Wan 3.0
25-30 second shotsSeedance 2.5 (4-30 s), Wan 3.0 (2-30 s)
a character instead of cameosSeedance 2.5 with references, or Nano Banana Pro then Kling 3.0
remixing a finished videoSeedance 2.5 edit mode
speech in other languagesMiniMax H3, Gemini Omni 1.1

What to check for each:

  • Prompt-only clips with audio. Veo 3.1 output is always 8 seconds long (720p, 1080p or 4K). On Seedance 2.5 and Wan 3.0, sound is controlled by generate_audio, enabled by default.
  • Long shots. One pass is enough on either; the ceiling is 1080p for Seedance 2.5 and 4K for Wan 3.0.
  • Characters. Feed Seedance as many as 30 pictures through image_urls. Alternatively, make matching stills in Nano Banana Pro, which takes 14 references, and let Kling 3.0 start a clip from one of them.
  • Remix. Send your footage through video_urls, 30 s combined at most. duration is required, and the input seconds are billed in addition to the output.
  • Other languages. When I tested Polish dialogue, MiniMax H3 missed 1 word out of 12 and Gemini Omni Flash 1.1 missed none. Details in AI video with Polish speech.

A few differences from how Sora worked:

  • No saved character profile. Sora's cameos lived in the app, built from one recording of yourself. In Kadraris, every request brings its own reference images. Use only the likeness of people who have agreed to it.
  • Remix means editing your own upload, not remixing someone's post from a feed. The prompt names the change, such as a new look, a different hour or another backdrop. For a full restyle there is HappyHorse 1.0, and Gemini Omni makes a new take from your reference clip.
  • Over 30 seconds means editing. Chain clips by feeding each one's final frame into the next request's image_url, so the action carries on.

Seedance 2.5 compared directly with Veo, Wan and Kling; everything else on the comparisons page.

Vendor sample: ByteDance

How Sora was shut down

The shutdown happened in two phases. Sources: The Decoder, 28 March 2026, and TechCrunch, 24 March 2026.

  • 24 March 2026: announcement that Sora would end, app and API alike.
  • 26 April 2026: sora.chatgpt.com and the mobile app stopped working; cameos and the feed went with them.
  • 24 September 2026: API cutoff. The Videos API, sora-2, sora-2-pro and every dated snapshot stopped answering.

The Decoder reports that Sora lives on inside OpenAI as research into world models, while its compute now serves developer products and enterprise clients. No successor video model has been named.

Costs

There are no credits that reset and no subscription. Top up from $10; the balance stays until you spend it, and each finished clip is deducted from it.

ModelBilled by8 s30 s
Seedance 2.5second8 × from $0.261 per second30 × from $0.261 per second
Wan 3.0second8 × from $0.0777 per second30 × from $0.0777 per second
Kling 3.0second8 × from $0.0963 per second-
MiniMax H3second8 × from $0.161 per second-

Veo charges a flat amount per 8-second clip: from $0.354 per video for Veo 3.1 Fast and from $2.53 per video for Veo 3.1 (Quality).

These are entry rates at the lowest resolution. Several models charge extra for sharper output or sound. Model your own case in the AI cost calculator; the complete list is on pricing, and the video lineup on the AI video generator page.

Questions

My old Sora prompts: keep or rewrite?

Keep most of them. Scene descriptions, camera directions and sound cues transfer well. What changes is length and size, which must fit each model's limits. Run one clip before a whole batch.

Which model is closest to sora-2-pro at 1792x1024?

Map it to 1080p and 16:9. Seedance 2.5 and Veo 3.1 both accept that, and Veo 3.1 and Wan 3.0 can go up to 4K if you need more.

Can I still download my Sora library?

OpenAI asked users to export videos and images before the cutoff dates. The Decoder reports that user data is deleted permanently after the deadlines, and that a possible extra export window would be communicated by email. The current state is on OpenAI's help center.

Will switching models later mean another migration?

No. All video models return one task format, which means hopping between Seedance 2.5, Veo 3.1 and Wan 3.0 is a change to the model field plus any values that model limits differently.