Receive real-time notifications about music distribution, royalties, and platform events
Endpoint URL:
https://your-domain.com/webhooks/jewelmusic
Headers:
X-JewelMusic-Signature: sha256=<signature>
X-JewelMusic-Event: <event_type>
X-JewelMusic-Timestamp: <unix_timestamp>
Content-Type: application/json
Subscribe to events that matter to your application
track.uploaded
Track successfully uploaded
track.processed
Track processing completed
track.transcribed
AI transcription completed
track.analyzed
Music analysis completed
release.created
New release created
release.submitted
Release submitted to DSPs
release.live
Release is live on platforms
release.rejected
Release rejected by platform
royalty.reported
New royalty report available
royalty.payment.pending
Payment processing started
royalty.payment.completed
Payment successfully sent
royalty.threshold.reached
Payment threshold reached
fraud.suspicious_activity
Suspicious streaming detected
fraud.bot_detection
Bot activity identified
fraud.action_required
Manual review required
fraud.resolved
Fraud issue resolved
All webhook requests include a signature in the X-JewelMusic-Signature
header. Verify this signature to ensure the webhook is from JewelMusic:
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from('sha256=' + expectedSignature)
);
}
// In your webhook handler
app.post('/webhooks/jewelmusic', (req, res) => {
const signature = req.headers['x-jewelmusic-signature'];
const payload = JSON.stringify(req.body);
if (!verifyWebhookSignature(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Process the webhook event
const event = req.body;
console.log('Received event:', event.type);
res.status(200).send('OK');
});
{
"id": "evt_1234567890",
"type": "release.live",
"created": 1693526400,
"data": {
"release_id": "rel_abc123def456",
"title": "My Album",
"artist": "Artist Name",
"status": "live",
"platforms": [
{
"name": "spotify",
"status": "live",
"url": "https://open.spotify.com/album/..."
},
{
"name": "apple_music",
"status": "live",
"url": "https://music.apple.com/album/..."
}
],
"metadata": {
"isrc": "USJML2500001",
"upc": "123456789012",
"release_date": "2025-09-01"
}
}
}
If your endpoint doesn't return a 2xx status code, we'll retry the webhook with exponential backoff: