verification.score.final
A play's verification score is final
Sent once a play's score is final, which is at most about 15 minutes after the play starts, and usually within a minute of the creative finishing. Formerly verification.score, which still works as an alias. Each endpoint receives this at most once per play, even if the delivery is retried.
Subscribing an endpoint through /v1 sends this for every play in the endpoint's scope whose score becomes final after you subscribe. It never backfills: earlier plays are not sent. Score filters can't be set through /v1 yet. attestConfigId identifies the filter settings Vojo created for the endpoint when you subscribed.
Read tracks.passport and tracks.harvester for the evidence behind the score. Ignore tracks.player: Vojo's evidence sources are Passport and Harvester.
Payload
A point-in-time echo of the play's FINAL score, not a live-updating view. Sent as verification.score.final, or as verification.score to endpoints subscribed under the deprecated name. tracks.*.eventCount are raw received-event counts per track, not the lifecycle-completeness bonus used internally to compute score. If every Harvester reading arrived after the score became final, tracks.harvester.eventCount is 0, because score doesn't include them.
eventTypestringRequiredeventIdstringRequiredStable per-event id, constant across retries (injected at delivery). Dedupe on this.
playIdstringRequiredexternalIdstring or nullRequiredEchoed from the play's wrapper, if any.
attestConfigIdstringRequiredThe filter settings this play cleared. For an endpoint subscribed through /v1, this is the permissive config created automatically when the endpoint subscribed to
verification.score.attestedAtstringRequiredEpoch (seconds) this event was generated.
tracksobjectRequiredShow 3 fields
passportobjectRequiredShow 1 field
eventCountintegerRequired
playerobjectRequiredShow 1 field
eventCountintegerRequired
harvesterobjectRequiredShow 1 field
eventCountintegerRequired
scoreobjectRequiredShow 5 fields
finalinteger or nullRequiredbandstring or nullRequiredphasestringRequiredAlways FINAL — this event is only sent once a play settles.
policyVersionstring or nullRequiredscoredAtstring or nullRequired
metadataobjectRequiredYour own data, returned unchanged — never scored. Empty object when the wrapper carried none.
attemptIdstringPer-attempt id; CHANGES on each retry. Do not dedupe on this.
Handling this event
Verify the signature, reply with a 2xx within 20 seconds, then process the event in the background. Retries reuse the same event id, so deduplicate on it.