Real-time Events

Webhook Events

Receive real-time notifications about music distribution, royalties, and platform events

Webhook Configuration
Configure your webhook endpoint to receive 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

Available Webhook Events

Subscribe to events that matter to your application

Track Events
Track
Events related to track uploads and processing
track.uploaded

Track successfully uploaded

track.processed

Track processing completed

track.transcribed

AI transcription completed

track.analyzed

Music analysis completed

Distribution Events
Distribution
Events for release distribution status
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 Events
Royalties
Events for royalty reporting and payments
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 Detection
Security
Security and fraud detection alerts
fraud.suspicious_activity

Suspicious streaming detected

fraud.bot_detection

Bot activity identified

fraud.action_required

Manual review required

fraud.resolved

Fraud issue resolved

Webhook Security
Verify webhook signatures to ensure authenticity

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');
});
Example Event Payload
Sample webhook event structure
{
  "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"
    }
  }
}
Retry Policy
Automatic retry for failed webhook deliveries

If your endpoint doesn't return a 2xx status code, we'll retry the webhook with exponential backoff:

Attempt 1Immediate
Attempt 2After 1 minute
Attempt 3After 5 minutes
Attempt 4After 30 minutes
Attempt 5After 2 hours (final)

Ready to Integrate Webhooks?

Apply for partner access to start receiving real-time events