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.
https://relay.solun.art (or your self-hosted relay)
Submit a fingerprint report from a listener device. The relay server aggregates reports from multiple listeners and runs consensus every 10 seconds.
| Field | Type | Required | Description |
|---|---|---|---|
| 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. |
// POST /api/fingerprint // Content-Type: application/json { "hash": "abcdef0123456789", "channel": "dj-set-tokyo", "device_id": "iphone-abc123", "timestamp": 1710000000 }
200 Report accepted
{
"ok": true
}
400 Missing required fields
{
"error": "missing required field: hash"
}
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"
}'
Retrieve current copyright detection matches for a channel. Returns the active consensus result and matched track information.
| Parameter | Type | Required | Description |
|---|---|---|---|
| channel | string | required | Channel name to query matches for |
// GET /api/fingerprint/matches?channel=dj-set-tokyo
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 "https://relay.solun.art/api/fingerprint/matches?channel=dj-set-tokyo"
The 64-bit fingerprint is computed from 5 seconds of audio at 48kHz:
| Parameter | Value | Description |
|---|---|---|
| Sample rate | 48,000 Hz | Standard audio sample rate |
| Window count | 32 | Audio divided into 32 time windows |
| Frequency bands | 8 | Spectral energy split into 8 bands |
| Hash size | 64 bits | 8 bands x 8 comparison bits per band |
| Extract interval | 5 seconds | New fingerprint every 5s |
The relay server aggregates fingerprint reports from multiple listeners and determines matches:
| Parameter | Value | Description |
|---|---|---|
| Hamming threshold | ≤ 8 bits | Max bit difference to consider two hashes matching |
| Min cluster size | ≥ 2 reports | Minimum agreeing listeners for consensus |
| Window | 60 seconds | Reports older than 60s are pruned |
| Check interval | 10 seconds | Consensus evaluated every 10s |
| Recipient | Share | Description |
|---|---|---|
| Rights Holder | 70% | Copyright owner / label |
| DJ Cashback | 20% | Incentive for the broadcaster |
| Platform | 10% | Soluna operations |