Video Generation
Temporarily unavailable

The Video Generation endpoint is currently under maintenance. Kindly bear with us as we work on it and get it back online.

Elvion AI Developer API

Elvion Developer API

One key. Reasoning chat, multimodal vision, cinematic video, studio voice, and image generation.

All services running smoothly

Developer Key Sync

Paste your developer API key here. It synchronizes automatically across every playground on this page.

Introduction

Welcome to Elvion AI's programmatic Developer API.

This documentation contains complete specifications, code examples, and interactive testing consoles for every developer endpoint. All endpoints share a single base URL, and every engine — chat, vision, image, video, voice — is billed entirely through Elvion AI. No juggling separate vendor accounts or keys.

https://web-production-9a18.up.railway.app

Agentic Reasoning

Philadelphia handles multi-turn agentic thinking natively. Strategy, logic, planning, live web search, and a context window big enough for entire codebases.

Three Video Engines

Philadelphia Pro (native audio, up to 2K, reference fusion), Philadelphia Fast (quicker & cheaper), and the Legacy engine.

Seraphina Voice Studio

Generate realistic, expressive voice recordings in dozens of tones and characters straight from text.

Why Build on Elvion

A single AI stack instead of five separate vendor bills.

Most teams stitch together a chat model, an image model, a video model, and a voice model from different providers. Different keys, different pricing pages, different SLAs. Elvion collapses that into one account, one credit balance, and one predictable price list.

CapabilityElvion AITypical multi-vendor stack
Chat + video + image + voiceOne account, one keySeparate accounts per capability
Agent context windowUp to 1,000,000 tokensOften capped much lower
Video with native audioGenerated in the same callUsually a separate audio pass
Style + motion + voice fusionOne Reference-to-Video requestMultiple disconnected tools
Failed generationCredits auto-refundedVaries, often manual
BillingPay-as-you-go, no subscriptionOften monthly seat-based plans

Philadelphia Chat, built for agents and real engineering

Philadelphia doesn't just answer questions, it thinks step-by-step, calls tools mid-conversation, reads long documents or an entire repository of code in one shot thanks to its huge context window, and writes clean, working code across virtually any language or framework. It's genuinely strong at debugging, refactoring, and multi-file reasoning.

Philadelphia Pro Video, one of the most complete video engines you can call

Native synchronized audio, resolution up to 2K, first/last-frame control, and Reference-to-Video generation that blends a character's look, a clip's motion, and a voice's performance into a single request. Capabilities most platforms only offer as separate, disconnected tools you'd have to stitch together yourself.

Quick Start

Your first API call in under 60 seconds.

1. Generate Your Credentials

Log into the Developer Dashboard, go to API Management, and generate an API key for 10 credits.

2. Call Philadelphia Chat

curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia/chat" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message": "Give me a 3-step plan to launch a coffee brand in Lagos."}'
import requests

url = "https://web-production-9a18.up.railway.app/api/developer/philadelphia/chat"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
data = {"message": "Give me a 3-step plan to launch a coffee brand in Lagos."}

r = requests.post(url, headers=headers, json=data)
print(r.json())

Authentication

Every request must authenticate using your project API key.

Include it in the Authorization header of every request:

Authorization: Bearer elv_sec_yourPrivateKeyHere
Security Rule: Never run these calls from client-side code (your frontend HTML, mobile apps, etc.). Always route through a secure backend proxy so your key stays hidden.

Pricing & Bonus Credits

Predictable pay-as-you-go credit billing. Plus free credits to get started.

Free bonus credits, always

Bonus credits are a constant at Elvion AI. Every new account starts with free credits already loaded, no promo code needed. Load your first wallet top-up, become an Elvion partner, and see every engine on this page for yourself before you build anything serious on it.

Scale Price

$0.005
per credit (₦5 = 1 credit)
  • ₦1,000/$1 top-up minimum
  • Automatic billing
  • Safe payment routing

Philadelphia Pro Video, pay per second

