The most important difference
In the legacy API, one job processes one model. If you needed vocals, instrumental, and drums, you submitted three separate jobs. In the Tasks API, one task can process multiple models. You submit one request with atargets array — each target specifying a model and output format — and all outputs are produced together.
Concept mapping
| Legacy (Jobs API) | Tasks API |
|---|---|
Base URL: groovy.audioshake.ai | Base URL: api.audioshake.ai |
Auth: Authorization: Bearer TOKEN | Auth: x-api-key: YOUR_KEY |
| Token via support email | Self-serve API keys in the dashboard |
POST /upload or POST /upload/link | POST /assets |
POST /job (one model per job) | POST /tasks (multiple models per task via targets) |
GET /job/<id> | GET /tasks/<id> |
metadata.name | targets[].model |
metadata.format | targets[].formats[] (now an array) |
callbackUrl in the job body | Webhooks registered separately via POST /webhooks |
Response wrapped in { "job": { ... } } | Response is a flat task object |
Request body structure
The job request body uses ametadata object to specify the model and format. The Tasks API flattens this into a targets array.
Authentication
Uploading a file
The endpoint path and field names are the same. Only the auth header changes.id field. Use that as assetId in your processing request.
Webhooks
In the legacy API, you passedcallbackUrl inside each job request. In the Tasks API, register your endpoint once — all task completion events are then delivered automatically.
Migration checklist
Generate a Tasks API key
Go to Settings → API Keys and create a new key.
Update file upload
Replace
POST /upload with POST /assets. The response id field is the same — use it as assetId.Consolidate jobs into one task
Replace each group of per-model job requests with a single
POST /tasks request. Move each metadata.name into a target’s model field, and each metadata.format into formats (as an array).Register webhooks separately
If you used
callbackUrl, register your endpoint once via POST /webhooks and remove callbackUrl from your task requests.Update response handling
The legacy response wraps the job in a
{ "job": { ... } } envelope. The Tasks API response is a flat object — update any code that reads response.job.id to read response.id instead.