Sonilo Text To Music API Documentation
Playground
Try it on WaveSpeedAI!Sonilo Text-to-Music is a fast AI music generation model that creates full music tracks from text prompts with manual duration control. Ready-to-use REST inference API for AI music generation, background music, creator content, video soundtracks, advertising audio, social media content, and professional text-to-music workflows with simple integration, no coldstarts, and affordable pricing.
Features
Sonilo Text-to-Music generates music directly from a natural-language prompt, with controllable output duration up to 360 seconds. It is designed for background music creation, soundtrack ideation, content scoring, and other prompt-driven music generation workflows.
Why Choose This?
-
Prompt-based music generation Create music from a text description of style, mood, instrumentation, and arrangement.
-
Flexible duration control Choose the target music length from short clips to longer pieces up to
360seconds. -
Simple workflow Provide a prompt, choose a duration, and generate music with minimal setup.
-
Useful for many creative workflows Suitable for videos, ads, games, social content, trailers, and prototype soundtracks.
-
Production-ready API Easy to integrate into music generation tools, creator workflows, and media pipelines.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text prompt describing the music style, mood, instruments, and arrangement. |
| duration | Yes | Target music duration in seconds. Range: 1–360. Default: 30. |
How to Use
- Write your prompt — describe the genre, mood, instrumentation, pacing, and production feel you want.
- Set duration — choose how many seconds of music to generate.
- Submit — run the model and download the generated music.
Example Prompt
Cinematic emotional orchestral music with soft piano, warm strings, slow build, inspiring trailer mood, modern polished production
Pricing
Pricing is based on the selected duration.
| Duration | Cost |
|---|---|
| 1s | $0.0025 |
| 10s | $0.025 |
| 30s | $0.075 |
| 60s | $0.15 |
| 120s | $0.30 |
| 300s | $0.75 |
| 360s | $0.90 |
Billing Rules
- Pricing is $0.0025 per second
- Billing is based on the selected
duration - Maximum billed duration is 360 seconds
promptdoes not affect pricing
Best Use Cases
- Background music generation — Create music beds for videos, podcasts, and social content.
- Trailer and ad concepts — Generate soundtrack ideas for marketing or promo edits.
- Game and app audio — Produce music for interactive or ambient playback.
- Music prototyping — Explore multiple soundtrack directions quickly from prompts.
- Content production — Create original music for creator and brand workflows.
Pro Tips
- Be specific in your prompt about genre, mood, instrumentation, and pacing.
- Mention arrangement cues like intro, build, drop, chorus, or ambient bed when needed.
- Start with shorter durations to validate the musical direction before generating longer pieces.
- Use concise prompts when you want tighter control, and broader prompts when you want more interpretive results.
Notes
- Both
promptanddurationare required. durationsupports values from1to360seconds.- Pricing depends only on the selected duration.
- Longer generated music may be more suitable for trailers, background scoring, and extended content workflows.
Related Models
- Sonilo Video-to-Music — Generate music that matches an uploaded video.
- Other prompt-based music generation workflows — Useful when you want alternate music-generation styles or model behavior.
- Video sound design workflows — Useful when you need synchronized effects instead of generated music.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"duration": 30
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/sonilo/text-to-music" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Text prompt describing the music style, mood, instruments, and arrangement. | |
| duration | integer | Yes | 30 | 1 ~ 360 | Target music duration in seconds. Maximum 360 seconds. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |