Creating Dispatch Packages
Step-by-step guide to creating SCORM dispatch packages for third-party LMS distribution.
Table of Contents
- Prerequisites
- Creating via Dashboard
- Creating via API
- Configuration Options
- Downloading the Package
- Best Practices
Prerequisites
- SCORM API account with active subscription
- At least one uploaded SCORM package
- API key with
writescope (for API method)
Creating via Dashboard
Step 1: Navigate to Dispatch Page
- Sign in to your SCORM API dashboard
- Navigate to Dashboard → Dispatch
- Click "Create Dispatch"
Step 2: Select Source Package
- Choose a SCORM package from the dropdown
- Packages are listed by title and version
- 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
- Click "Create Dispatch"
- Wait for package generation (typically <5 seconds)
- Click "Download ZIP" to download the dispatch package
- 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_idthat 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_idthat 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
- Navigate to Dashboard → Dispatch
- Find your dispatch package
- Click "Download ZIP"
- 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
- Dispatch Overview - Understanding dispatch packages
- Distributing Dispatch Packages - Distribution guide
- API Reference - Complete API docs
Last Updated: 2025-01-15