Music Delivery API reference
The generated reference below follows the canonical OpenAPI 3.1 contract. Read the quickstart and operational guides before enabling writes for a Partner sender.
/validateValidate a manifest without writing data
Requires `deliveries.validate`. This is a strict, write-free dry run. The response uses stable issue codes and JSONPath locations. When the publication-attestation rollout applies, a valid response also returns the exact public account/sender binding, normalized business-manifest SHA-256, territories, and resolved video-use scope needed to construct `rightsDeclaration`. Validation creates no acceptance evidence.
Request body
Requiredapplication/jsonSchemaDeliveryManifestV1
{
"schemaVersion": "kasty.music.delivery.v1",
"message": {
"id": "kasty-canary-2026-0001",
"type": "NEW_RELEASE",
"createdAt": "2026-07-14T12:00:00.000Z"
},
"defaults": {
"videoUse": {
"mode": "DISABLED"
}
},
"parties": [
{
"ref": "artist:kasty-canary-signal",
"kind": "ORGANIZATION",
"displayName": "Kasty Canary Signal"
}
],
"recordings": [
{
"ref": "recording:canary-signal",
"title": "Canary Signal",
"artistRefs": [
"artist:kasty-canary-signal"
],
"identifiers": {
"senderRecordingId": "kasty-canary-recording"
},
"masterAssetRef": "asset:canary-master"
}
],
"releases": [
{
"ref": "release:canary-signal",
"title": "Canary Signal",
"type": "SINGLE",
"primaryArtistRef": "artist:kasty-canary-signal",
"coverAssetRef": "asset:canary-cover",
"tracks": [
{
"recordingRef": "recording:canary-signal",
"discNumber": 1,
"trackNumber": 1,
"sequence": 1
}
],
"identifiers": {},
"dealRefs": [
"deal:canary-listening-worldwide"
]
}
],
"assets": [
{
"ref": "asset:canary-master",
"fileName": "canary-master.wav",
"contentType": "audio/wav",
"sizeBytes": 176444,
"checksumSha256": "9e7d1ee7be1fe98a6d6fa46159666e7fc49ce044d44fe3a8153bafa76a25d18a"
},
{
"ref": "asset:canary-cover",
"fileName": "canary-cover.png",
"contentType": "image/png",
"sizeBytes": 20726,
"checksumSha256": "ad8ab180c85527e603f83e4b79a13a7a1a94597415d3f7f0478d1b35ce455bc5"
}
],
"deals": [
{
"ref": "deal:canary-listening-worldwide",
"use": "LISTENING",
"territories": [
"WORLDWIDE"
],
"startsAt": null,
"endsAt": null,
"recordingRefs": [
"recording:canary-signal"
],
"releaseRefs": [
"release:canary-signal"
]
}
]
}
Responses
Validation completed, including invalid manifests.
application/jsonSchemaValidationResponse
{
"valid": true,
"manifestSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"itemCount": 7,
"issues": [],
"publicationAttestation": {
"required": true,
"declarationVersion": "KASTY_PARTNER_DELIVERY_RIGHTS_V1",
"catalogAccountPublicId": "catalog_public_1",
"senderPublicId": "sender_public_1",
"channel": "PARTNER_API",
"scope": {
"releaseCount": 1,
"recordingCount": 1,
"assetCount": 2,
"territories": [
"WORLDWIDE"
],
"videoUse": {
"modes": {
"UNDECIDED": 0,
"DISABLED": 1,
"FULL": 0,
"CLIP": 0
},
"commercialUseRecordingCount": 0
}
}
}
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Manifest bytes or entity count exceed the credential/channel quota.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_LIMIT_EXCEEDED",
"message": "Delivery manifest exceeds the accepted limit"
}
Human Partner agreement/payment state or this delivery's exact rights declaration is missing. A machine credential cannot create a human acceptance or payment acknowledgement. Follow `actionUrl` where present, then validate and submit the unchanged draft again.
application/jsonSchemaError
{
"code": "PARTNER_PAYMENT_ACKNOWLEDGEMENT_REQUIRED",
"message": "Confirm the current Partner payment terms before delivering new releases",
"currentEpoch": 3,
"actionUrl": "https://agreements.kasty.uk/programs/KASTY_PARTNERS/payment-acknowledgement?catalogAccountId=catalog_public_1"
}
{
"code": "DELIVERY_RIGHTS_ATTESTATION_REQUIRED",
"message": "Confirm that the represented organization controls the rights required for this delivery"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
/List delivery batches for the authenticated sender
Requires `deliveries.read`. Results are scoped to both the authenticated sender and catalog account, newest first.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
cursor | query | No | string | Opaque cursor returned by the previous page. |
limit | query | No | integer | — |
status | query | No | BatchStatus | — |
search | query | No | string | — |
Responses
One delivery batch page.
application/jsonSchemaBatchPage
Cursor or requested page size is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_CURSOR_INVALID",
"message": "Cursor or page limit is invalid"
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
/Submit a durable delivery message
Requires `deliveries.write`. `NEW_RELEASE`, `METADATA_UPDATE`, `ASSET_UPDATE`, `DEAL_UPDATE`, and `TAKEDOWN` use this endpoint and append history; updates never overwrite prior deliveries. The pair `(authenticated sender, message.id)` is the idempotency key. Replaying the same normalized SHA-256 and complete evidence SHA-256 returns the existing batch. Different content or publication evidence with the same key returns a conflict. Partner API/bulk submission requires a declaration bound to the validation hash; the server independently resolves the current agreement acceptance, payment regime, declaration, and video-use scope in the acceptance transaction.
Request body
Requiredapplication/jsonSchemaDeliveryManifestV1
{
"schemaVersion": "kasty.music.delivery.v1",
"message": {
"id": "kasty-canary-2026-0001",
"type": "NEW_RELEASE",
"createdAt": "2026-07-14T12:00:00.000Z"
},
"defaults": {
"videoUse": {
"mode": "DISABLED"
}
},
"parties": [
{
"ref": "artist:kasty-canary-signal",
"kind": "ORGANIZATION",
"displayName": "Kasty Canary Signal"
}
],
"recordings": [
{
"ref": "recording:canary-signal",
"title": "Canary Signal",
"artistRefs": [
"artist:kasty-canary-signal"
],
"identifiers": {
"senderRecordingId": "kasty-canary-recording"
},
"masterAssetRef": "asset:canary-master"
}
],
"releases": [
{
"ref": "release:canary-signal",
"title": "Canary Signal",
"type": "SINGLE",
"primaryArtistRef": "artist:kasty-canary-signal",
"coverAssetRef": "asset:canary-cover",
"tracks": [
{
"recordingRef": "recording:canary-signal",
"discNumber": 1,
"trackNumber": 1,
"sequence": 1
}
],
"identifiers": {},
"dealRefs": [
"deal:canary-listening-worldwide"
]
}
],
"assets": [
{
"ref": "asset:canary-master",
"fileName": "canary-master.wav",
"contentType": "audio/wav",
"sizeBytes": 176444,
"checksumSha256": "9e7d1ee7be1fe98a6d6fa46159666e7fc49ce044d44fe3a8153bafa76a25d18a"
},
{
"ref": "asset:canary-cover",
"fileName": "canary-cover.png",
"contentType": "image/png",
"sizeBytes": 20726,
"checksumSha256": "ad8ab180c85527e603f83e4b79a13a7a1a94597415d3f7f0478d1b35ce455bc5"
}
],
"deals": [
{
"ref": "deal:canary-listening-worldwide",
"use": "LISTENING",
"territories": [
"WORLDWIDE"
],
"startsAt": null,
"endsAt": null,
"recordingRefs": [
"recording:canary-signal"
],
"releaseRefs": [
"release:canary-signal"
]
}
]
}
{
"schemaVersion": "kasty.music.delivery.v1",
"message": {
"id": "label-2026-0002",
"type": "METADATA_UPDATE",
"createdAt": "2026-07-14T13:00:00.000Z"
},
"parties": [],
"recordings": [],
"releases": [],
"assets": [],
"deals": []
}
{
"schemaVersion": "kasty.music.delivery.v1",
"message": {
"id": "label-2026-0003",
"type": "TAKEDOWN",
"createdAt": "2026-07-14T14:00:00.000Z"
},
"parties": [],
"recordings": [],
"releases": [],
"assets": [],
"deals": []
}
Responses
Delivery accepted or idempotently replayed.
application/jsonSchemaSubmitResponse
{
"batchPublicId": "4b0588eb-2bfd-4db5-9d20-218bf131940a",
"status": "ACCEPTED",
"replayed": false
}
Manifest or requested operation is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_INVALID",
"message": "Delivery manifest is invalid",
"issues": [
{
"code": "REQUIRED",
"severity": "BLOCKING",
"retryable": false,
"message": "Required value is missing",
"suggestedAction": "Correct the manifest and validate again.",
"entityType": "RELEASE",
"externalRef": "release:single-42",
"jsonPath": "$.releases[0].title",
"fileRef": null
}
]
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Sender/message identity conflicts with prior content/evidence, or the authenticated channel is not activated for the requested delivery.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_IDEMPOTENCY_PAYLOAD_MISMATCH",
"message": "This sender and message ID were already used with different content"
}
{
"code": "MUSIC_DELIVERY_IDEMPOTENCY_EVIDENCE_MISMATCH",
"message": "This sender and message ID were already used with different publication evidence"
}
{
"code": "MUSIC_DELIVERY_DDEX_MAPPING_REQUIRED",
"message": "DDEX delivery requires an activated sender-specific bilateral mapping"
}
Manifest bytes or entity count exceed the credential/channel quota.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_LIMIT_EXCEEDED",
"message": "Delivery manifest exceeds the accepted limit"
}
Human Partner agreement/payment state or this delivery's exact rights declaration is missing. A machine credential cannot create a human acceptance or payment acknowledgement. Follow `actionUrl` where present, then validate and submit the unchanged draft again.
application/jsonSchemaError
{
"code": "PARTNER_PAYMENT_ACKNOWLEDGEMENT_REQUIRED",
"message": "Confirm the current Partner payment terms before delivering new releases",
"currentEpoch": 3,
"actionUrl": "https://agreements.kasty.uk/programs/KASTY_PARTNERS/payment-acknowledgement?catalogAccountId=catalog_public_1"
}
{
"code": "DELIVERY_RIGHTS_ATTESTATION_REQUIRED",
"message": "Confirm that the represented organization controls the rights required for this delivery"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
Partner delivery mutations are closed for this rollout stage or the authenticated sender is outside the active write cohort.
application/jsonSchemaError
{
"code": "MUSIC_V2_PARTNER_WRITES_DISABLED",
"message": "Partner delivery writes are not enabled for this rollout stage"
}
/{batchPublicId}Read batch status and counters
Requires `deliveries.read`. Reads are scoped to both sender and catalog account.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
Responses
Current durable batch state.
application/jsonSchemaBatch
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
/{batchPublicId}/itemsList independently progressing delivery items
Requires `deliveries.read`. Cursor order is stable by creation time and opaque ID.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
cursor | query | No | string | Opaque cursor returned by the previous page. |
limit | query | No | integer | — |
Responses
One item page.
application/jsonSchemaItemPage
Cursor or requested page size is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_CURSOR_INVALID",
"message": "Cursor or page limit is invalid"
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
/{batchPublicId}/issuesList stable machine-readable issues
Requires `deliveries.read`. Blocking, retryable, and resolved state are explicit.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
cursor | query | No | string | Opaque cursor returned by the previous page. |
limit | query | No | integer | — |
Responses
One issue page.
application/jsonSchemaIssuePage
Cursor or requested page size is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_CURSOR_INVALID",
"message": "Cursor or page limit is invalid"
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
/{batchPublicId}/uploads/intentsCreate or renew a scoped object upload intent
Requires `assets.upload`. The server derives the object key from the authenticated account and batch; arbitrary bucket or object keys are never accepted.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
Request body
Requiredapplication/jsonSchemaUploadIntentRequest
Responses
Upload intent and a short-lived object-scoped write URL.
application/jsonSchemaUploadIntent
Manifest or requested operation is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_INVALID",
"message": "Delivery manifest is invalid",
"issues": [
{
"code": "REQUIRED",
"severity": "BLOCKING",
"retryable": false,
"message": "Required value is missing",
"suggestedAction": "Correct the manifest and validate again.",
"entityType": "RELEASE",
"externalRef": "release:single-42",
"jsonPath": "$.releases[0].title",
"fileRef": null
}
]
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Human Partner agreement/payment state or this delivery's exact rights declaration is missing. A machine credential cannot create a human acceptance or payment acknowledgement. Follow `actionUrl` where present, then validate and submit the unchanged draft again.
application/jsonSchemaError
{
"code": "PARTNER_PAYMENT_ACKNOWLEDGEMENT_REQUIRED",
"message": "Confirm the current Partner payment terms before delivering new releases",
"currentEpoch": 3,
"actionUrl": "https://agreements.kasty.uk/programs/KASTY_PARTNERS/payment-acknowledgement?catalogAccountId=catalog_public_1"
}
{
"code": "DELIVERY_RIGHTS_ATTESTATION_REQUIRED",
"message": "Confirm that the represented organization controls the rights required for this delivery"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
Partner delivery mutations are closed for this rollout stage or the authenticated sender is outside the active write cohort.
application/jsonSchemaError
{
"code": "MUSIC_V2_PARTNER_WRITES_DISABLED",
"message": "Partner delivery writes are not enabled for this rollout stage"
}
/{batchPublicId}/uploads/{intentPublicId}/completeVerify and complete an uploaded asset
Requires `assets.upload`; object size, media type, and checksum are verified server-side.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
intentPublicId | path | Yes | string · uuid | — |
Responses
Verification work accepted.
application/jsonSchemaUploadCompletion
Manifest or requested operation is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_INVALID",
"message": "Delivery manifest is invalid",
"issues": [
{
"code": "REQUIRED",
"severity": "BLOCKING",
"retryable": false,
"message": "Required value is missing",
"suggestedAction": "Correct the manifest and validate again.",
"entityType": "RELEASE",
"externalRef": "release:single-42",
"jsonPath": "$.releases[0].title",
"fileRef": null
}
]
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Catalog coordination has not reached this declared asset yet. Refresh batch/item state and retry completion with bounded backoff.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_CATALOG_NOT_READY",
"message": "Catalog coordination has not reached this asset yet; retry shortly"
}
Upload URL expired; renew the scoped intent before retrying.
application/jsonSchemaError
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
Partner delivery mutations are closed for this rollout stage or the authenticated sender is outside the active write cohort.
application/jsonSchemaError
{
"code": "MUSIC_V2_PARTNER_WRITES_DISABLED",
"message": "Partner delivery writes are not enabled for this rollout stage"
}
/{batchPublicId}/retryRetry retryable failed items
Requires `deliveries.write`. Permanent validation failures cannot be retried.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
batchPublicId | path | Yes | string · uuid | — |
Request body
Optionalapplication/jsonSchemaobject
Responses
Retryable issues were resolved and durable work was requeued.
application/jsonSchemaobject
Manifest or requested operation is invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_MANIFEST_INVALID",
"message": "Delivery manifest is invalid",
"issues": [
{
"code": "REQUIRED",
"severity": "BLOCKING",
"retryable": false,
"message": "Required value is missing",
"suggestedAction": "Correct the manifest and validate again.",
"entityType": "RELEASE",
"externalRef": "release:single-42",
"jsonPath": "$.releases[0].title",
"fileRef": null
}
]
}
Credential is missing, expired, revoked, or invalid.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_AUTH_INVALID",
"message": "Invalid music delivery credential"
}
Credential lacks the operation scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_SCOPE_REQUIRED",
"message": "Credential does not grant the required scope"
}
Batch does not exist in the authenticated sender/account scope.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_BATCH_NOT_FOUND",
"message": "Delivery batch was not found"
}
Sender/message identity conflicts with prior content/evidence, or the authenticated channel is not activated for the requested delivery.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_IDEMPOTENCY_PAYLOAD_MISMATCH",
"message": "This sender and message ID were already used with different content"
}
{
"code": "MUSIC_DELIVERY_IDEMPOTENCY_EVIDENCE_MISMATCH",
"message": "This sender and message ID were already used with different publication evidence"
}
{
"code": "MUSIC_DELIVERY_DDEX_MAPPING_REQUIRED",
"message": "DDEX delivery requires an activated sender-specific bilateral mapping"
}
Explicit endpoint bucket is exhausted.
application/jsonSchemaError
{
"code": "MUSIC_DELIVERY_RATE_LIMITED",
"message": "Music delivery request rate exceeded; retry later"
}
Partner delivery mutations are closed for this rollout stage or the authenticated sender is outside the active write cohort.
application/jsonSchemaError
{
"code": "MUSIC_V2_PARTNER_WRITES_DISABLED",
"message": "Partner delivery writes are not enabled for this rollout stage"
}
