POST /asset

Add an audio file from disk to a folder in your Curlo library, specifying its metadata at the same time. Ideal for automation: a field recorder or render pipeline drops a file, your script registers it in Curlo with title, artist, tags and UCS classification in one request.

This endpoint is also available as POST /api/asset — both paths are equivalent.

How It Works

  • folderPath must be the absolute disk path of a local folder that has already been added to Curlo. Collections are virtual and cannot be import targets.
  • If the file already lives inside the destination folder, it is indexed in place — nothing is copied.
  • Otherwise the file is copied into the folder by default; pass "move": true to move it instead. Existing files are never overwritten.
  • Physical properties (duration, sample rate, channels, format, …) are always detected automatically and cannot be overridden.
  • Metadata you provide takes precedence over values read from the file; a field you omit keeps its auto-detected value, and an empty string clears it.
  • Curlo fingerprints every import: re-adding an identical file to the same folder returns 409 with the existing asset’s ID.
  • After creation, the asset is queued for AI vector indexing in the background, so semantic search picks it up once indexing completes.

Request

{
  "filePath": "/Users/me/Downloads/boom_v2.wav",
  "folderPath": "/Volumes/SFX/Explosions",
  "move": false,
  "writeToFile": false,
  "title": "Big Boom v2",
  "artist": "StudioX",
  "genre": "Cinematic",
  "comment": "Great for trailers",
  "assetType": "sfx",
  "isFavorite": true,
  "tags": ["explosion", "cinematic"],
  "ucsCatID": "EXPLReal",
  "ucsFxName": "Boom Big 02",
  "ucsCreatorID": "StudioX",
  "ucsSourceID": "Action Pack Y"
}

Request Fields

FieldTypeDescription
filePathstringRequired. Absolute path to the audio file on disk (~ is expanded). Must use a supported format (WAV, MP3, FLAC, AIFF, …)
folderPathstringRequired. Absolute path of the destination folder — a local folder already added to Curlo
movebooleanOptional. false (default) copies the file into the folder; true moves it. Ignored when the file is already inside the destination folder
writeToFilebooleanOptional. false (default) stores metadata in Curlo’s database only; true additionally writes it into the audio file itself (standard tags, plus the UCS BEXT chunk for WAV)
titlestringOptional. Omitted = keep the value read from the file; "" clears the field. Same semantics for all metadata fields below
artiststringOptional artist override
genrestringOptional genre override
commentstringOptional comment override
albumTitlestringOptional album title override
groupingstringOptional grouping override
bpmnumberOptional BPM override
assetTypestringOptional. "sfx", "music" or "unknown"
isFavoritebooleanOptional. Mark the new asset as a favorite
tagsstring[]Optional tag names to assign. Tags that don’t exist yet are created automatically with an auto-assigned color
ucsCatIDstringOptional UCS Category ID override
ucsFxNamestringOptional UCS FxName override
ucsCreatorIDstringOptional UCS CreatorID override
ucsSourceIDstringOptional UCS SourceID override
ucsUserCategorystringOptional UCS UserCategory override
ucsVendorCategorystringOptional UCS VendorCategory override
ucsUserDatastringOptional UCS UserData override

Response

Returns 201 Created with the newly created asset — the same shape as GET /asset, plus one extra field:

{
  "id": 12347,
  "fileName": "boom_v2.wav",
  "format": "WAV",
  "duration": 3.2,
  "tags": ["explosion", "cinematic"],
  "warnings": ["Failed to create tag 'cinematic': network unavailable"]
}

Response Fields

All fields are identical to GET /asset. Additionally:

FieldTypeDescription
warningsstring[]Only present when non-fatal issues occurred (e.g. a tag could not be created, or writing metadata into the file failed). The asset itself was still created

Errors

StatusMeaning
400Missing/empty filePath or folderPath, unsupported audio format, invalid assetType, or the file could not be parsed
403Free-tier limit of 5,000 files reached
404The audio file does not exist, or folderPath doesn’t match any local folder added to Curlo
409A file with the same name already exists in the target folder, or an identical file (same fingerprint) is already indexed in it
500Unexpected server error