AI Music, Lyrics, and Image Generation API
Producer provides image, lyrics, and music generation endpoints under the
/api/v1/producer/* namespace. All four endpoints follow the standard
task model:
authenticate with x-api-key, POST a JSON body, receive a task descriptor
(taskId, status, creditsRequired), and poll GET /api/v1/tasks/{taskId}
until terminal. The shared request config (priority / tags / metadata /
webhookUrl), the status enum, and the resources[] output shape are documented
in the hub — this page covers only the Producer-specific inputs and outputs.
Producer uses the current default OmnAPI model family unless your request or account configuration specifies otherwise.
Pricing
Section titled “Pricing”Producer uses the same OmnAPI credit balance as Suno and MV. Prices below are per request before any customer-specific pricing profile is applied.
| Endpoint | Credits |
|---|---|
POST /api/v1/producer/generate/image | 8 |
POST /api/v1/producer/generate/lyrics | 1 |
POST /api/v1/producer/generate/music/compose | 28 |
POST /api/v1/producer/generate/music/modify | 28 |
POST /api/v1/producer/generate/image
Section titled “POST /api/v1/producer/generate/image”Generates a single image from a text prompt.
| Field | Type | Required | Limit |
|---|---|---|---|
prompt | string | ✅ | ≤ 2000 chars |
config | object | — | shared envelope |
Example
Section titled “Example”curl -X POST https://api.omnapi.com/api/v1/producer/generate/image \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt": "ultra-detailed isometric vaporwave studio room, soft cyan rim light"}'Result shape (when COMPLETED)
Section titled “Result shape (when COMPLETED)”{ "resources": [ { "type": "image", "url": "https://cdn.omnapi.com/...", "mimeType": "image/png" } ], "outputResults": { /* endpoint-specific details */ }}POST /api/v1/producer/generate/lyrics
Section titled “POST /api/v1/producer/generate/lyrics”Generates structured lyrics for downstream composition.
| Field | Type | Required | Limit |
|---|---|---|---|
prompt | string | ✅ | ≤ 3000 chars |
config | object | — | shared envelope |
The prompt should describe theme + genre + language (e.g. “Bittersweet pop, English, about leaving a coastal town”).
Result shape
Section titled “Result shape”{ "resources": [ { "type": "text", "url": "https://cdn.omnapi.com/...", "mimeType": "text/plain" } ], "outputResults": { "lyrics": "[Verse]\nThe lighthouse blinks once for you...", "tags": ["[Verse]", "[Chorus]", "[Bridge]"] }}POST /api/v1/producer/generate/music/compose
Section titled “POST /api/v1/producer/generate/music/compose”Generates a complete song with optional lyrics, structure, timing, and artwork controls.
| Field | Type | Required | Limit | Default |
|---|---|---|---|---|
soundPrompt | string | ✅ | ≤ 500 chars | — |
lyrics | string | — | ≤ 3000 chars | auto-generated when omitted and instrumental: false; empty instrumental fallback if instrumental: true |
instrumental | boolean | — | — | false |
bpm | number | — | 1–300 | model-chosen |
length | number | — | 1–600 sec | model-chosen (typ. 90–120s) |
title | string | — | ≤ 200 chars | auto-generated |
seed | integer | — | ≥ 0 | random |
imagePrompt | string | — | ≤ 1000 chars | none |
imageId | string | — | — | none — references a previously generated image |
lyricsId | string | — | — | none — references a previous lyrics task |
currentSongId | string | — | — | reference frame for refinement workflows |
conversationId | string | — | — | thread together a multi-turn refinement |
config | object | — | — | shared envelope |
Examples
Section titled “Examples”curl -X POST https://api.omnapi.com/api/v1/producer/generate/music/compose \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "soundPrompt": "warm indie pop, jangly guitars, brushed drums", "lyrics": "[Verse]\nThe lighthouse blinks once for you...", "title": "Coastal Goodbye", "bpm": 92, "length": 120 }'curl -X POST https://api.omnapi.com/api/v1/producer/generate/music/compose \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "soundPrompt": "tense cinematic build, low strings, sparse percussion", "instrumental": true, "length": 75, "seed": 42 }'curl -X POST https://api.omnapi.com/api/v1/producer/generate/music/compose \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "soundPrompt": "synthwave dream pop, vocoder vocals", "lyrics": "[Verse]\nMidnight, cassette spinning...", "imagePrompt": "neon vaporwave album cover, sunset gradient" }'Result shape
Section titled “Result shape”{ "resources": [ { "type": "audio", "url": "https://cdn.omnapi.com/...", "mimeType": "audio/mpeg" }, { "type": "image", "url": "https://cdn.omnapi.com/...", "mimeType": "image/png" } ], "outputResults": { "clipId": "clip_01H...", "duration": 118.4, "lyrics": "...", "title": "Coastal Goodbye" }}When instrumental=false and neither lyrics nor lyricsId is supplied,
OmnAPI first generates lyrics from soundPrompt, then submits the compose task
with those lyrics. Set instrumental=true only when you explicitly want a
backing track without vocals. This extra lyrics step keeps non-instrumental
requests aligned with the expected vocal workflow.
Use the song in MV
Section titled “Use the song in MV”Producer compose returns normal audio resources. To create an MV from that song,
poll GET /api/v1/tasks/{taskId} until the Producer task is COMPLETED, then
send the audio resource URL to the MV API with source.type="audio".
curl -X POST https://api.omnapi.com/api/v1/mv \ -H "x-api-key: $OMNAPI_KEY" \ -H "Idempotency-Key: mv-from-producer-01" \ -H "Content-Type: application/json" \ -d '{ "mode": "fast", "source": { "type": "audio", "audioUrl": "https://cdn.omnapi.com/producer-song.mp3", "durationSec": 118, "lyrics": "[Verse]\nThe lighthouse blinks once for you..." }, "prompt": "warm coastal indie pop video, intimate closeups", "resolution": "540p", "subtitles": false }'For source.type="audio", lyrics is visual planning context only. OmnAPI
probes the audio URL server-side for authoritative duration, and exact subtitle
timing requires srtUrl on the MV request.
POST /api/v1/producer/generate/music/modify
Section titled “POST /api/v1/producer/generate/music/modify”Transforms an existing clip — extend, cover, swap vocals, swap sound, inpaint.
| Field | Type | Required | Notes |
|---|---|---|---|
clipId | string | ✅ | Source clip — usually from a prior compose’s outputResults.clipId |
transform | string | ✅ | extend / cover / inpaint / swap_vocals / swap_sound. The semantic edit to apply. |
modifyMode | "task" | "conversation" | — | Processing mode. task (default) applies the requested transform directly. conversation lets the model interpret an ambiguous instruction before applying the transform. |
prompt | string | — | Free-text describing the desired change |
soundPrompt | string | — | Override the sonic palette |
lyrics | string | — | New or replacement lyrics (≤ 3000 chars) |
lyricsId | string | — | Reference an existing lyrics task |
title | string | — | ≤ 200 chars |
tags | string[] | — | Genre/mood hints |
cropEndAt | number | — | Seconds, for extend and inpaint |
replaceStartAt | number | — | Seconds, for inpaint |
replaceEndAt | number | — | Seconds, for inpaint |
conversationId, currentSongId | string | — | Workflow continuity |
config | object | — | shared envelope |
Transform reference
Section titled “Transform reference”transform | What it does | Typical fields |
|---|---|---|
extend | Append more audio to the end of a clip | cropEndAt, prompt |
cover | Re-record the song with a different style / arrangement | soundPrompt, prompt |
inpaint | Replace a time range within the clip | replaceStartAt, replaceEndAt, prompt |
swap_vocals | Change the vocal performance, keep the backing | prompt |
swap_sound | Change the instrumental, keep the vocal | soundPrompt |
Example
Section titled “Example”curl -X POST https://api.omnapi.com/api/v1/producer/generate/music/modify \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "clipId": "clip_01H...", "transform": "extend", "cropEndAt": 90, "prompt": "More uplifting bridge, brighter chords" }'Limits at a glance
Section titled “Limits at a glance”| Limit | Value |
|---|---|
prompt (image) | 2000 chars |
prompt (lyrics) | 3000 chars |
soundPrompt (compose) | 500 chars |
lyrics | 3000 chars |
length | 1–600 seconds |
bpm | 1–300 |
priority | 1–10 (default 5) |
| Per-IP rate limit | 2000 req / 60 s (default) |
Rate limiting is documented in Rate Limits.