Skip to content

HTTP API

The Miso service answers these routes. The client uses nothing else, so this is the complete surface.

This is not a public API with a stability promise. It is documented because it is useful when scripting against your own instance.

Method Path Answers
GET /api/health Version and whether the database opened, or 503 with a detail. Never probes audio.cpp
GET /api/settings Settings
PUT /api/settings Settings
GET /api/backend/status Backend status. Takes an optional ?url= to test an address before saving
POST /api/backend/unload Frees every model on the backend
Method Path Answers
GET /api/catalog The merged catalog
POST /api/catalog/packages/:id/install Catalog
POST /api/catalog/packages/:id/install/stop Catalog
DELETE /api/catalog/packages/:id Catalog
POST /api/catalog/partials/clean What was cleaned
Method Path Answers
GET /api/projects Projects
POST /api/projects The new project
GET /api/projects/:id The project and its assets
PATCH /api/projects/:id The project
DELETE /api/projects/:id The projects that are left
GET /api/library Every take in every project, newest first, without peaks
GET /api/storage Storage usage

GET /api/library is the one read that crosses projects. It selects columns by name so the peaks column is never read. Peaks are about 23 KB a row, the library draws no waveforms, and the whole list for 35 takes is 31 KB without them.

Method Path Answers
POST /api/projects/:id/assets The new asset. The raw file is the request body
GET /api/projects/:id/assets/:assetId One take whole, peaks included
PATCH /api/projects/:id/assets/:assetId The asset
DELETE /api/projects/:id/assets/:assetId The assets that are left
GET /api/projects/:id/assets/:assetId/audio The file, 200 or 206 by range
GET /api/projects/:id/assets/:assetId/download The file as an attachment
PUT /api/projects/:id/assets/:assetId/peaks The asset, with peaks the browser computed
POST /api/projects/:id/assets/:assetId/peaks/read The asset, with peaks read on the service, or 415 for a format it will not read
Method Path Answers
GET /api/tasks Every task this build can run
GET /api/projects/:id/jobs Jobs, newest first
POST /api/projects/:id/jobs The queued job, and the worker is woken
DELETE /api/projects/:id/jobs/:jobId The cancelled job, or 409 if it already started
POST /api/projects/:id/jobs/dismiss Every finished job hidden from the queue. The rows are kept
GET /api/projects/:id/jobs/:jobId/outputs.zip Every take one job produced, as a stored zip streamed from disk
POST /api/projects/:id/jobs/:jobId/mix A separation’s stems summed into a new take, and whether it clipped
Method Path Answers
POST /api/lyrics/write A lyric sheet and a title, or 409 if no engine is configured
POST /api/lyrics/enhance The expansion beside the prompt it came from
GET /api/saved Saved prompts. Takes an optional ?kind=prompt or ?kind=lyrics
POST /api/saved The saved item, replacing whatever was under that name
DELETE /api/saved/:id The items that are left

Scores and MIDI artifacts are served separately from assets, because neither is one.

Method Path Answers
GET /api/projects/:id/assets/:assetId/score The ABC score as text/vnd.abc, from the database column
GET /api/projects/:id/scores The project’s scores, for the YuE2 score picker
GET /api/projects/:id/midi The project’s MIDI artifacts
GET /api/projects/:id/midi/:midiId/download The .mid file

There is no way to create or delete a score on its own. A score arrives with the take it planned and leaves with it, as a database cascade.