Skip to content
RX
Resomix Docs
B2B API
Guide
10 MIN_READ

Ingestion Requirements

Resomix sonic index protocol parameters

Everything you need in place before your catalogue can be ingested, grouped by the stage you are at. Each requirement says whether it is checked automatically — and therefore capable of rejecting a batch — or agreed with your Resomix contact.

If you are looking for the steps rather than the requirements, see Partner Onboarding. This page is the checklist behind those steps.

Validation is strict on purpose. A batch that half-imports is worse than one that is rejected: it leaves your index in a state neither side can describe. Anything that fails a check below stops the whole batch and returns the specific reason, the row number, and the ISRC or filename it applies to.


Stage 1 — Before partnership

Agreed with your Resomix contact. Nothing here is machine-checked.

RequirementWhy it matters
Rights to the recordingsYou must own or be licensed to process every recording you deliver. Resomix analyses the audio to build your private index.
Catalogue scopeAn approximate track count and expected growth rate. This sizes your index and your quota tier.
A named technical contactThe person who will receive credentials, run the first delivery, and be contacted if a batch fails.
Intended useWhich of the three query modes you plan to use — search, similarity-by-ID, similarity-by-upload — so your key is issued with the right scopes.

Stage 2 — Before your first ingestion

RequirementChecked
SFTP credentials received and tested. Confirm you can connect and list directories before preparing a real batch.Manual
Partner API key stored in a secrets manager. Never in source control, never in client-side code.Manual
Agreement on test/ vs live/. Deliveries land in one of two directories. Use test/ for your first dry run.Automatic

Your API key and SFTP credentials are tied to your organisation and grant access to your catalogue. Safeguarding them is your responsibility. If you suspect either has leaked, contact Resomix immediately so it can be rotated.


Stage 3 — Audio file requirements

Every one of these is checked automatically. A single failing file holds the entire batch.

Accepted formats

.wav, .flac, .mp3, .aiff

Anything else is rejected with INVALID_AUDIO_FORMAT. Note that .aif — the three-letter spelling — is not accepted; use .aiff.

The file must actually be audio

The extension is not taken on trust. Every file is probed with ffprobe and must contain a real, decodable audio stream with a duration above zero. A renamed text file, a truncated download, a video container, or a zero-byte placeholder fails with NOT_AUDIO.

Maximum length: 30 minutes

A track longer than 30 minutes is rejected with AUDIO_TOO_LONG. This is a hard limit of the analysis model, not a policy choice — very long files exhaust memory during embedding. DJ sets and continuous mixes need splitting before delivery.

Filenames must match the manifest exactly

The audio_filename column must match the delivered file character for character, including case and extension. A mismatch fails with MISSING_AUDIO_FILE.

The batch and the manifest must agree in both directions

  • A manifest row with no matching file → MISSING_AUDIO_FILE
  • A delivered file with no matching manifest row → EXTRA_FILE_NOT_IN_MANIFEST

Neither is treated as harmless. An unlisted file is either something you forgot to describe or something that should not have been sent.

Antivirus

Every file is scanned. An infected file fails the batch with AV_INFECTED, naming the threat.

If you deliver a .zip

Archives are accepted, with a strict allowlist applied before anything is extracted:

RuleFailure code
Flat structure only — no folders, no nested pathsZIP_CONTAINS_FOLDER
Only .csv and the four accepted audio formats insideDISALLOWED_ZIP_ENTRY
No symbolic linksZIP_SYMLINK
Uncompressed total under 10 GB, compression ratio under 100:1ZIP_BOMB

Stage 4 — Manifest requirements

One UTF-8 CSV with a header row, one row per track. An empty file fails immediately with EMPTY_CSV; a header row missing any required column fails with MISSING_HEADERS before a single row is read.

Required columns

Every row must carry all four.

ColumnRuleFailure code
isrcPresent, and a valid ISRC: 2 alphabetic country characters, 3 alphanumeric registrant characters, then 7 digits (12 total). Case-insensitive.MISSING_ISRC / INVALID_ISRC_FORMAT
titlePresent, non-empty.MISSING_TITLE
display_artistPresent, non-empty.MISSING_DISPLAY_ARTIST
audio_filenamePresent, and matches a delivered file.MISSING_AUDIO_FILENAME

ISRCs must be unique within the batch. A repeat fails with DUPLICATE_ISRC_IN_BATCH. Comparison is case-insensitive, so USRC17607839 and usrc17607839 count as the same ISRC.

Optional columns

Supply them if you have them — but if a value is present it must be valid. A malformed optional field fails the batch just as a missing required one does. An empty cell is skipped entirely.

