Receive real-time notifications about music distribution, royalties, and platform events
Endpoint URL:
https://your-domain.com/webhooks/jewelmusicHeaders:
X-JewelMusic-Signature: sha256=<signature>
X-JewelMusic-Event: <event_type>
X-JewelMusic-Timestamp: <unix_timestamp>
Content-Type: application/jsonSubscribe to events that matter to your application
track.uploadedTrack successfully uploaded
track.processedTrack processing completed
track.transcribedAI transcription completed
track.analyzedMusic analysis completed
release.createdNew release created
release.submittedRelease submitted to DSPs
release.liveRelease is live on platforms
release.rejectedRelease rejected by platform
royalty.reportedNew royalty report available
royalty.payment.pendingPayment processing started
royalty.payment.completedPayment successfully sent
royalty.threshold.reachedPayment threshold reached
fraud.suspicious_activitySuspicious streaming detected
fraud.bot_detectionBot activity identified
fraud.action_requiredManual review required
fraud.resolvedFraud 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: