Nech.PL APIs · api.nech.pl/audio/v1 · Getting Started
Stem-aware audio analysis as simple HTTP calls — emotion (valence/arousal), a ~35-dim feature stack, per-sample role, loop grading, onsets/tempo, render-ready waveform & spectrogram (FFT-as-a-service), BS.1770 loudness, and naming. Upload a clip, get JSON. Identical audio is cached server-side, so repeats are free.
Your key carries scope api:* — full access to every Nech.PL API, present and future. Health checks, the spec, and docs are public (no key).
B=https://api.nech.pl/audio/v1 # is it up? (no key needed) curl $B/healthz # who am I? curl -H "Authorization: Bearer $KEY" $B/me # analyse a clip curl -H "Authorization: Bearer $KEY" \ -F file=@track.wav $B/analyze/emotion
| Method & path | Returns |
|---|---|
| POST /analyze/emotion | valence/arousal + top emotions |
| POST /features | ~35-dim feature stack (spectral, MFCC, chroma/key, rhythm) |
| POST /analyze/samples | per-sample EDA + measured role (percs/bass/melodic/tops/atmos) |
| POST /analyze | emotion + features + sample role in one call |
| POST /grade | mechanical loop quality: 0–1 + S/A/B/C/D tier + flags |
| POST /onsets | onset times + tempo + onset rate |
| POST /waveform | [min,max] peaks + 0–1 RMS envelope (audio-reactive visuals) |
| POST /spectrum | downsampled spectrogram, bands×frames 0–1 (FFT-as-a-service) |
| POST /loudness | BS.1770 LUFS + sample/true peak + gain-to-target (−14/−9) |
| POST /naming | convention-compliant sample name from the measured role |
| POST /separate | 503 stem separation — GPU runner pending; code against it now |
| GET /healthz · /openapi.json · /docs | public: liveness · spec · interactive docs |
Interactive docs & full schema: https://api.nech.pl/audio/v1/docs · /openapi.json — generate a client in any language from the spec.
Drop nech.ts (ships with this kit) into your project — it uses only global fetch/FormData, so it runs on Node 18+, Vercel Functions and the Edge. One client, namespaced per API (nech.audio.…).
import { NechAPI } from "./nech"; const nech = new NechAPI({ token: process.env.NECHPL_TOKEN! }); const clip = await fetch(trackUrl).then(r => r.blob()); const mood = await nech.audio.emotion(clip); // { emotion: { valence, arousal, … } } const spec = await nech.audio.spectrum(clip, { bands: 64, frames: 200 }); if (mood._cache === "hit") { /* came free from the cache */ }
This is hand-built by ParVagues for the hydra-live-hexa Studio. Anything weird, a number that looks off, an endpoint you wish existed — just shout. Fast iterations, that's the point.
Welcome aboard. ⛵