Orders and distribution
Addresses, orders, spreadsheet imports, tracking and delivery codes.
Create an address
https://api.drometra.com/v1/distribution/locationsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
- idempotency-keymandatorystring · uuid
- A new UUID per operation. If you repeat the request with the same key, the change is not applied twice.
Body
- namemandatorystring
- addressmandatorystring
- coordinatemandatoryobject
- precisionmandatoryenum: address | street | area | manual
- geocodingobject
Response · 201
- idstring · uuidalways
- tenantIdstring · uuidalways
- namestringalways
- addressstringalways
- objectalways
- precisionenum: address | street | area | manualalways
- object o nullalways
- createdAtstring · date-timealways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/locations" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "idempotency-key: $(uuidgen)" \
-H "Content-Type: application/json" \ -d '{
"name": "…",
"address": "…",
"coordinate": {},
"precision": "…"
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"name": "…",
"address": "…",
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {
"kind": "nominatim",
"engine": "…",
"engineVersion": "…",
"dataVersion": "…",
"coverage": {
"id": "…",
"status": "covered"
}
},
"label": "…"
},
"createdAt": "2026-10-21T14:02:31Z"
}List addresses
https://api.drometra.com/v1/distribution/locationsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Reference parameters
- limitinteger
Response · 200
- array de objectalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/locations" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"items": [
{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"name": "…",
"address": "…",
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {
"kind": "nominatim",
"engine": "…",
"engineVersion": "…",
"dataVersion": "…",
"coverage": {}
},
"label": "…"
},
"createdAt": "2026-10-21T14:02:31Z"
}
]
}Create an order
https://api.drometra.com/v1/distribution/ordersRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
- idempotency-keymandatorystring · uuid
- A new UUID per operation. If you repeat the request with the same key, the change is not applied twice.
Body
- referencemandatorystring
- locationIdmandatorystring · uuid
- demandmandatoryinteger
- serviceSecondsmandatoryinteger
- windowmandatoryobject
- notesstring
- recipientobject
- parcelsarray de object
- linesarray de object
- customerIdstring · uuid
Response · 201
- idstring · uuidalways
- tenantIdstring · uuidalways
- referencestringalways
- objectalways
- demandintegeralways
- serviceSecondsintegeralways
- objectalways
- notesstring o nullalways
- object o nullalways
- array de objectalways
- stateenum: open | cancelledalways
- objectalways
- array de objectalways
- customerIdstring · uuid o nullalways
- invoiceIntentIdstring · uuid o nullalways
- versionintegeralways
- createdAtstring · date-timealways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/orders" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "idempotency-key: $(uuidgen)" \
-H "Content-Type: application/json" \ -d '{
"reference": "…",
"locationId": "…",
"demand": 0,
"serviceSeconds": 0,
"window": {}
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"location": {
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"name": "…",
"address": "…",
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {
"kind": "nominatim",
"engine": "…",
"engineVersion": "…",
"dataVersion": "…",
"coverage": {
"id": "…",
"status": "covered"
}
},
"label": "…"
},
"createdAt": "2026-10-21T14:02:31Z"
},
"demand": 0,
"serviceSeconds": 0,
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
},
"notes": "…",
"recipient": {
"name": "…",
"phone": "…",
"email": "…"
},
"parcels": [
{
"code": "…",
"description": "…"
}
],
"state": "open",
"planning": {
"status": "unplanned",
"routePlanId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"vehicleId": "…"
},
"lines": [
{
"position": 50.5,
"catalogItemId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"description": "…",
"quantity": "…",
"unitPriceMinor": "…"
}
],
"customerId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"invoiceIntentId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"createdAt": "2026-10-21T14:02:31Z"
}List orders
https://api.drometra.com/v1/distribution/ordersRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Reference parameters
- limitinteger
Response · 200
- array de objectalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/orders" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"items": [
{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"location": {
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"name": "…",
"address": "…",
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
},
"createdAt": "2026-10-21T14:02:31Z"
},
"demand": 0,
"serviceSeconds": 0,
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
},
"notes": "…",
"recipient": {
"name": "…",
"phone": "…",
"email": "…"
},
"parcels": [
{
"code": "…",
"description": "…"
}
],
"state": "open",
"planning": {
"status": "unplanned",
"routePlanId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"vehicleId": "…"
},
"lines": [
{
"position": 50.5,
"catalogItemId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"description": "…",
"quantity": "…",
"unitPriceMinor": "…"
}
],
"customerId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"invoiceIntentId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"createdAt": "2026-10-21T14:02:31Z"
}
]
}Cancel an order
https://api.drometra.com/v1/distribution/orders/{id}/cancelRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Body
- versionmandatoryinteger
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- referencestringalways
- objectalways
- demandintegeralways
- serviceSecondsintegeralways
- objectalways
- notesstring o nullalways
- object o nullalways
- array de objectalways
- stateenum: open | cancelledalways
- objectalways
- array de objectalways
- customerIdstring · uuid o nullalways
- invoiceIntentIdstring · uuid o nullalways
- versionintegeralways
- createdAtstring · date-timealways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/cancel" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Content-Type: application/json" \ -d '{
"version": 0
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"location": {
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"name": "…",
"address": "…",
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {
"kind": "nominatim",
"engine": "…",
"engineVersion": "…",
"dataVersion": "…",
"coverage": {
"id": "…",
"status": "covered"
}
},
"label": "…"
},
"createdAt": "2026-10-21T14:02:31Z"
},
"demand": 0,
"serviceSeconds": 0,
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
},
"notes": "…",
"recipient": {
"name": "…",
"phone": "…",
"email": "…"
},
"parcels": [
{
"code": "…",
"description": "…"
}
],
"state": "open",
"planning": {
"status": "unplanned",
"routePlanId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"vehicleId": "…"
},
"lines": [
{
"position": 50.5,
"catalogItemId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"description": "…",
"quantity": "…",
"unitPriceMinor": "…"
}
],
"customerId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"invoiceIntentId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"createdAt": "2026-10-21T14:02:31Z"
}Preview a delivery plan
https://api.drometra.com/v1/distribution/plan-previewsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
- idempotency-keymandatorystring · uuid
- A new UUID per operation. If you repeat the request with the same key, the change is not applied twice.
Body
- profilemandatoryenum: car | truck | bicycle | pedestrian
- depotmandatoryobject
- vehiclesmandatoryarray de object
- maxComputationMsinteger
- vehicleobject
- orderIdsmandatoryarray de string · uuid
Response · 201
- idstring · uuidalways
- tenantIdstring · uuidalways
- stateenum: ready | approvedalways
- versionintegeralways
- profileenum: car | truck | bicycle | pedestrianalways
- objectalways
- array de objectalways
- objectalways
- objectalways
- createdAtstring · date-timealways
- approvedAtstring · date-time o nullalways
- routePlanIdstring · uuid o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/plan-previews" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "idempotency-key: $(uuidgen)" \
-H "Content-Type: application/json" \ -d '{
"profile": "…",
"depot": {},
"vehicles": [],
"orderIds": []
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"state": "ready",
"version": 1,
"profile": "car",
"solution": {
"feasible": true,
"timedOut": true,
"optimal": false,
"routes": [
{
"vehicleId": "…",
"fleetVehicleId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderedStops": [],
"distanceMeters": 0,
"durationSeconds": 0
}
],
"unassigned": [
{
"id": "…",
"reason": "capacity_exceeded"
}
],
"totalDistanceMeters": 0,
"totalDurationSeconds": 0,
"baselineDistanceMeters": 0,
"improvementMeters": 0
},
"roadRoutes": [
{
"vehicleId": "…",
"fleetVehicleId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"route": {
"profile": "car",
"waypoints": [],
"geometry": {
"type": "LineString",
"coordinates": []
},
"distanceMeters": 0,
"durationSeconds": 0,
"estimated": true,
"trafficIncluded": false,
"provenance": {
"kind": "valhalla",
"engine": "…",
"engineVersion": "…",
"graphVersion": "…",
"coverage": {},
"roadNetwork": true
},
"ferryMeters": 0
}
}
],
"matrixProvenance": {
"kind": "valhalla",
"engine": "…",
"engineVersion": "…",
"graphVersion": "…",
"coverage": {
"id": "…",
"status": "covered"
},
"roadNetwork": true
},
"solver": {
"name": "…",
"maxComputationMs": 1000.5,
"optimal": false
},
"createdAt": "2026-10-21T14:02:31Z",
"approvedAt": "2026-10-21T14:02:31Z",
"routePlanId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d"
}Import orders from a spreadsheet
https://api.drometra.com/v1/distribution/importsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
- idempotency-keymandatorystring · uuid
- A new UUID per operation. If you repeat the request with the same key, the change is not applied twice.
Body
- kindmandatorystring
- fileNamemandatorystring
- contentBase64mandatorystring
Response · 201
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/imports" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "idempotency-key: $(uuidgen)" \
-H "Content-Type: application/json" \ -d '{
"kind": "…",
"fileName": "…",
"contentBase64": "…"
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}List imports
https://api.drometra.com/v1/distribution/importsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Reference parameters
- limitinteger
Response · 200
- array de objectalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/imports" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"items": [
{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1
}
]
}Get an import
https://api.drometra.com/v1/distribution/imports/{id}Requires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Reference parameters
- afterRowinteger
- rowLimitinteger
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/imports/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}Geocode an import's addresses
https://api.drometra.com/v1/distribution/imports/{id}/geocodeRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/imports/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/geocode" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Content-Type: application/json" \ -d '{}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}Resolve an import row
https://api.drometra.com/v1/distribution/imports/{id}/rows/{rowNumber}/resolutionRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
- rowNumbermandatoryinteger
Body
- versionmandatoryinteger
- actionmandatoryenum: candidate | coordinate | exclude | include
- candidateIndexinteger
- coordinateobject
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/imports/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/rows/<rowNumber>/resolution" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Content-Type: application/json" \ -d '{
"version": 0,
"action": "…"
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}Commit an import
https://api.drometra.com/v1/distribution/imports/{id}/commitRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Body
- versionmandatoryinteger
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/imports/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/commit" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Content-Type: application/json" \ -d '{
"version": 0
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}Discard an import
https://api.drometra.com/v1/distribution/imports/{id}/discardRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Body
- versionmandatoryinteger
Response · 200
- idstring · uuidalways
- tenantIdstring · uuidalways
- kindstringalways
- fileNamestringalways
- fileSha256stringalways
- encodingenum: utf-8 | windows-1252always
- delimiterenum: , | ;always
- stateenum: validated | committed | discardedalways
- array de objectalways
- objectalways
- createdBystring · uuidalways
- createdAtstring · date-timealways
- committedBystring · uuid o nullalways
- committedAtstring · date-time o nullalways
- discardedBystring · uuid o nullalways
- discardedAtstring · date-time o nullalways
- expiresAtstring · date-timealways
- versionintegeralways
- array de objectalways
- nextRowinteger o nullalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/imports/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/discard" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Content-Type: application/json" \ -d '{
"version": 0
}'{
"id": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"tenantId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"kind": "orders",
"fileName": "…",
"fileSha256": "…",
"encoding": "utf-8",
"delimiter": ",",
"state": "validated",
"warnings": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"counts": {
"total": 250,
"valid": 250,
"needsGeocoding": 250,
"needsReview": 250,
"error": 250,
"duplicate": 250,
"excluded": 250,
"created": 250,
"skippedDuplicate": 250
},
"createdBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"createdAt": "2026-10-21T14:02:31Z",
"committedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"committedAt": "2026-10-21T14:02:31Z",
"discardedBy": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"discardedAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"version": 1,
"rows": [
{
"rowNumber": 50001,
"reference": "…",
"status": "valid",
"issues": [
{
"code": "missing_value",
"column": "…",
"severity": "error"
}
],
"location": {
"coordinate": {
"latitude": 0,
"longitude": 0
},
"precision": "address",
"geocoding": {
"provenance": {},
"label": "…"
}
},
"candidates": [
{
"label": "…",
"coordinate": {},
"precision": "address",
"address": {}
}
],
"existingOrderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"version": 1,
"summary": {
"locationName": "…",
"address": "…",
"date": "…",
"window": {
"startsAt": "2026-10-21T14:02:31Z",
"endsAt": "2026-10-21T14:02:31Z"
}
}
}
],
"nextRow": 50001
}Export orders
https://api.drometra.com/v1/distribution/exports/ordersRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Reference parameters
- fromstring
- tostring
- stateenum: open | cancelled | all
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/exports/orders" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"(text/csv)Get an order's delivery code
https://api.drometra.com/v1/distribution/orders/{id}/delivery-codeRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 200
- orderIdstring · uuidalways
- referencestringalways
- codestringalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/delivery-code" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"code": "…"
}List order deliveries
https://api.drometra.com/v1/distribution/orders/deliveriesRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Reference parameters
- limitinteger
Response · 200
- array de objectalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/orders/deliveries" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"items": [
{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"outcome": "pending",
"at": "2026-10-21T14:02:31Z",
"serviceDate": "…",
"routeId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"stopId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"routeState": "assigned"
}
]
}Get an order's events
https://api.drometra.com/v1/distribution/orders/{id}/eventsRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 200
- orderIdstring · uuidalways
- truncatedbooleanalways
- array de objectalways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/events" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"truncated": true,
"items": [
{
"type": "route_assigned",
"occurredAt": "2026-10-21T14:02:31Z",
"receivedAt": "2026-10-21T14:02:31Z",
"routeId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"stopId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"serviceDate": "…",
"author": {
"kind": "company",
"name": "…"
}
}
]
}Get the tracking link
https://api.drometra.com/v1/distribution/orders/{id}/tracking-linkRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 200
- orderIdstring · uuidalways
- referencestringalways
- activebooleanalways
- createdAtstring · date-timealways
- expiresAtstring · date-timealways
- revokedAtstring · date-time o nullalways
- lastOpenedAtstring · date-time o nullalways
- openCountintegeralways
- previewCountintegeralways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X GET "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/tracking-link" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"active": true,
"createdAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"revokedAt": "2026-10-21T14:02:31Z",
"lastOpenedAt": "2026-10-21T14:02:31Z",
"openCount": 0,
"previewCount": 0
}Create the tracking link
https://api.drometra.com/v1/distribution/orders/{id}/tracking-linkRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
- idempotency-keymandatorystring · uuid
- A new UUID per operation. If you repeat the request with the same key, the change is not applied twice.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 201
- orderIdstring · uuidalways
- referencestringalways
- activebooleanalways
- createdAtstring · date-timealways
- expiresAtstring · date-timealways
- revokedAtstring · date-time o nullalways
- lastOpenedAtstring · date-time o nullalways
- openCountintegeralways
- previewCountintegeralways
- urlstring · urialways
- messagestringalways
- whatsappUrlstring · urialways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/tracking-link" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "idempotency-key: $(uuidgen)" \
-H "Accept: application / json"{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"active": true,
"createdAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"revokedAt": "2026-10-21T14:02:31Z",
"lastOpenedAt": "2026-10-21T14:02:31Z",
"openCount": 0,
"previewCount": 0,
"url": "https://empresa.cl/webhooks/drometra",
"message": "…",
"whatsappUrl": "https://empresa.cl/webhooks/drometra"
}Revoke the tracking link
https://api.drometra.com/v1/distribution/orders/{id}/tracking-link/revokeRequires the access token of a person in your company.
Headers
- x-tenant-idmandatorystring · uuid
- Your company's identifier. The server checks that you are still an active member of it.
Road parameters
- idmandatorystring · uuid
- e. g. 0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d
Response · 200
- orderIdstring · uuidalways
- referencestringalways
- activebooleanalways
- createdAtstring · date-timealways
- expiresAtstring · date-timealways
- revokedAtstring · date-time o nullalways
- lastOpenedAtstring · date-time o nullalways
- openCountintegeralways
- previewCountintegeralways
It can respond with error 400, 401, 403, 404, 409, 410, 413, 415, 422, 429, 503. The error body is explained in Concepts.
curl -X POST "https://api.drometra.com/v1/distribution/orders/0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d/tracking-link/revoke" \
-H "Authorization: Bearer $DROMETRA _ TOKEN"\
-H "x-tenant-id: $DROMETRA_TENANT" \
-H "Accept: application / json"{
"orderId": "0b6f8c2e-4a1d-4e5b-9c3f-2d7e8a9b1c4d",
"reference": "…",
"active": true,
"createdAt": "2026-10-21T14:02:31Z",
"expiresAt": "2026-10-21T14:02:31Z",
"revokedAt": "2026-10-21T14:02:31Z",
"lastOpenedAt": "2026-10-21T14:02:31Z",
"openCount": 0,
"previewCount": 0
}