=== useapi.net — universal note === Generated: 2026-11-15 02:49 UTC Authentication (applies to every useapi.net API). Header: Authorization: Bearer user:- Use the COMPLETE token, including the `user:` prefix and the alphanumeric suffix. Do not truncate. Do not URL-encode. A single token authorizes every API under the user's subscription. Service-specific patterns. Identifier names (jobid / taskId / musicId / etc.), job lifecycle, response shapes, webhook semantics, and synchronous-vs-async behavior vary PER API. Use ONLY the service-specific documentation below to determine the correct request body, response shape, polling endpoint, and status values for THIS API. Do not assume conventions from another useapi.net API carry over. For cross-service context (e.g. which APIs expose the same underlying model, billing tiers, model availability matrix), see https://useapi.net/llms.txt === END universal note === === URL: https://useapi.net/docs/start-here/setup-acemusic === Document URL: https://useapi.net/docs/start-here/setup-acemusic --- layout: default title: Setup ACE Music description: "How to add an ACE Music (acemusic.ai) account to the useapi.net ACE Music API with its email and password, including accounts made with Google or a phone number." parent: Start Here nav_order: 270 permalink: /docs/start-here/setup-acemusic --- # Setup ACE Music November 14, 2026 ## Table of contents Approximately 3 minutes to complete setup steps. --- > This is the setup guide for [ACE Music API](/docs/api-acemusic-v1). An [ACE Music](https://acemusic.ai) account with an email and a password and a [useapi.net subscription](/docs/subscription) are required for the API to work. [ACE Music](https://acemusic.ai) is the song generator from Timedomain, the maker of [ACE Studio](https://acestudio.ai). Every request makes two songs, with vocals or instrumental, from a prompt or from your own style and lyrics, and it covers, remixes, edits and mashes up songs you made or uploaded. The Free plan comes with 20 credits a day, and ACE-Step v1.5 XL songs use no credits on any plan. See [Pricing](/docs/api-acemusic-v1#pricing). The API signs in with the account's email and password, the way you sign in at acemusic.ai, and keeps ACE Music's session from then on. It renews the session by itself and signs in again with the stored password when ACE Music ends it. The password is used only to sign in to ACE Music and is never returned by the API. Each [useapi.net subscription](/docs/subscription) lets you connect 3 ACE Music accounts, up to 100 in total. ### Create an ACE Music account We recommend a dedicated ACE Music account for the API, separate from the one you use in your browser. 1. Open [acemusic.ai](https://acemusic.ai) and click **Sign up**. 2. Enter an email you can read and a password, then sign up. ACE Music emails a 6-digit code: enter it to verify the email. 3. Skip or finish the onboarding. Nothing else needs to be set up. To use ACE Music v1 and v1.1 beyond the Free plan's 20 daily credits, or to download WAV, MIDI and MusicXML files and split stems, subscribe to Creator or Artist on the [pricing page](https://acemusic.ai/pricing/) with that account. ### The email and password the API uses The API signs in exactly the way the [Log in](https://acemusic.ai/login/) page does, so the email and password you add are the ones you type there. Sign in once in your browser to check them: 1. Enter the account's email `1`. 2. Enter its password `2`. 3. Click **Log in** `3`. If ACE Music lets you in, the same email and password will work in [Add the account](#add-the-account) below. 4. No password yet, or forgot it? Use **Forgot password?** `4` to set one by email. Signing in to acemusic.ai in your own browser does not end the API's session. ![ACE Music Log in page: 1 Email, 2 Password, 3 Log in, 4 Forgot password?](https://media.useapi.net/acemusic/2026-11-14-setup/acemusic-setup-login-email-password.jpg) ### Accounts that sign in with Google or a phone number The API needs an email and a password. An account made with Continue with Google or with a phone number has no password yet. Set one on acemusic.ai first, for example with **Forgot password?** `4` in the Log in box (screenshot above): enter the account's email, type the 6-digit code ACE Music sends, then set a new password of 8 to 20 characters with both letters and numbers. Then add the account below with that email and password. Adding such an account before it has a password answers `400` with `ACE Music refused the email or password`. ### Add the account Paste your useapi.net API token and the account's email and password, then click Go. You can also call [POST /accounts](/docs/api-acemusic-v1/post-acemusic-accounts) directly.
The API signs in, checks the session and answers `200` with the account, its plan and the credits left. Adding the same email again with a new password replaces the stored one. ### What to expect - Signing out of acemusic.ai in your own browser does not end the API's session either. - After you change or reset the password on acemusic.ai, the stored one no longer works. Add the account again with the new password. - Each account runs up to 4 requests at a time, which is ACE Music's own limit. Lower it with `maxJobs` if you share the account with your own work on acemusic.ai. ### If the account needs attention When ACE Music refuses the stored email and password, the API pauses the account, emails you once and answers `596` for it, with the reason in `error` on [GET /accounts](/docs/api-acemusic-v1/get-acemusic-accounts). Add the account again with the current password to resume. Temporary problems never pause an account: they answer `503`, and a retry works. === URL: https://useapi.net/docs/api-acemusic-v1/delete-acemusic-accounts-email === Document URL: https://useapi.net/docs/api-acemusic-v1/delete-acemusic-accounts-email --- layout: default title: DELETE accounts/`email` description: "Remove an ACE Music account from the useapi.net ACE Music API with DELETE accounts/email. The stored password and session are deleted, the songs stay on acemusic.ai." parent: ACE Music API nav_order: 130 permalink: /docs/api-acemusic-v1/delete-acemusic-accounts-email --- ## Delete an account November 14, 2026 --- Remove a connected ACE Music account from your useapi.net account. The stored password and session are deleted and the account slot is freed. Nothing is deleted on ACE Music's side: the account's songs and uploads stay in its Library, and you can connect it again at any time with [POST /accounts](/docs/api-acemusic-v1/post-acemusic-accounts). Song and image ids of a removed account stop working until it is connected again, and a job still running on it fails with `404` at its next check. > **https://api.useapi.net/v1/acemusic/accounts/`email`** - `email` is the email of a connected account, URL-encoded in the path. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The account was removed. **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **404** **404 Not Found** ```json { "error": "Account example@example.com is not configured", "code": 404 } ``` ##### Examples **Curl** ``` bash curl -X DELETE "https://api.useapi.net/v1/acemusic/accounts/example%40example.com" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email = "example@example.com"; const response = await fetch(`https://api.useapi.net/v1/acemusic/accounts/${encodeURIComponent(email)}`, { method: "DELETE", headers: { "Authorization": `Bearer ${token}` } }); console.log(response.status); ``` **Python** ``` python import requests from urllib.parse import quote token = "API token" email = "example@example.com" response = requests.delete(f"https://api.useapi.net/v1/acemusic/accounts/{quote(email, safe='')}", headers={"Authorization": f"Bearer {token}"}) print(response.status_code) ``` === URL: https://useapi.net/docs/api-acemusic-v1/delete-acemusic-music-songid === Document URL: https://useapi.net/docs/api-acemusic-v1/delete-acemusic-music-songid --- layout: default title: DELETE music/`songId` description: "Delete an ACE Music song with DELETE music/songId in the useapi.net ACE Music API: it moves to the account's trash on acemusic.ai and leaves the Library and the API." parent: ACE Music API nav_order: 320 permalink: /docs/api-acemusic-v1/delete-acemusic-music-songid --- ## Delete a song November 14, 2026 --- Delete a song from the ACE Music Library of the account that holds it. ACE Music moves it to the account's trash, where it can be restored on acemusic.ai only. Through the API it is gone: its `songId` answers `404`, and so does a job whose songs were all deleted. > **https://api.useapi.net/v1/acemusic/music/`songId`** - `songId` is URL-encoded in the path (it contains `:` and `@`). ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The song was moved to the account's trash. **400** **400 Bad Request** ```json { "error": "Path parameter songId (not-a-song) is not a valid songId (user:--song:so_…)", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** ```json { "error": "Song user:5678-someone@example.com-song:so_91fd58fded6b4617a47a5726 is not yours", "code": 403 } ``` **404** **404 Not Found** The song is already deleted, or its account is not connected. ```json { "error": "Deleting the song: Not found", "code": 404 } ``` ##### Examples **Curl** ``` bash SONGID="user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7" curl -X DELETE -H "Authorization: Bearer …" \ "https://api.useapi.net/v1/acemusic/music/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$SONGID")" ``` **JavaScript** ``` javascript const token = "API token"; const songId = "user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7"; const response = await fetch(`https://api.useapi.net/v1/acemusic/music/${encodeURIComponent(songId)}`, { method: "DELETE", headers: { "Authorization": `Bearer ${token}` } }); console.log(response.status); ``` **Python** ``` python import requests from urllib.parse import quote token = "API token" songId = "user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7" response = requests.delete(f"https://api.useapi.net/v1/acemusic/music/{quote(songId, safe='')}", headers={"Authorization": f"Bearer {token}"}) print(response.status_code) ``` === URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-accounts-email === Document URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-accounts-email --- layout: default title: GET accounts/`email` description: "Read one ACE Music account live with GET accounts/email in the useapi.net ACE Music API: plan, billing cycle, credits left, credit costs and model text limits." parent: ACE Music API nav_order: 120 permalink: /docs/api-acemusic-v1/get-acemusic-accounts-email --- ## Retrieve an ACE Music account November 14, 2026 --- Read one connected account together with what ACE Music reports for it right now: the plan, the billing cycle, the credits left, what each request costs in credits, and the models the account can use with their text limits. Use it to check the balance before a run on ACE Music v1 or v1.1, which cost 4 credits a request. A paused account (its stored password was refused) answers with the stored fields and its `error`, without asking ACE Music. When only ACE Music's live part fails for a moment, the stored fields come back with `liveError`. > **https://api.useapi.net/v1/acemusic/accounts/`email`** - `email` is the email of a connected account, URL-encoded in the path. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "email": "example@example.com", "user_id": "1216554433", "plan": "free", "maxJobs": 4, "added": "2026-11-14T19:17:18.288Z", "health": "OK", "plan_name": "Free", "cycle": "monthly", "credits": 16, "costs": { "song": 4, "stems": { "0": 5, "2": 60 }, "video_minute": 1 }, "models": [ { "id": "acemusic-v1", "name": "ACE Music v1", "free": false, "limits": { "prompt": 2000, "style": 1000, "lyrics": 5000 } }, { "id": "acemusic-v1.1", "name": "ACE Music v1.1 Preview", "free": false, "limits": { "prompt": 2000, "style": 1000, "lyrics": 5000 } }, { "id": "ace-step-1.5-xl", "name": "ACE-Step v1.5 XL", "free": true, "limits": { "prompt": 2000, "style": 512, "lyrics": 2000 } } ], "online": true } ``` **400** **400 Bad Request** ```json { "error": "Path parameter email (not-an-email) is not a valid email", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **404** **404 Not Found** ```json { "error": "Account example@example.com is not configured", "code": 404 } ``` ##### Model ```typescript { // TypeScript, all fields are optional email: string user_id: string // ACE Music's own id of the account plan: string | null // free | creator | artist, live maxJobs: number added: string // ISO 8601 updated?: string // ISO 8601 error?: string // paused: ACE Music refused the stored password, add the account again health: 'OK' | 'error' plan_name: string | null // Free | Creator | Artist cycle: string | null // monthly or yearly billing credits: number | null // credits left. Free plans get 20 a day, Creator 1,000 and Artist 2,500 a month costs: { song: number // credits a request (two songs) costs on acemusic-v1 and acemusic-v1.1, 4 stems: Record // a stem split: "0" vocal + instrumental (mode vocals) 5, "2" every stem (mode all) 60 video_minute: number // ACE Music's price for video in a prompt, not used by this API } | null models: { id: string // the value for `model` name: string free: boolean // true: 0 credits limits: { prompt: number, style: number, lyrics: number } // maximum characters }[] online: boolean // false when ACE Music reports itself offline offlineReason?: string liveError?: string // the live part failed for a moment: only the stored fields are current } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v1/acemusic/accounts/example%40example.com" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email = "example@example.com"; const response = await fetch(`https://api.useapi.net/v1/acemusic/accounts/${encodeURIComponent(email)}`, { headers: { "Authorization": `Bearer ${token}` } }); console.log(response.status, await response.json()); ``` **Python** ``` python import requests from urllib.parse import quote token = "API token" email = "example@example.com" response = requests.get(f"https://api.useapi.net/v1/acemusic/accounts/{quote(email, safe='')}", headers={"Authorization": f"Bearer {token}"}) print(response.status_code, response.json()) ``` === URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-accounts === Document URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-accounts --- layout: default title: GET accounts description: "List every ACE Music account connected to the useapi.net ACE Music API with GET accounts: plan, maxJobs and health, read from storage with no call to ACE Music." parent: ACE Music API nav_order: 110 permalink: /docs/api-acemusic-v1/get-acemusic-accounts --- ## Retrieve ACE Music accounts November 14, 2026 --- List the ACE Music accounts connected with [POST /accounts](/docs/api-acemusic-v1/post-acemusic-accounts), keyed by email. The list is read from storage, with no call to ACE Music, so `plan` is the one last seen. For the live plan and credits left, use [GET /accounts/`email`](/docs/api-acemusic-v1/get-acemusic-accounts-email). An account whose stored password ACE Music refused shows `health: "error"` and the reason in `error`. It takes no requests until you add it again with the current password. > **https://api.useapi.net/v1/acemusic/accounts** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "example@example.com": { "email": "example@example.com", "user_id": "1216554433", "plan": "free", "maxJobs": 4, "added": "2026-11-14T19:17:18.288Z", "health": "OK" }, "example2@example.com": { "email": "example2@example.com", "user_id": "1216558877", "plan": "artist", "maxJobs": 4, "added": "2026-11-14T19:19:22.646Z", "updated": "2026-11-14T19:45:11.926Z", "health": "OK" }, "example3@example.com": { "email": "example3@example.com", "user_id": "1216561122", "plan": "creator", "maxJobs": 2, "added": "2026-11-10T08:02:41.007Z", "error": "ACE Music refused the stored email and password. Update the password with POST /accounts to resume using this account", "health": "error" } } ``` No accounts yet: ```json {} ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` ##### Model ```typescript { // TypeScript, all fields are optional [email: string]: { email: string user_id: string // ACE Music's own id of the account plan: string | null // free | creator | artist, as last seen maxJobs: number // requests the account runs at the same time, 1 to 4 added: string // ISO 8601 updated?: string // ISO 8601, the last re-add or maxJobs change error?: string // ACE Music refused the stored password: add the account again health: 'OK' | 'error' } } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v1/acemusic/accounts" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const response = await fetch("https://api.useapi.net/v1/acemusic/accounts", { headers: { "Authorization": `Bearer ${token}` } }); console.log(response.status, await response.json()); ``` **Python** ``` python import requests token = "API token" response = requests.get("https://api.useapi.net/v1/acemusic/accounts", headers={"Authorization": f"Bearer {token}"}) print(response.status_code, response.json()) ``` === URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-jobs-jobid === Document URL: https://useapi.net/docs/api-acemusic-v1/get-acemusic-jobs-jobid --- layout: default title: GET jobs/`jobid` description: "Poll an ACE Music song or stem-split job with GET jobs/jobid in the useapi.net ACE Music API: status, both songs with mp3 and play links, signed stem tracks, or the error." parent: ACE Music API nav_order: 810 permalink: /docs/api-acemusic-v1/get-acemusic-jobs-jobid --- ## Retrieve a job November 14, 2026 --- Fetch a job by its `jobid`. [POST /music](/docs/api-acemusic-v1/post-acemusic-music) and [POST /music/stems](/docs/api-acemusic-v1/post-acemusic-music-stems) return one. After an async request, or a sync one that answered `202`, poll this endpoint until `status` is `completed` or `failed`. Songs take 20 seconds to about 2 minutes and a stem split about 1.5 minutes, so polling every 10 seconds is enough. A job still running 30 minutes after it started fails with `504` when it is read. ACE Music may still finish it later, and a later read then shows it `completed`. Every read asks ACE Music for the job's songs, so links are always fresh: each song's `playUrl` and the stem track links are read again. `playUrl` is a direct link to the same MP3 for players, valid until `playUrlExpires` (about an hour): some browsers (Brave) block the redirect behind `audioUrl`. Store `audioUrl`, play `playUrl`. Stem track links are valid for 24 hours from the read. After the job ends, nothing of it is kept on our side: the record is rebuilt from the songs ACE Music keeps in the account's Library. A song deleted since, with [DELETE /music/`songId`](/docs/api-acemusic-v1/delete-acemusic-music-songid) or on acemusic.ai, is listed as `{ songId, taskId, status: "deleted" }` with no links, and the job keeps its status from the song still there. A job none of whose songs ACE Music has any more answers `404`, and any job answers `410` once it is older than 7 days. Instead of polling, pass `replyUrl` (and optionally `replyRef`) with the POST: when the job completes or fails, the API sends one `POST` of this same job record, as JSON, to that URL. See [Model](#model). > **https://api.useapi.net/v1/acemusic/jobs/`jobid`** - `jobid` is URL-encoded in the path (it contains `:` and `@`), for example `j1114201530412583907m-u1234-email%3Aexample%40example.com-task%3Aso_3f9c2a7d81e64b05a9d2c4e7.so_b6e14d0c9a7f4382be51f0a3-bot%3Aacemusic`. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** A song job (the songs are cut short here, see [POST /music](/docs/api-acemusic-v1/post-acemusic-music) for full songs): ```json { "jobid": "j1114201530412583907m-u1234-email:example@example.com-task:so_3f9c2a7d81e64b05a9d2c4e7.so_b6e14d0c9a7f4382be51f0a3-bot:acemusic", "type": "music", "status": "completed", "email": "example@example.com", "created": "2026-11-14T20:15:30.412Z", "model": "ace-step-1.5-xl", "modelUsed": "ace-step-1.5-xl", "songs": [ { "songId": "user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7", "taskId": "so_3f9c2a7d81e64b05a9d2c4e7", "status": "succeeded", "title": "Farmers Market Sunshine", "model": "ace-step-1.5-xl", "duration": 135.02, "audioUrl": "https://acemusic.ai/data/so_3f9c2a7d81e64b05a9d2c4e7.mp3", "playUrl": "https://….r2.cloudflarestorage.com/acemusic-data-prod/users/…/audio/202611/….mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261114T201722Z&X-Amz-Expires=3599&…", "playUrlExpires": "2026-11-14T21:17:21.000Z", "coverUrl": "https://acemusic.ai/data/so_3f9c2a7d81e64b05a9d2c4e7-cover.jpg?v=1794685678498", "kind": "original", "score": false }, { "songId": "user:1234-example@example.com-song:so_b6e14d0c9a7f4382be51f0a3", "taskId": "so_b6e14d0c9a7f4382be51f0a3", "status": "succeeded", "title": "Farmers Market Sunshine", "model": "ace-step-1.5-xl", "duration": 135.02, "audioUrl": "https://acemusic.ai/data/so_b6e14d0c9a7f4382be51f0a3.mp3", "playUrl": "https://….r2.cloudflarestorage.com/acemusic-data-prod/users/…/audio/202611/….mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261114T201723Z&X-Amz-Expires=3599&…", "playUrlExpires": "2026-11-14T21:17:22.000Z", "coverUrl": "https://acemusic.ai/data/so_b6e14d0c9a7f4382be51f0a3-cover.jpg?v=1794685679611", "kind": "original", "score": false } ], "completed": "2026-11-14T20:16:14.205Z" } ``` The same job after its second song was deleted with [DELETE /music/`songId`](/docs/api-acemusic-v1/delete-acemusic-music-songid): ```json { "jobid": "j1114201530412583907m-u1234-email:example@example.com-task:so_3f9c2a7d81e64b05a9d2c4e7.so_b6e14d0c9a7f4382be51f0a3-bot:acemusic", "type": "music", "status": "completed", "email": "example@example.com", "created": "2026-11-14T20:15:30.412Z", "model": "ace-step-1.5-xl", "modelUsed": "ace-step-1.5-xl", "songs": [ { "songId": "user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7", "taskId": "so_3f9c2a7d81e64b05a9d2c4e7", "status": "succeeded", "title": "Farmers Market Sunshine", "audioUrl": "https://acemusic.ai/data/so_3f9c2a7d81e64b05a9d2c4e7.mp3", "playUrl": "https://….r2.cloudflarestorage.com/acemusic-data-prod/users/…/audio/202611/….mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261114T201722Z&X-Amz-Expires=3599&…", "playUrlExpires": "2026-11-14T21:17:21.000Z" }, { "songId": "user:1234-example@example.com-song:so_b6e14d0c9a7f4382be51f0a3", "taskId": "so_b6e14d0c9a7f4382be51f0a3", "status": "deleted" } ], "completed": "2026-11-14T20:16:14.205Z" } ``` A stem split: ```json { "jobid": "j1114203012775104298s-u1234-email:example@example.com-task:so_3f9c2a7d81e64b05a9d2c4e7.0-bot:acemusic", "type": "stems", "status": "completed", "email": "example@example.com", "created": "2026-11-14T20:30:12.775Z", "stems": { "mode": "vocals", "songId": "user:1234-example@example.com-song:so_3f9c2a7d81e64b05a9d2c4e7", "tracks": [ { "type": "vocal", "url": "https://….r2.cloudflarestorage.com/acemusic-data-prod/users/…/stem/202611/…?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=86400&…", "duration": 135.02 }, { "type": "instrumental", "url": "https://….r2.cloudflarestorage.com/acemusic-data-prod/users/…/stem/202611/…?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=86400&…", "duration": 135.02 } ], "expires": "2026-11-15T20:31:40.508Z" }, "completed": "2026-11-14T20:31:39.143Z" } ``` A job that is still running or that failed answers `200` too: check `status`, and for a failed job `code` and `error`. **400** **400 Bad Request** ```json { "error": "Path parameter jobid (not-a-job) is not a valid ACE Music job id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The job belongs to another useapi.net user. ```json { "error": "Not your job", "code": 403 } ``` **404** **404 Not Found** ACE Music has none of the job's songs any more (deleted and then emptied from the trash on acemusic.ai), or the job's account was removed. ```json { "error": "Job j1114201530412583907m-u1234-email:example@example.com-task:so_3f9c2a7d81e64b05a9d2c4e7.so_b6e14d0c9a7f4382be51f0a3-bot:acemusic not found: ACE Music has none of its songs", "code": 404 } ``` ```json { "error": "Account example@example.com is not configured: the job cannot be read", "code": 404 } ``` **410** **410 Gone** The job is older than 7 days. Its songs are still in the account's Library: read them with [GET /music](/docs/api-acemusic-v1/get-acemusic-music). ```json { "error": "Job has expired: jobs can be read for 7 days", "code": 410 } ``` ##### Model The job record. [POST /music](/docs/api-acemusic-v1/post-acemusic-music) and [POST /music/stems](/docs/api-acemusic-v1/post-acemusic-music-stems) return it too, and it is the body of the `replyUrl` webhook. ```typescript { // TypeScript, all fields are optional jobid: string // j