Version 2.5.0

Node.js / JavaScript SDK

Full-featured SDK for Node.js applications with TypeScript support

Installation
Install the JewelMusic SDK using npm, yarn, or pnpm
npm install @jewelmusic/sdk
Quick Start
Get up and running with JewelMusic SDK in minutes
// ESM
import { JewelMusic } from '@jewelmusic/sdk';

// CommonJS
const { JewelMusic } = require('@jewelmusic/sdk');

// Initialize the client
const client = new JewelMusic({
  apiKey: process.env.JEWELMUSIC_API_KEY,
  environment: 'production', // or 'sandbox' for testing
  timeout: 30000, // optional: request timeout in ms
  maxRetries: 3 // optional: max retry attempts
});

// TypeScript types are included
import type { Track, Release, Artist } from '@jewelmusic/sdk';

Core Features

TypeScript Support

Full TypeScript definitions with IntelliSense support

Promise-based API

Modern async/await syntax for all operations

Tree-shakeable

Import only what you need for smaller bundles

API Examples

Track Upload
Upload and process audio tracks
// Upload a track with metadata
const track = await client.tracks.upload({
  file: fs.createReadStream('./song.mp3'),
  metadata: {
    title: 'My Song',
    artist: 'Artist Name',
    album: 'Album Name',
    genre: 'Electronic',
    releaseDate: '2025-09-01',
    copyright: '© 2025 Artist Name',
    isrc: 'USJML2500001' // optional: we can generate one
  },
  artwork: fs.createReadStream('./cover.jpg')
});

console.log('Track uploaded:', track.id);
console.log('Processing status:', track.status);
AI Transcription
Get AI-powered transcriptions and translations
// Request transcription for multiple languages
const transcription = await client.transcription.create({
  trackId: track.id,
  languages: ['en', 'ka', 'es', 'fr'],
  options: {
    includeTimestamps: true,
    wordLevelTimestamps: true,
    speakerDiarization: true,
    punctuation: true
  }
});

// Get transcription status
const status = await client.transcription.getStatus(transcription.id);

// Download transcription in different formats
const srt = await client.transcription.download(transcription.id, 'srt');
const vtt = await client.transcription.download(transcription.id, 'vtt');
const json = await client.transcription.download(transcription.id, 'json');
Distribution
Distribute music to streaming platforms
// Create a release for distribution
const release = await client.distribution.createRelease({
  type: 'album', // or 'single', 'ep'
  title: 'My Album',
  artist: 'Artist Name',
  tracks: [track.id, track2.id, track3.id],
  releaseDate: '2025-09-01',
  label: 'Independent',
  copyright: {
    text: '© 2025 Artist Name',
    year: 2025
  },
  territories: ['worldwide'], // or specific country codes
  platforms: [
    'spotify',
    'apple-music',
    'youtube-music',
    'amazon-music',
    'tidal',
    'deezer'
  ]
});

// Monitor distribution status
const distributionStatus = await client.distribution.getStatus(release.id);
console.log('Distribution progress:', distributionStatus.progress);
Royalty Reports
Access royalty data and analytics
// Get royalty reports
const reports = await client.royalties.getReports({
  startDate: '2025-01-01',
  endDate: '2025-01-31',
  groupBy: 'platform' // or 'track', 'territory', 'day'
});

// Get detailed analytics
const analytics = await client.analytics.getTrackAnalytics(track.id, {
  metrics: ['streams', 'revenue', 'listeners'],
  period: 'last_30_days',
  breakdown: 'daily'
});

// Download royalty statement
const statement = await client.royalties.downloadStatement({
  year: 2025,
  month: 1,
  format: 'pdf' // or 'csv', 'xlsx'
});
Webhook Integration
Handle webhook events
// Configure webhook endpoint
await client.webhooks.configure({
  url: 'https://your-domain.com/webhooks',
  events: [
    'track.processed',
    'release.live',
    'royalty.reported'
  ],
  secret: process.env.WEBHOOK_SECRET
});

// Verify webhook signature (in your webhook handler)
const isValid = client.webhooks.verifySignature(
  payload,
  signature,
  secret
);

// Parse webhook event
const event = client.webhooks.parseEvent(payload);

switch(event.type) {
  case 'track.processed':
    console.log('Track processed:', event.data.trackId);
    break;
  case 'release.live':
    console.log('Release is live:', event.data.releaseId);
    break;
}
Error Handling
Comprehensive error handling with detailed messages
import { JewelMusicError, ValidationError, RateLimitError } from '@jewelmusic/sdk';

try {
  const track = await client.tracks.upload({
    file: audioFile,
    metadata: metadata
  });
} catch (error) {
  if (error instanceof ValidationError) {
    console.error('Validation failed:', error.errors);
  } else if (error instanceof RateLimitError) {
    console.error('Rate limited. Retry after:', error.retryAfter);
  } else if (error instanceof JewelMusicError) {
    console.error('API error:', error.message, error.code);
  } else {
    console.error('Unexpected error:', error);
  }
}
Configuration Options
Customize SDK behavior
const client = new JewelMusic({
  // Required
  apiKey: 'jml_live_your_api_key',
  
  // Optional configurations
  environment: 'production', // 'production' | 'sandbox'
  apiVersion: 'v1', // API version
  timeout: 30000, // Request timeout in milliseconds
  maxRetries: 3, // Maximum retry attempts
  retryDelay: 1000, // Initial retry delay in ms
  
  // Advanced options
  httpAgent: customAgent, // Custom HTTP agent
  httpsAgent: customHttpsAgent, // Custom HTTPS agent
  proxy: {
    host: 'proxy.example.com',
    port: 8080,
    auth: {
      username: 'user',
      password: 'pass'
    }
  },
  
  // Logging
  logger: console, // Custom logger instance
  logLevel: 'info', // 'debug' | 'info' | 'warn' | 'error'
  
  // Hooks
  onRequest: (config) => {
    console.log('Request:', config);
    return config;
  },
  onResponse: (response) => {
    console.log('Response:', response);
    return response;
  },
  onError: (error) => {
    console.error('Error:', error);
    throw error;
  }
});

Ready to Build?

Get started with the JewelMusic Node.js SDK today