Async Jobs
Most generation routes return 202 first. Poll request status or subscribe to webhooks.
When to expect async behavior
- Most music generation, track generation, track editing, TTS, dubbing, and longer STT jobs return
202 Accepted. - POST
/v1/music/lyrics/extendcompletes synchronously. - POST
/v1/sound-effects/generateusually completes synchronously on the success path. - POST
/v1/speech/speech-to-textcan return either200or202depending on the audio path and job length.
Rule of thumb
request_id, treat it as an asynchronous workflow and build completion around polling or webhooks.The accepted response
Most async endpoints return a compact accepted envelope immediately. Persist the request_id on your side and treat it as the durable handle for the job.
{
"success": true,
"data": {
"request_id": "590b41ed-bf0f-42cf-bad9-32568c09475a",
"status": "accepted",
"operation": "music.song.generate",
"event": "music.song.generate",
"message": "Request accepted and processing started"
}
}Polling with /v1/requests
GET/v1/requests/:requestId is the canonical cross-service polling route. It returns ownership-checked status, timing metadata, and a result URL once available.
/v1/requests/:requestIdGET /v1/requests/590b41ed-bf0f-42cf-bad9-32568c09475a
{
"success": true,
"data": {
"request_id": "590b41ed-bf0f-42cf-bad9-32568c09475a",
"status": "completed",
"service_category": "music",
"service_operation": "song.generate",
"credits_used": 1,
"credits_estimated": 1,
"result_url": "https://cdn.wubble.ai/api-generations/...",
"error_message": null,
"estimated_seconds": 75,
"created_at": "2026-05-12T09:40:00.000Z",
"updated_at": "2026-05-12T09:41:15.000Z",
"completed_at": "2026-05-12T09:41:15.000Z"
}
}Polling cadence
Speech-specific status route
Speech workflows also expose GET/v1/speech/status/:requestId. Use it when you want speech-specific status semantics around TTS, STT, or dubbing.
/v1/speech/status/:requestIdGET /v1/speech/status/590b41ed-bf0f-42cf-bad9-32568c09475a
// 202 while still processing
{
"success": true,
"data": {
"request_id": "590b41ed-bf0f-42cf-bad9-32568c09475a",
"status": "processing",
"age_minutes": 1
}
}Choose your completion strategy
Best for server-side jobs and smaller integrations. Keep your own timeout and stop when status reaches completed or failed.
Better for production pipelines. Let Wubble push terminal events to your HTTPS receiver instead of holding clients open.
Failed jobs keep the request record. Read error_message and expose the reason clearly to your own operators.
Completed responses typically include a CDN URL. Do not assume the original POST response will contain the final media asset.