The API
One call per finished result
Not a model endpoint with a prompt box. Every feature is a whole pipeline behind a single call, and what comes back is the finished file. These are the same endpoints the Studio itself runs on, on the same balance, with nothing held back for the app.
Every generation works the same way
A four second video and a one line transcript are the same call, so you write the plumbing once and every feature you add later is a different string in the same request.
- 01
You send the generation
POST /v3/generations, with the feature and its arguments
curl -X POST "https://api.neurall.io/v3/generations" \ -H "Authorization: nl-YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "feature": "video/logo-reveal", "args": { "image": "f_9c21e0b4", "prompt": "A lens-flare reveal: the logo materializes in the wake of the flare.", "duration": 4 } }' - 02
It is accepted straight away
The balance is charged here, and refunded automatically if the generation fails
{ "generation": { "id": "9f2c1d84-6a3b-4f21-9c77-2f0a1b8e5d43", "feature": "video/logo-reveal", "kind": "video", "status": "pending" } } - 03
A moment later it is done
Poll it, or pass a webhookUrl and take a signed callback. Same generation either way.
{ "generation": { "id": "9f2c1d84-6a3b-4f21-9c77-2f0a1b8e5d43", "status": "done", "output": { "video": "https://cdn.neurall.io/…/video.mp4", "poster": "https://cdn.neurall.io/…/poster.jpg", "durationMs": 4042, "width": 1920, "height": 1080 } } } - 04
And that url is the file
1920 by 1080, four seconds, with sound
Every feature is the same call
Each one is a whole pipeline behind a single POST: the arguments change, the plumbing does not. Pick one and you get the file it returns and the exact request that returned it, in whichever language you write.
curl -X POST "https://api.neurall.io/v3/generations" \
-H "Authorization: nl-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"feature": "video/logo-reveal",
"args": {
"image": "f_9c21e0b4",
"prompt": "A lens-flare reveal: a horizontal blue anamorphic flare streaks across the black frame from left to right in the opening beat; the logo materializes exactly in the flare's wake, settling into its true colors by the final beat. Sound design: one long cinematic whoosh, fading to quiet.",
"mode": "intro",
"aspectRatio": "16:9",
"background": "#000000",
"generateAudio": true,
"duration": 4
}
}'- imagestring · required
- The logo. A file id from POST /v3/files/upload. Whatever backdrop is baked into the file is absorbed before the render, so a screenshot of a website header or a photo of a sign works as well as a cutout.
- promptstring · required
- The motion direction: the effect, the scene, the mood. Describe what happens around the logo, never the logo itself, and never how long a beat lasts.
- mode'intro' | 'outro'
- intro builds the logo in; outro starts on the logo and takes it apart.
- aspectRatio'16:9' | '9:16'
- Output format.
Charged per second of video. All 7 arguments and the limits.
When it does not work
Submit answers 400 for a bad argument, 401 for a bad key, 403 for a permission you have not confirmed, and 402 when the generation costs more than the balance holds. A generation that fails after it was accepted refunds itself, so a retry is safe and a failure is never billed.
Statuses, retries, webhook signing and the refund rules are defined once, in How a generation works.
HTTP/1.1 402 Payment Required
{
"error": {
"code": "insufficient_balance",
"message": "This generation costs $1.00 and the balance is $0.12.",
"required": 1,
"balance": 0.12
}
}Three things most generation APIs will not do
Ask the price before you spend it
GET /v3/pricing returns the rate for every feature on your plan. An agent can decide whether a generation is worth running before it runs it, which is not a thing most generation APIs let anything do.
GET /v3/pricing
{
"video/logo-reveal": {
"amount": 0.25,
"unit": "second"
}
}A failure costs nothing
The balance is charged when the generation is submitted and refunded automatically if it errors or times out. You are billed for finished results, not for attempts.
The rules are in the API, not in a policy page
Anything that produces a likeness refuses to run without an explicit confirmation of permission, and uploaded files are deleted 24 hours after they land. Both are enforced at the endpoint.
The whole surface
Generated from the live contract, so this list is the API rather than a description of it.
First call in about five minutes
Sign up, make a project key, and post a generation. Browsing costs nothing; you add a balance when you want a result.