● v1 spec in development
basehead Local API v1
We’re building a local API for basehead right now… so your own tools can search a library, import new files and transfer sounds while basehead keeps doing its thing.
How it works
Local onlyHTTP server inside basehead on
127.0.0.1. Off by default… enabled in Options.basehead must be runningThe API lives inside the app. If basehead is closed, requests fail to connect.
HeadlessCalls return data and never touch the UI… except
select, which exists to show files to the user.MCP tooThe same commands are exposed as an MCP server so AI agents can call basehead directly.
One command layerbasehead’s own AI Agent uses these same commands… no private shortcuts.
EditionUltra only. In development… not released yet.
Auth & requests
A token is shown in Options. Copy it into your tool once and send it with every request. JSON in, JSON out. All paths are versioned under /api/v1/.
# example curl http://127.0.0.1:PORT/api/v1/status \ -H "Authorization: Bearer <token>"
| HTTP | Meaning |
|---|---|
200 | OK |
202 | Job started (import)… poll for the result |
400 | Bad request… body has { "error": "...", "detail": "..." } |
401 | Missing or wrong token |
403 | Not Ultra, or not allowed for this user |
409 | basehead is busy (e.g. another import is running) |
Connection
GET/api/v1/statusIs basehead up, what’s open
{
"version": "2026.10.27",
"database": "Main Library",
"target_app": "REAPER",
"target_running": true
}GET/api/v1/capabilitiesWhat this install can do
{
"api_version": 1,
"edition": "Ultra",
"commands": ["search", "import", "transfer", "..."]
}GET/api/v1/databasesLocal + shared databases
- Lists every local and shared database and marks the one that’s open.
Library
GET/api/v1/ucsUCS tree with file counts
- Category → SubCategory tree, with how many files in the open database fall under each.
GET/api/v1/importsImports in the open DB
- Name, id and root path of each Import.
GET/api/v1/imports/{id}/folders?path=Browse one level, paged
- Child folders and file counts under
path. Leave it empty for the Import root. - The full folder path is the folder’s id… folders aren’t stored as records.
- Built lazily, one level at a time, so it stays fast on multi-million-file libraries.
GET/api/v1/groupsGroups in the open DB
- Name and id of each Group.
GET/api/v1/collections GET/api/v1/collections/{name}?path=Collection tree
- First call lists Collection names. Second returns one Collection’s folder tree with its sounds…
pathlimits it to one subfolder. - Collections work across databases. Each sound returns its path and cached metadata, plus its
idwhen it’s in the open database.
{
"name": "Car Pass-by",
"folders": [ { "name": "Exteriors", "folders": [...], "sounds": [...] } ],
"sounds": [...]
}Search & sounds
POST/api/v1/searchFull-text search + filters
Request
{
"query": "night",
"ucs_category": "AMBIENCE",
"ucs_subcategory": "URBAN",
"folder": "/Volumes/SFX/AMBIENCE/URBAN", // path starts-with
"import_id": 42,
"min_duration": 30,
"channels": 2,
"sample_rate": 48000,
"limit": 50,
"offset": 0
}
Response
{ "total": 312, "results": [ { sound }, ... ] }
Sound object
| Field | Notes |
|---|---|
id | Database id |
unique_id | Stable across databases |
path | Full file path |
online | File exists on disk right now |
import_id, folder | Import + folder relative to its root |
catid, category, subcategory | UCS |
keywords, description | |
duration, channels, sample_rate |
limit/offsetpage the results so a broad search never returns hundreds of thousands of rows at once.
GET/api/v1/sounds/{id}One file, full details
- Everything in the sound object plus all metadata fields and markers (cue / region / loop / sync).
GET/api/v1/selectionWhat the user selected
- The files currently selected in basehead’s Results… the user picks in basehead, your tool reads them.
Actions
POST/api/v1/import GET/api/v1/import/{job_id}Index new files
Request
{
"paths": ["/Volumes/SFX/Deliveries/Ep01"], // files and/or folders
"recursive": true,
"database": "Main Library", // optional, default = open DB
"import": { "id": 42 }, // or { "new": "Ep01 Deliveries" }
"group": { "new": "Car Pass-by" } // optional, or { "id": 7 }
}
Returns right away
{ "job_id": "imp-01", "status": "running" }
Poll GET import/{job_id}
{
"status": "done", "added": 212, "skipped": 3,
"failed": [ { "path": "...", "error": "unreadable" } ],
"import_id": 42, "group_id": 7,
"assets": [ { "path": "...", "id": 88123 } ]
}
- basehead indexes files where they are… it never moves them.
POST/api/v1/selectShow files in basehead
{ "ids": [88123, 88130], "foreground": true }
- Shows and selects those files in Results so the user can tag them with basehead’s own tools.
foreground(defaultfalse):truealso brings basehead to the front…falseleaves focus with your tool.
POST/api/v1/transferCopy a sound to a folder
{
"id": 88123,
"dest": "/Projects/Ep01/SFX",
"sample_rate": 48000, // optional
"bit_depth": 24, // optional
"format": "wav" // optional: wav | flac
}
- Uses the user’s Transfer settings (rename, handles, etc.).
sample_rate/bit_depth/formatoverride for this call only… saved settings are never changed.- Returns the path of the written file.
Later after v1
Already possible inside basehead, so good candidates once v1 is solid. Not promised… tell us which ones matter to you.
| Endpoint | Does |
|---|---|
POST groups · groups/{id}/sounds | Create / rename / delete Groups, add and remove sounds |
POST collections | Create Collections and add sounds |
GET fields/{name}/values | Distinct values for autocomplete |
GET sounds/missing · duplicates | Offline media and duplicates |
POST imports/{id}/rescan | Rescan an Import |
GET targets | Target DAWs, which is running, current project |
GET daw/session-files | Files used in the open DAW project |
POST xfer | Send sounds to the DAW’s bin / pool |
GET searches/saved | Saved and recent searches |
POST reveal · open-in-editor | Finder / Explorer, wave editor |
GET sounds/{id}/stats | Peak, LUFS, DC offset |
POST convert · sausage | Format conversion, concatenate with cue markers |
POST ai/* | Generate SFX, variations, transcribe (uses credits) |
Not planned kept out
| What | Why |
|---|---|
| Spot to DAW | Outside Pro Tools, spot can only land at the DAW cursor… use transfer and place files with your own tool. |
| Metadata writes | No DB or file metadata edits through the API for now. Use select and tag in basehead. |
| Playback | The API is headless… you get the full path and audition it yourself. |
| Deletes, licensing, secrets, settings writes | Too risky for an outside tool. |
Want in?
Tell us what you plan to build and how you’d use it… it helps us decide what ships first.
basehead Local API · v1 spec · October 2026 · BaseHead, LLC. Subject to change before release.