Skip to main content
AudioShake is migrating all customers to the Tasks API. This page is provided for reference only. New integrations should use the Tasks API.
The legacy API is hosted at https://groovy.audioshake.ai and uses a Jobs-based model where one job processes one model against one audio file. If you are starting a new integration, use the Tasks API instead.

Authentication

All requests require a Bearer token in the Authorization header.
Authorization: Bearer YOUR_API_TOKEN
Contact support@audioshake.ai to obtain a legacy API token. Never store tokens in client-side code. If a token is compromised, contact support to invalidate it immediately.

Upload a file

Before creating a job, upload your audio file to receive an asset ID.

Upload from disk

curl -X POST "https://groovy.audioshake.ai/upload" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: multipart/form-data" \
  -H "Accept: application/json" \
  -F 'file=@song.mp3;type=audio/mpeg'

Upload from URL

curl -X POST "https://groovy.audioshake.ai/upload/link" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "link": "https://example.com/audio.mp3",
    "name": "song"
  }'

Upload response

{
  "name": "song",
  "id": "clyxaywtp00ne0jpi4nf435dv",
  "fileType": "audio/mpeg",
  "format": "mp3",
  "link": "https://..."
}
Save the id — you will use it as assetId when creating a job.

Create a job

Each job runs one model against one asset. The model name and output format are specified inside the metadata object.
curl -X POST "https://groovy.audioshake.ai/job" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "metadata": {
      "format": "wav",
      "name": "vocals"
    },
    "assetId": "clyxaywtp00ne0jpi4nf435dv",
    "callbackUrl": "https://your-app.com/webhooks"
  }'
To process multiple models (for example, vocals + instrumental + drums), submit a separate job for each.

Job request fields

FieldDescription
metadata.nameModel name (for example, vocals, instrumental, music_detection)
metadata.formatOutput file format: wav, mp3, or json
assetIdAsset ID returned from file upload
callbackUrlOptional. URL to receive a webhook when the job completes

Job response

{
  "job": {
    "id": "<job-id>",
    "clientId": "<your-client-id>",
    "requestId": "<request-id>",
    "metadata": {
      "format": "wav",
      "name": "vocals"
    },
    "assetId": "clyxaywtp00ne0jpi4nf435dv",
    "status": "queued"
  }
}
Save the job.id to poll for status.

Check job status

curl -X GET "https://groovy.audioshake.ai/job/<job-id>" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
When status is completed, the response includes an outputAssets array with download links.

Music detection

The music_detection model returns a JSON array of time ranges where music is present.
curl -X POST "https://groovy.audioshake.ai/job" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "metadata": {
      "format": "json",
      "name": "music_detection"
    },
    "assetId": "<asset-id>"
  }'
Output format:
[
  {
    "start_time": 20.0,
    "end_time": 30.0,
    "confidence": 0.179
  }
]
Confidence values closer to 1 indicate higher certainty that music is present.

Check usage

curl -X GET "https://groovy.audioshake.ai/usage" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Returns the last 3 months of usage:
{
  "clientId": "<your-client-id>",
  "usage": [
    {
      "month": "2026-03",
      "totalJobs": 412,
      "totalMinutes": 823.5
    }
  ]
}

Migrating to the Tasks API

See Migrating from Jobs for a step-by-step guide.