Cost = duration × per-second rate, converted to credits at the Developer markup. Reference images beyond the first 5 add ~26 credits each; reference video material is billed at the output per-second rate; reference audio is always free.

ResolutionRate5s10s15s
768P~52 credits/s260 credits519 credits779 credits
2K~85 credits/s422 credits843 credits1,265 credits

Philadelphia Fast Video, pay per second

Cheaper and quicker than Pro. No reference-to-video mode. All images are free (never billed).

ResolutionRate5s10s15s
480P~32 credits/s162 credits324 credits486 credits
768P~52 credits/s260 credits519 credits779 credits

Seraphina Voice, character-based pricing beyond the flat fee

The 30-credit flat fee covers short requests. Past roughly 460 characters, cost scales per character at the same effective rate, so a full script or article costs proportionally more than a one-line greeting instead of being billed the same flat 30 credits either way.

Text lengthApprox. wordsCredits charged
Up to ~460 characters~75–90 words30 (flat)
5,000 characters~800 words~324
20,000 characters~3,200 words~1,296
1,000,000 characters ≈ 165,000 words ≈ 18 hours of narration, for context on scale.

Philadelphia Chat

Elite reasoning engine. Writes code, searches the live web, stays current with events, and holds huge amounts of context in one conversation.

POST/api/developer/philadelphia/chat3 credits + overage
FieldTypeDescription
messageRequiredstringLatest user prompt.
historyOptionalarrayPrior turns: [{role, content}].
system_promptOptionalstringCustom persona instruction.
Context & length: Philadelphia can hold up to 1,000,000 tokens of context in a single conversation — long documents, whole codebases, extended chat history all fit. Responses can run up to 500,000 tokens for very large generation tasks, though most replies are far shorter. The flat 3-credit fee covers typical messages; unusually large prompts or long histories may add a small overage charge, itemized in your usage log.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia/chat" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"message": "Write a 3-step plan to launch a coffee brand in Lagos.", "system_prompt": "You are a business advisor."}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/philadelphia/chat",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "message": "Write a 3-step plan to launch a coffee brand in Lagos.",
        "system_prompt": "You are a business advisor.",  # optional
        "history": []                                      # optional: [{"role": "user"/"assistant", "content": "..."}]
    }
)
print(r.json())  # {"reply": "...", "thinking": "...", "credits_charged": 3}

Playground

Bobby Chat

Fast, friendly companion for ideation, coding, and brainstorming, lighter and quicker than Philadelphia for everyday chat.

POST/api/developer/bobby/chat3 credits
FieldTypeDescription
promptRequiredstringInstructions or question.
systemPromptOptionalstringBehavioral override.
modelOptionalstringfast for quick, lightweight replies, or thinking for a slower, more deliberate pass. Defaults to thinking on this endpoint.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/bobby/chat" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "Write a short sci-fi story about an offline robot.", "model": "fast"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/bobby/chat",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "prompt": "Write a short sci-fi story about an offline robot.",
        "systemPrompt": None,  # optional
        "model": "fast"        # "fast" or "thinking" (default "thinking")
    }
)
print(r.json())

Playground

Vision Analysis

Native image/video inspection. No separate upload step.

