Validation errors
Every delivery gets a result with errors (any error rejects the batch) and warnings (the batch is
still accepted). Each issue has a stable code, a readable message, and usually a path (an ERN
location, a file in the batch, or an XML line number).
{
"id": "20261101120000000",
"object": "delivery",
"status": "rejected",
"message_type": "NewReleaseMessage",
"release_id": "aria-rel-sample-0001",
"errors": [
{ "code": "image.too_small", "message": "Cover art must be at least 3000×3000 (resources/cover.jpg is 1400×1400).", "path": "resources/cover.jpg" }
],
"warnings": [],
"received_at": "2026-11-02T18:04:11.201Z",
"completed_at": "2026-11-02T18:04:13.950Z"
}
You get this in the release.rejected or release.validated webhook and from GET /v1/deliveries/{batchId}.
To fix a rejected batch, upload a corrected one under a new batch ID.
Checking an ERN without uploading
curl -X POST https://dev.ddex-delivery.phyzi.io/v1/validate \
-H "Authorization: Bearer $PHYZI_KEY" -H "Content-Type: application/xml" \
--data-binary @aria-rel-sample-0001.xml
This runs every XML-level check (schema, required fields, track order) and returns the same shape
with "files_checked": false. File, hash and phyzi.json checks only run on a real delivery.
Error codes
| Code | Meaning |
|---|---|
batch.no_ern |
No ERN XML in the batch (BatchComplete_*.xml and phyzi/ don't count) |
batch.multiple_ern |
More than one ERN. Send one release per batch. |
xml.malformed |
Not well-formed XML |
xml.schema |
Fails the official ERN 4.3 XSD. The message names the element and the path gives the line. |
ern.message_type |
Root element isn't NewReleaseMessage or PurgeReleaseMessage |
ern.version |
Not ERN 4.3 (namespace http://ddex.net/xml/ern/43) |
ern.party_missing |
A DisplayArtist points at a party that isn't in PartyList |
release.missing |
ReleaseList has no main Release |
release.id_missing |
No ProprietaryId on the release (or on PurgedRelease) |
release.id_invalid |
Release ID uses characters other than letters, digits, . _ : -, or is over 100 long |
release.type_invalid |
ReleaseType isn't Album, EP or Single |
release.title_missing / release.artist_missing / release.genre_missing |
Required release field is empty |
release.cover_missing |
No FrontCoverImage |
release.tracklist_missing |
No ResourceGroup on the release |
release.no_tracks |
Track list has no sound recordings |
release.reference_unknown |
Track list references a resource that isn't in ResourceList |
release.too_large |
The release won't fit on a Phyzi (about 7.36 GB: lossless audio + MP3 copies + videos + cover) |
track.sequence_missing |
A track has no SequenceNumber |
track.sequence_invalid |
Track numbers on a disc (audio and videos together) aren't exactly 1…n |
track.title_missing / track.artist_missing |
Required track (or video) field is empty |
file.uri_missing |
A track or the cover has no File/URI |
file.uri_invalid |
URI is absolute, a URL, or contains .. |
file.missing |
A referenced file isn't in the batch |
file.md5_missing |
No MD5 HashSum for a file (or no md5 for a print file) |
file.md5_mismatch |
The file's MD5 doesn't match the one you sent |
audio.unreadable |
Couldn't read the audio file |
audio.format |
Audio isn't WAV (PCM) or FLAC |
audio.sample_rate |
Below 44.1 kHz |
audio.bit_depth |
Not 16 or 24-bit |
video.unreadable |
Couldn't read the video file |
video.format |
Video isn't MP4 or MOV with H.264, HEVC or ProRes |
image.unreadable |
Couldn't read the cover image |
image.format |
Cover isn't JPEG or PNG |
image.not_square |
Cover isn't square |
image.too_small |
Cover is under 3000 × 3000 |
image.colorspace |
Cover is CMYK (use RGB) |
phyzi.sidecar_missing |
No phyzi/phyzi.json |
phyzi.sidecar_invalid |
phyzi.json isn't valid JSON, has the wrong schema, or a print file is missing path |
phyzi.release_id_mismatch |
phyzi.json release_id differs from the ERN's |
phyzi.copyright_not_passed |
copyright_check.passed isn't true |
phyzi.print_role |
Print file role isn't drive_art or box_art |
Warning codes
| Code | Meaning |
|---|---|
file.unreferenced |
A file in the batch isn't referenced by the ERN or phyzi.json, so it's ignored |
audio.duration_mismatch |
The ERN Duration and the actual file length differ by more than 2 seconds |