{"openapi":"3.1.0","info":{"title":"Suede AI","version":"1.0.0","description":"AI-powered music and video generation, payable with USDC on Base via the x402 protocol.","guidance":"Suede AI generates full-length songs and music videos from text prompts. All endpoints require x402 payment (USDC on Base). Send a POST with a JSON body containing at minimum a 'prompt' field. For music: /agent/generate ($0.20) or /create-music ($0.20). For video: /agent/video ($1.50). Include a PAYMENT-SIGNATURE header to authorize — either an x402 payment payload or a Skyfire pay/kya-pay token (both rails are accepted on the same endpoints). For async mode, add ?async=true — returns 202 with songId and pollUrl. Poll GET /api/songs/{songId} until audio_url is no longer the placeholder."},"servers":[{"url":"https://app.suedeai.ai"}],"tags":[{"name":"ProgrammableIP","description":"Programmableip related endpoints"},{"name":"CreativeRWA","description":"Creativerwa related endpoints"},{"name":"Provenance","description":"Provenance related endpoints"},{"name":"Licensing","description":"Licensing related endpoints"},{"name":"CreatorOwnership","description":"Creatorownership related endpoints"},{"name":"AgentCommerce","description":"Agentcommerce related endpoints"},{"name":"SuedeLabs","description":"Suede Labs — onchain AI music platform"},{"name":"SUEDEAI","description":"Suede AI platform services"},{"name":"AISUEDE","description":"AI Suede — generative music and IP"},{"name":"JohnnySuede","description":"Johnnysuede related endpoints"},{"name":"JasonColapietro","description":"Jasoncolapietro related endpoints"},{"name":"SuedeAgent","description":"Suede autonomous music agent"},{"name":"x402","description":"x402 payment protocol endpoints"},{"name":"ACP","description":"Acp related endpoints"},{"name":"AgentCash","description":"AgentCash micropayment integration"},{"name":"AIAgent","description":"AI agent capabilities"},{"name":"music","description":"AI music generation — create full-length songs from text prompts"},{"name":"AIMusic","description":"AI-powered music creation and generative audio"},{"name":"MusicAI","description":"Music intelligence and AI composition"},{"name":"GenerateMusic","description":"Generate an original full-length song from prompts"},{"name":"MusicProduction","description":"Professional music production with AI"},{"name":"video","description":"AI video generation — create music videos from prompts"},{"name":"rights","description":"Rights related endpoints"},{"name":"provenance","description":"Provenance related endpoints"},{"name":"lookup","description":"Lookup related endpoints"},{"name":"registry","description":"Registry related endpoints"},{"name":"Base","description":"Base related endpoints"},{"name":"analysis","description":"Analysis related endpoints"},{"name":"audio","description":"Audio related endpoints"},{"name":"bpm","description":"Bpm related endpoints"},{"name":"key","description":"Key related endpoints"},{"name":"extend","description":"Extend related endpoints"},{"name":"continuation","description":"Continuation related endpoints"},{"name":"cover","description":"Cover related endpoints"},{"name":"remix","description":"Remix related endpoints"},{"name":"voice","description":"Voice related endpoints"},{"name":"vocal","description":"Vocal related endpoints"},{"name":"continue","description":"Continue related endpoints"},{"name":"stems","description":"Stems related endpoints"},{"name":"separation","description":"Separation related endpoints"},{"name":"mixing","description":"Mixing related endpoints"},{"name":"acapella","description":"Acapella related endpoints"},{"name":"midi","description":"Midi related endpoints"},{"name":"transcription","description":"Transcription related endpoints"},{"name":"wav","description":"Wav related endpoints"},{"name":"mastering","description":"Mastering related endpoints"},{"name":"lyrics","description":"Lyrics related endpoints"},{"name":"sync","description":"Sync related endpoints"},{"name":"karaoke","description":"Karaoke related endpoints"},{"name":"writing","description":"Writing related endpoints"},{"name":"creative","description":"Creative related endpoints"},{"name":"style","description":"Style related endpoints"},{"name":"prompt","description":"Prompt related endpoints"},{"name":"rig","description":"Rig related endpoints"},{"name":"guitar","description":"Guitar related endpoints"},{"name":"pedalboard","description":"Pedalboard related endpoints"},{"name":"signal-chain","description":"Signal-chain related endpoints"},{"name":"musician_tool","description":"Musician_tool related endpoints"},{"name":"oracle","description":"Oracle related endpoints"},{"name":"recommendation","description":"Recommendation related endpoints"},{"name":"roast","description":"Roast related endpoints"},{"name":"chain","description":"Chain related endpoints"},{"name":"chat","description":"Chat related endpoints"}],"paths":{"/agent/generate":{"post":{"summary":"Generate a complete, full-length song from a text prompt. Returns a multi-minute track with vocals, melody, and full arrangement, not a short clip or preview. Suede's programmable-IP stack builds every track rights-aware and ready to license.","operationId":"agent_music","tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["shareUrl"],"properties":{"shareUrl":{"type":"string","format":"uri","description":"Public URL to listen to the generated track."},"title":{"type":"string","description":"Auto-generated song title."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.20"},"x-bazaar":{"tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"category":"music","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Creative prompt describing mood, genre, instrumentation, or lyrics guidance."},"style":{"type":"string","description":"Optional style or genre preset (for example, 'ambient', 'synthwave')."},"custom_mode":{"type":"boolean","description":"Enable advanced lyric control (requires lyrics)."},"lyrics":{"type":"string","description":"Custom lyrics to sing when custom_mode is true."},"make_instrumental":{"type":"boolean","description":"Generate an instrumental version without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred vocal gender ('m' or 'f') if vocals are enabled."},"tags":{"type":"string","description":"Optional comma-separated tags stored with the generated asset."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Creative prompt describing mood, genre, instrumentation, or lyrics guidance."},"style":{"type":"string","description":"Optional style or genre preset (for example, 'ambient', 'synthwave')."},"custom_mode":{"type":"boolean","description":"Enable advanced lyric control (requires lyrics)."},"lyrics":{"type":"string","description":"Custom lyrics to sing when custom_mode is true."},"make_instrumental":{"type":"boolean","description":"Generate an instrumental version without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred vocal gender ('m' or 'f') if vocals are enabled."},"tags":{"type":"string","description":"Optional comma-separated tags stored with the generated asset."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["shareUrl"],"properties":{"shareUrl":{"type":"string","format":"uri","description":"Public URL to listen to the generated track."},"title":{"type":"string","description":"Auto-generated song title."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Creative prompt describing mood, genre, instrumentation, or lyrics guidance."},"style":{"type":"string","description":"Optional style or genre preset (for example, 'ambient', 'synthwave')."},"custom_mode":{"type":"boolean","description":"Enable advanced lyric control (requires lyrics)."},"lyrics":{"type":"string","description":"Custom lyrics to sing when custom_mode is true."},"make_instrumental":{"type":"boolean","description":"Generate an instrumental version without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred vocal gender ('m' or 'f') if vocals are enabled."},"tags":{"type":"string","description":"Optional comma-separated tags stored with the generated asset."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/create-music":{"post":{"summary":"Create a full-length, rights-aware song from a prompt, with optional custom lyrics and style control. Returns a complete multi-minute track with verses, a chorus, and full arrangement, never a clip or preview. Suede generates and registers it inside the programmable-IP and licensing workflow.","operationId":"create_music","tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["shareUrl"],"properties":{"shareUrl":{"type":"string","format":"uri","description":"Public URL to listen to and download the track."},"title":{"type":"string","description":"Title of the generated track."},"imageUrl":{"type":"string","format":"uri","description":"Cover art image URL."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.20"},"x-bazaar":{"tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"category":"music","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Describe the song you want to create. Include genre, mood, instruments, and any specific vibe. Example: 'Upbeat 80s synthwave with driving bass and neon atmosphere' or 'A melancholic acoustic guitar ballad about rain'."},"style":{"type":"string","description":"Specific musical style or genre tag (e.g., 'Hip Hop', 'Ambient', 'Rock'). Helping the AI focus on a specific sound."},"custom_mode":{"type":"boolean","description":"Set to true to use your own lyrics provided in the 'lyrics' field."},"lyrics":{"type":"string","description":"Your custom lyrics. Required if custom_mode is true."},"make_instrumental":{"type":"boolean","description":"If true, generates a track without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred gender for the vocalist ('m' for male, 'f' for female)."},"tags":{"type":"string","description":"Comma-separated keywords to tag the generated file."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Describe the song you want to create. Include genre, mood, instruments, and any specific vibe. Example: 'Upbeat 80s synthwave with driving bass and neon atmosphere' or 'A melancholic acoustic guitar ballad about rain'."},"style":{"type":"string","description":"Specific musical style or genre tag (e.g., 'Hip Hop', 'Ambient', 'Rock'). Helping the AI focus on a specific sound."},"custom_mode":{"type":"boolean","description":"Set to true to use your own lyrics provided in the 'lyrics' field."},"lyrics":{"type":"string","description":"Your custom lyrics. Required if custom_mode is true."},"make_instrumental":{"type":"boolean","description":"If true, generates a track without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred gender for the vocalist ('m' for male, 'f' for female)."},"tags":{"type":"string","description":"Comma-separated keywords to tag the generated file."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["shareUrl"],"properties":{"shareUrl":{"type":"string","format":"uri","description":"Public URL to listen to and download the track."},"title":{"type":"string","description":"Title of the generated track."},"imageUrl":{"type":"string","format":"uri","description":"Cover art image URL."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Describe the song you want to create. Include genre, mood, instruments, and any specific vibe. Example: 'Upbeat 80s synthwave with driving bass and neon atmosphere' or 'A melancholic acoustic guitar ballad about rain'."},"style":{"type":"string","description":"Specific musical style or genre tag (e.g., 'Hip Hop', 'Ambient', 'Rock'). Helping the AI focus on a specific sound."},"custom_mode":{"type":"boolean","description":"Set to true to use your own lyrics provided in the 'lyrics' field."},"lyrics":{"type":"string","description":"Your custom lyrics. Required if custom_mode is true."},"make_instrumental":{"type":"boolean","description":"If true, generates a track without vocals."},"vocal_gender":{"type":"string","enum":["m","f"],"description":"Preferred gender for the vocalist ('m' for male, 'f' for female)."},"tags":{"type":"string","description":"Comma-separated keywords to tag the generated file."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/agent/video":{"post":{"summary":"Generate a short-form music-video clip for a track, product, or campaign. Renders creator-owned video you can pair with Suede's full-length music endpoints.","operationId":"agent_video","tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","video","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["videoUrl"],"properties":{"videoUrl":{"type":"string","format":"uri","description":"Signed URL to download the generated video."},"jobId":{"type":"string","description":"Job identifier for the render."},"status":{"type":"string","description":"Render status (processing, ready)."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"1.50"},"x-bazaar":{"tags":["ProgrammableIP","CreativeRWA","Provenance","Licensing","CreatorOwnership","AgentCommerce","SuedeLabs","SUEDEAI","AISUEDE","JohnnySuede","JasonColapietro","SuedeAgent","x402","ACP","AgentCash","AIAgent","video","music","AIMusic","MusicAI","GenerateMusic","MusicProduction"],"category":"video","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Narrative or visual prompt to drive the music video concept."},"durationSeconds":{"type":"integer","description":"Clip length in seconds (default 8)."},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1"],"description":"Desired frame aspect ratio."},"resolution":{"type":"string","enum":["720p","1024p"],"description":"Target rendering resolution."},"model":{"type":"string","description":"Optional model preset variant. Leave unset for the default."},"seed":{"type":"integer","description":"Optional random seed for reproducible renders."},"asyncMode":{"type":"boolean","description":"If true, return immediately while the video renders asynchronously."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Narrative or visual prompt to drive the music video concept."},"durationSeconds":{"type":"integer","description":"Clip length in seconds (default 8)."},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1"],"description":"Desired frame aspect ratio."},"resolution":{"type":"string","enum":["720p","1024p"],"description":"Target rendering resolution."},"model":{"type":"string","description":"Optional model preset variant. Leave unset for the default."},"seed":{"type":"integer","description":"Optional random seed for reproducible renders."},"asyncMode":{"type":"boolean","description":"If true, return immediately while the video renders asynchronously."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["videoUrl"],"properties":{"videoUrl":{"type":"string","format":"uri","description":"Signed URL to download the generated video."},"jobId":{"type":"string","description":"Job identifier for the render."},"status":{"type":"string","description":"Render status (processing, ready)."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Narrative or visual prompt to drive the music video concept."},"durationSeconds":{"type":"integer","description":"Clip length in seconds (default 8)."},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1"],"description":"Desired frame aspect ratio."},"resolution":{"type":"string","enum":["720p","1024p"],"description":"Target rendering resolution."},"model":{"type":"string","description":"Optional model preset variant. Leave unset for the default."},"seed":{"type":"integer","description":"Optional random seed for reproducible renders."},"asyncMode":{"type":"boolean","description":"If true, return immediately while the video renders asynchronously."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/rights/{assetHash}":{"get":{"summary":"Check and verify on-chain music rights, ownership, and provenance for a piece of content by its hash. Resolves the Suede Registry attestation on Base and returns the owner, IP account, token id, and licensing metadata.","operationId":"rights_lookup","tags":["ProgrammableIP","Provenance","Licensing","CreatorOwnership","rights","provenance","lookup","registry","Base","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["assetHash","isRegistered"],"properties":{"assetHash":{"type":"string","description":"Echo of queried content hash."},"isRegistered":{"type":"boolean","description":"Whether the asset has an on-chain Suede Registry entry."},"owner":{"type":["string","null"],"description":"NFT owner wallet."},"ipAccount":{"type":["string","null"],"description":"ERC-6551 IP Account address."},"tokenId":{"type":["integer","null"],"description":"SuedeNFT token id."},"timestamp":{"type":["integer","null"],"description":"On-chain registration unix timestamp."},"metadata":{"type":["object","string","null"],"description":"Registered metadata blob."},"registryContract":{"type":["string","null"],"description":"Suede Registry contract address."},"explorerUrl":{"type":["string","null"],"description":"Block explorer URL."},"queriedAt":{"type":"string","format":"date-time","description":"Lookup wall-clock timestamp (ISO 8601)."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.005"},"x-bazaar":{"tags":["ProgrammableIP","Provenance","Licensing","CreatorOwnership","rights","provenance","lookup","registry","Base","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"rights","info":{"input":{"type":"http","method":"GET","bodyType":"json","body":{"type":"object","required":["assetHash"],"properties":{"assetHash":{"type":"string","description":"32-byte content hash (sha256, hex-encoded with optional 0x prefix).","pattern":"^(0x)?[a-fA-F0-9]{64}$"}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["assetHash"],"properties":{"assetHash":{"type":"string","description":"32-byte content hash (sha256, hex-encoded with optional 0x prefix).","pattern":"^(0x)?[a-fA-F0-9]{64}$"}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["assetHash","isRegistered"],"properties":{"assetHash":{"type":"string","description":"Echo of queried content hash."},"isRegistered":{"type":"boolean","description":"Whether the asset has an on-chain Suede Registry entry."},"owner":{"type":["string","null"],"description":"NFT owner wallet."},"ipAccount":{"type":["string","null"],"description":"ERC-6551 IP Account address."},"tokenId":{"type":["integer","null"],"description":"SuedeNFT token id."},"timestamp":{"type":["integer","null"],"description":"On-chain registration unix timestamp."},"metadata":{"type":["object","string","null"],"description":"Registered metadata blob."},"registryContract":{"type":["string","null"],"description":"Suede Registry contract address."},"explorerUrl":{"type":["string","null"],"description":"Block explorer URL."},"queriedAt":{"type":"string","format":"date-time","description":"Lookup wall-clock timestamp (ISO 8601)."}}}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"assetHash","in":"path","required":true,"schema":{"type":"string","pattern":"^(0x)?[a-fA-F0-9]{64}$"},"description":"32-byte content hash (sha256, hex-encoded with optional 0x prefix)."}]}},"/v1/analyze":{"post":{"summary":"Detect the BPM (tempo) and musical key of any audio file, then analyze its mode, energy, danceability, loudness, duration, and a suggested genre. Use it to route or tag tracks before generation or mixing.","operationId":"audio_analyze","tags":["analysis","audio","bpm","key","music","AIMusic","MusicAI","MusicProduction","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["audioUrl","bpm","key","mode"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Echo of the analyzed audio URL."},"bpm":{"type":"number","description":"Estimated beats per minute."},"key":{"type":"string","description":"Detected musical key."},"mode":{"type":"string","enum":["major","minor"],"description":"Tonal mode."},"energy":{"type":"number","description":"Normalized RMS energy."},"danceability":{"type":"number","description":"Heuristic danceability (0.0-1.0)."},"loudness":{"type":"number","description":"Approximate integrated loudness in dBFS."},"durationSeconds":{"type":"number","description":"Total duration in seconds."},"suggestedGenre":{"type":"string","description":"Heuristic genre suggestion."},"analyzedAt":{"type":"string","format":"date-time","description":"Analysis wall-clock timestamp (ISO 8601)."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.003"},"x-bazaar":{"tags":["analysis","audio","bpm","key","music","AIMusic","MusicAI","MusicProduction","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"analysis","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to an audio file (mp3, wav, flac, m4a, ogg)."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to an audio file (mp3, wav, flac, m4a, ogg)."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["audioUrl","bpm","key","mode"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Echo of the analyzed audio URL."},"bpm":{"type":"number","description":"Estimated beats per minute."},"key":{"type":"string","description":"Detected musical key."},"mode":{"type":"string","enum":["major","minor"],"description":"Tonal mode."},"energy":{"type":"number","description":"Normalized RMS energy."},"danceability":{"type":"number","description":"Heuristic danceability (0.0-1.0)."},"loudness":{"type":"number","description":"Approximate integrated loudness in dBFS."},"durationSeconds":{"type":"number","description":"Total duration in seconds."},"suggestedGenre":{"type":"string","description":"Heuristic genre suggestion."},"analyzedAt":{"type":"string","format":"date-time","description":"Analysis wall-clock timestamp (ISO 8601)."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to an audio file (mp3, wav, flac, m4a, ogg)."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/extend":{"post":{"summary":"Extend a song past its ending with a natural continuation in the same key and style. Works from a Suede clip id or an uploaded audio URL.","operationId":"extend","tags":["music","MusicAI","MusicProduction","extend","continuation","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.40"},"x-bazaar":{"tags":["music","MusicAI","MusicProduction","extend","continuation","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to extend."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio to register and extend."},"prompt":{"type":"string","description":"Optional creative direction for the extension."},"title":{"type":"string","description":"Optional title for the extended track."},"tags":{"type":"string","description":"Optional comma-separated style tags."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source (seconds) to continue from."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to extend."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio to register and extend."},"prompt":{"type":"string","description":"Optional creative direction for the extension."},"title":{"type":"string","description":"Optional title for the extended track."},"tags":{"type":"string","description":"Optional comma-separated style tags."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source (seconds) to continue from."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to extend."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio to register and extend."},"prompt":{"type":"string","description":"Optional creative direction for the extension."},"title":{"type":"string","description":"Optional title for the extended track."},"tags":{"type":"string","description":"Optional comma-separated style tags."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source (seconds) to continue from."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/cover":{"post":{"summary":"Create a cover of an existing song in a new style or genre, remaking the track while keeping it recognizable. Works from a Suede clip id or an uploaded audio URL.","operationId":"cover","tags":["music","MusicAI","MusicProduction","cover","remix","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.40"},"x-bazaar":{"tags":["music","MusicAI","MusicProduction","cover","remix","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to cover."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio."},"prompt":{"type":"string","description":"Optional creative direction for the cover."},"title":{"type":"string","description":"Optional title for the cover."},"tags":{"type":"string","description":"Optional style tags."},"style":{"type":"string","description":"Target style (e.g. 'orchestral', 'lofi')."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to cover."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio."},"prompt":{"type":"string","description":"Optional creative direction for the cover."},"title":{"type":"string","description":"Optional title for the cover."},"tags":{"type":"string","description":"Optional style tags."},"style":{"type":"string","description":"Target style (e.g. 'orchestral', 'lofi')."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["sourceClipId"]},{"required":["audioUrl"]}],"properties":{"sourceClipId":{"type":"string","description":"Suede clip id of the source track to cover."},"audioUrl":{"type":"string","format":"uri","description":"Alternative: public URL of source audio."},"prompt":{"type":"string","description":"Optional creative direction for the cover."},"title":{"type":"string","description":"Optional title for the cover."},"tags":{"type":"string","description":"Optional style tags."},"style":{"type":"string","description":"Target style (e.g. 'orchestral', 'lofi')."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/vox":{"post":{"summary":"Swap or replace the lead vocal on a track with a target Suede voice while keeping the original instrumental, melody, and timing. A voice-to-voice vocal cover, also known as voice conversion.","operationId":"voice_cover","tags":["music","MusicAI","MusicProduction","voice","vocal","cover","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.40"},"x-bazaar":{"tags":["music","MusicAI","MusicProduction","voice","vocal","cover","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"voiceId":{"type":"string","description":"Optional preset Suede voice id."},"pitchShift":{"type":"number","description":"Semitone pitch shift (-12..+12)."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"voiceId":{"type":"string","description":"Optional preset Suede voice id."},"pitchShift":{"type":"number","description":"Semitone pitch shift (-12..+12)."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"voiceId":{"type":"string","description":"Optional preset Suede voice id."},"pitchShift":{"type":"number","description":"Semitone pitch shift (-12..+12)."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/continue":{"post":{"summary":"Continue or extend an uploaded audio file from any timestamp, generating a continuation that preserves the original key and style.","operationId":"continue_track","tags":["music","MusicAI","MusicProduction","continue","extend","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.40"},"x-bazaar":{"tags":["music","MusicAI","MusicProduction","continue","extend","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"prompt":{"type":"string","description":"Optional creative direction for the continuation."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source to continue from."},"durationSeconds":{"type":"integer","description":"Desired additional duration (seconds)."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"prompt":{"type":"string","description":"Optional creative direction for the continuation."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source to continue from."},"durationSeconds":{"type":"integer","description":"Desired additional duration (seconds)."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"prompt":{"type":"string","description":"Optional creative direction for the continuation."},"continueAtSeconds":{"type":"number","description":"Timestamp within the source to continue from."},"durationSeconds":{"type":"integer","description":"Desired additional duration (seconds)."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/stems-pro":{"post":{"summary":"Stem separation for any song: split a track into four isolated stems with Suede Stems Pro, vocals, drums, bass, and other instruments, built for remixing, sampling, and mixing.","operationId":"stems_full","tags":["music","MusicProduction","stems","separation","mixing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status."},"mode":{"type":"string","enum":["full","basic"],"description":"Stem split mode."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.40"},"x-bazaar":{"tags":["music","MusicProduction","stems","separation","mixing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status."},"mode":{"type":"string","enum":["full","basic"],"description":"Stem split mode."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/stems":{"post":{"summary":"Two-stem separation: split a track into a vocal stem and an instrumental stem. The fast path when you only need an a cappella (acapella) and a karaoke-ready backing track.","operationId":"stems_basic","tags":["music","MusicProduction","stems","separation","mixing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status."},"mode":{"type":"string","enum":["full","basic"],"description":"Stem split mode."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.20"},"x-bazaar":{"tags":["music","MusicProduction","stems","separation","mixing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status."},"mode":{"type":"string","enum":["full","basic"],"description":"Stem split mode."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["clipId"]},{"required":["audioUrl"]}],"properties":{"clipId":{"type":"string","description":"Suede clip UUID to separate. Use this when you already have a clip ID from a prior generation."},"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file. The clip UUID is extracted from the URL path."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/acapella":{"post":{"summary":"Isolate and extract the vocals from a song, returning a clean a cappella (acapella) vocal stem.","operationId":"vox","tags":["music","MusicProduction","vocal","acapella","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.20"},"x-bazaar":{"tags":["music","MusicProduction","vocal","acapella","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/midi":{"post":{"summary":"Audio-to-MIDI transcription: convert an audio recording into a MIDI file of editable notes for your DAW.","operationId":"midi","tags":["music","MusicProduction","midi","transcription","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.10"},"x-bazaar":{"tags":["music","MusicProduction","midi","transcription","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/mastering":{"post":{"summary":"Master a track with Suede Master (audio mastering) and render a loud, release-ready WAV with balanced levels and tone.","operationId":"wav_master","tags":["music","MusicProduction","wav","mastering","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.10"},"x-bazaar":{"tags":["music","MusicProduction","wav","mastering","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file to render as WAV."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file to render as WAV."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file to render as WAV."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/lyric-sync":{"post":{"summary":"Generate timestamped, time-synced lyrics with Suede Lyric Sync, ready for karaoke or captioned playback.","operationId":"lyric_sync","tags":["music","lyrics","sync","karaoke","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.10"},"x-bazaar":{"tags":["music","lyrics","sync","karaoke","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"lyrics":{"type":"string","description":"Optional plain-text lyrics to align (if known)."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"lyrics":{"type":"string","description":"Optional plain-text lyrics to align (if known)."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["taskId"],"properties":{"taskId":{"type":"string","description":"Polling identifier for the rendered job."},"status":{"type":"string","description":"Current job status (queued, processing, succeeded, failed)."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"Public URL to the source audio file."},"lyrics":{"type":"string","description":"Optional plain-text lyrics to align (if known)."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/lyrics":{"post":{"summary":"Write original song lyrics with Suede Lyrics from a creative prompt, with optional style direction.","operationId":"lyrics","tags":["music","lyrics","writing","creative","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"lyrics":{"type":"string","description":"Generated lyric text (when returned synchronously)."},"taskId":{"type":"string","description":"Polling id (when returned asynchronously)."},"status":{"type":"string","description":"Current job status."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.04"},"x-bazaar":{"tags":["music","lyrics","writing","creative","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Description of the song or scene to write lyrics for."},"style":{"type":"string","description":"Optional style hint (e.g. 'country ballad')."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Description of the song or scene to write lyrics for."},"style":{"type":"string","description":"Optional style hint (e.g. 'country ballad')."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"lyrics":{"type":"string","description":"Generated lyric text (when returned synchronously)."},"taskId":{"type":"string","description":"Polling id (when returned asynchronously)."},"status":{"type":"string","description":"Current job status."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Description of the song or scene to write lyrics for."},"style":{"type":"string","description":"Optional style hint (e.g. 'country ballad')."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/style-coach":{"post":{"summary":"Expand a few style tags into a richer, prompt-ready brief with Suede Style Coach for music generation.","operationId":"style_coach","tags":["music","style","prompt","writing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["expandedTags"],"properties":{"expandedTags":{"type":"array","items":{"type":"string"},"description":"Expanded style-tag list."},"seedTags":{"type":"string","description":"Echo of the input seed-tag list."},"count":{"type":"integer","description":"Number of returned tags."},"status":{"type":"string","description":"Current job status."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.02"},"x-bazaar":{"tags":["music","style","prompt","writing","SuedeLabs","SUEDEAI","x402","ACP","AgentCash","AIAgent"],"category":"music-tools","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["tags"],"properties":{"tags":{"type":"string","description":"Short seed tag list (e.g. 'lofi, rainy, late night')."},"targetCount":{"type":"integer","description":"How many expanded tags to return (default ~12)."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["tags"],"properties":{"tags":{"type":"string","description":"Short seed tag list (e.g. 'lofi, rainy, late night')."},"targetCount":{"type":"integer","description":"How many expanded tags to return (default ~12)."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["expandedTags"],"properties":{"expandedTags":{"type":"array","items":{"type":"string"},"description":"Expanded style-tag list."},"seedTags":{"type":"string","description":"Echo of the input seed-tag list."},"count":{"type":"integer","description":"Number of returned tags."},"status":{"type":"string","description":"Current job status."},"provider":{"type":"string","description":"Always 'suede'."},"modelVersion":{"type":"string","description":"Suede-branded model version."}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tags"],"properties":{"tags":{"type":"string","description":"Short seed tag list (e.g. 'lofi, rainy, late night')."},"targetCount":{"type":"integer","description":"How many expanded tags to return (default ~12)."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/rig/analyze":{"post":{"summary":"Analyze a guitar or bass rig from an audio clip and infer the signal chain: pedal order, drive, modulation, and time-based effects.","operationId":"rig_analyze","tags":["rig","guitar","pedalboard","signal-chain","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.10"},"x-bazaar":{"tags":["rig","guitar","pedalboard","signal-chain","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"musician_tool","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to a rig audio clip."},"pedals":{"type":"array","items":{"type":"string"},"description":"Optional declared pedal list."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to a rig audio clip."},"pedals":{"type":"array","items":{"type":"string"},"description":"Optional declared pedal list."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["audioUrl"],"properties":{"audioUrl":{"type":"string","format":"uri","description":"HTTPS URL to a rig audio clip."},"pedals":{"type":"array","items":{"type":"string"},"description":"Optional declared pedal list."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/rig/oracle":{"post":{"summary":"Recommend a full guitar rig (pedals, amp, and guitar) that hits a target tone, with optional genre and budget limits.","operationId":"rig_oracle","tags":["rig","guitar","oracle","recommendation","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.10"},"x-bazaar":{"tags":["rig","guitar","oracle","recommendation","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"musician_tool","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["goal"],"properties":{"goal":{"type":"string","description":"Tone goal (e.g. 'warm 80s lead')."},"genre":{"type":"string","description":"Optional genre constraint."},"budgetUsd":{"type":"integer","description":"Optional budget in USD."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["goal"],"properties":{"goal":{"type":"string","description":"Tone goal (e.g. 'warm 80s lead')."},"genre":{"type":"string","description":"Optional genre constraint."},"budgetUsd":{"type":"integer","description":"Optional budget in USD."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["goal"],"properties":{"goal":{"type":"string","description":"Tone goal (e.g. 'warm 80s lead')."},"genre":{"type":"string","description":"Optional genre constraint."},"budgetUsd":{"type":"integer","description":"Optional budget in USD."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/rig/roast":{"post":{"summary":"Roast a player's gear list (pedals, amp, and guitar) for laughs, using the same inputs as the rig recommender.","operationId":"rig_roast","tags":["rig","guitar","roast","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.05"},"x-bazaar":{"tags":["rig","guitar","roast","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"musician_tool","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","properties":{"pedals":{"type":"array","items":{"type":"string"},"description":"Pedalboard contents."},"amp":{"type":"string","description":"Amp model."},"guitar":{"type":"string","description":"Guitar model."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","properties":{"pedals":{"type":"array","items":{"type":"string"},"description":"Pedalboard contents."},"amp":{"type":"string","description":"Amp model."},"guitar":{"type":"string","description":"Guitar model."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pedals":{"type":"array","items":{"type":"string"},"description":"Pedalboard contents."},"amp":{"type":"string","description":"Amp model."},"guitar":{"type":"string","description":"Guitar model."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/prompt-analyze":{"post":{"summary":"Analyze a music-generation prompt and extract its genre, mood, instrumentation, and structure. Use it to route prompts before generation.","operationId":"prompt_analyze","tags":["prompt","analysis","music","musician_tool","AIMusic","MusicAI","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.003"},"x-bazaar":{"tags":["prompt","analysis","music","musician_tool","AIMusic","MusicAI","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"analysis","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Music generation prompt to analyze."}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Music generation prompt to analyze."}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Music generation prompt to analyze."}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}},"/v1/chain-chat":{"post":{"summary":"Ask plain-language questions about a registered music asset's rights, provenance, license, and royalties. The on-chain Suede Registry answers each one.","operationId":"chain_chat","tags":["chain","chat","provenance","registry","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}},"402":{"description":"Payment Required — x402 challenge. The response body carries the PaymentRequirements payload (network, asset, maxAmountRequired, payTo, etc.). Re-send the same request with a PAYMENT-SIGNATURE header to authorize.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"WWW-Authenticate":{"description":"Always 'x402' on a payment challenge.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["x402Version","accepts"],"properties":{"x402Version":{"type":"integer","description":"x402 protocol version."},"accepts":{"type":"array","items":{"type":"object"},"description":"Accepted PaymentRequirements (per Coinbase x402 spec)."},"error":{"type":"string","description":"Optional human-readable hint."}}}}}},"429":{"description":"Too Many Requests — rate-limited. Honor `Retry-After` before retrying.","headers":{"Retry-After":{"description":"RFC 7231 retry hint, in seconds. Always set on 429 and may be set on 402 challenges when the facilitator is back-pressured.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Total request quota for the active window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active window before throttling kicks in.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["detail"],"properties":{"detail":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Optional machine-readable error code."}}},"example":{"detail":"Too many requests"}}}},"202":{"description":"Accepted — job queued for asynchronous execution. Poll `pollUrl` until the embedded `audio_url`/`video_url` is no longer a placeholder. Returned only when the caller passes `?async=true`.","content":{"application/json":{"schema":{"type":"object","required":["status","pollUrl"],"properties":{"status":{"type":"string","enum":["processing","queued"],"description":"Job lifecycle state at the time the request was accepted."},"shareUrl":{"type":"string","format":"uri","description":"Predicted browser-friendly share URL once the job completes."},"songId":{"type":["string","null"],"description":"Stable id for the placeholder row. May be null when the job is queued before placeholder creation."},"taskId":{"type":"string","description":"Polling identifier for non-songId workloads (musician tools, mastering, etc.)."},"pollUrl":{"type":"string","format":"uri","description":"Absolute URL the client should GET to retrieve the finished asset. Poll until status transitions out of 'processing'/'queued'."}},"additionalProperties":true}}}}},"x-payment-info":{"protocols":["x402"],"pricingMode":"fixed","price":"0.02"},"x-bazaar":{"tags":["chain","chat","provenance","registry","musician_tool","x402","ACP","AgentCash","AIAgent","SuedeLabs","SUEDEAI"],"category":"musician_tool","info":{"input":{"type":"http","method":"POST","bodyType":"json","body":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"Question for the on-chain provenance oracle."},"assetHash":{"type":"string","description":"Optional Suede Registry asset hash for context.","pattern":"^(0x)?[a-fA-F0-9]{64}$"}}}},"output":{"type":"json","example":{}}},"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"body":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"Question for the on-chain provenance oracle."},"assetHash":{"type":"string","description":"Optional Suede Registry asset hash for context.","pattern":"^(0x)?[a-fA-F0-9]{64}$"}}}}},"output":{"type":"object","properties":{"example":{"type":"object","required":["status"],"properties":{"profile":{"type":"string","description":"Echo of the profile key handled."},"status":{"type":"string","description":"Synchronous job status (typically 'ok')."},"shareUrl":{"type":"string","format":"uri","description":"Browser-friendly preview URL for the result."}},"additionalProperties":true}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"Question for the on-chain provenance oracle."},"assetHash":{"type":"string","description":"Optional Suede Registry asset hash for context.","pattern":"^(0x)?[a-fA-F0-9]{64}$"}}}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":true,"description":"Signed payment authorization. Accepts either an x402-compatible payment payload (base64 PaymentPayload) or a Skyfire pay or kya-pay JWT. Skyfire tokens are verified against Skyfire's JWKS and charged via the Skyfire charge-token API; x402 payloads settle USDC on Base through the facilitator. Omit on the first call to receive the 402 challenge, then retry with this header to authorize.","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","required":false,"description":"Client-supplied idempotency token. Re-sending the same key + body within the cache TTL returns the original response without re-charging the payer. Recommended for any POST that triggers a non-idempotent backend job (music/video render, mastering, etc.).","schema":{"type":"string","maxLength":200}},{"name":"async","in":"query","required":false,"description":"When 'true', the server returns 202 Accepted with a polling URL instead of blocking until the job completes. See the 202 response for the callback envelope.","schema":{"type":"string","enum":["true","false"],"default":"false"}}]}}}}