POST/api/developer/vision/analyze3 credits
Key (multipart)TypeDescription
fileRequiredbinaryImage or video file. Any image/* or video/* mime type. Practical limits: images up to ~10MB, video up to ~50MB per request.
promptOptionalstringDefaults to "Analyze this media in detail."
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/vision/analyze" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@photo.jpg" \
  -F "prompt=Describe this in full detail."
import requests

with open("photo.jpg", "rb") as f:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/vision/analyze",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"file": f},
        data={"prompt": "Describe this in full detail."}  # optional
    )
print(r.json())  # {"analysis": "...", "thinking": "...", "credits_charged": 3}

Playground

Image Generation

Philadelphia Image V1 for stylized art across dozens of styles, V2 for photoreal detail and batching. Version 1's (v6) style is extremely good for text in images alongside Version 2.

POST/api/developer/generate-image12 or 18×n credits
FieldTypeDescription
promptRequiredstringImage description.
use_minimaxOptionalbooleantrue = V2 (18 credits/image), false = V1 (12 credits flat).
modelOptionalstringV1 only. One of v6, photoreal, movie, anime, anime_core, illustration, realistic, max, portrait, photoreal2, animereal, radiant, animecinematic, noir, nyx, pixel, rewave, analog, pastel, toonish, apex. Ignored on V2.
aspect_ratioOptionalstringV2 only. One of 1:1, 16:9, 4:3, 3:2, 2:3, 3:4, 9:16, 21:9. Takes priority over width/height.
width / heightOptionalintegerV2 only. 512–2048px, must be divisible by 8. Ignored if aspect_ratio is set.
nOptionalintegerV2 only. Batch count 1–9. Cost scales as 18 × n. V1 always returns exactly 1 image.
seedOptionalintegerV2 only. Fix for reproducible output.
prompt_optimizerOptionalbooleanV2 only. Lets the engine expand/refine your prompt before generating.
Real-person likenesses: Philadelphia Image V1 can render recognizable likenesses of some public figures depending entirely on how you prompt it — results tend to lean toward an older, softer interpretation rather than a sharp match, and quality varies a lot with prompt specificity. You are responsible for making sure anything you generate and publish complies with copyright, rights-of-publicity, and defamation laws in your jurisdiction. When in doubt, avoid naming real individuals in your prompts.
Response shape differs by count: single image returns image_b64; V2 batches (n > 1) return an images_b64 array. Always check for both.
# V1 
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-image" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "A futuristic city in the clouds, digital art", "use_minimax": false, "model": "v6"}'

# V2 (batched)
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-image" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "A futuristic city in the clouds", "use_minimax": true, "aspect_ratio": "16:9", "n": 3}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/generate-image",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "prompt": "A futuristic city in the clouds, digital art",
        "use_minimax": True,      # False = V1 (12 cr flat), True = V2 (18 cr x n)
        "aspect_ratio": "16:9",   # V2 only
        "n": 3,                   # V2 only, 1-9
        "seed": None,             # V2 only
        "prompt_optimizer": True  # V2 only
    }
)
data = r.json()
images = data.get("images_b64") or [data.get("image_b64")]
print(len(images), "image(s) returned")

Playground

Seraphina Voice Gen

Realistic speech synthesis across 40 languages and a wide range of tones and characters. Type in the language you want and it speaks that language natively.

POST/api/developer/seraphina/voice30 credits, or per-character beyond ~460 chars
Pricing: Charged at 30 credits flat for typical requests (up to ~460 characters, about 75–90 words). Beyond that, cost scales per character at the same effective rate rather than staying flat regardless of length. The response's credits_charged field always reflects the exact amount deducted — check it, don't hardcode 30.

Supported languages (40)

Chinese, Cantonese, English, Spanish, French, Russian, German, Portuguese, Arabic, Italian, Japanese, Korean, Indonesian, Vietnamese, Turkish, Dutch, Ukrainian, Thai, Polish, Romanian, Greek, Czech, Finnish, Hindi, Bulgarian, Danish, Hebrew, Malay, Persian, Slovak, Swedish, Croatian, Filipino, Hungarian, Norwegian, Slovenian, Catalan, Nynorsk, Tamil, Afrikaans.

FieldTypeDescription
textRequiredstringScript to vocalize.
voice_idOptionalstringOne of ceo, narrator, anime, movie, elder, knight, abbess, sweet, lovely, casual, gentle, hero, cute, boy, elegant, friendly, inspire.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/seraphina/voice" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"text": "Welcome to Elvion AI.", "voice_id": "narrator"}'
import requests, base64

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/seraphina/voice",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"text": "Welcome to Elvion AI.", "voice_id": "narrator"}
)
data = r.json()  # {"audio_b64": "...", "voice_used": "...", "format": "mp3", "credits_charged": 30}
with open("voice.mp3", "wb") as f:
    f.write(base64.b64decode(data["audio_b64"]))

Playground

Philadelphia Pro, Text to Video

Native audio, up to 2K, full camera and mood control. Extremely realistic.

Engine: Philadelphia Pro Video
POST/api/developer/philadelphia-pro/generate-text~52-85 credits/sec
FieldTypeDescription
promptRequiredstringScene description.
durationOptionalinteger4–15 seconds. Default 5.
resolutionOptionalstring768P or 2K. Default 2K.
ratioOptionalstringOne of 21:9, 16:9, 4:3, 1:1, 3:4, 9:16. Defaults to 16:9. Cannot be "adaptive" for text-to-video.
camera_motionOptionalstringOne of none, push_in, pull_out, pan_left, pan_right, orbit, handheld, drone, shake, zoom_burst. Baked into the prompt.
audio_moodOptionalstringOne of none, cinematic_score, tense, upbeat, ambient, silence. Shapes the native generated audio.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-text" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "A golden eagle soaring over neon Lagos at night", "duration": 6, "resolution": "2K", "ratio": "16:9", "camera_motion": "drone", "audio_mood": "cinematic_score"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-text",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "prompt": "A golden eagle soaring over neon Lagos at night",
        "duration": 6,
        "resolution": "2K",
        "ratio": "16:9",
        "camera_motion": "drone",
        "audio_mood": "cinematic_score"
    }
)
print(r.json())  # {"status": "submitted", "task_id": "...", "credits_charged": N}
Returns immediately with a task_id. Poll the Pro/Fast Status Poller — never /api/video/status, that poller is Legacy-engine only.

Playground

Philadelphia Pro, Image to Video

Animate a first frame, optionally toward a specified last frame.

POST/api/developer/philadelphia-pro/generate-image~52-85 credits/sec
Key (multipart)TypeDescription
first_frameRequiredbinaryStarting frame image.
last_frameOptionalbinaryTarget end frame — costs one extra billable image beyond the first 5.
promptRequiredstringMotion directions.
durationOptionalinteger4–15s. Default 5.
resolutionOptionalstring768P or 2K.
camera_motion / audio_moodOptionalstringSame option sets as Text to Video.
Aspect ratio is derived automatically from the uploaded image — there is no separate ratio field here.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-image" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "first_frame=@start.jpg" \
  -F "last_frame=@end.jpg" \
  -F "prompt=Slow zoom out revealing the skyline" \
  -F "duration=6" \
  -F "resolution=2K"
import requests

with open("start.jpg", "rb") as first, open("end.jpg", "rb") as last:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-image",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"first_frame": first, "last_frame": last},  # last_frame optional
        data={"prompt": "Slow zoom out revealing the skyline", "duration": 6, "resolution": "2K"}
    )
print(r.json())

Playground

Philadelphia Pro, Reference to Video

Fuse style/character from up to 9 images with pacing and voice from a reference video and/or audio clip.

POST/api/developer/philadelphia-pro/generate-reference~52-85 credits/sec + input material
Key (multipart)TypeDescription
promptRequiredstringScene direction.
reference_imagesOptionalbinary[]Up to 9. First 5 are free; each beyond that adds ~26 credits.
reference_video_urlOptionalstringPublic clip URL. Use this OR reference_video_file, not both — file wins if both are sent.
reference_video_fileOptionalbinaryDirect upload, max 40MB.
reference_video_secondsOptionalintegerActual clip length, for accurate billing. Defaults to a conservative 15s if omitted.
reference_audio_url / reference_audio_fileOptionalstring / binaryPublic URL or direct upload (max 15MB). Always free — never adds to cost.
durationOptionalinteger4–15s. Default 5.
resolutionOptionalstring768P or 2K.
ratioOptionalstringDefaults to adaptive; may be set to any concrete ratio.
camera_motion / audio_moodOptionalstringSame option sets as above.
Provide at least one of: reference images, reference video, or reference audio. Reference video input material is billed at the same per-second rate as your chosen output resolution.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-reference" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "prompt=A knight walks through a burning village" \
  -F "reference_images=@char1.jpg" \
  -F "reference_images=@char2.jpg" \
  -F "reference_video_url=https://example.com/clip.mp4" \
  -F "reference_video_seconds=8" \
  -F "duration=6" \
  -F "resolution=2K"
import requests

with open("char1.jpg", "rb") as c1, open("char2.jpg", "rb") as c2:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/generate-reference",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files=[("reference_images", c1), ("reference_images", c2)],  # up to 9
        data={
            "prompt": "A knight walks through a burning village",
            "reference_video_url": "https://example.com/clip.mp4",  # or reference_video_file upload
            "reference_video_seconds": 8,   # actual clip length -- improves billing accuracy
            "duration": 6,
            "resolution": "2K",
            "ratio": "adaptive"
        }
    )
print(r.json())

Playground

Philadelphia Pro, Upscale to 2K

Upgrade a previously succeeded 768P Pro generation to 2K.

POST/api/developer/philadelphia-pro/upscale~33 credits/sec
FieldTypeDescription
source_task_idRequiredstringTask ID of a succeeded 768P Pro generation. Must be your own task, within the 7-day query window.
resolutionRequiredstringMust be "2K".
Only works on tasks created via the Pro endpoints above. Fast Video and Legacy engine outputs are not eligible.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/upscale" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"source_task_id": "your_succeeded_task_id", "resolution": "2K"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/philadelphia-pro/upscale",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"source_task_id": "your_succeeded_task_id", "resolution": "2K"}
)
print(r.json())

Playground

Philadelphia Fast, Text to Video

Quicker, cheaper generation for iteration and previews.

Engine: Philadelphia Fast Video
POST/api/developer/philadelphia-fast/generate-text~32-52 credits/sec
FieldTypeDescription
promptRequiredstringScene description.
durationOptionalinteger5–15 seconds — 4s is not supported on Fast Video. Default 6.
resolutionOptionalstring480P or 768P. No 2K on this engine. Default 768P.
ratioOptionalstringSame ratio set as Pro. Defaults to 16:9.
camera_motion / audio_moodOptionalstringSame option sets as Pro.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-fast/generate-text" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "A skateboarder doing a kickflip at sunset", "duration": 6, "resolution": "768P", "ratio": "9:16"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/philadelphia-fast/generate-text",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "prompt": "A skateboarder doing a kickflip at sunset",
        "duration": 6,         # 5-15, default 6 (4s not supported)
        "resolution": "768P",  # "480P" or "768P", no 2K
        "ratio": "9:16"
    }
)
print(r.json())
Poll with the same Pro/Fast Status Poller used for Pro tasks.

Playground

Philadelphia Fast, Image to Video

Animate a starting frame at Fast-engine speed and price.

POST/api/developer/philadelphia-fast/generate-image~32-52 credits/sec
Key (multipart)TypeDescription
first_frameRequiredbinaryStarting frame. All images are free on Fast Video.
last_frameOptionalbinaryTarget end frame — still free.
promptRequiredstringMotion directions.
durationOptionalinteger5–15s. Default 6.
resolutionOptionalstring480P or 768P.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/philadelphia-fast/generate-image" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "first_frame=@start.jpg" \
  -F "prompt=Camera pans right as the car drives off" \
  -F "duration=6" \
  -F "resolution=768P"
import requests

with open("start.jpg", "rb") as f:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/philadelphia-fast/generate-image",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"first_frame": f},
        data={"prompt": "Camera pans right as the car drives off", "duration": 6, "resolution": "768P"}
    )
print(r.json())

Playground

Legacy Engine, Text to Video

Original engine. Silent output, fixed durations.

No native audio
POST/api/developer/generate-video-from-text32 credits/sec
FieldTypeDescription
promptRequiredstringScene description.
durationOptionalinteger6 or 10 only (any value ≥10 rounds to 10, anything else rounds to 6). 6s = 192 credits, 10s = 320 credits.
resolutionOptionalstring512P, 768P, or 1080P. Default 1080P. 1080P is only honored on a 6s clip — a 10s request automatically renders at 768P regardless of what you send.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-text" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt": "A lion walking across the savanna at dawn", "duration": 6, "resolution": "1080P"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-text",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "prompt": "A lion walking across the savanna at dawn",
        "duration": 6,          # snaps to 6 or 10 server-side
        "resolution": "1080P"   # only honored if duration ends up as 6; 10s forces 768P
    }
)
print(r.json())

Playground

Legacy Engine, Image to Video

Directed animation from a starting frame.

POST/api/developer/generate-video-from-image32 credits/sec
Key (multipart)TypeDescription
fileRequiredbinaryStarting frame.
promptRequiredstringMotion directions.
durationOptionalinteger6 or 10, same billing and 1080P/6s rule as Text to Video.
resolutionOptionalstring512P, 768P, or 1080P. Default 768P.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-image" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@frame.jpg" \
  -F "prompt=The waves crash gently onto the shore" \
  -F "duration=6" \
  -F "resolution=768P"
import requests

with open("frame.jpg", "rb") as f:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-image",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"file": f},
        data={"prompt": "The waves crash gently onto the shore", "duration": 6, "resolution": "768P"}
    )
print(r.json())

Playground

Legacy Engine, Frame Interpolation

Interpolate between an exact first and last frame.

POST/api/developer/generate-video-from-frames192 credits (fixed 6s, 1080P)
Key (multipart)TypeDescription
first_frameRequiredbinaryStart frame.
last_frameRequiredbinaryEnd frame.
promptRequiredstringMotion description.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-frames" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "first_frame=@a.jpg" -F "last_frame=@b.jpg" \
  -F "prompt=Smooth morph between the two poses"
import requests

with open("a.jpg", "rb") as f1, open("b.jpg", "rb") as f2:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/generate-video-from-frames",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"first_frame": f1, "last_frame": f2},
        data={"prompt": "Smooth morph between the two poses"}
    )
print(r.json())

Playground

Legacy Engine, Subject Consistency

Lock generation to a specific character subject photo.

POST/api/developer/generate-video-subject192 credits (fixed 6s, 1080P)
Key (multipart)TypeDescription
subject_photoRequiredbinaryReference photo of the subject.
promptRequiredstringScene the subject appears in.
curl -X POST "https://web-production-9a18.up.railway.app/api/developer/generate-video-subject" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "subject_photo=@person.jpg" \
  -F "prompt=Walking through a busy market"
import requests

with open("person.jpg", "rb") as f:
    r = requests.post(
        "https://web-production-9a18.up.railway.app/api/developer/generate-video-subject",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"subject_photo": f},
        data={"prompt": "Walking through a busy market"}
    )
print(r.json())

Playground

Pro / Fast Status Poller

Use this for every Philadelphia Pro and Philadelphia Fast task.

GET/api/h3/status/{task_id}0 credits, no auth needed
Response fieldDescription
statuspending, Success, or cancelled (all HTTP 200) — or an HTTP 500 error if the generation itself failed.
urlTime-limited download URL, present when status="Success".
resolution / duration / ratioEchoed back from the completed task.
curl "https://web-production-9a18.up.railway.app/api/h3/status/YOUR_TASK_ID"
import requests, time

task_id = "YOUR_TASK_ID"
url = f"https://web-production-9a18.up.railway.app/api/h3/status/{task_id}"

while True:
    r = requests.get(url)
    if r.status_code != 200:
        print("Failed:", r.json())
        break
    data = r.json()
    if data["status"] == "Success":
        print("Done:", data["url"])
        break
    elif data["status"] == "cancelled":
        print("Task was cancelled.")
        break
    time.sleep(5)
Tasks are only queryable for 7 days. This endpoint does not accept an Authorization header — task IDs are the access control.

Playground

Legacy Status Poller

Use this only for the four Legacy Engine endpoints above.

GET/api/video/status?task_id=YOUR_TASK_ID0 credits, no auth needed
curl "https://web-production-9a18.up.railway.app/api/video/status?task_id=YOUR_TASK_ID"
import requests

r = requests.get(
    "https://web-production-9a18.up.railway.app/api/video/status",
    params={"task_id": "YOUR_TASK_ID"}
)
print(r.json())

Playground

Video Cost Estimator

Preview the exact credit cost before submitting a Pro or Fast video job. No charge or auth required.

POST/api/h3/estimate-costFree
FieldTypeDescription
modeRequiredstringtext, image, or reference. reference is Pro-only.
modelOptionalstringpro or fast. Default pro.
duration / resolutionOptionalinteger / stringSame constraints as the matching generation endpoint.
image_count / ref_video_secondsOptionalintegerPro reference-mode billing inputs.
tierOptionalstringstudio or dev. Use dev to preview Developer API pricing.
curl -X POST "https://web-production-9a18.up.railway.app/api/h3/estimate-cost" \
  -H "Content-Type: application/json" \
  -d '{"mode": "text", "model": "pro", "duration": 6, "resolution": "2K", "tier": "dev"}'
import requests

r = requests.post(
    "https://web-production-9a18.up.railway.app/api/h3/estimate-cost",
    json={
        "mode": "text",       # "text" | "image" | "reference"
        "model": "pro",       # "pro" or "fast"
        "duration": 6,
        "resolution": "2K",
        "image_count": 0,     # relevant for reference mode
        "ref_video_seconds": 0,
        "tier": "dev"         # "dev" to preview Developer API pricing
    }
)
print(r.json())  # {"credits": N, "naira": N, "tier": "dev", "model": "pro"}

Playground

Errors & Rate Limits

Predictable error payloads for logging integrations.

StatusReasonDescription
400Bad RequestMissing required fields, or a parameter outside its valid range (duration, resolution, ratio, file size).
401UnauthorizedInvalid or missing API key.
402Payment RequiredCredit balance below the endpoint's cost.
500 / 502Upstream ErrorThe underlying generation engine rejected or failed the job — message is passed through in detail. Credits already deducted for a failed generation are automatically refunded to your balance.

Rate limits

At Elvion, Spend is the natural throttle. Extremely high-frequency or clearly abusive traffic patterns may still be slowed or paused. If you're planning meaningful production volume, email elvionailabs@gmail.com first so your account is provisioned correctly. Generally, 30 seconds per request.

FAQ

Common questions from integrators.

Elvion AI is a single platform for reasoning chat (Philadelphia), companion chat (Bobby), image generation, video generation, and voice synthesis, behind one API key and one credit balance.

Pro for native synchronized audio, up to 2K, and reference fusion. Fast for quicker, cheaper iteration when you don't need audio-driven reference generation. Legacy for the original fixed-duration silent engine, including frame interpolation and subject-consistency modes not available elsewhere.

/api/h3/status/{task_id} for anything submitted through a Pro or Fast endpoint; /api/video/status?task_id= only for the four Legacy endpoints. Using the wrong one returns an "invalid task_id" error.

No, Developer API output is unwatermarked for white-label integration into your own product.

Image V1 & 2 can render likenesses of some public figures depending on how you prompt it, though results skew older and softer rather than a sharp match. You're responsible for making sure whatever you generate and publish respects copyright and rights-of-publicity laws where you operate — see the note in the Image Generation section.

Credits deducted for a job that fails on Elvion's side are refunded to your balance automatically, no support ticket required. Feel free to write to us if otherwise.

No, they remain in your balance until spent.

Bonus credits are a constant at Elvion, every new account starts with free credits. Fund your wallet whenever you're ready to go further, or email elvionailabs@gmail.com for test credits before committing.

Yes, it's built for exactly that. Step-by-step reasoning, mid-conversation tool calls, live web search, and a context window big enough to hold long documents or a full codebase make it a strong fit for agents, coding assistants, and support automation, not just chat.

Chat holds up to 1,000,000 tokens of context and can generate responses up to 500,000 tokens. For uploads: vision images up to ~10MB, vision video up to ~50MB, reference video files up to 40MB, reference audio files up to 15MB.

Never call the Developer API directly from a browser or mobile app, route requests through your own backend so the key never reaches the client. See Authentication.