Skip to content

For developers

Registry HTTP API

The registry's REST API sits behind the nginx proxy on the same domain (same-origin):

Method Path What it does
GET /registry/health service liveness
GET /registry/tracks track catalog
GET /registry/tracks/{isrc} track card: splits, genre, BPM
POST /registry/tracks registration (Bearer JWT; draft_id closes a DDEX draft)
GET /registry/subjects/{ndp_id} public passport status
POST /registry/subjects/mint passport mint (commitment + device key)
POST /registry/receipts/batch batch of signed §7.1 receipts
GET /registry/stats, /registry/stats/journal stats and journal
GET /payouts/me my payouts (Bearer)

Authentication: Telegram-JWT (/auth/telegram, Login Widget) for write endpoints; public ones need no token. CORS is intentionally closed: clients go same-origin or through their own proxy.

MCP server for AI agents

21 tools over the Model Context Protocol: verify_artist, register_track, identify_track, get_track_manifest, snapshot_epoch, the audit circuit (journal, stats) and more. Transports: SSE and Streamable HTTP; Bearer auth. The cloud edition runs on Cloudflare Workers.

ADNA oracle

  • POST /oracle/register — reference registration (private network);
  • identify by a v1 fingerprint (base64, 256 bytes) or v2 — windowed signatures: fragment localization inside a mix (~0.03 s), pitch/tempo ±8%, per-source attribution maps for multi-sample tracks.

CLI

ndp-cli (Python, open source): MP3/FLAC tagging with the NDT manifest, ADNA computation, comparison, receipt journal, offline settlement checks; menu wizard and TUI; --json for scripts; RU/EN locales (NDP_LANG).

main.py tag TRACK.mp3 --artist … --title … --isrc … --splits 'main:wallet:60,parent:isrc:…:40'
main.py compare a.mp3 b.mp3     # verdict: same | derivative | different

Validations to know

  • splits: total exactly 100, roles main/parent/…;
  • a derivative track: exactly one role='parent' split with wallet='isrc:<ISRC>';
  • ADNA: base64, 256 bytes;
  • ISRC: CC-XXX-YY-NNNNN.