The table below shows the state transitions you may receive:
state.primary
state.supplement
Meaning
QC
PENDING
Photos submitted, under quality review
QC
REJECTED
Photos failed quality review — a media_rejected event follows with details
QC
APPROVED
Photos passed QC, authentication starting
UNDERWAY
ASSIGNED
Authenticator assigned
COMPLETE
APPROVED
Item is authentic
COMPLETE
REJECTED
Item is not authentic
The most important transition is COMPLETE + APPROVED or COMPLETE + REJECTED — this is the final authentication result. See Service Request States for the full state machine.Using the TypeScript SDK (v0.2.0+), you can check these with isAuthentic(event) and isCounterfeit(event) instead of comparing strings manually. See Handling Webhooks.
Sent when uploaded images fail quality control. Each rejected image includes the side name and rejection reason so you can prompt the user to re-upload specific photos.
{ "event_type": "media_rejected", "sr_uuid": "b16c763b-1723-455d-ba29-164418044886", "reference_id": "YOUR-INTERNAL-ITEM-ID", "sides": [ { "side": "Front", "reason": "Image is Blurry", "message": "The submitted image is too blurry. Please capture a clearer photo, ensuring minimal motion for better accuracy." }, { "side": "Interior", "reason": "Insufficient Lighting", "message": "The lighting in the submitted image is insufficient. Please take a new photo with better lighting for improved visibility." } ], "timestamp": "2026-02-10T12:15:00.000Z"}
Rejection reason. These are human-readable strings from the Legitmark reasons database (e.g. "Image is Blurry", "Insufficient Lighting"). Values may change as new reasons are added.
When you receive a media_rejected event, the user needs to re-upload the specific rejected sides before the service request can proceed. Prompt them with the side name and message for the best experience.
Using the TypeScript SDK, needsResubmission(event) returns true for this event type. See Handling Webhooks.