DDEX Gateway
The Enterprise DDEX Gateway supports two equal integration paths. REST-first clients reference a SpaceMedia release and never need to generate XML. Standards-native clients submit their existing ERN message, keep the original payload intact, and use the same validation, delivery, acknowledgement, and webhook resources.
The gateway is part of the Enterprise Delivery API add-on. API clients receive no DDEX access until ddex:read, ddex:write, or ddex:manage is explicitly granted.
Current availability
DDEX public routes are currently available in staging for onboarding and conformance. Do not send production DDEX traffic until SpaceMedia confirms that the production routes and the specific live connection are active. A production 404 during this phase means the public DDEX route is not available in that environment; it is not a signal to retry or change credentials.
Staging add-on activation and API testing are free. An organization administrator can activate the Enterprise Delivery API add-on, create scoped credentials under Settings > DDEX Gateway, exchange them at POST /api/v1/token, inspect the standards matrix, create locked connection profiles, run validations, and test webhook receivers.
Every customer connection requires SpaceMedia connection activation review and passing conformance evidence before sandbox transport is enabled. This protects partner endpoints and is separate from release review. Customers can prepare and validate the complete integration before transport approval.
Staging simulation and real approval boundaries
Staging provides an isolated DDEX simulator while the official licensed schema assets and external approvals are pending. It lets clients exercise the complete API lifecycle without contacting a DSP, SFTP server, or partner Web Service endpoint.
| Area | Staging behavior | What it does not prove |
|---|---|---|
| Schema and AVS | Secure parsing plus structural, semantic, profile, AVS, DPID, identifier, catalog, contract, and state validation | Official XSD conformance against a licensed DDEX schema package |
| Implementation Licence | The readiness and evidence workflow can be rehearsed | Legal approval or a DDEX Implementation Licence |
| Retention | The configured 24-month policy and evidence workflow can be rehearsed | Legal approval of the retention policy |
| Partner conformance | SpaceMedia can run a deterministic sandbox suite and record SIM-STAGING-* evidence | Bilateral evidence for a concrete live connection |
| Transport | Sandbox delivery reaches simulated acknowledged state and returns delivery_simulated: true | External delivery, partner acceptance, or storefront availability |
When licensed schema assets are absent, the validation report contains the informational finding DDEX_SCHEMA_VALIDATION_SIMULATED. The gateway never reports this as XSD validation. Connection health checks return simulated: true and external_probe_performed: false when the staging simulator handled the check.
Simulated conformance can approve a sandbox connection for local testing after SpaceMedia review. It can never approve or activate a live connection. Live activation remains blocked until the official schema package, recorded licence and retention approvals, and bilateral partner conformance evidence are present.
Choose an integration path
| Path | Use it when | Source field |
|---|---|---|
| REST-first | Your system manages catalog records through the Enterprise API. | release_reference |
| Standards-native | Your system already creates ERN and needs validation, relay, or import. | native_xml |
Send exactly one source field. Native XML is preserved without rewriting sender, recipient, identifiers, deals, or valid partner extensions.
SpaceMedia review boundary
The connection's commercial_route determines the review rule.
| Commercial route | SpaceMedia review | Credits and existing delivery provider |
|---|---|---|
spacemedia_delivery_deal | Transmission waits for the existing SpaceMedia review to be approved. | The normal contracted delivery workflow remains authoritative. |
direct_partner | No SpaceMedia review is created, awaited, or changed. | DDEX processing does not consume release credits or invoke the existing delivery provider. |
Both routes still receive secure parsing, DDEX, catalog, contract, transport, and state validation. A direct partner route is not a way to bypass security or partner contract rules.
Version policy
Call GET /api/v1/ddex/standards during onboarding and store the returned matrix.
| Use | Versions |
|---|---|
| Default generated output | ERN 4.3.2 |
| REST-first generated output | ERN 4.3.2 only |
| Continuous inbound and native relay | ERN 4.3.0, 4.3.1, or 4.3.2 |
| Catalog migration only | ERN 3.8.2 or 3.8.3 after onboarding approval |
New integrations must not request ERN 3 live feeds. The gateway does not silently downgrade messages or treat ERN 4.2 as compatible with ERN 4.3.
Supported first-release profiles are Audio and Simple Audio Single. Connections pin an exact ERN version, profile, AVS revision, and either Web Service 1.8 or Cloud Storage 1.8.1 choreography. Generated operations default to AVS 011.
ERN 4.3.2 uses the exact http://ddex.net/xml/ern/432 namespace. Generated messages set ReleaseProfileVersionId to Audio or SimpleAudioSingle, use AVS 011, and do not add a non-standard MessageSchemaVersionId attribute. The gateway never treats the ERN 4.3.1 namespace as a 4.3.2 alias.
DPIDs are shown in their human-readable hyphenated form in settings. DDEX XML uses the canonical form without hyphens. For example, SpaceMedia's displayed PA-DPIDA-2025040501-N identifier is emitted as PADPIDA2025040501N inside DDEX messages.
Create a connection
Before connection creation:
- Register and attest a sender DPID.
- Select an integration owner from the same organization.
- Agree the partner DPID, actions, asset rules, acknowledgements, and environment.
- Create a sandbox connection.
- Submit it through
POST /api/v1/ddex/connections/{reference}/activation-request. - Complete SpaceMedia sandbox conformance testing before requesting live enablement.
Create the sandbox connection with a new idempotency key:
{
"name": "Partner sandbox",
"partner_name": "Partner DSP",
"sender_identity_reference": "1a12f4f0-07a1-4294-a556-21b0f59e8c42",
"integration_owner_reference": "10f94dbe-2677-49d1-91e3-3464b40edb23",
"commercial_route": "direct_partner",
"direction": "outbound",
"environment": "sandbox",
"remote_dpid": "PA-DPIDA-2026072902-N",
"ern_version": "4.3.2",
"release_profile": "Audio",
"avs_version": "011",
"choreography": "web_service_1_8",
"hosting_mode": "spacemedia_managed",
"auth_type": "bearer",
"agreement_reference": "PARTNER-SANDBOX-2026",
"capabilities": ["insert", "update", "global_takedown"]
}For spacemedia_delivery_deal, omit sender_identity_reference; SpaceMedia supplies the platform sender identity. For direct_partner, the sender identity is required and must belong to the same organization.
Create an explicit deal profile before a REST-first delivery that needs commercial rights:
{
"name": "Worldwide streaming",
"commercial_model": "SubscriptionModel",
"use_types": ["OnDemandStream"],
"territories": ["GB", "US", "DE"],
"valid_from": "2026-08-21T00:00:00Z",
"valid_until": null,
"terms": {
"rights_claimed": true
}
}Creating a connection never enables transport. It starts as a locked draft. An activation request submits it for SpaceMedia connection review and sandbox conformance testing. Transport becomes available only after the applicable connection and production-readiness checks pass. This operational review applies to all connections and is separate from SpaceMedia release review. A partner certificate is not required.
For live activation, submit a live connection for the same organization, partner DPID, ERN, release profile, AVS, and choreography as a passing sandbox connection. Live connections remain disabled until licensing, retention, bilateral agreement, connection health, compatible transport, and production-access requirements are confirmed. Staging cannot contact live DDEX endpoints.
Sender-hosted Web Service feeds are available for outbound conformance. Partner-managed outbound SFTP for Cloud Storage 1.8.1 is available with pinned host keys and streamed, size-checked, atomic publication. Web Service recipient polling and SpaceMedia-managed SFTP are enabled per connection when available and after bilateral conformance. Their unavailability does not prevent a separate connection from using another supported transport. A connection health check reports the applicable requirements explicitly.
Rotate connection credentials through POST /api/v1/ddex/connections/{reference}/rotate-secret, then run POST /api/v1/ddex/connections/{reference}/health-check. Stored credentials are encrypted and never returned.
Connection capability and contract profiles are immutable versions. To replace one, create a complete connection profile with supersedes_reference set to the prior connection reference. The prior profile becomes superseded, in-flight evidence keeps its original profile, and the replacement starts in testing.
Validate without transmission
curl --request POST \
--url https://staging.spacemedia.uk/api/v1/ddex/validations \
--header "Authorization: Bearer $SPACEMEDIA_TOKEN" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: validation-20260729-001" \
--data '{
"connection_reference": "3bc1f628-60af-4db2-b984-321c1525df20",
"release_reference": "b7a15d95-58f6-4f67-b5d1-89f4f5bfb4d8",
"deal_profile_reference": "bb9b8f3b-55b1-498f-a484-05155b8950ef",
"action": "insert"
}'The API returns 202 with a canonical status_url, correlation key, current state, and findings. Validation itself can finish in the first request, but clients must still handle the operation as asynchronous. On staging, inspect findings for DDEX_SCHEMA_VALIDATION_SIMULATED before treating a successful result as official XSD conformance.
Every finding includes a stable code, family, severity, stage, retryability, JSON Pointer or XPath, explanation, remediation, optional partner rule, and correlation key.
A successful asynchronous operation returns a public operation reference, current state, findings, canonical status URL, and correlation key:
{
"data": {
"reference": "45be9e79-f39e-4cf9-bfc8-bf9f10481da6",
"status": "ready",
"review_status": "not_required",
"transport_status": "not_started",
"partner_status": "not_started",
"findings": []
},
"status_url": "/api/v1/ddex/messages/45be9e79-f39e-4cf9-bfc8-bf9f10481da6",
"correlation_key": "ddex_01J2M4Y8Q7K3"
}Validation includes secure XML parsing, exact namespace/schema/profile/AVS pins, DPIDs, GTIN check digits, ISRC format, P-line and C-line ownership, dates, territories, verified-master MIME/size/hash, deal validity, partner-required fields, allowed actions, transport credentials, choreography/auth compatibility, duplicate messages, update ordering, and acknowledged identifier locks. Download the complete report from GET /api/v1/ddex/messages/{reference}/validation-report.
Common stable finding codes:
| Family | Codes |
|---|---|
| Secure input | DDEX_XML_EXTERNAL_ENTITY, DDEX_XML_SIZE_LIMIT, DDEX_XML_DEPTH_LIMIT, DDEX_XML_MALFORMED |
| Standard | DDEX_STANDARD_UNSUPPORTED, DDEX_NAMESPACE_VERSION_MISMATCH, DDEX_RELEASE_PROFILE_MISMATCH, DDEX_AVS_VERSION_MISMATCH, DDEX_XSD_INVALID |
| Identity and catalog | DDEX_DPID_MISMATCH, DDEX_XML_DPID_MISMATCH, DDEX_GTIN_INVALID, DDEX_ISRC_INVALID, DDEX_COPYRIGHT_FIELD_REQUIRED, DDEX_MASTER_TECHNICAL_INVALID |
| Deal and contract | DDEX_DEAL_PROFILE_REQUIRED, DDEX_DEAL_PROFILE_INACTIVE, DDEX_DEAL_TERRITORY_MISMATCH, DDEX_ACTION_NOT_CONTRACTED, DDEX_PARTNER_FIELD_REQUIRED |
| Review and transport | DDEX_SPACEMEDIA_RELEASE_REQUIRED, DDEX_SPACEMEDIA_REVIEW_REQUIRED, DDEX_TRANSPORT_CONFIGURATION_INCOMPLETE, DDEX_TRANSPORT_AUTH_INCOMPATIBLE |
| State and import | DDEX_DUPLICATE_MESSAGE, DDEX_UPDATE_BEFORE_INSERT, DDEX_ACKNOWLEDGED_IDENTIFIER_CHANGED, DDEX_IMPORT_CATALOG_COLLISION |
Deliver a release
TypeScript:
const result = await fetch("https://staging.spacemedia.uk/api/v1/ddex/deliveries", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SPACEMEDIA_TOKEN}`,
"Content-Type": "application/json",
"Idempotency-Key": "delivery-20260729-001"
},
body: JSON.stringify({
connection_reference: "3bc1f628-60af-4db2-b984-321c1525df20",
release_reference: "b7a15d95-58f6-4f67-b5d1-89f4f5bfb4d8",
deal_profile_reference: "bb9b8f3b-55b1-498f-a484-05155b8950ef",
action: "insert"
})
});
if (result.status !== 202) throw new Error(`DDEX delivery failed: ${result.status}`);
const operation = await result.json();PHP:
$response = $client->request('POST', '/api/v1/ddex/deliveries', [
'headers' => [
'Authorization' => 'Bearer '.$token,
'Idempotency-Key' => 'delivery-20260729-001',
],
'json' => [
'connection_reference' => '3bc1f628-60af-4db2-b984-321c1525df20',
'release_reference' => 'b7a15d95-58f6-4f67-b5d1-89f4f5bfb4d8',
'deal_profile_reference' => 'bb9b8f3b-55b1-498f-a484-05155b8950ef',
'action' => 'insert',
],
]);Clients choose insert, update, territorial_takedown, global_takedown, or purge. Do not classify a change as metadata-only or resource-only. Updates are complete statements of current and future deal truth. Unchanged binaries may be omitted when the connection permits it.
REST-first insert, update, and territorial_takedown operations require deal_profile_reference. The gateway does not guess commercial rights. A generated global_takedown intentionally omits the deal list, while purge creates a PurgeReleaseMessage for corrupt catalog state.
On staging, an approved sandbox connection uses the isolated transport simulator. Poll the message until it reaches acknowledged, then inspect delivery_simulated. A value of true confirms only that the local contract, queue, packaging, status, acknowledgement, and webhook lifecycle completed without external delivery.
A territorial takedown also requires an explicit subset of the selected deal profile and an ISO 8601 effective time with timezone:
{
"connection_reference": "3bc1f628-60af-4db2-b984-321c1525df20",
"release_reference": "b7a15d95-58f6-4f67-b5d1-89f4f5bfb4d8",
"deal_profile_reference": "bb9b8f3b-55b1-498f-a484-05155b8950ef",
"action": "territorial_takedown",
"metadata_overlay": {
"takedown": {
"territories": ["DE"],
"effective_at": "2026-08-01T00:00:00+02:00"
}
}
}Native relay and import
Use native_xml instead of release_reference:
{
"connection_reference": "3bc1f628-60af-4db2-b984-321c1525df20",
"action": "insert",
"native_xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ern:NewReleaseMessage>...</ern:NewReleaseMessage>"
}POST /api/v1/ddex/uploads preserves and validates a native message. POST /api/v1/ddex/imports stages a create-only inbound import under the connection's same-organization integration owner. Imports are atomic and create drafts only. UPC, ISRC, source-message, or catalog collisions block the complete import rather than creating partial catalog records.
Fields that cannot safely round-trip through the normalized catalog remain attached to the original message and appear in unmapped_fields.
Follow the returned import status_url, or call GET /api/v1/ddex/imports/{reference}, to inspect the canonical import result.
State model
Normal control progression:
accepted → validating → ready → queued → packaging → available or transferring → transferred → claimed → acknowledged
Exceptional states are blocked, rejected, failed, cancelled, and expired.
Review, transport, partner, and webhook states are separate. Recipient DELETE confirms claim only. It is not proof of processing or storefront availability. The API exposes live only after an explicit partner processing status reports it.
Retry and cancellation
- Reusing an idempotency key with the same request safely replays the outcome.
- Reusing it with a different request returns a conflict.
- Validation errors and partner rejections are not retried automatically.
- Temporary timeouts, resets, throttling, and server failures use bounded retry with backoff.
- Retry only messages that the API reports as recoverable.
- Cancel only work that has not been claimed.
Web Service and Cloud Storage
Web Service 1.8 uses the sender-hosted feed and recipient claim semantics. Resource downloads use GET /api/v1/ddex/messages/{reference}/resources/{resourceReference} with stable authenticated URLs, SHA-256 checksums, ETag, and byte-range requests through the standard Range header. Processing status remains separate from claim.
Read the Atom feed through GET /api/v1/ddex/connections/{reference}/feed. A feed contains at most the current available message for a release. A superseded payload URL returns 404.
Cloud Storage 1.8.1 supports release-by-release and negotiated batches. A message cannot enter multiple open batches. Batch completion and its manifest checksum are published after all message artifacts.
Conformance checklist
- Sandbox DPIDs and credentials are exchanged out of band.
- Exact ERN, profile, AVS, and choreography match the connection.
- Single, album, update, takedown, purge, invalid message, retry, claim, and acknowledgement fixtures pass.
- Release-by-release and batch flows are tested separately.
- Direct partner tests confirm no SpaceMedia review or credit mutation.
- SpaceMedia delivery deal tests confirm transmission cannot start before review approval.
- Duplicate, stale, out-of-order, and identifier-changing updates are rejected.
- Webhook signatures, duplicates, retries, ordering, and secret rotation are verified.
- Operational owners agree acknowledgement deadlines and escalation contacts.
Related pages
Was this page helpful?