Fingerprint API

Distributed copyright detection via listener-side audio fingerprinting. Listeners compute 64-bit spectral hashes from received audio and report them to the relay server, which aggregates reports and identifies tracks through consensus.

Listener Device Relay Server Rights DB Audio RX POST /api/fingerprint FFT 8 bands x 32 windows ────────────────────→ Aggregation 64-bit hash │ Consensus (hamming ≤ 8, N ≥ 2) │ Match → Royalty 70% rights holder 20% DJ cashback 10% platform
Base URL: https://relay.solun.art (or your self-hosted relay)

POST /api/fingerprint

Submit a fingerprint report from a listener device. The relay server aggregates reports from multiple listeners and runs consensus every 10 seconds.

Request Body

FieldTypeRequiredDescription
hash string required 64-bit fingerprint hash as hex string (16 chars)
channel string required Channel / group name the listener is receiving from
device_id string required Unique identifier for the reporting device
timestamp integer optional Unix timestamp (seconds). Server uses current time if omitted.

Request Example

// POST /api/fingerprint
// Content-Type: application/json

{
  "hash": "abcdef0123456789",
  "channel": "dj-set-tokyo",
  "device_id": "iphone-abc123",
  "timestamp": 1710000000
}

Responses

200 Report accepted

{
  "ok": true
}

400 Missing required fields

{
  "error": "missing required field: hash"
}

cURL Example

curl -X POST https://relay.solun.art/api/fingerprint \
  -H "Content-Type: application/json" \
  -d '{
    "hash": "abcdef0123456789",
    "channel": "dj-set-tokyo",
    "device_id": "iphone-abc123"
  }'

GET /api/fingerprint/matches

Retrieve current copyright detection matches for a channel. Returns the active consensus result and matched track information.

Query Parameters

ParameterTypeRequiredDescription
channel string required Channel name to query matches for

Request Example

// GET /api/fingerprint/matches?channel=dj-set-tokyo

Responses

200 Match found

{
  "channel": "dj-set-tokyo",
  "match": true,
  "track": {
    "title": "Summer Vibes",
    "artist": "DJ Example",
    "isrc": "US-XXX-24-00001"
  },
  "confidence": 0.95,
  "consensus_count": 3,
  "since": 1710000000
}

200 No match

{
  "channel": "dj-set-tokyo",
  "match": false,
  "consensus_count": 0
}

cURL Example

curl "https://relay.solun.art/api/fingerprint/matches?channel=dj-set-tokyo"

Algorithm Details

Hash Computation

The 64-bit fingerprint is computed from 5 seconds of audio at 48kHz:

ParameterValueDescription
Sample rate48,000 HzStandard audio sample rate
Window count32Audio divided into 32 time windows
Frequency bands8Spectral energy split into 8 bands
Hash size64 bits8 bands x 8 comparison bits per band
Extract interval5 secondsNew fingerprint every 5s

Consensus Protocol

The relay server aggregates fingerprint reports from multiple listeners and determines matches:

ParameterValueDescription
Hamming threshold≤ 8 bitsMax bit difference to consider two hashes matching
Min cluster size≥ 2 reportsMinimum agreeing listeners for consensus
Window60 secondsReports older than 60s are pruned
Check interval10 secondsConsensus evaluated every 10s

Revenue Split

RecipientShareDescription
Rights Holder70%Copyright owner / label
DJ Cashback20%Incentive for the broadcaster
Platform10%Soluna operations