● v1 spec in development
API icon

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>"
HTTPMeaning
200OK
202Job started (import)… poll for the result
400Bad request… body has { "error": "...", "detail": "..." }
401Missing or wrong token
403Not Ultra, or not allowed for this user
409basehead 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… path limits it to one subfolder.
  • Collections work across databases. Each sound returns its path and cached metadata, plus its id when it’s in the open database.
{
  "name": "Car Pass-by",
  "folders": [ { "name": "Exteriors", "folders": [...], "sounds": [...] } ],
  "sounds": [...]
}

Search & sounds

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 (default false): true also brings basehead to the front… false leaves 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 / format override 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.

EndpointDoes
POST groups · groups/{id}/soundsCreate / rename / delete Groups, add and remove sounds
POST collectionsCreate Collections and add sounds
GET fields/{name}/valuesDistinct values for autocomplete
GET sounds/missing · duplicatesOffline media and duplicates
POST imports/{id}/rescanRescan an Import
GET targetsTarget DAWs, which is running, current project
GET daw/session-filesFiles used in the open DAW project
POST xferSend sounds to the DAW’s bin / pool
GET searches/savedSaved and recent searches
POST reveal · open-in-editorFinder / Explorer, wave editor
GET sounds/{id}/statsPeak, LUFS, DC offset
POST convert · sausageFormat conversion, concatenate with cue markers
POST ai/*Generate SFX, variations, transcribe (uses credits)

Not planned kept out

WhatWhy
Spot to DAWOutside Pro Tools, spot can only land at the DAW cursor… use transfer and place files with your own tool.
Metadata writesNo DB or file metadata edits through the API for now. Use select and tag in basehead.
PlaybackThe API is headless… you get the full path and audition it yourself.
Deletes, licensing, secrets, settings writesToo 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.

Contact us about the API →

basehead Local API · v1 spec · October 2026 · BaseHead, LLC. Subject to change before release.