# Suno V6 API Suno V6 music generation: full songs with vocals or instrumentals from a description, or your own lyrics and style in custom mode. Each request returns two tracks. Base URL: https://01router.com/api/v1 Model ID: suno-v6 Documentation: https://01router.com/gateway/suno-v6#api ## Quick start Set API_KEY to your project key, then run a sample from your server. Replace example media URLs with your own public URLs. ```bash export API_KEY="YOUR_API_KEY" curl "https://01router.com/api/v1/generations" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ --data-binary @- <<'JSON' { "model": "suno-v6", "input": { "prompt": "Welcome back. Let us get started.", "custom_mode": false, "instrumental": false } } JSON ``` ## Endpoints | Method | Path | Authentication | Description | | --- | --- | --- | --- | | POST | /api/v1/generations | API key required | Create a generation (charges credits) | | GET | /api/v1/generations/{id} | API key required | Get a generation; polls the provider while running | | POST | /api/v1/generations/{id}/cancel | API key required | Cancel a running generation (credits refunded) | | POST | /api/v1/quote | Public · no key | Price a request on every provider (no charge, no key needed) | | GET | /api/v1/models/suno-v6 | Public · no key | Get one model | ## Authentication Send your API key as a Bearer token. Requests are billed to the key owner's credits. `Authorization: Bearer ` ## Input Send JSON with Content-Type: application/json. Model parameters belong inside input; model, provider and callback_url are top-level fields. | Name | Type | Required | Description | | --- | --- | --- | --- | | model | string | Yes | "suno-v6" | | provider | string | No | Pin a provider; omit to auto-route to the cheapest. One of: kie \| apimart \| evolink \| atlascloud | | input | object | Yes | Model parameters, see the input fields below. | | callback_url | string | No | Optional public HTTPS webhook URL. The final task result is signed and delivered here; polling remains available. | ### input Required fields are marked explicitly. Other fields use the listed defaults when omitted. | Name | Type | Required | Description | Default | | --- | --- | --- | --- | --- | | input.prompt | string | No | Song description (simple mode) or lyrics (custom mode) | — | | input.custom_mode | boolean | No | Use your own lyrics, style and title | false | | input.instrumental | boolean | No | Instrumental | false | | input.style | string | No | Custom mode only, e.g. "dream pop, female vocals" | — | | input.title | string | No | Custom mode only | — | | input.negative_tags | string | No | Exclude styles | — | | input.vocal_gender | string | No | Vocal gender; options: ["m","f"] | — | | input.duration | integer | No | Custom mode only; min: 10; max: 360 | — | Auto-routing chooses a provider that supports the request. Select a provider to see its input constraints and pinned request examples. ### Provider input schemas ```json [ { "provider": "kie", "params": [ { "name": "prompt", "type": "text", "label": "Prompt / lyrics", "description": "Song description (simple mode) or lyrics (custom mode)", "maxLength": 5000 }, { "name": "custom_mode", "type": "boolean", "label": "Custom mode", "description": "Use your own lyrics, style and title", "default": false }, { "name": "instrumental", "type": "boolean", "label": "Instrumental", "default": false }, { "name": "style", "type": "string", "label": "Style", "description": "Custom mode only, e.g. \"dream pop, female vocals\"", "maxLength": 1000 }, { "name": "title", "type": "string", "label": "Title", "description": "Custom mode only", "maxLength": 80 }, { "name": "negative_tags", "type": "string", "label": "Exclude styles" }, { "name": "vocal_gender", "type": "enum", "label": "Vocal gender", "options": [ "m", "f" ] }, { "name": "duration", "type": "integer", "label": "Duration (s)", "description": "Custom mode only", "min": 10, "max": 360 } ] }, { "provider": "apimart", "params": [ { "name": "prompt", "type": "text", "label": "Prompt / lyrics", "description": "Song description (simple mode) or lyrics (custom mode)", "maxLength": 5000 }, { "name": "custom_mode", "type": "boolean", "label": "Custom mode", "description": "Use your own lyrics, style and title", "default": false }, { "name": "instrumental", "type": "boolean", "label": "Instrumental", "default": false }, { "name": "style", "type": "string", "label": "Style", "description": "Custom mode only, e.g. \"dream pop, female vocals\"", "maxLength": 1000 }, { "name": "title", "type": "string", "label": "Title", "description": "Custom mode only", "maxLength": 80 }, { "name": "negative_tags", "type": "string", "label": "Exclude styles" }, { "name": "vocal_gender", "type": "enum", "label": "Vocal gender", "options": [ "m", "f" ] }, { "name": "duration", "type": "integer", "label": "Duration (s)", "description": "Custom mode only", "min": 10, "max": 360 } ] }, { "provider": "evolink", "params": [ { "name": "prompt", "type": "text", "label": "Prompt / lyrics", "description": "Song description (simple mode) or lyrics (custom mode)" }, { "name": "custom_mode", "type": "boolean", "label": "Custom mode", "description": "Use your own lyrics, style and title", "default": false }, { "name": "instrumental", "type": "boolean", "label": "Instrumental", "default": false }, { "name": "style", "type": "string", "label": "Style", "description": "Custom mode only, e.g. \"dream pop, female vocals\"" }, { "name": "title", "type": "string", "label": "Title", "description": "Custom mode only" }, { "name": "negative_tags", "type": "string", "label": "Exclude styles" }, { "name": "vocal_gender", "type": "enum", "label": "Vocal gender", "options": [ "m", "f" ] }, { "name": "duration", "type": "integer", "label": "Duration (s)", "description": "Custom mode only", "min": 10, "max": 360 } ] }, { "provider": "atlascloud", "params": [ { "name": "prompt", "type": "text", "label": "Prompt / lyrics", "description": "Song description (simple mode) or lyrics (custom mode)", "maxLength": 3000 }, { "name": "custom_mode", "type": "boolean", "label": "Custom mode", "description": "Use your own lyrics, style and title", "default": false }, { "name": "instrumental", "type": "boolean", "label": "Instrumental", "default": false }, { "name": "style", "type": "string", "label": "Style", "description": "Custom mode only, e.g. \"dream pop, female vocals\"", "maxLength": 500 }, { "name": "title", "type": "string", "label": "Title", "description": "Custom mode only", "maxLength": 200 }, { "name": "negative_tags", "type": "string", "label": "Exclude styles", "maxLength": 500 }, { "name": "vocal_gender", "type": "enum", "label": "Vocal gender", "options": [ "m", "f" ] }, { "name": "duration", "type": "integer", "label": "Duration (s)", "description": "Custom mode only", "min": 10, "max": 360 } ] } ] ``` ## Output Creating a task does not mean generation has finished. Keep its id, poll until succeeded or failed, then read outputs or error. Amounts below are illustrative; actual charges depend on the request. | Name | Type | Required | Description | | --- | --- | --- | --- | | id | string | Yes | Generation ID. Use it to query or cancel this task. | | object | string | Yes | generation | | model | string | Yes | suno-v6 | | type | string | Yes | audio | | provider | string | Yes | Provider | | status | string | Yes | queued → processing → succeeded / failed. Stop polling at either terminal state. | | input | object | Yes | Model parameters, see the input fields below. | | outputs | string[] | Yes | Result URLs. Empty while processing; read after succeeded and save the files promptly. | | error | string \| null | Yes | Failure reason, or null when no failure is reported. | | credits | number | Yes | Credits charged for this request. | | price_usd | number | Yes | Request price in USD. | | created_at | string | Yes | Creation time in ISO 8601 format. | | completed_at | string \| null | Yes | Completion time in ISO 8601 format; null before completion. | ### Task submitted ```json { "id": "gen_example", "object": "generation", "model": "suno-v6", "type": "audio", "provider": "kie", "status": "processing", "input": { "prompt": "Welcome back. Let us get started.", "custom_mode": false, "instrumental": false }, "outputs": [], "error": null, "credits": 0, "price_usd": 0, "created_at": "2026-10-25T08:00:00.000Z", "completed_at": null } ``` ### Task completed ```json { "id": "gen_example", "object": "generation", "model": "suno-v6", "type": "audio", "provider": "kie", "status": "succeeded", "input": { "prompt": "Welcome back. Let us get started.", "custom_mode": false, "instrumental": false }, "outputs": [ "https://example.com/output.wav" ], "error": null, "credits": 0, "price_usd": 0, "created_at": "2026-10-25T08:00:00.000Z", "completed_at": "2026-10-25T08:01:00.000Z" } ``` ## Get the result Poll every few seconds until status is succeeded or failed. Output URLs are provider-hosted and may expire — download them promptly. Or pass callback_url to get the result pushed. ```bash curl "https://01router.com/api/v1/generations/GENERATION_ID" -H "Authorization: Bearer $API_KEY" ``` ## Cancel a task Cancellation depends on provider support and task state. A confirmed cancellation returns status: failed and error: Canceled by user. Unsupported or completed tasks return 409 not_cancelable. ```bash curl -X POST "https://01router.com/api/v1/generations/GENERATION_ID/cancel" -H "Authorization: Bearer $API_KEY" ``` ## Quote Same body as creating a generation. Returns every available provider sorted by price, plus the ones that cannot serve the request and why. ```bash curl "https://01router.com/api/v1/quote" -H "Content-Type: application/json" --data-binary @- <<'JSON' { "model": "suno-v6", "input": { "prompt": "Welcome back. Let us get started.", "custom_mode": false, "instrumental": false } } JSON ``` ## Callbacks Optional public HTTPS webhook URL. The final task result is signed and delivered here; polling remains available. See https://01router.com/docs/callback for signature verification. ## Errors Check the HTTP status and error.message. Fix the request before retrying validation or authentication errors. A failed generation is reported in status and error on the task itself. ```json { "error": { "message": "Invalid or missing API key", "code": "unauthorized" } } ``` HTTP 400: invalid request; 401: unauthorized; 402: insufficient credits; 404: not found; 409: not cancelable; 429: rate/concurrency/quota limit; 5xx: upstream/server error. Full API reference: https://01router.com/docs/errors