Attestation API
Generate verifiable proof about a vehicle's data.
Overview
Base URL
https://attestation-api.dimo.zoneEndpoints
Create a vehicle VIN attestation
rawVC from the response, you can use it to perform queries on the Telemetry API, such as getting the VIN of a vehicle.Parameters
vehicleJwtstringRequiredtokenIdintegerRequiredconst vinVc = await dimo.attestation.createVinVc({vehicleJwt: "eyJhbGc...ILlujqw",tokenId: 123456})
{"vcUrl": "https://telemetry-api.dimo.zone/query","vcQuery": "query {vinVCLatest(tokenId: <TOKEN_ID>) {rawVC}}","message": "VC generated successfully. Retrieve using the provided GQL URL and query parameter."}
Create a vehicle odometer statement VC
rawVC from the response, you can use it to perform queries on the Telemetry API, such as getting the odometer of a vehicle.Parameters
vehicleJwtstringRequiredtokenIdintegerRequiredtimestamptimeOptionalconst vinVc = await dimo.attestation.createOdometerStatementVC({vehicleJwt: "eyJhbGc...ILlujqw",tokenId: 123456,timestamp: '2023-01-01T00:00:00Z' // Optional})
{"message": "VC generated successfully, retrieve using the provided telemetry-api."}
Create a vehicle health attestation
rawVC from the response, you can use it to perform queries on the Telemetry API, such as getting the health status of a vehicle.Parameters
vehicleJwtstringRequiredtokenIdintegerRequiredstartTimetimeRequiredendTimetimeRequiredconst vinVc = await dimo.attestation.createVehicleHealthVc({vehicleJwt: "eyJhbGc...ILlujqw",tokenId: 123456,startTime: '2023-01-01T00:00:00Z',endTime: '2023-01-15T00:00:00Z'})
{"message": "VC generated successfully, retrieve using the provided telemetry-api."}
Create a vehicle position attestation
rawVC from the response, you can use it to perform queries on the Telemetry API, such as getting the position of a vehicle.Parameters
vehicleJwtstringRequiredtokenIdintegerRequiredtimestamptimeRequiredconst vinVc = await dimo.attestation.createVehiclePositionVc({vehicleJwt: "eyJhbGc...ILlujqw",tokenId: 123456,timestamp: '2023-01-01T00:00:00Z'})
{"message": "VC generated successfully, retrieve using the provided telemetry-api."}
Document Insertion
Insurance cards, registrations, service invoices, titles, inspections, driver licenses, and other vehicle paperwork live on DIMO as signed CloudEvents. You post them to the DIMO Ingest Server (DIS) attestation endpoint, and you pull them back out through the Fetch API. For large files, the Fetch API returns a presigned S3 URL on dataUrl instead of inlining the bytes.
CloudEvent types
dimo.raw.*dimo.document.*Supported dimo.document.* subtypes
dimo.document.vehicle.insurancedimo.document.vehicle.registrationdimo.document.vehicle.titledimo.document.vehicle.service.invoicedimo.document.vehicle.inspectiondimo.document.vehicle.financedimo.document.vehicle.regulatory.otherdimo.document.driver.licensedimo.document.unknownBase URL
https://attest.dimo.zoneEndpoints
curl -X POST "https://attest.dimo.zone/" \-H "Authorization: Bearer <DEVELOPER_JWT>" \-H "Content-Type: application/json" \-d '{"id": "unique-identifier","source": "0xConnectionLicenseAddress","producer": "did:ethr:137:0xSignerAddress","specversion": "1.0","subject": "did:erc721:137:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF:42","time": "2026-05-22T12:00:00Z","type": "dimo.document.vehicle.insurance","datacontenttype": "application/json","raweventid": "ksuid-of-the-dimo.raw.insurance-event","signature": "0x...","data": {"policyNumber": "SF-12345678","insurerName": "State Farm","insuredAddress": "123 Main St, Denver, CO 80202","vin": "1GGCM82633A123456","state": "CO","coverageType": "full coverage","effectiveDate": "2025-01-01","expirationDate": "2025-07-01"}}'
Retrieving stored documents
Documents come back through the Fetch API like any other CloudEvent. The one thing to remember: ask for dataUrl. The raw file is served as a presigned S3 link, not inlined into the response, so if you skip dataUrl you will not get the bytes.
query LatestInsurance {
latestCloudEvent(
did: "did:erc721:137:0xbA5738a18d83D41847dfFbDC6101d37C69c9B0cF:42",
filter: { type: "dimo.document.vehicle.insurance" }
) {
header { id type time raweventid }
data # parsed fields, when present
dataUrl # presigned S3 link to the raw file
}
}
To see which document types exist for a vehicle before querying, hit availableCloudEventTypes. To pull several subtypes in one round-trip, filter cloudEvents by types: ["dimo.document.vehicle.insurance", "dimo.document.vehicle.registration", ...].
Extract API
The Extract API is the parser. You hand it a vehicle document; it tells you what the document is and what fields it contains. That is the whole job. It does not store the file, it does not sign a CloudEvent, and it does not post anything to DIS. If you already have your own storage and lifecycle pipeline and just need classification plus field extraction, this is the right service to call. If you want the full upload + storage + attestation flow handled for you, go through the orchestration layer in the DIMO mobile backend instead.
Request (multipart/form-data)
filefileRequiredcategory_hintstringOptionalResponse
typeStringdata.fieldsobjectcategory_hint values
serviceinsuranceregulatoryownershipdriverBase URL
https://extract.dimo.zoneEndpoints
curl -X POST "https://extract.dimo.zone/extract" \-H "Authorization: Bearer <DEVELOPER_JWT>" \-F [email protected] \-F category_hint=regulatory
{"type": "dimo.document.vehicle.registration","data": {"fields": {"vin": "1GGCM82633A123456","plateNumber": "ABC-1234","registrationLocation": "California","issuingAuthority": "California DMV","expirationDate": "2027-04-30","ownerName": "Jane Doe"}}}
Extract only parses. If you want the whole document round-trip — store the file, parse it, link the parse back to the raw upload, query both later — it looks like this:
- POST a
dimo.raw.<subtype>CloudEvent tohttps://attest.dimo.zonewith the file as the signeddatapayload. Save the event id; it becomes theraweventidfor the parse. - POST the same file to
https://extract.dimo.zone/extract. You get back atypeanddata.fields. - POST a second CloudEvent to
https://attest.dimo.zoneusing thetypeExtract returned (e.g.dimo.document.vehicle.insurance). Put the extracted fields indataand the raw event id from step 1 inraweventid. - Query both events back through the Fetch API. The raw file comes back as a presigned
dataUrl.
Document field schemas
Every dimo.document.* type carries a defined set of fields under data.fields. The Extract API returns this shape, and you post the same shape when you store a dimo.document.* event. Fields are best-effort: anything the source document does not contain comes back null, so a real document often has fewer keys than shown. Pick a type to see its fields.
- Insurance
- Registration
- Title
- Service invoice
- Inspection
- Finance
- Regulatory
- Driver license
{
"type": "dimo.document.vehicle.insurance",
"data": {
"fields": {
"policyNumber": "SF-12345678",
"insurerName": "State Farm",
"naicNumber": "25178",
"insuredAddress": "123 Main St, Denver, CO 80202",
"ownerName": "Jane Doe",
"vin": "1GGCM82633A123456",
"plateNumber": "ABC-1234",
"state": "CO",
"coverageType": "full coverage",
"effectiveDate": "2025-01-01",
"expirationDate": "2025-07-01",
"premium": 842.5,
"currency": "USD",
"additionalDrivers": "John Doe",
"additionalVehicles": [
{
"vin": "2HGED36426H123789",
"plateNumber": "XYZ-9988",
"description": "2019 GMC Yukon"
}
]
}
}
}
{
"type": "dimo.document.vehicle.registration",
"data": {
"fields": {
"vin": "1GGCM82633A123456",
"ownerName": "Jane Doe",
"ownerAddress": "123 Main St, Denver, CO 80202",
"plateNumber": "ABC-1234",
"registrationLocation": "California",
"issuingAuthority": "California DMV",
"issueDate": "2026-04-30",
"expirationDate": "2027-04-30",
"titleNumber": "T1234567",
"color": "Blue",
"bodyStyle": "SUV",
"fuelType": "Gas",
"vehicleType": "Passenger"
}
}
}
{
"type": "dimo.document.vehicle.title",
"data": {
"fields": {
"titleNumber": "T1234567",
"issueDate": "2026-04-30",
"issuingAuthority": "California DMV",
"ownerName": "Jane Doe",
"ownerAddress": "123 Main St, Denver, CO 80202",
"vin": "1GGCM82633A123456",
"color": "Blue",
"bodyStyle": "SUV",
"odometer": 48210,
"odometerStatus": "ACTUAL MILEAGE",
"fuelType": "Gas",
"previousTitleNumber": "T0099887",
"liens": "ABC Credit Union"
}
}
}
{
"type": "dimo.document.vehicle.service.invoice",
"data": {
"fields": {
"vin": "1GGCM82633A123456",
"plateNumber": "ABC-1234",
"serviceDate": "2026-03-15",
"odometerReading": 48210,
"summary": "Oil and filter change, four tire replacement, air filter replacement.",
"lineItems": [
{
"code": "LOF",
"description": "Synthetic blend oil and filter change",
"total": 79.99
},
{
"code": "RT1234",
"description": "Tire replacement (4), mount and balance",
"total": 612.0
},
{
"code": "AF-22",
"description": "Engine air filter replacement",
"total": 34.5
}
],
"customerName": "Jane Doe",
"recommendations": "Replace front brake pads within 10,000 miles.",
"providerName": "Joe's Auto Service",
"providerLocation": "Denver, CO",
"providerPhone": "(303) 555-0142",
"invoiceNumber": "WO-293543",
"subtotal": 726.49,
"tax": 59.93,
"totalCost": 786.42,
"paymentMethod": "Visa ending in 4532",
"currency": "USD"
}
}
}
{
"type": "dimo.document.vehicle.inspection",
"data": {
"fields": {
"inspectionDate": "2026-02-10",
"inspectionStation": "Denver Emissions Center, Denver, CO",
"result": "pass",
"emissionsResult": "pass",
"nextInspectionDue": "2028-02-10",
"odometer": 48210,
"vin": "1GGCM82633A123456",
"plateNumber": "ABC-1234",
"issuingAuthority": "Colorado Air Care",
"fuelType": "Gas",
"certificateNumber": "CO-EM-7781234",
"cost": 25.0,
"currency": "USD",
"notes": "All tires at 5/32 or better; battery tested good."
}
}
}
{
"type": "dimo.document.vehicle.finance",
"data": {
"fields": {
"lender": "ABC Credit Union",
"accountNumber": "100023455",
"balance": 18450.75,
"monthlyPayment": 412.3,
"dueDate": "2026-06-01",
"vin": "1GGCM82633A123456",
"borrowerName": "Jane Doe",
"documentKind": "statement"
}
}
}
{
"type": "dimo.document.vehicle.regulatory.other",
"data": {
"fields": {
"documentKind": "traffic violation",
"issueDate": "2026-05-02",
"amountDue": 125.0,
"currency": "USD",
"vendor": "City of Denver Parking Enforcement",
"ownerName": "Jane Doe",
"ownerAddress": "123 Main St, Denver, CO 80202",
"vin": "1GGCM82633A123456",
"plateNumber": "ABC-1234",
"referenceNumber": "CITN-2026-558210",
"description": "Parking citation for an expired meter at 16th & Larimer."
}
}
}
{
"type": "dimo.document.driver.license",
"data": {
"fields": {
"licenseNumber": "D1234567",
"issuingAuthority": "California DMV",
"issueDate": "2022-08-15",
"expirationDate": "2030-08-15",
"class": "C",
"firstName": "Jane",
"middleName": "A",
"lastName": "Doe",
"dateOfBirth": "1990-08-15",
"sex": "F",
"eyeColor": "BRO",
"height": "5'6\"",
"address": "123 Main St, Denver, CO 80202"
}
}
}
dimo.document.unknown has no defined fields. The Extract API returns it when a document matches no spec; treat it as an unclassified placeholder rather than a schema.