Creating Dispatch Packages

Step-by-step guide to creating SCORM dispatch packages for third-party LMS distribution.

Table of Contents

Prerequisites

  • SCORM API account with active subscription
  • At least one uploaded SCORM package
  • API key with write scope (for API method)

Creating via Dashboard

Step 1: Navigate to Dispatch Page

  1. Sign in to your SCORM API dashboard
  2. Navigate to DashboardDispatch
  3. Click "Create Dispatch"

Step 2: Select Source Package

  1. Choose a SCORM package from the dropdown
  2. Packages are listed by title and version
  3. Only packages you own are available

Step 3: Configure Dispatch

Fill in the dispatch configuration:

  • Dispatch Name (optional): Friendly name for this dispatch
  • Client Name (optional): Name to distinguish multiple dispatches of the same package
  • Registration Limit (optional): Maximum number of unique registrations
  • License Limit (optional): Maximum number of unique user IDs (licenses)
  • Track Licenses (optional): Enable license tracking/restriction
  • Expires In Hours (optional): Hours until dispatch expires
  • Allowed Domains (optional): List of allowed domain names

Step 4: Create and Download

  1. Click "Create Dispatch"
  2. Wait for package generation (typically <5 seconds)
  3. Click "Download ZIP" to download the dispatch package
  4. Copy the Launch URL for reference

Creating via API

Create Dispatch Endpoint

curl -X POST https://app.allureconnect.com/api/customer/dispatches \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "package_id": "pkg_abc123",
    "dispatch_name": "Safety Training - Client A",
    "client_name": "Client A",
    "registration_limit": 1000,
    "license_limit": 500,
    "track_licenses": true,
    "expires_in_hours": 8760,
    "allowed_domains": ["client-a-lms.com", "training.client-a.com"]
  }'

Response:

{
  "dispatch": {
    "id": "dispatch_xyz789",
    "tenant_id": "550e8400-e29b-41d4-a716-446655440000",
    "package_id": "pkg_abc123",
    "dispatch_name": "Safety Training - Client A",
    "client_name": "Client A",
    "registration_limit": 1000,
    "license_limit": 500,
    "track_licenses": true,
    "expires_at": "2026-01-15T10:30:00.000Z",
    "allowed_domains": ["client-a-lms.com", "training.client-a.com"],
    "status": "active",
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "launch_url": "https://app.allureconnect.com/player/dispatch/eyJhbGciOiJIUzI1NiIs...",
    "created_at": "2025-01-15T10:30:00.000Z"
  }
}

Download Dispatch ZIP

curl -X GET "https://app.allureconnect.com/api/customer/dispatches/dispatch_xyz789/zip" \
  -H "X-API-Key: your-api-key" \
  --output dispatch-package.zip

Configuration Options

Dispatch Name

Purpose: Friendly identifier for the dispatch package.

Example: "Safety Training - Q1 2025"

Use When:

  • You have multiple dispatches of the same package
  • You want to distinguish dispatches in your dashboard
  • You need human-readable identifiers

Client Name

Purpose: Distinguish multiple dispatches of the same package to different clients.

Example: "Client A", "Client B"

Use When:

  • Distributing same package to multiple clients
  • Need to track usage per client
  • Want to generate client-specific reports

Registration Limit

Purpose: Maximum number of unique registrations allowed.

Example: 1000 registrations

What Counts:

  • Each unique user_id that launches the dispatch
  • Counted across all LMSs using this dispatch
  • Increments on first launch per user

Use When:

  • You want to limit total usage
  • You have usage-based pricing
  • You need to control distribution scope

License Limit

Purpose: Maximum number of unique user IDs (licenses) allowed.

Example: 500 licenses

What Counts:

  • Each unique user_id that launches
  • Separate from registration limit
  • Used for license-based restrictions

Use When:

  • You have license-based pricing
  • You need to enforce license limits
  • You want separate tracking from registrations

Track Licenses

Purpose: Enable license tracking and restriction.

Default: false

When Enabled:

  • License limit is enforced
  • Unique user IDs are tracked
  • Exceeding limit blocks new launches

Use When:

  • You have license-based business model
  • You need to enforce license limits
  • You want license usage reporting

Expires In Hours

Purpose: Set expiration time for the dispatch package.

Example: 8760 hours (1 year)

Behavior:

  • Dispatch becomes inactive after expiration
  • Existing launches may continue
  • New launches are blocked

Use When:

  • You have time-limited content
  • You want to enforce subscription periods
  • You need to control access duration

Allowed Domains

Purpose: Restrict which domains can launch the dispatch.

Example: ["client-a-lms.com", "training.client-a.com"]

Behavior:

  • Only requests from allowed domains are accepted
  • Referrer header is checked
  • Helps prevent unauthorized usage

Use When:

  • You want to restrict to specific LMSs
  • You need domain-based access control
  • You want to prevent unauthorized distribution

Downloading the Package

Via Dashboard

  1. Navigate to DashboardDispatch
  2. Find your dispatch package
  3. Click "Download ZIP"
  4. Save the file to your computer

Via API

async function downloadDispatch(dispatchId: string, apiKey: string) {
  const response = await fetch(
    `https://app.allureconnect.com/api/customer/dispatches/${dispatchId}/zip`,
    {
      headers: { 'X-API-Key': apiKey },
    }
  );

  if (!response.ok) {
    throw new Error('Download failed');
  }

  const blob = await response.blob();
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = `dispatch-${dispatchId}.zip`;
  a.click();
}

Best Practices

1. Use Descriptive Names

{
  "dispatch_name": "Safety Training - Client A - Q1 2025",
  "client_name": "Client A"
}

2. Set Appropriate Limits

  • Registration Limit: Based on expected usage
  • License Limit: Based on purchased licenses
  • Expiration: Based on content lifecycle

3. Use Client Names for Multi-Client

{
  "package_id": "pkg_abc123",
  "client_name": "Client A"
}
{
  "package_id": "pkg_abc123",
  "client_name": "Client B"
}

4. Track Licenses When Needed

{
  "license_limit": 500,
  "track_licenses": true
}

5. Set Domain Restrictions

{
  "allowed_domains": ["client-a-lms.com"]
}

Complete Example

async function createDispatchPackage(
  packageId: string,
  clientName: string
) {
  const response = await fetch(
    'https://app.allureconnect.com/api/customer/dispatches',
    {
      method: 'POST',
      headers: {
        'X-API-Key': process.env.CONNECT_API_KEY!,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        package_id: packageId,
        dispatch_name: `Training Package - ${clientName}`,
        client_name: clientName,
        registration_limit: 1000,
        license_limit: 500,
        track_licenses: true,
        expires_in_hours: 8760, // 1 year
        allowed_domains: [`${clientName.toLowerCase()}-lms.com`],
      }),
    }
  );

  const { dispatch } = await response.json();

  // Download ZIP
  const zipResponse = await fetch(
    `https://app.allureconnect.com/api/customer/dispatches/${dispatch.id}/zip`,
    {
      headers: { 'X-API-Key': process.env.CONNECT_API_KEY! },
    }
  );

  const blob = await zipResponse.blob();
  return {
    dispatch,
    zipBlob: blob,
  };
}

Related Documentation


Last Updated: 2025-01-15