Custody SDK Events
Events in the CUSTODY_SDK product group cover vehicle custody transfers, authorization lifecycle, and credential operations. Subscribe to this group to build integrations around vehicle pickup, delivery, and chain-of-custody workflows.
All events in this group are Active and actively delivered to webhook subscribers. Contact the VECU team with any questions about relay availability.
Delivery semantics
At-least-once delivery. Consumers MUST be idempotent — the same event may be delivered more than once (network retries, regional failover).
No cross-VIN ordering is guaranteed.
Within a single authorization, use the
versionfield oncustody.authorization.modifiedandcustody.authorization.assignedto order events relative to each other. A missed or out-of-order event is detectable by a non-monotonic version sequence.On
custody.authorization.assigned, idempotent consumers should dedupe on
(authorizationId, version)— re-deliveries with the same version are duplicates of the same logical event.
Example values are illustrative
ID strings shown in this document (AUTH-xyz789abc, cred_abc123xyz,
vecu_*, etc.) are stylized examples chosen for readability. Don't
pattern-match on the literal example forms when integrating. Actual
values are server-generated and follow these formats:
authorizationId— UUID (treat as opaque; up to 128 characters)credentialId— service-assigned identifier (treat as opaque)personIdentityKey—vecu_prefix + 24 URL-safe-base64 characters (28 characters total)
Locations are emitted as plain-text street addresses (origin,
destination, and location fields on individual events), often
accompanied by coordinates (originLat, originLng,
originGeohash). There is no separate location-ID system to resolve.
Identity Fields Reference
Different events use different field names for the same person. The mapping:
| Field | Used In | Meaning |
|---|---|---|
holderId | credential.*, wallet.* | User ID of the credential or wallet holder. |
userId | authorization.*, IDV events | User ID in the authorization / IDV domain. |
personIdentityKey | custody.* | Driver's identifier in the custody domain. vecu_ + 24-character URL-safe base64. |
actor.actorId | All events (envelope) | The entity that triggered the event (may be a service, not the subject of the event). |
Treat all identity fields as opaque strings. The same person produces a stable identifier across requests within your client, so events for the same person correlate. Different clients receive different identifiers for the same person — don't compare or join identifiers across clients.
When correlating events across services, use correlationId on the envelope rather than identity field values.
Credential Service Events
Identity credentials
credential.identity.revoked — an identity credential is revoked.
ActiveSource: vecu.credential-service
credentialIdstringrequiredUnique credential identifier.
reasonstringrequiredRevocation reason. One of (X.509-derived camelCase identifiers):
unspecifiedkeyCompromise— the issuer's private key was compromisedaffiliationChanged— the holder's affiliation changedsuperseded— replaced by a newer credentialcessationOfOperation— credential use no longer neededprivilegeWithdrawn— authorization or privilege revokedfraudulent— credential determined to be fraudulentholderRequested— holder requested revocation
revokedBystringrequiredIdentifier of the user or service that initiated the revocation.
{
"id": "evt_a1b2c3d4e5f6g7h8",
"source": "vecu.credential-service",
"type": "credential.identity.revoked",
"specversion": "1.0",
"time": "2026-03-15T15:30:00.123Z",
"datacontenttype": "application/json",
"data": {
"credentialId": "cred_abc123xyz",
"reason": "fraudulent",
"revokedBy": "ops-user-42@client.example.com",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.credential-service",
"actorType": "service"
},
"metadata": {
"environment": "production",
"serviceName": "credential-service",
"serviceVersion": "0.0.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_a1b2c3d4e5f6g7h8"
}
}
}
credential.identity.issued — a new identity credential (mDoc) is issued after identity verification completes successfully.
ActiveSource: vecu.credential-service
credentialIdstringrequiredUnique credential identifier.
holderIdstringrequiredUser ID of the credential holder.
docTypestringrequiredCredential type URI. Always com.coxautoinc.vecu.identity.1 for this event.
issuedAtstringrequiredISO 8601 timestamp when the credential was issued.
expiresAtstringrequiredISO 8601 timestamp when the credential expires.
{
"id": "evt_a1b2c3d4e5f6g7h8",
"source": "vecu.credential-service",
"type": "credential.identity.issued",
"specversion": "1.0",
"time": "2026-03-15T10:30:00.123Z",
"datacontenttype": "application/json",
"data": {
"credentialId": "cred_abc123xyz",
"holderId": "vecu_gfTRAjYnn_y-8zj-aBc4dEf5",
"docType": "com.coxautoinc.vecu.identity.1",
"issuedAt": "2026-03-15T10:30:00+00:00",
"expiresAt": "2028-03-15T10:30:00+00:00",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.credential-service",
"actorType": "service"
},
"metadata": {
"environment": "production",
"serviceName": "credential-service",
"serviceVersion": "0.0.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_a1b2c3d4e5f6g7h8"
}
}
}
Custody credentials
credential.custody.revoked — a vehicle custody credential is revoked.
ActiveSource: vecu.credential-service
credentialIdstringrequiredUnique credential identifier.
reasonstringrequiredRevocation reason. Same enum as
credential.identity.revoked (X.509-derived
camelCase identifiers).
revokedBystringrequiredIdentifier of the user or service that initiated the revocation.
{
"id": "evt_b2c3d4e5f6g7h8i9",
"source": "vecu.credential-service",
"type": "credential.custody.revoked",
"specversion": "1.0",
"time": "2026-03-15T15:32:00.123Z",
"datacontenttype": "application/json",
"data": {
"credentialId": "cred_custody_xyz789",
"reason": "privilegeWithdrawn",
"revokedBy": "vecu.custody-service",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.credential-service",
"actorType": "service"
},
"metadata": {
"environment": "production",
"serviceName": "credential-service",
"serviceVersion": "0.0.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_b2c3d4e5f6g7h8i9"
}
}
}
credential.custody.issued — a vehicle custody credential is issued for a transport assignment.
ActiveSource: vecu.credential-service
credentialIdstringrequiredUnique credential identifier.
holderIdstringrequiredDriver identifier (mapped form, vecu_ + 24 chars).
docTypestringrequiredCredential type URI. Always com.coxautoinc.vecu.custody.1 for this event.
vinstringrequired17-character Vehicle Identification Number.
issuedAtstringrequiredISO 8601 timestamp when the credential was issued.
expiresAtstringrequiredISO 8601 timestamp when the credential expires.
{
"id": "evt_cf307e5abd9e459a95db4095893b1cb3",
"source": "vecu.credential-service",
"type": "credential.custody.issued",
"specversion": "1.0",
"time": "2026-03-15T14:00:00.123Z",
"datacontenttype": "application/json",
"data": {
"credentialId": "cred_f5d83a52e7b44cdbbcb2f5d79a277aeb",
"holderId": "vecu_gIZE5XjsQQE7eHWavMp0nOY3",
"docType": "com.coxautoinc.vecu.custody.1",
"vin": "19UUB2F64JA422871",
"issuedAt": "2026-03-15T14:00:00+00:00",
"expiresAt": "2026-03-16T14:00:00+00:00",
"_platform": {
"traceId": "Root=1-6a0de106-1192a9b14251546f731b3623;Parent=7d9332e7bf769cb0;Sampled=1;Lineage=2:638c6cad:0",
"actor": {
"actorId": "vecu.credential-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "credential-service",
"serviceVersion": "0.0.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_cf307e5abd9e459a95db4095893b1cb3"
}
}
}
Expiration
credential.expired — a credential reaches its expiry date and is automatically marked expired by a scheduled job.
ActiveSource: vecu.credential-service
This event fires for both identity and custody credentials — the credentialType field on the payload distinguishes them. There is no separate credential.identity.expired or credential.custody.expired event.
credentialIdstringrequiredUnique credential identifier.
credentialTypestringrequiredType of credential that expired. Identity credentials use
com.coxautoinc.vecu.identity.1; custody credentials use
com.coxautoinc.vecu.custody.1.
holderIdstringrequiredIdentifier of the credential holder.
expiredAtstringrequiredISO 8601 timestamp when the credential was marked expired.
issuedAtstringrequiredISO 8601 timestamp when the credential was originally issued.
previousStatusstringrequiredStatus the credential was in before expiration. Currently always active.
{
"id": "evt_exp_a1b2c3d4e5f6",
"source": "vecu.credential-service",
"type": "credential.expired",
"specversion": "1.0",
"time": "2026-03-15T00:00:00.123Z",
"datacontenttype": "application/json",
"data": {
"credentialId": "cred_abc123xyz",
"credentialType": "com.coxautoinc.vecu.identity.1",
"holderId": "vecu_gfTRAjYnn_y-8zj-aBc4dEf5",
"expiredAt": "2026-03-15T00:00:00+00:00",
"issuedAt": "2025-03-15T10:30:00+00:00",
"previousStatus": "active",
"_platform": {
"correlationId": "corr_exp_abc123",
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "system:expiration-handler",
"actorType": "system"
}
}
}
}
Authorization Service Events
The source identifier for authorization events is vecu.authorization (no
hyphen before "authorization"). This is a historical naming convention — new
services use hyphenated names (e.g., vecu.authorization-pool-service,
vecu.custody-service).
Authorization Pool Service Events
Custody Service Events
Authorization lifecycle
Sessions and transfers
custody.session.started — a custody session is started (the first PICKUP transfer for a session).
ActiveSource: vecu.custody-service
Published once per session — fires on the PICKUP transfer that opens the session.
vinstringrequired17-character Vehicle Identification Number.
sessionIdstringrequiredUnique session identifier.
startedBystringrequiredCredential ID of the actor who initiated the session (not a
personIdentityKey). This is the credential under which the PICKUP transfer
was authorized.
locationstringrequiredAddress string of the location where the session started.
{
"id": "evt_session_start_p4q5r6",
"source": "vecu.custody-service",
"type": "custody.session.started",
"specversion": "1.0",
"time": "2026-03-15T14:20:00.123Z",
"datacontenttype": "application/json",
"data": {
"vin": "5XXXX00000XEXMPL1",
"sessionId": "session_xyz123abc",
"startedBy": "cred_abc123xyz",
"location": "Manheim Atlanta, 400 Atlanta Dr, Hapeville, GA",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.custody-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "custody-service",
"serviceVersion": "0.1.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_session_start_p4q5r6"
}
}
}
custody.session.completed — a custody session is closed (the DELIVERY transfer that ends the session).
ActiveSource: vecu.custody-service
Published once per session — fires on the DELIVERY transfer that closes the session.
vinstringrequired17-character Vehicle Identification Number.
sessionIdstringrequiredUnique session identifier.
completedBystringrequiredCredential ID of the actor who completed the session (the DELIVERY
transfer's toCustodian).
locationstringrequiredAddress string of the location where the session completed.
totalTransfersintegerrequiredTotal number of transfer steps in the session (PICKUP + intermediate CHECKPOINT/HANDOFFs + DELIVERY).
durationinteger | nullrequiredSession duration in seconds (DELIVERY time minus PICKUP time). null when
the start or end timestamp couldn't be resolved.
{
"id": "evt_session_comp_v1w2x3",
"source": "vecu.custody-service",
"type": "custody.session.completed",
"specversion": "1.0",
"time": "2026-03-15T14:28:00.123Z",
"datacontenttype": "application/json",
"data": {
"vin": "5XXXX00000XEXMPL1",
"sessionId": "session_xyz123abc",
"completedBy": "cred_def456",
"location": "Metro Honda, 5555 Peachtree Rd, Atlanta, GA",
"totalTransfers": 3,
"duration": 480,
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.custody-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "custody-service",
"serviceVersion": "0.1.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_session_comp_v1w2x3"
}
}
}
custody.transfer.completed — an individual transfer step in a custody session is completed. May fire multiple times per session for multi-step transfers (e.g., PICKUP → CHECKPOINT → CHECKPOINT → DELIVERY).
ActiveSource: vecu.custody-service
Published once per transfer step (one event per call to POST /transfers).
vinstringrequired17-character Vehicle Identification Number.
transferIdstringrequiredUnique transfer step identifier.
sessionIdstringrequiredSession this transfer step belongs to.
transferTypestringrequiredType of transfer: PICKUP, CHECKPOINT, HANDOFF, or DELIVERY.
fromCustodianstring | nullrequiredPrevious custodian's credential ID. null for PICKUP (no previous
custodian).
toCustodianstringrequiredCredential ID of the custodian receiving custody on this transfer step.
locationstringrequiredAddress string of the location where the transfer occurred.
eventHashstringrequiredLedger event hash — cryptographic integrity anchor for the chain-of-custody ledger entry created by this transfer.
{
"id": "evt_transfer_comp_s7t8u9",
"source": "vecu.custody-service",
"type": "custody.transfer.completed",
"specversion": "1.0",
"time": "2026-03-15T14:25:00.123Z",
"datacontenttype": "application/json",
"data": {
"vin": "5XXXX00000XEXMPL1",
"transferId": "transfer_def789",
"sessionId": "session_xyz123abc",
"transferType": "PICKUP",
"fromCustodian": null,
"toCustodian": "cred_abc123xyz",
"location": "Manheim Atlanta, 400 Atlanta Dr, Hapeville, GA",
"eventHash": "0xae3f1c9d6b8e0a4d2f1e8c7b6a5d4c3b2a1f0e9d8c7b6a5d4c3b2a1f0e9d8c7b",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.custody-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "custody-service",
"serviceVersion": "0.1.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_transfer_comp_s7t8u9"
}
}
}
Releasability
custody.releasability.updated — a vehicle's releasability status is computed or updated. Emitted at three points: when a release-API call resolves status, during authorization creation (releasability re-check), and from the Manheim-API fallback path inside the releasability check service.
ActiveSource: vecu.custody-service
This event is published from three different code paths inside
vecu.custody-service:
- PUT /releasability — emits the full 11-field shape (adds
originFormattedAddressandreleaseIdto the 9-field base set). - Manheim API fallback (when the cached releasability lookup misses and the service queries Manheim directly) — emits the 9-field base set.
- Authorization-time releasability check (fired during POST /authorizations when releasability state is computed against the cache) — emits the 9-field base set.
vinstringrequired17-character Vehicle Identification Number.
releasablebooleanrequiredWhether the vehicle is now releasable.
releasabilityStatusstringrequiredTri-state status: RELEASABLE, NOT_RELEASABLE, or UNKNOWN (the
UNKNOWN value appears when authorization-time releasability check runs
without a cache hit).
blockersstring[]requiredReasons the vehicle is not releasable (e.g., "Releasability pending",
payment/title/inspection blockers). Empty list when releasable is true.
originAddressstring | nullrequiredOrigin address string as supplied by the caller / cache.
originLatnumber | nullrequiredOrigin latitude (Amazon Location resolved). null when geocoding didn't
succeed.
originLngnumber | nullrequiredOrigin longitude. null when geocoding didn't succeed.
originGeohashstring | nullrequiredGeohash-7 of the origin coordinates. null when geocoding didn't succeed.
originFormattedAddressstring | nullCanonical/normalized origin address from Amazon Location. Only present on events fired by the PUT /releasability path.
detectedAtstring | nullrequiredISO 8601 timestamp of when this releasability status was determined. May be
null when the originating caller didn't supply one.
releaseIdstring | nullOptional release identifier supplied by the Manheim integration contract. Only present on events fired by the PUT /releasability path.
{
"id": "evt_5259518ca2b04820b9f1d65f34fa5f08",
"source": "vecu.custody-service",
"type": "custody.releasability.updated",
"specversion": "1.0",
"time": "2026-03-15T13:45:00.123Z",
"datacontenttype": "application/json",
"data": {
"vin": "5XXXX00000XEXMPL0",
"releasable": false,
"releasabilityStatus": "UNKNOWN",
"blockers": ["Releasability pending"],
"originAddress": "6205 Peachtree Dunwoody Rd, Atlanta, GA 30328",
"originLat": 33.924675567041,
"originLng": -84.350596966385,
"originGeohash": "dnh0bxc",
"detectedAt": "2026-03-15T13:45:00+00:00",
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.custody-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "custody-service",
"serviceVersion": "0.1.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_5259518ca2b04820b9f1d65f34fa5f08"
}
}
}
Vehicle release
custody.vehicle.released — a vehicle is physically released to a driver. This is the final event in the custody transfer lifecycle.
ActiveSource: vecu.custody-service
The envelope time field is the release timestamp — there is no separate
data.releasedAt. releaseLocation is a typed object {(latitude, longitude)} | null, not a string. holderId, poolId, and
releasedPoolCompositeId are nullable in the schema; holderId and poolId
are populated for every release driven through the standard auth-pool path.
vinstringrequired17-character Vehicle Identification Number.
authorizationIdstringrequiredCustody authorization that permitted this release. UUID.
holderIdstring | nullDriver who received the vehicle, in mapped form. Per
ADR-043,
this is the KMS-pepper'd HMAC mapped form (vecu_ + 24 chars URL-safe
base64, e.g., vecu_gfTRAjYnn_y-8zj-aBc4dEf5 — illustrative; actual values
are 24 chars after vecu_). Note: other custody.* events identify the
driver via personIdentityKey — this event uses holderId instead,
reflecting the release point in the lifecycle where the credential-holder
identity is the relevant surface. Nullable in the schema — sourced from
the verifier-supplied release request body, with fallback to the
authorization record's already-mapped personIdentityKey for legacy
single-driver auths.
releaseMethodstringrequiredHow the release was triggered: web_verifier, mobile_verifier, or
gate_pass. Reflects the upstream surface that initiated the release —
not the cryptographic verification protocol.
releaseLocationobject | nullCoordinates of the physical release location. Currently emitted as null
for all releases pending verifier-side coordinate-capture rollout. When
populated the shape is:
releaseLocation.latitudenumberrequiredLatitude of the release point.
releaseLocation.longitudenumberrequiredLongitude of the release point.
poolIdstring | nullAuthorization-pool UUID this release was tied to. Useful for correlating
with authorizationpool.* events on the same pool. Nullable in the
schema; populated whenever the release was driven through the auth-pool
fan-out (the standard path).
releasedPoolCompositeIdstring | nullPool composite ID ({poolId}:{authPoolAuthorizationId}) of the specific
pool entry that was released, when applicable. null for single-driver
releases without a pool composite. Distinct from
custody.authorization.assigned's
cancelledPoolCompositeIds (which lists non-assigned drivers).
verifiedDriversobject[]requiredDrivers who verified themselves against this authorization prior to
release. Added by vecu-event-relay at delivery time (not by
vecu-custody-service); the relay cross-references the
vecu-event-relay-verifications guest-book table by
AUTH#<authorizationId>, dedupes by holderId, and injects the result
into the payload. Empty array ([]) when no verifications were recorded
against this authorization — see _enrichmentStatus for the reason.
Each entry is minimized to exactly two fields:
verifiedDrivers[].holderIdstringrequiredverifiedDrivers[].verifiedAtstringrequiredISO-8601 timestamp of the most-recent verification for this holderId.
When multiple verifications exist for the same driver (e.g., credential
rotation mid-authorization), only the latest verifiedAt is kept.
_enrichmentStatusstringMarker for the enrichment outcome. Currently observed values:
no-verifications-recorded (the verification record-set was empty at
release time) and race-window-empty (release fired before
cross-region replication caught up — retry/idempotent re-delivery
resolves). Absent when enrichment produced a non-empty
verifiedDrivers array.
Where verifiedDrivers comes from
verifiedDrivers and _enrichmentStatus are added by the relay service at
delivery time — they reflect the verification record-set resolved at the
moment of release, not data the originating service carried on the internal
event. This enrichment is specific to custody.vehicle.released; other
custody events pass through unmodified.
{
"id": "evt_rel_a1b2c3d4e5f6",
"source": "vecu.custody-service",
"type": "custody.vehicle.released",
"specversion": "1.0",
"time": "2026-03-15T14:30:00.123Z",
"datacontenttype": "application/json",
"data": {
"vin": "5XXXX00000XEXMPL0",
"authorizationId": "AUTH-xyz789abc",
"releaseMethod": "mobile_verifier",
"releaseLocation": null,
"poolId": "9b4bdd89-1451-4bf6-b28e-7324ef1ac5c7",
"holderId": "vecu_gfTRAjYnn_y-8zj-aBc4dEf5",
"releasedPoolCompositeId": null,
"_platform": {
"correlationId": "",
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": {
"actorId": "vecu.custody-service",
"actorType": "service"
},
"metadata": {
"environment": "sandbox",
"serviceName": "custody-service",
"serviceVersion": "0.1.0"
},
"sourceRegion": "us-east-1",
"deduplicationId": "evt_rel_a1b2c3d4e5f6"
},
"verifiedDrivers": [
{
"holderId": "vecu_gfTRAjYnn_y-8zj-aBc4dEf5",
"verifiedAt": "2026-03-15T14:29:48.123Z"
}
]
}
}
`verifiedDrivers: []` when no verification was recorded
When the release occurs without any prior credential verification (e.g.,
manual override flows, test authorizations that skip the verifier step),
the array is empty AND _enrichmentStatus is populated with the reason:
"verifiedDrivers": [],
"_enrichmentStatus": "no-verifications-recorded"
Consumers should treat an empty array as "no verified drivers at release time", not as a delivery error.
Wallet Service Events
wallet.credential.stored — a credential is stored in a user's wallet.
ActiveSource: vecu.wallet-service
credentialIdstringrequiredUnique credential identifier; treat as opaque.
holderIdstringrequiredOpaque holder identifier in vecu_ + 24 URL-safe-base64 characters (28
characters total).
credentialTypestringrequiredCredential type identifier (e.g. com.coxautoinc.vecu.identity.1,
com.coxautoinc.vecu.custody.1).
docTypestringrequiredmDoc document type. Currently matches credentialType on the wire.
issuedAtstringrequiredISO 8601 timestamp of credential issuance.
{
"id": "evt_9e9a96e2e9314a08b062aabdb1d56b0f",
"source": "vecu.wallet-service",
"type": "wallet.credential.stored",
"specversion": "1.0",
"time": "2026-05-19T19:57:46.651184Z",
"datacontenttype": "application/json",
"data": {
"_platform": {
"traceId": "Root=1-6a0cc0b9-2b940d476a21888a1bc1f908;Parent=e0ddaa6b33c623ac;Sampled=1;Lineage=3:638c6cad:0",
"actor": {
"actorId": "vecu.wallet-service",
"actorType": "service"
}
},
"credentialId": "cred_52447c2d8b324a2883c7d6ca95186ea0",
"holderId": "vecu_qUReRox9xes06VbyAJamami8",
"credentialType": "com.coxautoinc.vecu.custody.1",
"docType": "com.coxautoinc.vecu.custody.1",
"issuedAt": "2026-05-19T19:57:46.561813Z"
}
}
wallet.credential.presented — a credential is presented or shared from a user's wallet.
ActiveSource: vecu.wallet-service
credentialIdstringrequiredUnique credential identifier; treat as opaque.
holderIdstringrequiredOpaque holder identifier in vecu_ + 24 URL-safe-base64 characters (28 characters total).
presentedAtstringrequiredISO 8601 timestamp of presentation.
verifierClientIdstring | nullIdentifier of the verifier that requested the presentation. May be a client ID or, when the verifier did not authenticate, a redirect_uri: reference to the response URL.
claimsRequestedstring[]requiredClaim paths the verifier requested, in <namespace>/<element> form (e.g. com.coxautoinc.vecu.custody.1.vehicle/vin).
authorizationIdstring | nullCustody authorization ID extracted from the presented credential, when the credential carries one. null for credentials without a custody authorization.
{
"id": "evt_ac1c38f66e364699843690ca95617156",
"source": "vecu.wallet-service",
"type": "wallet.credential.presented",
"specversion": "1.0",
"time": "2026-05-19T19:57:59.761719Z",
"datacontenttype": "application/json",
"data": {
"_platform": {
"traceId": "Root=1-6a0cc0bd-3e092cc16e719e7a01d2b8e7;Parent=f1cb5357c0bf3dca;Sampled=1;Lineage=1:563ddb03:0",
"actor": {
"actorId": "vecu.wallet-service",
"actorType": "service"
}
},
"credentialId": "cred_52447c2d8b324a2883c7d6ca95186ea0",
"holderId": "vecu_qUReRox9xes06VbyAJamami8",
"verifierClientId": "redirect_uri:https://verifier.example.com/v1/verification/presentations/response",
"presentedAt": "2026-05-19T19:57:59.761475Z",
"claimsRequested": [
"com.coxautoinc.vecu.custody.1.driver/driver_id",
"com.coxautoinc.vecu.custody.1.vehicle/vin",
"com.coxautoinc.vecu.custody.1.vehicle/origin_location",
"com.coxautoinc.vecu.custody.1.vehicle/destination_location",
"com.coxautoinc.vecu.custody.1.vehicle/origin_coordinates",
"com.coxautoinc.vecu.custody.1.auth/authorization_id",
"com.coxautoinc.vecu.custody.1.auth/credential_id"
],
"authorizationId": "d91e73d3-d566-4eeb-80fc-a12b6439acd5"
}
}
wallet.credential.revoked — a credential is revoked from a wallet.
ActiveSource: vecu.wallet-service
credentialIdstringrequiredUnique credential identifier; treat as opaque.
holderIdstringrequiredOpaque holder identifier in vecu_ + 24 URL-safe-base64 characters (28
characters total).
revocationReasonstringrequiredReason for revocation. Currently always holder_requested for revocations
initiated through the wallet API.
revokedAtstringrequiredISO 8601 timestamp of revocation.
{
"id": "evt_wallet_revoke_e1f2g3",
"source": "vecu.wallet-service",
"type": "wallet.credential.revoked",
"specversion": "1.0",
"time": "2026-03-15T15:35:00.123Z",
"datacontenttype": "application/json",
"data": {
"_platform": {
"traceId": "Root=1-5e3f4b5c-7a8b9c0d1e2f3a4b5c6d7e8f",
"actor": { "actorId": "vecu.wallet-service", "actorType": "service" }
},
"credentialId": "cred_52447c2d8b324a2883c7d6ca95186ea0",
"holderId": "vecu_qUReRox9xes06VbyAJamami8",
"revocationReason": "holder_requested",
"revokedAt": "2026-03-15T15:35:00Z"
}
}