ColumnRuleFailure code
bpmInteger between 30 and 300.INVALID_BPM / INVALID_BPM_FORMAT
duration_msPositive integer, milliseconds.INVALID_DURATION / INVALID_DURATION_FORMAT
parental_warningExactly one of NoAdviceAvailable, NotExplicit, Explicit, ExplicitContentEdited.INVALID_PARENTAL_WARNING
release_dateYYYY-MM-DD.INVALID_RELEASE_DATE
audio_languageTwo characters — an ISO code, or xx when unknown.INVALID_LANGUAGE_CODE
is_explicit0, 1, true or false.INVALID_IS_EXPLICIT
is_instrumental0, 1, true or false.INVALID_IS_INSTRUMENTAL
p_line_yearInteger between 1900 and 2100.INVALID_P_LINE_YEAR / INVALID_P_LINE_YEAR_FORMAT
upc_eanExactly 12 or 13 digits.INVALID_UPC_EAN
genre, mix_name, version_titleFree text.

Leave an optional column out entirely, or leave the cell empty, rather than guessing a value. An empty cell is skipped; a wrong one stops the batch.


Stage 5 — Delivering a batch

RequirementDetail
Order of deliveryAudio files first, then the manifest, then the .done marker last.
.done is the triggerNothing is read until it arrives. A partial or interrupted transfer is therefore never ingested by mistake — if a delivery goes wrong, re-upload and place a fresh .done at the end.
One active batch at a timeA second .done while a batch is still processing is rejected. Wait for the current batch to reach a terminal state.
Delivery is atomicAny failing check holds the whole batch. Nothing is partially indexed.

Validation runs in two passes. Cheap per-row checks (columns, formats, ranges) come first across the whole manifest; only rows that clear those are put through the expensive ffprobe and antivirus pass. This means a manifest with a typo in row 3 is reported without waiting for every file to be probed.


Stage 6 — After ingestion, and ongoing

RequirementDetail
Wait for confirmationYour catalogue is not queryable until you receive the confirmation email. Processing time scales with batch size.
Read the rejection reportIf a batch fails you receive the specific error codes, the row numbers, and the ISRC or filename each applies to. Fix and re-deliver — there is no partial retry.
Top-ups follow the same rulesAdding tracks later means another batch: audio, manifest, .done. Every requirement on this page applies again. New tracks are added on top of the existing catalogue and the private index is rebuilt.
Stay within your quotaQuery volume is subject to rate limits and monthly quotas. Ingestion volume is agreed per contract.

Pre-flight checklist

Run through this before sending your first .done:

  • Every audio file is .wav, .flac, .mp3 or .aiff
  • Every audio file opens and plays, and is under 30 minutes
  • The manifest is UTF-8 with a header row
  • The header row contains isrc, title, display_artist, audio_filename
  • Every row fills all four of those
  • Every ISRC is well-formed and appears once
  • Every audio_filename matches a delivered file exactly
  • Every delivered file appears in the manifest
  • Optional columns are either valid or absent
  • No other batch is currently processing
  • .done is the last thing you upload

Validation error reference

Every code that can stop a batch.

Manifest-level

CodeMeaning
EMPTY_CSVThe manifest file is empty.
MISSING_HEADERSThe header row is missing one or more required columns.

Required fields

CodeMeaning
MISSING_ISRCRequired isrc is empty.
INVALID_ISRC_FORMATNot a valid 12-character ISRC.
DUPLICATE_ISRC_IN_BATCHThe same ISRC appears more than once in this batch.
MISSING_TITLERequired title is empty.
MISSING_DISPLAY_ARTISTRequired display_artist is empty.
MISSING_AUDIO_FILENAMERequired audio_filename is empty.

Audio

CodeMeaning
INVALID_AUDIO_FORMATExtension is not .wav, .flac, .mp3 or .aiff.
MISSING_AUDIO_FILEA manifest row references a file that was not delivered.
EXTRA_FILE_NOT_IN_MANIFESTA delivered file is not described in the manifest.
NOT_AUDIOThe file has no decodable audio stream, or zero duration.
AUDIO_TOO_LONGThe track exceeds the 30-minute maximum.
AV_INFECTEDAntivirus flagged the file.

Optional fields

CodeMeaning
INVALID_BPM / INVALID_BPM_FORMATbpm is outside 30–300, or not an integer.
INVALID_DURATION / INVALID_DURATION_FORMATduration_ms is not a positive integer.
INVALID_PARENTAL_WARNINGNot one of the four allowed values.
INVALID_RELEASE_DATENot YYYY-MM-DD.
INVALID_LANGUAGE_CODEaudio_language is not two characters.
INVALID_IS_EXPLICIT / INVALID_IS_INSTRUMENTALNot 0, 1, true or false.
INVALID_P_LINE_YEAR / INVALID_P_LINE_YEAR_FORMATOutside 1900–2100, or not an integer.
INVALID_UPC_EANNot exactly 12 or 13 digits.

Archives

CodeMeaning
ZIP_CONTAINS_FOLDERThe archive contains directories or nested paths.
DISALLOWED_ZIP_ENTRYThe archive contains a file type other than .csv or accepted audio.
ZIP_SYMLINKThe archive contains a symbolic link.
ZIP_BOMBThe archive exceeds the 10 GB uncompressed or 100:1 ratio limit.

Next