The request schemas describe the shared vocabulary; the model catalog tells you which parts a particular model accepts. Read the catalog before choosing a duration, quality tier or reference input, then quote the exact body with POST /jobs/cost before you generate.
GET /models publishes each model's capabilities and credit prices. A field being in the request schema does not mean every model supports it. The examples below read the catalog with the published clients.
Each argument example is an independent submission and can spend credits. Install the clients and set NOLGIA_TOKEN as in the Quick Start; the examples preserve its client construction and submit-error handling. They print the new job id: use the Quick Start's finish() loop or Asynchronous: submit and poll to wait for the asset.
Replace illustrative asset, character, project and other UUIDs with ids from your own account. For URL examples, set REFERENCE_URL to your own HTTPS media URL. Python's generated request from_dict constructs the schema's enum and UUID fields from the same JSON body shown in curl.
Required for image, video and audio; 3D selects hunyuan3d-v3 when both model and quality are omitted
Values or range
A model id published for the requested modality
Applies to
All four generation request schemas
CLI flag
--model; gen 3d --draft selects trellis
Send the catalog id verbatim. Model ids belong to a modality: an image model is not a video model even when the names describe the same family. CLI defaults are separate from the HTTP request contract; an explicit model makes a script easier to reproduce.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Describe the result for images, video, music and sound effects; for text to speech, this is the text spoken and the input used for character-based billing. Image background removal and enhancement refuse a prompt because they operate on the reference pixels; image expansion accepts an optional prompt for the new margins. On reference video routes, name inputs with the provider slots published in the schema, such as @Image1 or @Video1.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Up to 4,000 characters; an image model can publish a lower image.negative_prompt_max_length
Applies to
Image and video requests; refused for image background removal
CLI flag
--negative-prompt on gen video; no image flag
Use negative text only within the selected model's accepted limit. The server checks a model-specific image limit before reserving credits, so the shared schema maximum is not permission to exceed the catalog value.
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","negative_prompt":"blurred, illegible text"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","negative_prompt":"blurred, illegible text"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Image and video requests; video support is video.seed
CLI flag
--seed on gen video; no image flag
A seed is only meaningful on a model whose provider takes one. For video, video.seed: false means sending a seed is refused with 400; an absent capability is unverified. A common field name is not a promise that all providers reproduce identical output.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","seed":42}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","seed":42},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","seed":42}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
1 through 4, further limited by image.num_images_max
Applies to
GenerateImageRequest
CLI flag
No dedicated flag; gen image submits one image
The flux-pro fixture publishes a maximum of four images. Read the cap for the chosen model instead of copying that number across the catalog. Face-reference identity requests require one image, including when a character supplies the face reference.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","num_images":2}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":2,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","num_images":2}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
No --image-size flag; use --aspect-ratio with a ratio instead
These are the six size aliases accepted by the image schema. Prefer aspect_ratio when a model publishes a native ratio outside the square, 4:3 and 16:9 families. The CLI takes ratio strings, not these aliases.
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","image_size":"landscape_16_9"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","image_size":"landscape_16_9"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","image_size":"landscape_16_9"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Schema values below, intersected with the selected model's published ratios
Applies to
Image and video requests; image.aspect_ratios or video.aspect_ratios
CLI flag
--aspect-ratio on gen image and gen video
Choose a ratio from the selected model's catalog entry. The image and video enums differ, and a value in either enum can still be refused by a particular model. For example, the video fixture above accepts 16:9 and 9:16.
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","aspect_ratio":"16:9"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","aspect_ratio":"16:9"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","aspect_ratio":"16:9"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
string or null for image/video; enum string for 3D
Default
The model's quality.default; 3D defaults to hunyuan3d-v3 when model is also absent
Values or range
quality.options[].id; 3D accepts draft or standard
Applies to
Image, video and 3D requests
CLI flag
--quality for image/video; --draft for 3D
The ladder and price are model-specific: the fixtures show native, 2k, 4k for flux-pro, and 720p, 1080p for veo-3.1-lite. Omitting the field uses the base tier. An unsupported tier is a 400, before a credit hold. For 3D, draft selects trellis and standard selects hunyuan3d-v3; a conflicting explicit model is refused.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","quality":"2k"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","quality":"2k"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","quality":"2k"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
This controls the effort spent drawing the image. quality separately controls its output resolution, and the two can be combined. low, medium and high cost the base rate; xhigh and max add the credits published in the model's render-quality options and exist only on the GPT Image 2.5 models. A value the selected model does not publish is refused, never silently downgraded.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","render_quality":"high"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","render_quality":"high"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","render_quality":"high"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Model-dependent; omit to select a supported duration
Values or range
Schema 1 through 60, restricted by video.durations, duration ranges and reference constraints
Applies to
GenerateVideoRequest; the audio field is deprecated and ignored
CLI flag
--duration-seconds on gen video
For a discrete duration list, the server chooses the supported value nearest the five-second baseline, resolving ties upward; the Veo fixture therefore defaults to six seconds. Reference images can pin a different duration through references.element_refs_duration_seconds. An explicit duration must be supported: four seconds works in the fixture, five does not. Do not use the deprecated audio field to trim a narration.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Read video.audio: none returns a silent clip regardless of the flag; optional honors it; always supplies native audio and refuses false with 400. The asset's generation metadata records generate_audio_effective so the delivered behavior remains inspectable.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"generate_audio":true}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"generate_audio":true},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"generate_audio":True}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
One start/reference image; image requests cap URL length at 2,048 characters
Applies to
Image reference input; video start-frame input; 3D front image
CLI flag
--input for image/video uses a local file or asset id; 3D also has --image-url
An image reference needs spare image.reference_images_max capacity. For video, check references.start_frame and start_frame_required; text-only routes do not consume an image. For 3D, send exactly one of image_url and image_asset_ids. Prefer owned asset ids where the request offers them, so queued work receives a fresh signed URL at execution.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_url":"https://example.com/reference.png"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_url":process.env.REFERENCE_URL!},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_url":os.environ["REFERENCE_URL"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Image: at most 4 combined references; video: at most 9 combined element images; each model can allow fewer
Applies to
Image image.reference_images_max; video references.element_refs_max
CLI flag
No direct URL-array flag; use API clients
On image requests, image_url is the first reference and image_urls adds more. On video requests, these URLs fill element-reference slots, sharing their budget with element_asset_ids. These fields do not create an independent budget for every way you attach media.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_urls":["https://example.com/reference.png"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_urls":[process.env.REFERENCE_URL!]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","image_urls":[os.environ["REFERENCE_URL"]]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
At most 4; shared with image_url and image_urls and limited by image.reference_images_max
Applies to
GenerateImageRequest
CLI flag
--input PATH_OR_UUID supplies one owned reference
Use ids for images already in your Library. The server resolves and re-signs them when the job runs. A model with no reference input, including flux-pro in the fixture above, refuses any reference with 400; it does not ignore the image.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
One PNG mask; exactly one reference image; matching dimensions and an alpha channel
Applies to
Image models with image.inpaint_mask: true
CLI flag
--mask PATH_OR_UUID with exactly one --input
Transparent mask pixels mark the region the model may repaint; opaque pixels describe the region to preserve. Describe the whole desired picture, including the new content. The mask is model guidance, so preserved areas are re-rendered rather than copied byte for byte. Unsupported input is refused before a hold; missing alpha or wrong dimensions discovered during execution fails the job with a full refund.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a desk with a red mug on the left and a potted fern in the centre","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"mask_asset_id":"b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a desk with a red mug on the left and a potted fern in the centre","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"mask_asset_id":"b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a desk with a red mug on the left and a potted fern in the centre","reference_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"mask_asset_id":"b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
One final frame; mutually exclusive with end_image_asset_id
Applies to
Video with references.end_frame: true; requires the start image_url
CLI flag
--end-frame PATH_OR_UUID resolves a file or asset; no raw end-URL flag
A final frame pins the destination of a start-to-end clip. Supply the start frame as well and check the capability: the Veo fixture above publishes end_frame: false. Choose a model that explicitly supports both frames.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":"https://example.com/start.png","end_image_url":"https://example.com/end.png"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":process.env.START_IMAGE_URL!,"end_image_url":process.env.END_IMAGE_URL!},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":os.environ["START_IMAGE_URL"],"end_image_url":os.environ["END_IMAGE_URL"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
One owned final frame; mutually exclusive with end_image_url
Applies to
Same video capability and start-frame requirement as end_image_url
CLI flag
--end-frame PATH_OR_UUID with --input
This is the owned-asset form of the final-frame input. The server resolves its URL for you; use at most one of the two end-frame fields.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":"https://example.com/start.png","end_image_asset_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":process.env.START_IMAGE_URL!,"end_image_asset_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","image_url":os.environ["START_IMAGE_URL"],"end_image_asset_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
At most 10 combined with video_urls, further limited by references.video_refs_max
Applies to
GenerateVideoRequest on a model accepting video references
CLI flag
Repeat --video-ref ASSET_ID
Prefer owned video assets so the server can read duration and other stored metadata. Prompt references use @Video1, @Video2 and so on. Duration and input-format constraints are model-specific; editing with video_task: edit requires a stored duration and cannot use raw URLs.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Video models with references.video_refs_max greater than zero
CLI flag
No raw video-URL flag; use --video-ref for owned assets
Use raw URLs only for externally hosted footage. They share the asset-id budget, and the server cannot validate their duration, resolution or size from stored asset metadata; provider violations still fail. Use video_asset_ids when the footage is already in Nolgia.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_urls":["https://example.com/reference.png"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_urls":[process.env.REFERENCE_URL!]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_urls":[os.environ["REFERENCE_URL"]]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
At most 10 combined with audio_urls; references.audio_refs_max and any audio_refs_max_seconds further restrict input
Applies to
GenerateVideoRequest on models accepting reference audio
CLI flag
Repeat --audio-ref PATH_OR_UUID
These are your recorded audio tracks, resolved to signed URLs by the server. They are different from choosing a preset roster voice. Models that derive clip length and billing from the reference audio require an owned asset with duration metadata.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Video models with references.audio_refs_max greater than zero
CLI flag
No raw audio-URL flag; --audio-ref accepts a file or owned asset
Pass externally hosted reference audio through this field when the selected model accepts it. Prefer audio_asset_ids; a model that requires stored input duration can refuse raw URLs.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_urls":["https://example.com/reference.png"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_urls":[process.env.REFERENCE_URL!]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","audio_urls":[os.environ["REFERENCE_URL"]]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
At most 9 combined with image_urls, further limited by references.element_refs_max
Applies to
GenerateVideoRequest
CLI flag
Repeat --element ASSET_ID
These are image references for a video, not registry element ids. Address the attached images as @Image1 and onward in the prompt. An images-only reference request is allowed where the model supports it; attaching a video is not inherently required.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","element_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","element_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","element_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Grok Imagine 1.5 reference voices on models publishing voice-reference capability
CLI flag
No dedicated flag
These select voices from the provider's roster rather than uploading audio. Address them as <AUDIO_0> through <AUDIO_2> in the prompt. The schema notes provider availability restrictions and a 720p output cap; pairing these voices with a 1080p tier is refused.
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"grok-imagine-video-1.5","prompt":"A guide says <AUDIO_0> Welcome to the mountains.","reference_voice_ids":["eve"],"quality":"720p"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"grok-imagine-video-1.5","prompt":"A guide says <AUDIO_0> Welcome to the mountains.","reference_voice_ids":["eve"],"quality":"720p"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Image, video and audio requests; visual references must fit the chosen model
CLI flag
--character-id for image/video; no audio flag
On image and video requests, the character supplies its canonical description and primary reference. Image identity constraints include one output and no competing face_reference_asset_id. For audio, the character can supply a catalog voice for this model; an explicit voice wins, and clip-voice cloning is not available.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Up to 4 unique characters, limited by the model's reference capacity
Applies to
Image and video requests
CLI flag
No cast-array flag; use API clients
Order defines the cast, with the first character as lead. Every reference counts toward the model's budget; a cast that will not fit is refused. If you also send character_id, it must be one of the members. A character name mentioned as @Name is mapped to its cast/reference slot.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42","b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42","b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","character_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42","b2fbb51e-3c33-4a54-b87b-9c2b1e4f9a11"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Image and video; spare image/element-reference capacity is required when the location has an image
CLI flag
No dedicated flag
A location contributes its canonical description and, when present, its primary reference. It has its own field beside the character so a shot can place a person in a consistent room. An unknown location or insufficient capacity is a 400, not a silently dropped reference.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","location_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","location_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","location_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
One owned product; its primary and additional images use the remaining reference budget
Applies to
Image and video requests; not video regeneration with source_video_asset_id
CLI flag
No dedicated flag
A product contributes its description and up to three images, primary first, within the remaining model budget. If the primary image cannot fit the request is refused; extra gallery images beyond the budget do not ride. A product with no image contributes only its description.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","product_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","product_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","product_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Omitted: the generation's project can supply its linked brand kit
Values or range
One owned brand kit
Applies to
Image and video requests; logo attachment depends on lane and spare capacity
CLI flag
No dedicated flag
The brand block is appended after your prompt. A logo never displaces a reference you already supplied; it rides only when the lane and available slots permit it. Image enhancement, expansion and masked requests do not attach a logo. The asset records whether it rode as brand_logo_attached.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","brand_kit_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","brand_kit_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","brand_kit_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Omitting the mode applies the full kit. prompt_only adds the brand block without the logo. off disables both explicit and project branding and cannot be combined with brand_kit_id.
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","brand_kit_mode":"off"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","brand_kit_mode":"off"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","brand_kit_mode":"off"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Omitted: the generation's project can contribute its pinned style
Values or range
One saved style visible to the caller
Applies to
Image and video requests; not video regeneration with source_video_asset_id
CLI flag
No dedicated flag
A style appends its prompt fragment after your words. Reference images ride only within remaining capacity; a swatch that does not fit is omitted while the fragment remains. Video adds a swatch only when the clip already has other visual input, so a standalone swatch does not become the subject.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","style_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","style_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","style_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Image: up to 4; video: up to 9; all attached images still share the model's reference budget
Applies to
Image and video requests
CLI flag
No registry-element flag; video --element maps to element_asset_ids, a different field
Registry elements carry a canonical description and reference images. They must be visible in your personal or active organization library. A character id can also be used here, but naming the same character here and in character_id is refused. Excess references are rejected before credits are held.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","element_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","element_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"gpt-image-2","prompt":"a paper-cut mountain range at dawn","element_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
The server appends the selected camera move's prompt fragment as its own sentence; it does not replace or shorten your prompt. Use it for text-to-video, image-to-video or a multi-shot request. An unknown id is a 400 naming the motion library.
shell
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in","motion_strength":"subtle"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in","motion_strength":"subtle"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"veo-3.1-lite","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","duration_seconds":4,"motion_id":"push-in","motion_strength":"subtle"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
On for person prompts on image.aura_compatible models; off otherwise
Values or range
true or false
Applies to
GenerateImageRequest
CLI flag
--aura true or --aura false
Aura composes people as photographs with real skin and lighting. An explicit false overrides the person-prompt default. On a model without the capability, true is a no-op; a face reference is an identity request and cannot be combined with aura: false.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a portrait of a mountain guide in natural morning light","aura":true}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a portrait of a mountain guide in natural morning light","aura":true},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a portrait of a mountain guide in natural morning light","aura":True}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Model-specific; an eligible character can supply its catalog voice
Values or range
A model-specific voice id, at most 128 characters; read audio.voices
Applies to
GenerateAudioRequest for text to speech
CLI flag
--voice; discover with nolgia voices list --model
Select a voice published for the TTS model. A voice id from another provider is not interchangeable, and an explicit voice overrides the character's saved voice.
shell
$ curl -s https://api.nolgia.ai/v1/generate/audio \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","voice":"af_bella"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/audio",{body:{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","voice":"af_bella"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_audiofromnolgia.modelsimportGenerateAudioRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_audio.sync(client=client,body=GenerateAudioRequest.from_dict({"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","voice":"af_bella"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Shared schema 0.7 through 1.3; use the model's audio.speed range
Applies to
Text-to-speech models publishing audio.speed
CLI flag
No dedicated flag
Speed changes speaking rate without changing character-based pricing. The allowed range is per model; the schema documents an upper bound of 1.2 for ElevenLabs and 1.3 for MiniMax and Kokoro. Unsupported models or values outside their range return 400.
shell
$ curl -s https://api.nolgia.ai/v1/generate/audio \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","speed":1.1}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/audio",{body:{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","speed":1.1},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_audiofromnolgia.modelsimportGenerateAudioRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_audio.sync(client=client,body=GenerateAudioRequest.from_dict({"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","speed":1.1}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
$ curl -s https://api.nolgia.ai/v1/generate/audio \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","format":"wav"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/audio",{body:{"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","format":"wav"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_audiofromnolgia.modelsimportGenerateAudioRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_audio.sync(client=client,body=GenerateAudioRequest.from_dict({"model":"kokoro-us-english","prompt":"The sun rises over the mountains.","format":"wav"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
true or false; disabling texture requires hunyuan3d-v3
Applies to
Generate3DRequest
CLI flag
--no-texture sends false
Disable texture to produce an untextured white model. The draft model does not offer the untextured option, and PBR requires texture to remain enabled.
Request PBR materials when you need that output from the textured 3D route. Quote the exact settings first because this option changes the request's price.
No default: supply exactly this field or image_url
Values or range
One through four images in front, back, left, right order; trellis takes exactly one
Applies to
Generate3DRequest
CLI flag
Repeat gen 3d --input PATH_OR_UUID in view order
The order of views matters. Use your own stored assets, and do not combine the array with a hosted image_url. Multiple views are available only on the model that supports them.
Repeat gen 3d --tag; no image/video/audio generation flag
Tags are applied to the resulting assets and normalized to lowercase. They label the output; they are not provider prompt text.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","tags":["hero","draft"]}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","tags":["hero","draft"]},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","tags":["hero","draft"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
File the generated assets in a project. An explicit project takes precedence over automatic agent-session attribution. The async video and 3D outputs are filed when the job completes; an unknown or foreign project is refused.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","project_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","project_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","project_id":"5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Omitted on direct API, CLI, MCP and pipeline calls
Values or range
At most 128 characters
Applies to
All four generation requests
CLI flag
No dedicated generation flag
The web app supplies this when a generation originates from a preset. It is attribution, stored verbatim without checking whether that preset still exists. Setting the slug does not load a preset or fill in missing model arguments; the example remains a complete generation body.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","preset_slug":"cinematic-portrait"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","preset_slug":"cinematic-portrait"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","preset_slug":"cinematic-portrait"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
The token returned by POST /jobs/cost for this exact request and price, before expires_at
Applies to
All four generation requests
CLI flag
No dedicated flag
Quote the request, show that price to the customer, then return the quote's token with the unchanged generation body. An expired, malformed, foreign or mismatched token is refused with 422 and code: confirmation_rejected. Omitting the token does not activate the gate. Set CONFIRMATION_TOKEN to the token from your own quote, not the redacted value in an example response.
shell
$ curl -s https://api.nolgia.ai/v1/generate/image \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","confirmation_token":"<confirmation_token from the quote>"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/image",{body:{"num_images":1,"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","confirmation_token":process.env.CONFIRMATION_TOKEN!},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_imagefromnolgia.modelsimportGenerateImageRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_image.sync(client=client,body=GenerateImageRequest.from_dict({"model":"flux-pro","prompt":"a paper-cut mountain range at dawn","confirmation_token":os.environ["CONFIRMATION_TOKEN"]}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
Provider default where a model supports bitrate selection
Values or range
standard, high
Applies to
Video models publishing video.bitrate_modes; none currently published
CLI flag
--bitrate
No currently published model exposes bitrate selection. The schema reserves these two values, and sending the field to a model without the capability is a 400. These request fragments illustrate the field only; do not add it to a current generation.
Omitted; the provider classifies the task from the prompt
Values or range
reference, edit, extend, as published in references.video_tasks
Applies to
Video requests carrying a reference video on a supporting model
CLI flag
No dedicated flag
Choose what the input footage is for. reference uses its motion and timing to drive a new render; edit changes one thing while keeping source length and aspect ratio; extend continues it by the requested new duration. Edit takes one owned video with known duration of 4–30 seconds, refuses raw URLs, and uses the source duration when you omit the field. Unsupported tasks or missing reference video return 400.
$ curl -s https://api.nolgia.ai/v1/generate/video \
-H "Authorization: Bearer $NOLGIA_TOKEN"\
-H "Content-Type: application/json"\
-d '{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"video_task":"reference"}'
TypeScript
import{createNolgiaClient}from"@nolgia/sdk";constnolgia=createNolgiaClient(process.env.NOLGIA_TOKEN!);const{data: job,error}=awaitnolgia.POST("/generate/video",{body:{"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"video_task":"reference"},});if(error)thrownewError(`${error.title}: ${error.detail??""}`);console.log(job.id);
Python
importosfromnolgiaimportAuthenticatedClientfromnolgia.api.generateimportgenerate_videofromnolgia.modelsimportGenerateVideoRequest,Jobclient=AuthenticatedClient(base_url="https://api.nolgia.ai/v1",token=os.environ["NOLGIA_TOKEN"])job=generate_video.sync(client=client,body=GenerateVideoRequest.from_dict({"model":"seedance-2.5","prompt":"a paper-cut mountain range at dawn, slow push-in as the sun rises","video_asset_ids":["5a2f7c58-9e5a-4f1a-9c7f-2f0b6c3d1e42"],"video_task":"reference"}))ifnotisinstance(job,Job):raiseSystemExit(f"refused: {job}")print(job.id)
These generated tables are the request source of truth. The sections above explain the shared controls; the full schemas also cover specialized controls, including image guidance, explicit face references, video shots and regeneration. See the API reference for operation responses and the OpenAPI document for complete descriptions and constraints.
Optional proof that this exact request and price were shown to the customer, from POST /jobs/cost.…
model
ImageModel
Yes
prompt
string
No
What to generate.…
negative_prompt
string, nullable
No
Negative prompt text.…
image_size
ImageSize
No
aspect_ratio
ImageAspectRatio
No
num_images
integer
No
How many images to render from this one request. Each one is billed, so four images cost four times one. The ceiling is per-model (image.num_images_max); most models allow four.
seed
integer, nullable
No
Reproducibility seed. The same seed with the same prompt and settings gives the same image on a model whose provider honors one; omit it for a different result every time. Not every provider honors it.
guidance_scale
number, nullable
No
image_url
string, nullable
No
Source image (https URL) for image-to-image restyle. When set, the model transforms this image instead of generating from scratch.
image_urls
array of string, nullable
No
Multiple reference images (https URLs) for models that support multi-reference input (OpenAI gpt-image models — e.g.…
reference_asset_ids
array of string, nullable
No
Reference images given as ids of your own image assets — the server resolves each to a signed URL and it rides the same multi-reference path as image_urls (the image lane's sibling of the video lane's element_asset_ids).…
render_quality
one of auto, low, medium, high, xhigh, max
No
How much detail the model spends on the render itself, on models that publish image.render_quality (the GPT Image family).…
mask_asset_id
string, nullable
No
Edit only PART of the reference image.…
quality
string, nullable
No
Quality/resolution tier for the selected model.…
tags
array of string
No
Applied to the resulting asset(s); normalized to lowercase.
project_id
string
No
Files the generated asset(s) into this project at creation.…
preset_slug
string, nullable
No
Slug of the preset this generation was launched from, if any.…
aura
boolean, nullable
No
Applies Aura, the Nolgia character engine: server-side photoreal composition layered onto the prompt (people render as photographs, real skin, real light, no AI gloss).…
face_reference_asset_id
string, nullable
No
Image asset (owned by the caller) whose face conditions the render for identity.…
face_check_consent
boolean, nullable
No
Records your consent to the face identity check for the face_reference_asset_id photo (once per photo; it stays recorded for later requests).…
character_id
string, nullable
No
One of your characters (GET /characters, created on the Create Characters page).…
character_ids
array of string, nullable
No
An ORDERED cast of up to 4 of your characters rendered together (two-person dialogue scenes, duets, family commercials).…
location_id
string, nullable
No
One of your locations (GET /locations): the place this render is set in.…
brand_kit_id
string, nullable
No
One of your brand kits (GET /brand-kits).…
brand_kit_mode
BrandKitMode
No
product_id
string, nullable
No
One of your products (GET /products): the product this render shows.…
style_id
string, nullable
No
One of your saved styles (GET /styles).…
element_ids
array of string, nullable
No
Registry elements (GET /elements) to condition this render: each element's reference images are attached as image references (after any image_url/image_urls and any face/character reference, which keeps its slot) and its canonical_description rides into the prompt verbatim with the binding clause ("100% matches the reference") - the belt-and-braces continuity stack.…
Optional proof that this exact request and price were shown to the customer, from POST /jobs/cost.…
model
VideoModel
Yes
prompt
string
Yes
Text prompt.…
negative_prompt
string, nullable
No
What to keep OUT of the clip.…
image_url
string, nullable
No
Required for image-to-video models; ignored for text-to-video.
end_image_url
string, nullable
No
Final-frame image (https URL) for start+end frame pinning on models that support it (Seedance 2.0 Pro i2v, Seedance 2.5, Seedance 2.0 Fast and Mini, FLUX 3 Video, MiniMax Hailuo 3, MiniMax H3 Max i2v).…
end_image_asset_id
string, nullable
No
One of your image assets to use as the final frame (server resolves it to a signed URL). Same semantics as end_image_url; provide at most one of the two.
video_asset_ids
array of string, nullable
No
Reference videos for models with references.video_refs_max > 0 on GET /models (seedance-2.5: up to 10; seedance-2.0-pro-r2v: up to 3; minimax-h3 takes none), given as ids of your video assets — the server resolves each to a signed URL and forwards them as the provider's video_urls.…
video_urls
array of string, nullable
No
Raw https reference-video URLs, for callers that host media outside Nolgia.…
video_task
VideoTask
No
element_asset_ids
array of string, nullable
No
Element/reference images for reference-to-video models, given as ids of your image assets — resolved to signed URLs and forwarded as the provider's image_urls.…
image_urls
array of string, nullable
No
Raw https element-image URLs. Counted against the same 9-image cap as element_asset_ids. Prefer element_asset_ids.
audio_asset_ids
array of string, nullable
No
Reference audio tracks for models with references.audio_refs_max > 0 on GET /models (seedance-2.5: up to 10 with no per-track ceiling; minimax-h3: up to 3, each at most 15 seconds; Seedance 2.0 Pro r2v takes none, its primary route has no reference-audio slot), given as ids of your audio assets — resolved to signed URLs and forwarded as the provider's audio_urls.…
audio_urls
array of string, nullable
No
Raw https reference-audio URLs. Counted against the same per-model cap as audio_asset_ids (references.audio_refs_max, never more than 10). Prefer audio_asset_ids.
reference_voice_ids
array of string, nullable
No
Preset voices for Grok Imagine 1.5 reference-to-video (models with references.voice_refs_max > 0 on GET /models), each a voice_id from xAI's Text-to-Speech roster (for example eve, the default; case-insensitive, validated by xAI).…
bitrate_mode
BitrateMode
No
aspect_ratio
AspectRatio
No
duration_seconds
integer
No
Clip length in seconds.…
seed
integer, nullable
No
Reproducibility seed.…
generate_audio
boolean, nullable
No
Ask the model to generate a synchronized audio track (dialogue/ambient/SFX).…
strip_audio
boolean, nullable
No
Deliver the clip with NO audio stream at all: every audio track the model rendered is removed on delivery by a stream copy (the video stream is untouched), and the asset records has_audio: false.…
quality
string, nullable
No
Quality/resolution tier for the selected model (e.g.…
shots
array of VideoShot, nullable
No
Multi-shot sequence: divide the clip into sequential shots, each with its own prompt, duration, and optional sound direction.…
tags
array of string
No
Applied to the resulting asset(s); normalized to lowercase.
project_id
string
No
Files the generated asset into this project at creation (the async video asset lands in the project when the job completes).…
preset_slug
string, nullable
No
Slug of the preset this generation was launched from, if any.…
source_video_asset_id
string, nullable
No
Regenerate one of your completed videos at the model's top resolution: the referenced video asset is re-rendered at 2K via the provider's native regeneration flow (models with video.regeneration on GET /models — MiniMax Hailuo 3's 768P→2K Video Regeneration).…
character_id
string, nullable
No
One of your characters (GET /characters).…
use_character_voice
boolean, nullable
No
Attaches the lead character's (character_id, or the first of character_ids) voice clip as a reference audio track (audio_asset_ids, emitted after your own audio tracks and audio_urls, taking the next @Audio slot) and adds a voice line to the prompt.…
character_ids
array of string, nullable
No
An ORDERED cast of up to 4 of your characters rendered together in one clip.…
location_id
string, nullable
No
One of your locations (GET /locations): the place this clip is set in.…
brand_kit_id
string, nullable
No
One of your brand kits (GET /brand-kits).…
brand_kit_mode
BrandKitMode
No
product_id
string, nullable
No
One of your products (GET /products): the product this clip shows.…
style_id
string, nullable
No
One of your saved styles (GET /styles).…
element_ids
array of string, nullable
No
Registry elements (GET /elements) to condition this clip: each element's reference images are appended to the element-reference slots (before any character_id reference, which stays appended last) and its canonical_description rides into the prompt verbatim with the binding clause ("100% matches the reference") - the belt-and-braces continuity stack.…
motion_id
string, nullable
No
A camera move from the library on GET /motions (for example push-in, orbit-left, crane-up, rack-focus).…
Optional proof that this exact request and price were shown to the customer, from POST /jobs/cost.…
model
AudioModel
Yes
prompt
string
Yes
For TTS this is the text to speak; for music/SFX it is the description.…
voice
string, nullable
No
TTS voice id (model-specific): one of the model's audio.voices, or the voice_id of one of your custom voices (GET /voices) on a model whose audio.custom_voices is true.…
speed
number, nullable
No
Speaking rate as a multiple of the voice's natural pace; 1 is natural.…
character_id
string, nullable
No
One of your characters.…
duration_seconds
integer, nullable
No
Currently ignored; never forwarded to audio providers.
format
AudioFormat
No
tags
array of string
No
Applied to the resulting asset(s); normalized to lowercase.
project_id
string
No
Files the generated asset into this project at creation.…
preset_slug
string, nullable
No
Slug of the preset this generation was launched from, if any.…
There is no safety-checker toggle or prompt-expansion flag on generation requests; the server composes the image prompt itself, enhanced_prompt on the asset shows what ran, and POST /generate/video/enhance-prompt is a separate one-credit helper.