Developer Documentation
A complete integration guide for onboarding your app and using the APIs, with the live Swagger reference at the end.
Developer Documentation
Request and receive connected-vehicle data directly from our APIs — with owner consent at the core.
What Programmatic Access is
Programmatic Access lets your application request and receive vehicle data — historical, last-known, and real-time — directly from our APIs through the platform. You register an integration once, receive credentials, and then call the data-request APIs to create requests, track their status, and retrieve delivered data.
Three things are true of every integration, and they shape everything else in this guide:
- Access is read-only. The business integration realm is a zero-trust, read-only environment. You can request data about a vehicle; you cannot send commands to a vehicle (no door unlock, no engine start). Those capabilities live in a separate fleet realm and are not exposed here.
- The vehicle owner is always in control. Data only flows after the owner has explicitly consented to the specific data you asked for, for the specific purpose you stated. You initiate; the owner approves. There is no path that bypasses owner consent.
- The platform meters and bills automatically. Pricing, payment, and invoicing are enforced by the platform before any backend service runs. Your backend never handles pricing logic — you register a payment method and the platform does the rest.
If you have integrated with OAuth providers or other consent-gated data APIs before, the overall shape will feel familiar. The one concept that is easy to under-estimate — and the one that causes the most integration bugs — is consent as a first-class, owner-controlled lifecycle that is independent of your access tokens. The Consent section is the most important in this guide; read it before you write code.
How a data request works (the mental model)
There are three actors:
| Actor | Who | Role |
|---|---|---|
| You (the integrator) | A business organization: insurer, leasing co., energy aggregator, repairer, mobility operator, data intermediary | Initiates data requests on behalf of, or with the permission of, a vehicle owner |
| The vehicle owner | The natural person linked to the VIN | Grants, denies, or revokes consent in their own secure portal |
| The platform | MyNissanData, the data-access platform on top of the connected-vehicle infrastructure | Validates, gates, meters, bills, and delivers |
Every request follows the same arc, regardless of integration model or data family:
The request does not return data synchronously at creation time. Creating a request returns a requestId and a status. You then either poll the status or subscribe to a webhook to learn when consent is granted and data is ready. Only when the request reaches APPROVED with consent GRANTED does data become retrievable.
Consent: the rule that governs everything
Consent is owner-granted, scope-specific, time-bounded, revocable, and independent of your tokens. Internalize these five properties and most lifecycle questions answer themselves.
You initiate; the owner approves
For security and data-protection compliance, the act of granting consent always happens in the owner's own secure portal session — never through your credentials. A business partner can initiate a consent request via API, but cannot grant it. How the owner is brought into the loop differs by integration model:
- M2M (server-to-server): When you create a request, the platform emails the owner a secure deep-link. They follow it, authenticate, review exactly what you asked for (data, purpose, time range), and approve or deny.
- App (Authorization Code + PKCE): The owner is redirected to the Nissan IdP login + Consent Screen inline during your app's authorization flow, approves there, and is redirected back to your app.
Either way, the owner sees a plain-language description of your request — for example, "Allow [App Name] to access your driving-style data to provide a personalized insurance quote."
Scope-specific and additive-only
Consent is granted at the package level (see Data families). A grant covers exactly the packages and purpose you requested — nothing more. You cannot silently widen scope. If you later need data attributes that were not in the original grant, you must create a new request for the additional scope, which the owner approves separately. This enforces data minimization.
Time-bounded
Every grant carries a duration. Historical requests are bounded by a date range; subscriptions run for an agreed term. When the term ends, consent reaches a terminal "expired" state and data stops automatically.
Revocable at any time
The owner can revoke an active consent from their portal at any moment. Revocation is immediate: real-time streams associated with that grant are terminated and no further data flows. Your integration must treat revocation as a normal, expected event — not an error — and stop relying on that data.
Independent of your access tokens
This is the property most likely to bite you. Your OAuth/M2M token lifecycle and the consent lifecycle are two separate things.
- A valid, unexpired access token does not mean you are entitled to data. Entitlement is gated by stored consent, evaluated fresh on every data access.
- Conversely, refreshing or re-minting a token does not re-grant or extend consent.
So: a real-time read can return 403/no-data even with a perfectly valid token, because the owner revoked consent or the term expired. Always check the request/consent status, not just your token, before assuming data is available.
Consent request expiry
If the owner never acts on a pending request, the request expires after a configurable window (commonly ~7 days, with reminders) and the secure link becomes invalid. The opportunity is closed and you must initiate a fresh request. You are notified of expiry via webhook/polling like any other status change.
The three authorization gates
Before any data is read, every request passes through a centralized compliance engine — three sequential gates. If any gate fails, the request is terminated immediately. You don't call these gates; they run for you. Knowing they exist explains why a request can be rejected even when your call is well-formed.
| Gate | Question it answers | What it checks |
|---|---|---|
| 1 — Governance | Is this business entity legally allowed to receive data? | Global sanctions lists and the MyNissanData "gatekeeper" blocklist. Restricted entities are blocked. |
| 2 — Policy (consent) | Has the owner granted this specific scope? | The requested package/scope against the active consent ledger for that VIN. Enforces data minimization. |
| 3 — Dynamic (entitlement) | Did this owner own this vehicle during the requested window? | The temporal intersection of your request window and the owner's vehicle-ownership window, plus privacy-mode filters. Prevents leakage across previous/subsequent owners. |
Gate 3 is why a historical request can succeed but return less data than the full date range you asked for: only the portion of the window during which the consenting owner actually owned the vehicle is eligible.
Data families: what you can request
Every service package belongs to one of three families. The family determines the delivery mechanism, the request endpoint, and the billing model. List the packages available to your account before creating a request (see the service-package catalog); use the returned package id values in your request body.
| Family | What it provides | How it's delivered | Billing |
|---|---|---|---|
| Historical | Time-series history over a date range — one-off or recurring (periodic) | Async file: zipped CSVs via a time-limited pre-signed download URL | Prepaid per request (one-off); subscription (periodic) |
| Last Known Value | The most recent known value(s); no date range | Synchronous JSON, last-known value | Prepaid per call |
| Real-Time | Live telematics for an approved vehicle | Pull: read a resource snapshot on demand. Push: webhook events on state change | Subscription (aggregated monthly) |
Notes that matter in practice:
- Data availability is vehicle-dependent. For retrieving recorded values, a given vehicle supports either the Historical (time-series over a date range) option or the Last Known Value option — not necessarily both. Some vehicle models expose only the last-known-value service. Always rely on the service-package catalog and the package
typeto see what is actually available for your account and the vehicles you query, rather than assuming a vehicle supports historical. - Real-time delivery is event-driven, not a raw firehose. Subscriptions surface meaningful events — e.g., journey completed, charge-state changed, safety fault — rather than continuous raw pings. This protects your receiving infrastructure. Pull reads give you the latest known state on demand.
- A resource can legitimately return no data if the vehicle doesn't support it. For example, the
chargingresource returns404for non-EV (ICE) vehicles. - Very high-volume continuous telemetry is out of scope here. Webhook-based delivery is designed for self-serve SME-to-mid scale. If your run-rate or frequency needs grow past the threshold for managed streaming, that is a managed high-throughput streaming tier conversation — contact your account team rather than working around webhook limits.
Billing: how and when you are charged
Billing is enforced by the platform, not your backend. The model depends entirely on the data family / request type — not on whether the call came from an M2M backend or an app.
The prerequisite: a valid payment method
Your API credentials remain suspended until your business account has a complete billing profile and a valid primary payment method (a credit or debit card). Until then, data-request calls are blocked. Add a payment method in account settings to activate.
Pricing tier
Pricing is rendered dynamically by account type:
- SME — margin-free rate.
- Large Enterprise — commercial rate.
You don't pass a price; the platform computes it from your account type and the requested package.
Workflow A — One-Off Historical
Granting consent triggers the invoice and hold automatically: the platform issues an invoice for the exact packages the owner approved and places a hold for that amount in the same step. The hold is reserved, not captured — no charge occurs while the data is being prepared, and if the owner never consents, no hold is placed and nothing is charged.
Payment is only captured when the requester initiates the download. If capture succeeds, the download link is released; if it fails, the download is blocked and the requester is notified that payment is required.
Workflow B1 — Recurring subscriptions (Periodic)
Workflow B2 — Recurring subscriptions (Realtime)
Both subscription workflows share the same consent and billing model; they differ in delivery. Periodic subscriptions deliver on a schedule, while real-time subscriptions stream continuously — you either pull the current value from the API or receive a webhook push as signals arrive. Real-time delivery is not gated on the monthly invoice; data flows for the whole billing period and the charge is deducted automatically on the 1st.
Because consented VINs can be added or revoked organically throughout the month, individual VINs are not charged per transaction. Instead, on the 1st of each month, an aggregated billing job sums all active, consented VINs for your account over the prior month and generates a single consolidated invoice.
Invoices & retention
Invoices are generated at capture (Workflow A) or at the monthly aggregation (Workflows B1 and B2) and are available in the portal. Financial records are retained for tax-compliance purposes independently of account deletion.
Cost control: dynamic date ranges & repeat requests
The platform prices the request, not the vehicle. How your app derives the requested period therefore decides how often you are charged — see Billing for the charging mechanics.
Worked example
A quotation app sends periodStartDate = today - 30 days and periodEndDate = today. A user who submits on Monday and again on Tuesday creates two requests over two different windows — two pre-authorization holds, and two captures once each is consented.
Pattern 1 — check existing coverage before you create
Before every POST .../historical/data-requests, list what already exists for that VIN:
curl -G "{API_BASE}/cms/m2m/accounts/{account_id}/historical/data-requests" \
-H "Authorization: Bearer <access_token>" \
--data-urlencode "vin=VF1AAAAA000000001" \
--data-urlencode "requestType=ONE_OFF" \
--data-urlencode "requestStatus=PENDING" \
--data-urlencode "requestStatus=APPROVED" \
--data-urlencode "requestStatus=COMPLETED" \
--data-urlencode "pageSize=100"The list endpoint filters on vin, requestType, requestStatus and consentStatus — there is no date-range filter. Each item returns periodStartDate, periodEndDate, packages, reference and createdAt, so do the window comparison in your own code:
- Fetch the VIN's
ONE_OFFrequests in the statuses that can still cost you money —PENDING,APPROVED,ACTIVE,COMPLETED. - Compare the window you are about to ask for against each request's
periodStartDate–periodEndDateand package set. - Already covered and consented? Re-read the existing deliveries instead of requesting the same data again.
- Still
PENDINGfor that window? Wait for the owner to act rather than stacking a second hold on your payment method. - Nothing covers it? Then create the request.
Pattern 2 — snap dynamic windows to a stable grid
Rather than anchoring the range to the wall clock, quantize it: a whole calendar month, or a window that only moves once a week. Repeat submissions inside the same slot then resolve to the identical period, which is what makes the Pattern 1 coverage check actually hit. Show the resolved window in your UI so the user sees the period they are paying for.
Pattern 3 — guardrails in your own application
- Cap creation yourself. A hard ceiling per VIN and per end-user — for example one one-off request per VIN per calendar month — is the only limit fully under your control. Enforce it in your backend, before the API call.
- Stamp a correlation key in
reference(up to 255 characters) — for example a digest of VIN + package set + period. It is returned on the list response, so detecting a repeat is a string comparison rather than a field-by-field diff. - Serve data you already hold. A delivered extract stays usable for its retention window; re-requesting the same window buys nothing but another charge.
- Make submission deliberate. Confirm window, packages and cost in the UI behind an explicit user action. Never create a request as a side effect of a page load, a refresh, or a client-side retry.
- Reconcile continuously. Subscribe to the consent & billing webhooks and alert on requests-per-day run-rate anomalies, rather than discovering them on the invoice.
Pattern 4 — use PERIODIC when the need is recurring
If the use case genuinely needs a rolling window on an ongoing basis, a PERIODIC request with MONTHLY frequency is billed through the aggregated monthly charge (Workflows B1 and B2) on one consent round, instead of a fresh prepaid request per submission. That is far more predictable per VIN than repeated ONE_OFF calls — see Data families.
PENDING requests as coverage therefore also stops you stacking holds against your payment method once those owners do decide.Choose your integration model: M2M vs. App (PKCE)
You pick the authorization model when you create the integration, and it cannot be changed afterwards. If you need both, create two integrations.
| Server-to-Server (M2M) | Authorization Code + PKCE (App) | |
|---|---|---|
| Best for | Backend services acting on behalf of your organization | Apps acting on behalf of an individual vehicle owner |
| Grant | client_credentials | authorization_code |
| Credentials | client_id + client_secret | client_id only (public client + PKCE; no secret) |
| User login | Not required | Required (owner consents via browser redirect) |
| Redirect URLs | Not used | Required at registration; exact-match enforced |
| How consent is captured | Owner approves via emailed secure deep-link | Owner approves inline on the Nissan IdP login / Consent Screen |
| Tokens used on reads | access_token only | access_token |
| API base path | /cms/m2m/... | /cms/oauth/... |
Rule of thumb: if a human owner is present in your UX and you want them to authenticate and consent in the moment, use App (PKCE). If you're running unattended backend jobs against VINs your organization is permitted to act for, use M2M and rely on email-link consent capture. Both share the same package catalog, the same data-request lifecycle, and the same billing model.
Before you begin
Make sure the following are in place for your business account. Data requests are blocked until every gate below passes.
- An active business account (not suspended), and your organization is not on a sanctions/gatekeeper blocklist (Gate 1).
- A complete billing profile with a valid primary payment method (a credit or debit card). Until this exists, your API credentials are suspended.
- Accepted platform terms and Data Terms & Conditions.
Development vs. production: a development account is sandboxed and vehicle-count-limited for PoC and pre-prod validation; a primary account runs live, contracted services. Build and validate against development first.
Create an integration & get credentials
From the Programmatic Access tab, choose Create Integration and complete the form:
- Application name (3–50 characters).
- Authorization model — M2M or Authorization Code. Immutable after creation.
- Redirect URLs — required for Authorization Code. These are the only URLs the authorize step will redirect back to (exact match).
- Purpose of the integration (shown to owners in the consent prompt).
- Service packages you intend to request.
- Accept the Data Terms & Conditions.
Submit to register. You can later update most fields, but the authorization model stays fixed.
Your credentials
After creation, credentials are shown once in a popup. Store them securely before closing it (you can also download a PDF summary).
- M2M: a
client_idand aclient_secret(the secret is shown only once). - Authorization Code: a
client_idonly (no secret — security comes from PKCE).
Browse the service-package catalog
A service package defines the data a request can access, and which family/billing it falls under. List what's available to your account before creating a request:
M2M
GET {API_BASE}/cms/m2m/accounts/{account_id}/service-packages?dataType=HISTORICAL|REAL_TIMEApp (PKCE) — same shape, OAuth path + access-token headers:
GET {API_BASE}/cms/oauth/accounts/{account_id}/service-packages?dataType=HISTORICAL|REAL_TIMEEach package returns at least an id, name, description, and type. Use the package id values in the packages array when you create a data request. The catalog is the source of truth for what a given vehicle/account supports — including whether historical time-series or only last-known-value reads are available (see Data families).
Quickstart A — Server-to-Server (M2M)
Backend service, no interactive login. Consent is captured via an emailed secure link to the owner.
- Your backend → Platform API:
POST /cms/m2m/token(client credentials) - Platform API → Your backend:
access_token - Your backend → Platform API: POST data-request (VIN, package, owner email)
- Platform API → Vehicle owner: Email secure consent link
- Platform API → Your backend:
requestId, status =PENDING - Vehicle owner → Platform API: Approve in secure portal
- Platform API → Your backend: Webhook
CONSENT_GRANTED(or poll status) - Your backend → Platform API: GET data (deliveries / resource)
- Platform API → Your backend: Pre-signed download URL or JSON
Step 1 — Get an access token
Exchange your account ID and client credentials for a bearer token:
curl -X POST "{API_BASE}/cms/m2m/token" \
-H "Content-Type: application/json" \
-d '{
"account_id": "YOUR_ACCOUNT_ID",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}'The response contains an access_token and its expires_in lifetime. Send it on every subsequent call:
Authorization: Bearer <access_token>Step 2 — Create a data request
Use the endpoint that matches the package family:
/cms/m2m/accounts/{account_id}/realtime/data-requests/cms/m2m/accounts/{account_id}/historical/data-requestsA request identifies a vehicle (17-character vin), the vehicle user's email (used to notify the owner for consent), and one or more package id values. Historical requests also take requestType (ONE_OFF or PERIODIC), a date range, and — for periodic — a frequency. The exact field names and validation rules are in the API reference.
What happens behind the scenes: the platform runs synchronous validations (valid VIN, resolvable user, active ownership pairing, temporal limits — see Compliance constraints), creates a PENDING record, validates the payment method, and emails the owner a secure approval link. The call returns a requestId and status — no data yet.
A one-off historical request is held and charged once consent is granted, so each distinct period you ask for is a separate charge. Read Cost control before deriving the period from a dynamic expression.
Step 3 — Monitor the request
Poll the list endpoints (filter by vin, requestStatus, consentStatus, with paging), or subscribe to a webhook to be pushed status changes:
/cms/m2m/accounts/{account_id}/realtime/data-requests/cms/m2m/accounts/{account_id}/historical/data-requestsWait for requestStatus = APPROVED and consentStatus = GRANTED. See Data-request lifecycle & statuses.
Step 4 — Retrieve data
Historical — list deliveries, then fetch a time-limited download URL:
/cms/m2m/accounts/{account_id}/historical/data-requests/{requestId}/data-deliveries/cms/m2m/accounts/{account_id}/historical/.../data-deliveries/{dataDeliveryId}/downloadReal-time — once approved, read a telematics resource directly:
/cms/m2m/accounts/{account_id}/realtime/vehicles/{vin}/{resource}See the real-time telematics catalog for valid {resource} values.
Quickstart B — Authorization Code + PKCE (App)
Use this when an individual owner authorizes your app. PKCE means no client secret.
- Your app: Generate PKCE verifier + challenge
- Your app → Platform API: Redirect owner to
/authorize(challenge) - Platform API → Nissan IdP: Redirect for login
- Vehicle owner → Nissan IdP: Authenticate
- Nissan IdP → Vehicle owner: Consent prompt
- Vehicle owner → Nissan IdP: Approve
- Platform API → Your app: Redirect to callback (auth code)
- Your app → Platform API:
POST /cms/oauth/token(code + verifier) - Platform API → Your app: access_token + refresh_token
- Your app → Platform API: GET data (Authorization)
- Platform API → Your app: Data
Step 1 — Generate a PKCE verifier and challenge (per authorization attempt)
// Keep the verifier private; send only the challenge to /authorize.
const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
const digest = await crypto.subtle.digest(
"SHA-256",
new TextEncoder().encode(verifier)
);
const codeChallenge = base64url(new Uint8Array(digest));Step 2 — Redirect the owner to the authorize endpoint
/cms/oauth/authorize{API_BASE}/cms/oauth/authorize
?account_id=YOUR_ACCOUNT_ID
&client_id=YOUR_CLIENT_ID
&redirectUri=https://your-app.example.com/callback
&codeChallenge=BASE64URL_SHA256_OF_VERIFIER
&codeChallengeMethod=S256The owner logs in via the Nissan IdP, sees the plain-language consent prompt for the scopes you requested, approves, and is redirected back to your redirectUri with an auth code.
redirectUri must exactly match one of the redirect URLs registered for the integration, or the request is rejected.Step 3 — Exchange the code for tokens (on your callback, using the original verifier)
/cms/oauth/tokencurl -X POST "{API_BASE}/cms/oauth/token" \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "AUTH_CODE_FROM_CALLBACK",
"redirect_uri": "https://your-app.example.com/callback",
"client_id": "YOUR_CLIENT_ID",
"code_verifier": "ORIGINAL_VERIFIER"
}'You receive an access_token and a refresh_token.
Step 4 — Call owner-scoped APIs with Access Token
Every /cms/oauth/accounts/... call carries the owner's access token:
Authorization: Bearer <access_token>The owner-scoped endpoints mirror the M2M ones:
/cms/oauth/accounts/{account_id}/realtime/data-requests/cms/oauth/accounts/{account_id}/historical/data-requests/cms/oauth/accounts/{account_id}/realtime/data-requests/cms/oauth/accounts/{account_id}/historical/data-requests/cms/oauth/accounts/{account_id}/realtime/vehicles/{vin}/{resource}Step 5 — Refresh tokens before they expire
The refresh token rotates on each use — store the new one each time:
/cms/oauth/token/refreshcurl -X POST "{API_BASE}/cms/oauth/token/refresh" \
-H "Content-Type: application/json" \
-d '{
"clientId": "YOUR_CLIENT_ID",
"refreshToken": "YOUR_REFRESH_TOKEN"
}'Data-request lifecycle & statuses
A request moves through several states as the owner consents and data is delivered. Poll the list endpoints or use webhooks to track it. These are the authoritative enums returned by the API:
| Field | Values |
|---|---|
requestStatus | PENDING, ACTIVE, APPROVED, DECLINED, COMPLETED, REVOKED, CANCELLED, INVALID, EXPIRED |
consentStatus | PENDING, GRANTED, REVOKED, EXPIRED, DENIED, SUPERSEDED |
package status | PENDING, GRANTED, DENIED, EXPIRED, REVOKED |
requestType | HISTORICAL, REAL_TIME, ONE_OFF, PERIODIC |
frequency | MONTHLY, WEEKLY (periodic only) |
The consent lifecycle, in brief:
| Transition | When |
|---|---|
PENDING → APPROVED | Owner grants |
PENDING → DECLINED | Owner denies |
PENDING → EXPIRED | No action in window |
APPROVED → COMPLETED | One-off delivered |
APPROVED → REVOKED | Owner revokes |
APPROVED → EXPIRED | Term ends |
How to read the statuses together:
PENDING/consentStatus = PENDING— created, owner notified, awaiting action. No data.APPROVED+GRANTED— the only state in which data is retrievable. Real-time reads and historical deliveries are available here.DECLINED/consentStatus = DENIED— owner rejected. Terminal; initiate a new request if still needed.EXPIRED(request) /consentStatus = EXPIRED— either the request lapsed before the owner acted, or the consent term ended. Terminal; create a fresh request.REVOKED— owner revoked an active grant; data stops immediately. Terminal for that grant.SUPERSEDED(consent) — a newer consent grant has replaced this one (e.g., re-scoped request).COMPLETED— a one-off request whose delivery has been fulfilled.INVALID/CANCELLED— failed validation (bad VIN, no ownership link, etc.) or was cancelled.
requestStatus = APPROVED and consentStatus = GRANTED.Retrieving data
Historical (file delivery)
Historical results are prepared asynchronously and delivered as zipped CSVs via a time-limited pre-signed download URL (session/IP- restricted). The flow:
- Request reaches
APPROVED+GRANTEDand (Workflow A) payment is captured. - List deliveries:
GET .../historical/data-requests/{requestId}/data-deliveries. - Fetch the download URL:
GET .../data-deliveries/{dataDeliveryId}/download. - Download promptly — the URL expires.
If you created the request via API and subscribed to webhooks, you'll receive a delivery-ready event instead of needing to poll.
Last-known value
Last-known packages return the most recent known value(s) synchronously as JSON — no date range, no async file. Availability is vehicle-dependent (see Data families); expect a single response per call.
Real-time (pull)
Once APPROVED + GRANTED, read the latest known state of a resource on demand:
GET {API_BASE}/cms/{m2m|oauth}/accounts/{account_id}/realtime/vehicles/{vin}/{resource}Real-time (push)
Subscribe a webhook to receive events on state change instead of polling. Real-time push is event-driven (e.g., journey completed, charge-state changed, safety fault).
Real-time telematics catalog
Real-time sections are read per vehicle via .../realtime/vehicles/{vin}/{section}. Each section answers with its own serviceName token, which is what the response envelope carries — not the URL segment. Available {section} values:
| Section | serviceName | Description |
|---|---|---|
location | VEHICLE_LOCATION | Current GPS position |
cockpit | COCKPIT | Odometer, fuel/energy and cockpit readouts |
charging | VEHICLE_CHARGE_STATUS | EV charging state |
hvac | VEHICLE_HVAC_STATUS | Climate / HVAC state |
tirepressure | VEHICLE_TIRE_PRESSURE | Tire pressure readings |
occupancy | VEHICLE_PRESENCE_STATUS | Seat occupancy / belt status |
visibility | VEHICLE_LIGHTING_STATUS | Lights, wipers and visibility-related state |
adas | VEHICLE_ADAS | Advanced driver-assistance state |
behavior | DRIVER_PERFORMANCE_DATA | Driving-behavior signals |
security | VEHICLE_SECURITY | Doors, locks and windows |
healthstatus | VEHICLE_HEALTH_STATUS | Vehicle health / diagnostic status |
200 with metaData.responseStatus = FAILED. An ICE vehicle answers /charging that way. Individual fields the vehicle did not report are omitted rather than sent as null — see the real-time data dictionary for the envelope and every field.Webhooks
Instead of polling, subscribe a webhook and the platform pushes events to your endpoint. Two payload families are delivered: real-time telemetry push and consent & billing lifecycle events. Both arrive as HTTPS POSTs signed with HMAC-SHA256 — register once, verify the signature, then route on the payload.
Events
| Event | Fires when | Package | What it delivers |
|---|---|---|---|
JOURNEY.COMPLETED | The vehicle ends a journey (ignition off) | Usage-Based Insurance | The completed-journey data (all fields below) |
CHARGE.STATE.CHANGED | The vehicle's charge status changes (state-of-charge or battery capacity) | Smart Charging | Charge status + current location |
SYSTEM.SAFETY.FAULT | A new safety or health fault is detected | Remote Diagnostics | Active alert codes + current location |
| Package | Webhook event |
|---|---|
| Usage-Based Insurance | JOURNEY.COMPLETED |
| Smart Charging | CHARGE.STATE.CHANGED |
| Remote Diagnostics | SYSTEM.SAFETY.FAULT |
A field the vehicle did not report is omitted rather than sent as null. Coded fields carry both the integer value and its label.
Register your endpoint
You can register from the portal UI or the webhook API. In the portal:
- Log in to the Portal.
- Open the Data Catalog tab in the top navigation.
- Switch to the Programmatic Access tab.
- In the Advanced Programmatic Access card, click Configure Webhook.
In the dialog you provide:
- A publicly reachable HTTPS callback URL.
- An HMAC key (up to 32 characters) used to sign and verify payloads.
Subscriptions are managed against your business account:
PUT to rotate the URL or HMAC key.Deliveries originate from the platform's (MyNissanData) webhook delivery service over HTTPS. If your infrastructure requires source IP allow-listing, request the current egress range for your environment from your account team.
Registration handshake (ownership challenge)
When you register a callback URL, the platform verifies you own it before it will send events:
- The platform sends a challenge to your URL.
- Your endpoint must echo the challenge back in the response.
- On a match, the subscription is saved and set active.
Type 1 — Real-time telemetry push
Delivered when a subscribed vehicle emits a real-time event. Every delivery uses the same envelope; the event data is carried in payload:
{
"eventId": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"eventType": "CHARGE.STATE.CHANGED",
"eventTime": "2026-06-01T12:34:56.000Z",
"vin": "SJNJ12TDXU2117834",
"payload": { "soc": 80 }
}| Field | Meaning |
|---|---|
eventId | Unique per delivery — use as your idempotency key. |
eventType | eventType identifies the event: JOURNEY.COMPLETED, CHARGE.STATE.CHANGED, or SYSTEM.SAFETY.FAULT. One webhook subscription per account receives all three — switch on eventType. |
eventTime | ISO-8601 UTC timestamp of delivery. |
vin | Vehicle identification number. |
payload | The event data. |
Signature verification (X-MND-Sig)
Each delivery carries an HMAC-SHA256 signature in the X-MND-Sig header (lowercase hex, 64 characters). Compute it over the eventTime, a literal dot, and the raw request body:
signed string = <eventTime> + "." + <raw request body>
X-MND-Sig = HMAC_SHA256(signed string, your_hmac_key) // lowercase hexeventTime— the top-leveleventTimevalue from the body, used verbatim.- raw body — the exact bytes you received; do not re-serialize the JSON before hashing.
- Compare case-sensitively and in constant time.
Test vector — verify your implementation against this:
signing key : whsec_sample_key_do_not_use_in_prod
eventTime : 2026-06-01T12:34:56.000Z
raw body : {"eventId":"3f2504e0-4f89-41d3-9a0c-0305e82c3301","eventType":"CHARGE.STATE.CHANGED","eventTime":"2026-06-01T12:34:56.000Z","vin":"SJNJ12TDXU2117834","payload":{"soc":80}}
signed str : 2026-06-01T12:34:56.000Z.{"eventId":"3f2504e0-4f89-41d3-9a0c-0305e82c3301","eventType":"CHARGE.STATE.CHANGED","eventTime":"2026-06-01T12:34:56.000Z","vin":"SJNJ12TDXU2117834","payload":{"soc":80}}
X-MND-Sig = 1d116cccde8627fcd09e6a8820d248c478230354ec0064da5e2ec3060334fd49<eventTime>. prefix; (2) re-serializing the body before hashing instead of using the exact received bytes.Type 2 — Consent & billing events
Consent-lifecycle and download-payment notifications use a different envelope: match on the top-level event and read the data object. Validate the X-MND-Sig signature the same way before processing.
timestamp is Unix epoch milliseconds (UTC). Optional fields are omitted entirely when absent (never sent as null) — a VIN-less request omits vin; a package with no stored display name omits name.CONSENT_GRANTED — consent granted (example shows a partial grant, one package denied):
{
"event": "CONSENT_GRANTED",
"data": {
"requestId": "3f1c8e2a-9b4d-4f7a-8c21-0d5e6f7a8b90",
"appId": "9a2b7c3d-1e4f-4a5b-9c8d-2e3f4a5b6c7d",
"accountId": "acct-10023",
"consentStatus": "GRANTED",
"requestStatus": "APPROVED",
"requestType": "REAL_TIME",
"timestamp": 1752566400000,
"vin": "WVWZZZ1KZAW000001",
"packages": [
{ "id": "PKG_LOCATION", "name": "Location Data", "status": "GRANTED" },
{ "id": "PKG_TELEMATICS", "name": "Telematics", "status": "DENIED" }
]
}
}CONSENT_DENIED — vehicle user declines the request:
{
"event": "CONSENT_DENIED",
"data": {
"requestId": "7b2d1f04-3c6e-4a19-b0f2-5a8c9d1e2f30",
"appId": "9a2b7c3d-1e4f-4a5b-9c8d-2e3f4a5b6c7d",
"accountId": "acct-10023",
"consentStatus": "DENIED",
"requestStatus": "DECLINED",
"requestType": "HISTORICAL",
"timestamp": 1752570000000,
"vin": "WVWZZZ1KZAW000001",
"packages": [
{ "id": "PKG_TRIPS", "name": "Trip History", "status": "DENIED" }
]
}
}CONSENT_REVOKED — a previously granted consent is revoked or cancelled (example reflects app termination: request → CANCELLED, consent + packages → REVOKED):
{
"event": "CONSENT_REVOKED",
"data": {
"requestId": "c4a9e6b1-8d20-4f3c-9a7e-1b2c3d4e5f60",
"appId": "9a2b7c3d-1e4f-4a5b-9c8d-2e3f4a5b6c7d",
"accountId": "acct-10023",
"consentStatus": "REVOKED",
"requestStatus": "CANCELLED",
"requestType": "REAL_TIME",
"timestamp": 1752573600000,
"vin": "WVWZZZ1KZAW000001",
"packages": [
{ "id": "PKG_LOCATION", "name": "Location Data", "status": "REVOKED" }
]
}
}CONSENT_EXPIRED — consent auto-expired (no user action within the consent window):
{
"event": "CONSENT_EXPIRED",
"data": {
"requestId": "e1f2a3b4-5c6d-4e7f-8a9b-0c1d2e3f4a5b",
"appId": "9a2b7c3d-1e4f-4a5b-9c8d-2e3f4a5b6c7d",
"accountId": "acct-10023",
"consentStatus": "EXPIRED",
"requestStatus": "EXPIRED",
"requestType": "HISTORICAL",
"timestamp": 1752577200000,
"vin": "WVWZZZ1KZAW000001",
"packages": [
{ "id": "PKG_TRIPS", "name": "Trip History", "status": "EXPIRED" }
]
}
}PAYMENT_FAILED — a download-time invoice payment could not be resolved (the API call is rejected with HTTP 402):
{
"event": "PAYMENT_FAILED",
"data": {
"requestId": "a8b7c6d5-e4f3-4a2b-9c8d-7e6f5a4b3c2d",
"accountId": "acct-10023",
"appId": "9a2b7c3d-1e4f-4a5b-9c8d-2e3f4a5b6c7d",
"invoiceId": "inv-2026-000789",
"status": "FAILED",
"message": "Payment could not be completed",
"requestType": "ONE_OFF",
"vin": "WVWZZZ1KZAW000001"
}
}Real-time packages: overview & trigger matrix
Real-time connected-vehicle data reaches you in one of two ways: you pull the last-known value of a resource whenever you ask, or you receive a signed webhook push the instant an event happens. Your subscribed package decides which data groups you are entitled to — see Webhooks for the delivery mechanics.
Choose a delivery mode by how you want the data; choose a package by what data you need. A subscription can combine packages.
Two delivery modes
| Mode | What you get | When it arrives | Who initiates |
|---|---|---|---|
| Pull API | The last-known value of a vehicle section | Whenever you ask for it | You call GET …/{section} |
| Webhooks (push) | An event payload, the instant an event happens | On a journey end, charge change, or safety fault | We POST it to your endpoint |
Which package do I need?
Pull API — packages that let you call sections on demand:
| Package | Best for | Pull sections you can call |
|---|---|---|
| Telemetry Snapshot | Location, cockpit gauges & charge state, on demand | /location · /cockpit · /charging |
| Smart Charging | EV charge state & cockpit gauges | /cockpit · /charging |
| Remote Diagnostics | Vehicle health, security, cabin & ADAS | /behavior · /tirepressure · /occupancy · /security · /hvac · /visibility · /healthstatus · /adas |
Webhooks — packages that deliver an event to your endpoint:
| Package | Best for | Webhook event you receive |
|---|---|---|
| Usage-Based Insurance | Completed-journey trip summaries | JOURNEY.COMPLETED |
| Smart Charging | Charge-status changes | CHARGE.STATE.CHANGED |
| Remote Diagnostics | New safety / health faults | SYSTEM.SAFETY.FAULT |
Make your first pull call
- Get an access token — OAuth2 client-credentials, using your M2M account credentials.
- Call the section you want for a VIN:
GET /cms/m2m/accounts/{account_id}/realtime/vehicles/{vin}/locationwithAuthorization: Bearer <token>. - Read the fields from
data— flat for a single-object section, or keyed by sub-object otherwise. CheckmetaData.responseStatus:SUCCESSmeans the vehicle has reported that section.
What triggers a delivery
| Delivery | Type | Fires when |
|---|---|---|
| On-demand pull | Pull | You call the endpoint for a resource; it returns the last-known value. |
JOURNEY.COMPLETED | Push | The vehicle ends a journey — at ignition off. |
CHARGE.STATE.CHANGED | Push | The vehicle's charge status changes — state-of-charge or battery capacity. |
SYSTEM.SAFETY.FAULT | Push | A new hardware safety or health fault is detected — delivered immediately. |
The four real-time packages
- Telemetry Snapshot (
pkg.rt.telemetry_snapshot) — current position, mileage and energy/fuel level for a vehicle. On-demand pull only — no webhook. Unlocks/location,/cockpitand/chargingpull access. - Usage-Based Insurance (
pkg.rt.ubi_insurance) — a completed-journey summary with driving-behaviour metrics, for pay-how-you-drive products. Pushes onJOURNEY.COMPLETEDonly — no on-demand pull access. - Smart Charging (
pkg.rt.smart_charging) — EV state-of-charge and charging-session events, for energy and charging platforms. Pushes onCHARGE.STATE.CHANGED, plus on-demand pull of/cockpitand/charging. - Remote Diagnostics (
pkg.rt.remote_diagnostics) — safety and health faults, for repair and roadside providers. Pushes onSYSTEM.SAFETY.FAULT, plus on-demand pull of/behavior,/tirepressure,/occupancy,/security,/hvac,/visibility,/healthstatusand/adas.
Real-time data dictionary (pull API & webhook)
Every real-time field, grouped by pull section or webhook event: the field delivered in the message, its type and unit, an official description, the complete value-to-meaning mapping, and the vehicle models that deliver it. Read it alongside the package × trigger matrix to know which fields a given package actually delivers.
Part 1 — Pull API
On-demand access to the last-known value of a vehicle resource. Call an endpoint for a section and receive its current value.
How the pull API works
The pull API is on-demand: each call returns the last-known value the platform holds for one section of a vehicle. There is no streaming and no polling contract — you read a section whenever you need its current state.
Request
GET {API_BASE}/cms/m2m/accounts/{account_id}/realtime/vehicles/{vin}/{section}
Authorization: Bearer <access_token>OAuth2 (client-credentials). {account_id} is your M2M account, {vin} the target vehicle, {section} one of the sections below.
Response envelope
{
"vin": "SJNJ12TD1U2232824",
"serviceName": "VEHICLE_LOCATION",
"data": { ... section fields ... },
"metaData": { "responseStatus": "SUCCESS", "message": "VEHICLE_LOCATION data available." }
}serviceName is a fixed token per section — not the URL segment; see the matrix below. data holds the section's fields: a single-object section (/location, /tirepressure) returns them flat; every other section returns data keyed by sub-object — for example data.odometer, data.speed. Coded fields are delivered as { "label": …, "value": … } objects.
A section the vehicle has not reported returns metaData.responseStatus = FAILED with HTTP 200 (not an HTTP error) and the message No <serviceName> data available. Fields — and whole sub-objects — the vehicle did not report are omitted from data rather than sent as null.
Example responses
/location — single object, data flat:
{
"vin": "SJNJ12TD1U2232824",
"serviceName": "VEHICLE_LOCATION",
"data": {
"locationLatitude": 48.825026944444,
"locationLongitude": 2.0747516666667,
"locationHeading": 220,
"latitudeAtStart": 48.799281388889,
"latitudeAtEnd": 48.840693888889,
"longitudeAtStart": 2.0439263888889,
"longitudeAtEnd": 2.2295127777778,
"lastKnownLocationAltitude": 210,
"locationSource": { "label": "A_IVI", "value": 1 },
"locationValidity": { "label": "VALID", "value": 0 },
"locationSourceAtStart": 1,
"locationSourceAtEnd": 1,
"lastUpdated": "2026-09-10T06:32:30.313Z"
},
"metaData": { "responseStatus": "SUCCESS", "message": "VEHICLE_LOCATION data available." }
}/cockpit — multiple objects, data keyed by sub-object:
{
"vin": "SJNJ12TD1U2232824",
"serviceName": "COCKPIT",
"data": {
"odometer": {
"mileage": { "value": 6607.47, "unit": "km" },
"mileageLife": { "value": 6150.8, "unit": "km" },
"mileageCoveredInTrip": { "value": 97.4, "unit": "km" },
"totalDistanceStartTrip": { "value": 6494.41, "unit": "km" },
"totalDistanceEndTrip": { "value": 6478.07, "unit": "km" },
"lastUpdated": "2026-09-10T06:32:30.313Z"
},
"fuelLevel": {
"fuelGaugeDisplayValue": 17,
"fuelLowLevel": 0,
"ecoAverageDistanceForFuelEconomy": { "value": 5, "unit": "km/L" },
"lastUpdated": "..."
},
"dte": {
"distanceToEmpty": { "value": 157, "unit": "km" },
"bRangeFrequencyInTrip": 1,
"lastUpdated": "..."
},
"speed": {
"speedDisplayedValue": { "value": 117.4, "unit": "km/h" },
"averageTripSpeed": { "value": 69.73, "unit": "km/h" },
"statusSpeedUnit": { "label": "KM/H", "value": 0 },
"averageSpeedWheelFrontLeft": { "value": 106.14, "unit": "km/h" },
"lastUpdated": "..."
}
},
"metaData": { "responseStatus": "SUCCESS", "message": "COCKPIT data available." }
}Sections & package entitlement
Each section is its own endpoint. Your subscribed package decides which sections you may call.
Package × endpoint matrix
| Section endpoint | serviceName | Returns | Package |
|---|---|---|---|
/location | VEHICLE_LOCATION | GPS location & motion state | Telemetry Snapshot |
/cockpit | COCKPIT | Cluster gauges — odometer, fuel, distance-to-empty, speed | Telemetry Snapshot · Smart Charging |
/charging | VEHICLE_CHARGE_STATUS | EV charge status & session | Telemetry Snapshot · Smart Charging |
/behavior | DRIVER_PERFORMANCE_DATA | Driver performance (last-trip summary) | Remote Diagnostics |
/tirepressure | VEHICLE_TIRE_PRESSURE | Tire pressure (per corner) | Remote Diagnostics |
/occupancy | VEHICLE_PRESENCE_STATUS | Seat presence + seat-belt status | Remote Diagnostics |
/security | VEHICLE_SECURITY | Doors · locks · windows | Remote Diagnostics |
/hvac | VEHICLE_HVAC_STATUS | HVAC / cabin climate | Remote Diagnostics |
/visibility | VEHICLE_LIGHTING_STATUS | Lighting & wipers | Remote Diagnostics |
/healthstatus | VEHICLE_HEALTH_STATUS | Health · system-safety alerts · MIL · oil pressure · faults | Remote Diagnostics |
/adas | VEHICLE_ADAS | ADAS — FCW · AEB · LDW | Remote Diagnostics |
Package → pull sections it grants
| Package | Pull sections it grants |
|---|---|
| Telemetry Snapshot | /location · /cockpit · /charging |
| Smart Charging | /cockpit · /charging |
| Remote Diagnostics | /behavior · /tirepressure · /occupancy · /security · /hvac · /visibility · /healthstatus · /adas |
Section field reference
Every field delivered in each pull section — the JSON key you receive, its type and unit, an official description, the value-to-meaning mapping, and the vehicle models that deliver it. The field lists below are the complete set returned by the live API, grouped exactly as the response nests them.
How to read this reference
Field delivered is the JSON key you actually receive, and it is the authoritative name — it is not always a mechanical camelCase of the underlying vehicle signal (StatusDistanceTotalizerComputed arrives as mileage, VCMEVSOCStatusDisplay as stateOfCharge). Numeric fields pass through unchanged. Coded fields carry both the integer code and its enum label.
0 = OK, 1 = active — but brake fluid low, 12V battery low and HV battery high invert to 1 = OK, 2 = active. Status fields (doors, tyres, charge, gearbox…) are multi-state rather than simple on/off — check each row.- All models — ARIYA · QASHQAI · QASHQAI MC · JUKE · LEAF · Navara: the signal is defined on every supported model.
- QASHQAI MC — QASHQAI MC only: the richer cabin, door, HVAC, driver-assistance and extended-diagnostic set.
- ARIYA · QASHQAI · JUKE · LEAF · Navara — every model except QASHQAI MC, for example the TPMS warning lamp and the accelerator-pedal ratio.
/location — Geolocation
serviceName: VEHICLE_LOCATION. Single-object section — data holds these fields flat.
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
locationLatitude | Number | degrees | Current latitude of the vehicle | −90.0 … 90.0 (WGS-84) | All models |
locationLongitude | Number | degrees | Current longitude of the vehicle | −180.0 … 180.0 (WGS-84) | All models |
locationHeading | Number | degrees | Direction heading of the vehicle | 0 … 360 (0 = north, clockwise) | All models |
lastKnownLocationAltitude | Number | metres | Altitude — height above sea level | — | QASHQAI MC |
latitudeAtStart | Number | degrees | Latitude at the start of the last trip | −90.0 … 90.0 (WGS-84) | All models |
longitudeAtStart | Number | degrees | Longitude at the start of the last trip | −180.0 … 180.0 (WGS-84) | All models |
latitudeAtEnd | Number | degrees | Latitude at the end of the last trip | −90.0 … 90.0 (WGS-84) | All models |
longitudeAtEnd | Number | degrees | Longitude at the end of the last trip | −180.0 … 180.0 (WGS-84) | All models |
locationSource | Enum | — | Source of the reported position | 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
locationValidity | Enum | — | Whether the location was received correctly. While NOT_VALID, the last successful position is kept. | 0 = VALID · 1 = NOT_VALID · 2 = Unavailable | QASHQAI MC |
locationSourceAtStart | Number | — | Position source at trip start | 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
locationSourceAtEnd | Number | — | Position source at trip end | 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
/cockpit — Odometer, Fuel & Speed
serviceName: COCKPIT. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
odometer | mileage | Number | km | Total corrected vehicle mileage (odometer) | Cumulative odometer (0 … 2,600,000) | All models |
odometer | mileageCoveredInTrip | Number | km | Distance covered during the last trip | — | All models |
odometer | mileageLife | Number | km | Lifetime odometer reading | — | QASHQAI MC |
odometer | totalDistanceEndTrip | Number | km | Odometer reading at trip end | — | All models |
odometer | totalDistanceStartTrip | Number | km | Odometer reading at trip start | — | All models |
odometer | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
fuelLevel | ecoAverageDistanceForFuelEconomy | Number | km/L | Average fuel economy | — | QASHQAI MC |
fuelLevel | fuelGaugeDisplayValue | Number | % | Remaining fuel as shown on the fuel indicator | 0 … 100 | QASHQAI MC |
fuelLevel | fuelLowLevel | Number | — | Low-fuel indicator | 0 = OK · 1 = LOW | All models |
fuelLevel | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
dte | bRangeFrequencyInTrip | Number | — | Range-recompute frequency during the trip | — | QASHQAI MC |
dte | distanceToEmpty | Number | km | Estimated remaining driving range | — | All models |
dte | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
speed | averageSpeedWheelFrontLeft | Number | km/h | Average wheel speed — front left | — | QASHQAI MC |
speed | averageSpeedWheelFrontRight | Number | km/h | Average wheel speed — front right | — | QASHQAI MC |
speed | averageSpeedWheelRearLeft | Number | km/h | Average wheel speed — rear left | — | QASHQAI MC |
speed | averageSpeedWheelRearRight | Number | km/h | Average wheel speed — rear right | — | QASHQAI MC |
speed | averageTripSpeed | Number | km/h | Average speed over the trip | — | QASHQAI MC |
speed | speedDisplayedValue | Number | km/h | Speed as displayed on the instrument panel | Cluster-displayed speed (0 … 409.4) | All models |
speed | statusSpeedUnit | Enum | — | Unit of speed measurement | 0 = KM/H · 1 = MPH | QASHQAI MC |
speed | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
/charging — EV Charge Status
serviceName: VEHICLE_CHARGE_STATUS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
chargeStatus | hvBatteryMaxCapacity | Number | Wh | Maximum traction-battery capacity | — | QASHQAI MC |
chargeStatus | hvRemainingCapacity | Number | Wh | Remaining traction-battery capacity | — | QASHQAI MC (EV-conditional) |
chargeStatus | stateOfCharge | String | % | Battery state of charge | 0.01 … 100 | All models |
chargeStatus | statusEemsocBattery14V | Number | % | 12V / 14V auxiliary-battery state of charge | — | QASHQAI MC |
chargeStatus | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
chargeSession | chargeStatus | Enum | — | Charging-session status | 0 = No charge · 1 = Waiting planned · 2 = Ended · 3 = In progress · 4 = Failure · 5 = Waiting current · 7 = Stopped (SOC not full) · 8 = Continues at full SOC · 9 = V2G · 10 = V2L Outside · 11 = V2G discharge · 12 = V2G charge | QASHQAI MC |
chargeSession | distanceToEmpty | Number | km | Estimated remaining driving range | — | QASHQAI MC |
chargeSession | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
evChargePlugConnected | Enum | — | Charging-cable connection status (EV) | 0 = Plug not connected · 1 = Connected · 2 = Powertrain start impossible · 3 = Unavailable | QASHQAI MC |
hvBatteryChargeType | Enum | — | Type of charge (EV) — delivered on EV models | 0 = No charge · 1 = Normal · 2 = Accelerated · 3 = Fast · 4 = Quick · 5 = Ultra fast · 6–9 = … | All models |
/behavior — Driver Performance
serviceName: DRIVER_PERFORMANCE_DATA. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
driveDynamics | acceleratorPedalOpeningRatio | String | — | Accelerator pedal opening ratio | — | ARIYA · QASHQAI · JUKE · LEAF · Navara |
driveDynamics | averageMeanEffectiveTorque | Number | — | Average mean effective torque | — | QASHQAI MC |
driveDynamics | averageStatusBrakePressure | Number | — | Average status brake pressure | — | QASHQAI MC |
driveDynamics | engineMeanEffectiveTorque | Number | — | Engine mean effective torque | — | QASHQAI MC |
driveDynamics | ePedalModeDisplayRequest | Enum | — | e-Pedal mode status | 0 = NO_DISPLAY · 1 = EPEDAL_ACTIVE | QASHQAI MC |
driveDynamics | numberOfBraking | Number | — | Number of braking | — | QASHQAI MC |
driveDynamics | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
harshAccelDecel | acceleratorDurationOver50 | Number | — | Accelerator duration over 50% | — | QASHQAI MC |
harshAccelDecel | acceleratorDurationOver75 | Number | — | Accelerator duration over 75% | — | QASHQAI MC |
harshAccelDecel | averageEscAccelerationLongitudinalCorrected | Number | — | Average ESC acceleration longitudinal corrected | — | QASHQAI MC |
harshAccelDecel | escAccelerationLongitudinalCorrected | Number | — | ESC acceleration longitudinal corrected | — | QASHQAI MC |
harshAccelDecel | escAccelerationTransversalCorrected | Number | — | ESC acceleration transversal corrected | — | QASHQAI MC |
harshAccelDecel | gforceAforceAcceleration | Number | — | Longitudinal G-force acceleration | — | QASHQAI MC |
harshAccelDecel | gforceDforceDeceleration | Number | — | Longitudinal G-force (decel) deceleration | — | QASHQAI MC |
harshAccelDecel | numberOfAcceleration | Number | — | Number of acceleration | — | QASHQAI MC |
harshAccelDecel | rapidDecelerationAcceleration | Array | — | Rapid deceleration acceleration | — | All models |
harshAccelDecel | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
corneringGForce | averageYawRateCorrected | Number | — | Average yaw rate corrected | — | QASHQAI MC |
corneringGForce | yawRateCorrected | Number | — | Yaw rate corrected | — | QASHQAI MC |
corneringGForce | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
rpmBandExceedance | averageEngineRpm | Number | — | Average engine RPM | — | QASHQAI MC |
rpmBandExceedance | engineRpm | Number | — | Engine RPM | — | QASHQAI MC |
rpmBandExceedance | frequency3000RpmTripdata | Number | — | Frequency 3000rpm trip samples | — | QASHQAI MC |
rpmBandExceedance | frequency4000RpmTripdata | Number | — | Frequency 4000rpm trip samples | — | QASHQAI MC |
rpmBandExceedance | frequency5000RpmTripdata | Number | — | Frequency 5000rpm trip samples | — | QASHQAI MC |
rpmBandExceedance | frequency6000RpmTripdata | Number | — | Frequency 6000rpm trip samples | — | QASHQAI MC |
rpmBandExceedance | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
idling | excessiveIdling | Array | — | Excessive idling | — | All models |
idling | idlingTimeInTrip | Number | — | Idling time in trip | — | All models |
idling | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
bcmPositionDriverSide | Enum | — | Driver-side position (Left-Hand-Drive / Right-Hand-Drive) | — | All models |
driveModeState | Enum | — | Driving-mode status | 0 = NORMAL/STANDARD/AUTO · 1 = ECO · 2 = SPORT/TRACK · … · 31 = Unavailable | QASHQAI MC |
/tirepressure — Tire Pressure
serviceName: VEHICLE_TIRE_PRESSURE. Single-object section — data holds these fields flat.
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
statusWheelPressureFrontAxle | Number | kPa | Axle-level TPMS reading — front axle | Axle-level pressure | All models |
statusWheelPressureFrontLeft | Number | mbar | Per-wheel tyre pressure — front left. Only updates while moving. | Per-wheel pressure | All models |
statusWheelPressureFrontRight | Number | mbar | Per-wheel tyre pressure — front right. Only updates while moving. | Per-wheel pressure | All models |
statusWheelPressureRearAxle | Number | kPa | Axle-level TPMS reading — rear axle | Axle-level pressure | All models |
statusWheelPressureRearLeft | Number | mbar | Per-wheel tyre pressure — rear left. Only updates while moving. | Per-wheel pressure | All models |
statusWheelPressureRearRight | Number | mbar | Per-wheel tyre pressure — rear right. Only updates while moving. | Per-wheel pressure | All models |
statusWheelStateFrontLeft | Number | — | Tyre inflation status — front left | 0 = OK · 1 = LOW_PRESSURE · 2 = FLAT_TIRE · 3 = ERROR_FAILURE · 4 = LOW_PRESSURE_AND_FAILURE · 5 = NOT_AVAILABLE | All models |
statusWheelStateFrontRight | Number | — | Tyre inflation status — front right | 0 = OK · 1 = LOW_PRESSURE · 2 = FLAT_TIRE · 3 = ERROR_FAILURE · 4 = LOW_PRESSURE_AND_FAILURE · 5 = NOT_AVAILABLE | All models |
statusWheelStateRearLeft | Number | — | Tyre inflation status — rear left | 0 = OK · 1 = LOW_PRESSURE · 2 = FLAT_TIRE · 3 = ERROR_FAILURE · 4 = LOW_PRESSURE_AND_FAILURE · 5 = NOT_AVAILABLE | All models |
statusWheelStateRearRight | Number | — | Tyre inflation status — rear right | 0 = OK · 1 = LOW_PRESSURE · 2 = FLAT_TIRE · 3 = ERROR_FAILURE · 4 = LOW_PRESSURE_AND_FAILURE · 5 = NOT_AVAILABLE | All models |
tripMaxWheelPressureFrontLeft | Number | mbar | Trip max wheel pressure front left | — | QASHQAI MC |
tripMaxWheelPressureFrontRight | Number | mbar | Trip max wheel pressure front right | — | QASHQAI MC |
tripMaxWheelPressureRearLeft | Number | mbar | Trip max wheel pressure rear left | — | QASHQAI MC |
tripMaxWheelPressureRearRight | Number | mbar | Trip max wheel pressure rear right | — | QASHQAI MC |
wheelPressureStateFrontLeft | Number | — | Wheel pressure state front left | — | QASHQAI MC |
wheelPressureStateFrontRight | Number | — | Wheel pressure state front right | — | QASHQAI MC |
wheelPressureStateRearLeft | Number | — | Wheel pressure state rear left | — | QASHQAI MC |
wheelPressureStateRearRight | Number | — | Wheel pressure state rear right | — | QASHQAI MC |
lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
/occupancy — Presence & Seat-belts
serviceName: VEHICLE_PRESENCE_STATUS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
occupancy | customerPresenceSecondRowCenter | Number | — | Customer presence second row center | — | QASHQAI MC |
occupancy | customerPresenceSecondRowLeft | Number | — | Customer presence second row left | — | QASHQAI MC |
occupancy | customerPresenceSecondRowRight | Number | — | Customer presence second row right | — | QASHQAI MC |
occupancy | presencePassenger | Number | — | Presence passenger | — | QASHQAI MC |
occupancy | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
seatbelt | seatBeltFirstRowCenter | Enum | — | Seat belt first row center | 0 = UNFASTENED | All models |
seatbelt | seatBeltFirstRowDriver | Number | — | Seat belt first row driver | — | All models |
seatbelt | seatBeltFirstRowPassenger | Enum | — | Seat belt first row passenger | 1 = FASTENED | All models |
seatbelt | seatBeltSecondRowCenter | Enum | — | Seat belt second row center | 1 = FASTENED | All models |
seatbelt | seatBeltSecondRowLeft | Enum | — | Seat belt second row left | 1 = FASTENED | All models |
seatbelt | seatBeltSecondRowRight | Enum | — | Seat belt second row right | 1 = FASTENED | All models |
seatbelt | seatBeltThirdRowCenter | Enum | — | Seat belt third row center | 0 = UNFASTENED | QASHQAI MC |
seatbelt | seatBeltThirdRowLeft | Enum | — | Seat belt third row left | 0 = UNFASTENED | QASHQAI MC |
seatbelt | seatBeltThirdRowRight | Enum | — | Seat belt third row right | 0 = UNFASTENED | QASHQAI MC |
seatbelt | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
customerPresenceFirstRowCenter | Enum | — | First-row centre occupant presence | 0 = not monitored · 1 = present · 2 = absent · 3 = unknown | QASHQAI MC |
customerPresenceThirdRowCenter | Enum | — | Third-row centre occupant presence | 0 = not monitored · 1 = present · 2 = absent · 3 = unknown | QASHQAI MC |
customerPresenceThirdRowLeft | Enum | — | Third-row left occupant presence | 0 = not monitored · 1 = present · 2 = absent · 3 = unknown | QASHQAI MC |
customerPresenceThirdRowRight | Enum | — | Third-row right occupant presence | 0 = not monitored · 1 = present · 2 = absent · 3 = unknown | QASHQAI MC |
/security — Doors, Locks & Windows
serviceName: VEHICLE_SECURITY. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
lockStatus | doorsBackLocked | Number | — | Lock status — tailgate | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | doorsDriverLocked | Number | — | Lock status — driver door | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | doorsPassengerLocked | Number | — | Lock status — passenger door | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | doorsRearLeftLocked | Number | — | Lock status — rear-left door | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | doorsRearRightLocked | Number | — | Lock status — rear-right door | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | statusDoorOutsideLockedState | Number | — | Outside central-lock state | 0 = unlocked · 1 = locked | QASHQAI MC |
lockStatus | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
doorStatus | statusDoorDriver | Number | — | Door open/closed status — driver | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorFrontLeft | Number | — | Door open/closed status — front left | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorFrontRight | Number | — | Door open/closed status — front right | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorPassenger | Number | — | Door open/closed status — passenger | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorRearLeft | Number | — | Door open/closed status — rear left | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorRearRight | Number | — | Door open/closed status — rear right | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | statusDoorTailGate | Number | — | Tailgate open/closed status | 0 = unavailable · 1 = closed · 2 = open | QASHQAI MC |
doorStatus | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
windowPosition | windowsFrontLeftPosition | Enum | — | Window position — front left | 0 = invalid · 1 = closed · 2–5 = partly open · 6–7 = fully open | QASHQAI MC |
windowPosition | windowsFrontRightPosition | Enum | — | Window position — front right | 0 = invalid · 1 = closed · 2–5 = partly open · 6–7 = fully open | QASHQAI MC |
windowPosition | windowsRearLeftPosition | Enum | — | Window position — rear left | 0 = invalid · 1 = closed · 2–5 = partly open · 6–7 = fully open | QASHQAI MC |
windowPosition | windowsRearRightPosition | Enum | — | Window position — rear right | 0 = invalid · 1 = closed · 2–5 = partly open · 6–7 = fully open | QASHQAI MC |
windowPosition | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
sunroofPosition | Enum | — | Sunroof position | 0 = invalid · 1 = closed · 2–15 = window sectors (odd = open %, even = moving) | QASHQAI MC |
/hvac — HVAC & Cabin Climate
serviceName: VEHICLE_HVAC_STATUS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
hvac | hvacFanBlowerMotorStatus | Enum | — | HVAC fan/blower motor status | 0 = OFF · 1 = ON | QASHQAI MC |
hvac | hvacRecyclingAutoDisplay | Number | — | HVAC air-recycling auto display | 0 = OFF · 1 = ON · 2 = AUTO | QASHQAI MC |
hvac | hvacTemperature | Number | degC | HVAC set-point temperature | — | QASHQAI MC |
hvac | hvacTemperatureCabinCurrentValue | Number | degC | Current cabin temperature | — | QASHQAI MC |
hvac | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
cabinExternalTemp | airTempDrivingStartupUnitEv | Number | — | Air temp driving startup unit ev | — | QASHQAI MC |
cabinExternalTemp | airTempDrivingStartupUnitIce | Number | — | Air temp driving startup unit ice | — | QASHQAI MC |
cabinExternalTemp | airTempDrivingStartupValueEv | Number | degC | Air temp driving startup value ev | — | QASHQAI MC |
cabinExternalTemp | airTempDrivingStartupValueIce | Number | degC | Air temp driving startup value ice | — | QASHQAI MC |
cabinExternalTemp | airTempStartingTimeUnit | Number | — | Air temp starting time unit | — | QASHQAI MC |
cabinExternalTemp | airTempStartingTimeValue | Number | — | Air temp starting time value | — | QASHQAI MC |
cabinExternalTemp | externalTempDisplayUnit | Enum | — | Outside-temperature display unit | 0 = Celsius · 1 = Fahrenheit | All models |
cabinExternalTemp | externalTempDisplayValue | Number | degC | Outside air temperature, as displayed | — | All models |
cabinExternalTemp | externalTempValue | Number | degC | Outside air temperature | — | QASHQAI MC |
cabinExternalTemp | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
evHeaterStatus | Enum | — | EV heater ON/OFF status — delivered on EV models | 0 = OFF · 1 = ON | ARIYA · QASHQAI · JUKE · LEAF · Navara |
hvacEvStatusOfAc | Enum | — | EV air-conditioner ON/OFF status — delivered on EV models | 0 = OFF · 1 = ON | ARIYA · QASHQAI · JUKE · LEAF · Navara |
/visibility — Lighting & Wipers
serviceName: VEHICLE_LIGHTING_STATUS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
lighting | brakeLampStatus | Enum | — | Brake-light lamp status (manual or automatic) | 0 = OFF · 1 = ON | QASHQAI MC |
lighting | durationDrlOnTrip | Number | — | Duration drl on trip | — | QASHQAI MC |
lighting | durationFrontFogLightsOn | Number | — | Duration front fog lights on | — | QASHQAI MC |
lighting | durationPositionLightsOn | Number | — | Duration position lights on | — | QASHQAI MC |
lighting | headLightOnTimeInTrip | Number | — | Head light on time in trip | — | QASHQAI MC |
lighting | lightingWarningLightsStatus | Enum | — | Warning-light status | 0 = OFF · 1 = ON | QASHQAI MC |
lighting | lightningExternalDrl | Enum | — | Daytime-running-light request status | 0 = OFF · 1 = ON | All models |
lighting | lightningFlashingIndicator | Enum | — | Turn-indicator status | 0 = BOTH_OFF · 1 = LEFT · 2 = RIGHT · 3 = BOTH_ON · 4 = UNAVAILABLE | QASHQAI MC |
lighting | lightningFrontFogLight | Enum | — | Front-fog request status | 0 = OFF · 1 = ON | All models |
lighting | lightningHighBeam | Enum | — | High-beam request status | 0 = OFF · 1 = ON | All models |
lighting | lightningLowBeam | Enum | — | Low-beam request status | 0 = OFF · 1 = ON | All models |
lighting | positionLightsStatus | Enum | — | Position-light status | 0 = OFF · 1 = ON | All models |
lighting | rearFogLightsStatus | Enum | — | Rear-fog light status | 0 = OFF · 1 = ON | All models |
lighting | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
wipers | frontWiperSwitchStatus | Number | — | Front wiper switch status | — | QASHQAI MC |
wipers | statusWipingFront | Number | — | Wiping front | — | All models |
wipers | wipingFrontDuration | Number | — | Wiping front duration | — | QASHQAI MC |
wipers | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
/healthstatus — Health, EV Health & System Safety
serviceName: VEHICLE_HEALTH_STATUS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
healthAlert | coolantTemp | String | — | Engine coolant temperature state (ICE only) | OK / warning | All models |
healthAlert | oilLevel | String | — | Engine oil level on the 0–15 scale | 8–15 = OK · 0–7 = low | QASHQAI MC |
healthAlert | oilPressure | String | — | Oil-pressure state | OK / warning | All models |
healthAlert | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
alerts | <alert code> → { active, severity, label, rawValue } | Object map | — | Map keyed by alert code — see the alert-code table below | active/severity/label/rawValue | All models |
milCheckEngine | statusMilLampRequest | Number | — | Request to switch on the MIL lamp | 0 = OFF · 1 = ON | All models |
milCheckEngine | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
oilPressure | engineOilDrainingRange | Number | km | Engine oil draining range | — | QASHQAI MC |
oilPressure | oilLevel | Number | — | Engine oil level on the 0–15 scale | 8–15 = OK · 0–7 = low | QASHQAI MC |
oilPressure | oilPressureWarningStatus | Number | — | Oil pressure warning status | — | All models |
oilPressure | statusOilPressureSwitch | String | — | Oil pressure switch | — | All models |
oilPressure | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
absFault | durationAbsTriggered | Number | — | Duration abs triggered | — | All models |
absFault | escabsInRegulation | Number | — | Escabs in regulation | — | QASHQAI MC |
absFault | escAbsMalfunction | Number | — | ESC abs malfunction | — | All models |
absFault | startingAbsActivationLatitude | Number | — | Starting abs activation latitude | — | QASHQAI MC |
absFault | startingAbsActivationLongitude | Number | — | Starting abs activation longitude | — | QASHQAI MC |
absFault | startingAbsActivationSpeed | Number | km/h | Starting abs activation speed | — | QASHQAI MC |
absFault | startingAbsActivationVehicleHeading | Number | — | Starting abs activation vehicle heading | — | QASHQAI MC |
absFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
brakeSystemFault | afuFailure | Number | — | Afu failure | — | QASHQAI MC |
brakeSystemFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
crashSensorFault | crashDetectionOutOfOrder | Number | — | Crash detection out of order | — | All models |
crashSensorFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
escStabilityFault | averageEscBrakingPedalInformation | Number | — | Average ESC braking pedal information | — | QASHQAI MC |
escStabilityFault | escAsrMalfunction | Number | — | ESC asr malfunction | — | QASHQAI MC |
escStabilityFault | escAycMalfunction | Number | — | ESC ayc malfunction | — | QASHQAI MC |
escStabilityFault | escBrakingPedalInformation | Enum | — | Brake-pedal press status | 1 = NOT_PRESSED · 2 = PRESSED · 4 = CONFIRMED_PRESSED | QASHQAI MC |
escStabilityFault | escEbdStateDisplay | Number | — | ESC ebd state display | — | QASHQAI MC |
escStabilityFault | iceHvacDisplayClimBlowerLevel | Enum | — | Ice HVAC display clim blower level | 1 = LEVEL_1 | QASHQAI MC |
escStabilityFault | iceHvacDisplayClimForcedRecy | Enum | — | Ice HVAC display clim forced recy | 2 = RECYCLING_OFF | QASHQAI MC |
escStabilityFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
powerParkFault | parkFailure | Number | — | Park failure | — | QASHQAI MC |
powerParkFault | powerLimitationAlert | Number | — | Power limitation alert | — | QASHQAI MC |
powerParkFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
steeringEpsFault | steeringStatus | Enum | — | Steering status | 0 = NO_EPS_WARNING | QASHQAI MC |
steeringEpsFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
otherSystemFault | crashAirbagMalfunction | Number | — | Crash airbag malfunction | — | QASHQAI MC |
otherSystemFault | evAlertCrbsFailureDisplay | Number | — | Ev alert crbs failure display | — | QASHQAI MC |
otherSystemFault | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
airbag | crashAirbagPassengerInhibition | Number | — | Crash airbag passenger inhibition | — | QASHQAI MC |
airbag | crashCrashOrder | Number | — | Crash crash order | — | QASHQAI MC |
airbag | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
brakeFluid | statusBrakeLowFluidLevel | Number | — | Brake low fluid level | — | All models |
brakeFluid | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | All models |
hvBatteryAlerts | batteryHighLevelAlert | Number | — | Battery high level alert | — | QASHQAI MC |
hvBatteryAlerts | hvBatteryLowAlert | Number | — | Hv battery low alert | — | QASHQAI MC |
hvBatteryAlerts | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
The alerts map is keyed by alert code; each value is { active, severity, label, rawValue }. Use the active flag — do not derive it from rawValue, as the rule differs by code. Alert codes actually delivered:
| Alert code | Description | Value → meaning | Severity | Models |
|---|---|---|---|---|
ABS_FAIL | ABS malfunction | 0 = OK · 1 = FAILURE | HIGH | All models |
EBD_FAILURE | Electronic Brakeforce Distribution failure | 0 = OK · 1 = FAILURE | HIGH | QASHQAI MC |
AFU_FAILURE | Emergency-braking-system malfunction | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
CRBS_FAILURE | Cooperative regenerative braking failure | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
AIRBAG_FAILURE | Airbag malfunction | 0 = OK · 1 = MALFUNCTION | CRITICAL | QASHQAI MC |
STEERING_WARNING | EPS steering warning | 0 = OK · 1 = L1 · 2 = L2 · 3 = lamp check | HIGH | QASHQAI MC |
PARK_FAILURE | AT park failure | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
POWER_LIMITATION | Power-limitation (SLOW lamp) | 0 = OK · 1 = LIMITED | WARN | QASHQAI MC |
BRAKE_LOW_FLUID | Brake-fluid level | 1 = OK · 2 = LOW | HIGH | All models |
LOW_VEHICLE_BATTERY | Low 12V battery | 1 = OK · 2 = LOW | WARN | QASHQAI MC |
MIL_ON | MIL (check-engine) lamp on | 0 = OFF · 1 = ON | WARN | All models |
OIL_PRESSURE_WARNING | Oil-pressure warning | 0 = OK · 1 = WARNING | HIGH | All models |
OIL_PRESSURE_SWITCH | Oil-pressure switch warning | 0 = OK · 1 = WARNING | HIGH | All models |
AIRBAG_OUT_OF_ORDER | Crash-detection unit out of order | 0 = OK · 1–3 = malfunction zones | HIGH | All models |
WHEEL_FL · WHEEL_FR · WHEEL_RL · WHEEL_RR | Per-wheel tyre-state safety alert | non-zero = fault | WARN | All models |
HV_BATTERY_LOW | Traction-battery low (xEV) | 0 = OK · 1 = LOW | WARN | QASHQAI MC |
HV_HIGH_LEVEL | Traction-battery high-level warning | 1 = OK · 2 = HIGH | WARN | QASHQAI MC |
ESC_BRAKING_FAILURE | ESC braking failure | 0 = OK · 1 = FAILURE | HIGH | ARIYA · QASHQAI · JUKE · LEAF · Navara |
TPMS_WARNING | TPMS warning lamp | 0 = OFF · 1 = ON | WARN | ARIYA · QASHQAI · JUKE · LEAF · Navara |
Additional in-scope fields — delivered when the vehicle reports them (conditional; absent from the sample snapshot but part of the section).
| Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|
engineAirTemperature | Number | °C | Engine intake-air temperature (intake manifold) | −40 … 86 | QASHQAI MC |
gearBoxAutoLeverPosition | Enum | — | Gearbox lever selection | 0 = P · 1 = R · 2 = N · 3 = D · 4 = M · 5 = L · 6 = Ds · 7 = Confirmed · 8 = B · 15 = Not available | QASHQAI MC |
gearBoxAutomaticRangeIndication | Enum | — | Gear/mode of gearbox currently in operation | 0 = OFF · 1 = P · 2 = R · 3 = N · 4 = D · … · 63 = Not used | QASHQAI MC |
/adas — Driver Assistance
serviceName: VEHICLE_ADAS. data is keyed by sub-object; each sub-object also carries its own lastUpdated.
| Sub-object | Field delivered | Type | Unit | Description | Value → label / meaning | Models |
|---|---|---|---|---|---|---|
forwardCollisionWarning | activationStateFcw | Enum | — | ON/OFF status of AEB and Forward Collision Warning | 0 = AEB_OFF_FCW_OFF · 1 = AEB_OFF_FCW_ON · 3 = AEB_ON_FCW_ON | QASHQAI MC |
forwardCollisionWarning | forwardCollisionWarningStatus | Number | — | Forward collision warning status | — | QASHQAI MC |
forwardCollisionWarning | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
laneDepartureWarning | ldwStatusDisplay | Number | — | Ldw status display | — | QASHQAI MC |
laneDepartureWarning | stateActivation | Number | — | Lane Departure Warning activation status | 0 = Unavailable · 1 = Activated · 2 = Deactivated | QASHQAI MC |
laneDepartureWarning | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
automaticEmergencyBraking | aebStatusDisplay | Enum | — | Automatic Emergency Braking status | 0 = No display · 1 = AEB off · 2 = Operation · 3 = Not operation · 4 = Temporary failure · 5 = Permanent failure · 6 = Initial | QASHQAI MC |
automaticEmergencyBraking | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
cruiseAccSettings | accStatusDisplay | Number | — | Acc status display | — | QASHQAI MC |
cruiseAccSettings | accTargetDistanceAlert | Number | km | Acc target distance alert | — | QASHQAI MC |
cruiseAccSettings | accTargetDistanceDisplay | Enum | — | ACC detected-target distance indication | 0 = NO_DETECTED_TARGET · 1 = LONG · 2 = MIDDLE · 3 = SHORT | QASHQAI MC |
cruiseAccSettings | adaptiveCruiseControlDisplayDistanceSetting | Enum | — | ACC following-distance setting | 0 = NO_DISPLAY · 1 = SHORT · 2 = MIDDLE · 3 = LONG · 5 = VERY_LONG | QASHQAI MC |
cruiseAccSettings | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
driverMonitoring | dmcAlertStatus | Number | — | Dmc alert status | — | QASHQAI MC |
driverMonitoring | lastUpdated | String | ISO-8601 | When the sub-object was last updated | — | QASHQAI MC |
Field values come from the platform signal registry; descriptions and value meanings come from the Nissan Data Dictionary. A field the vehicle did not report is omitted, never sent as null.
Part 2 — Webhooks
Event-driven delivery: the fields sent in each real-time webhook event. See Webhooks for the envelope, registration and signature mechanics.
| Event | Fires when | Package | What it delivers |
|---|---|---|---|
JOURNEY.COMPLETED | The vehicle ends a journey (ignition off) | Usage-Based Insurance | The completed-journey data (all fields below) |
CHARGE.STATE.CHANGED | The vehicle's charge status changes (state-of-charge or battery capacity) | Smart Charging | Charge status + current location |
SYSTEM.SAFETY.FAULT | A new safety or health fault is detected | Remote Diagnostics | Active alert codes + current location |
| Package | Webhook event |
|---|---|
| Usage-Based Insurance | JOURNEY.COMPLETED |
| Smart Charging | CHARGE.STATE.CHANGED |
| Remote Diagnostics | SYSTEM.SAFETY.FAULT |
A field the vehicle did not report is omitted rather than sent as null. Coded fields carry both the integer value and its label.
chargeStatus battery fields, the extended location set (locationSource, locationValidity, lastKnownLocationAltitude, locationSourceAtStart / locationSourceAtEnd, lastUpdated), the driver userId, and the alert timestamp / rawTrigger. The other models send the base set.JOURNEY.COMPLETED
Sent at ignition-off. The payload below is the complete set of fields delivered, grouped by their JSON key. Number fields that carry a unit are delivered as { "value": …, "unit": "…" }.
| Group (JSON key) | Field | Type | Unit | Description / value meaning | Models |
|---|---|---|---|---|---|
(root) | vin | String | — | Vehicle identification number | All models |
(root) | journeyId | String | — | Unique identifier for the journey | All models |
(root) | status | Enum | — | Journey status — COMPLETED | All models |
(root) | closeReason | Enum | — | Why the journey closed — e.g. IGN_OFF | All models |
(root) | interimCount | Number | — | Number of interim samples recorded during the journey | All models |
(root) | accountId | String | — | Your account identifier | All models |
(root) | userId | String | — | Head-unit driver id — present when a driver is logged in | QASHQAI MC |
location | latitudeAtStart · latitudeAtEnd | Number | degrees | Trip start / end latitude (WGS-84) | All models |
location | longitudeAtStart · longitudeAtEnd | Number | degrees | Trip start / end longitude (WGS-84) | All models |
location | locationHeading | Number | degrees | Heading (0 = north, clockwise) | All models |
location | lastKnownLocationAltitude | Number | metres | Altitude — height above sea level | QASHQAI MC |
location | locationSourceAtStart · locationSourceAtEnd | Enum | — | Position source at trip start / end — { label, value } | QASHQAI MC |
odometer | totalDistanceStartTrip · totalDistanceEndTrip | Number | km | Odometer reading at trip start / end | All models |
odometer | mileageCoveredInTrip | Number | km | Distance covered during the trip | All models |
odometer | mileageLife | Number | km | Lifetime odometer reading | QASHQAI MC |
speed | averageTripSpeed | Number | km/h | Average speed over the trip | All models |
header | startTripTimestamp | String | ISO-8601 | Timestamp when the journey started | All models |
header | stopTripTimestamp | String | ISO-8601 | Timestamp when the journey ended | All models |
header | userId | String | — | Head-unit driver id | QASHQAI MC |
{
"eventType": "JOURNEY.COMPLETED",
"eventTime": "2026-08-17T16:52:05.190Z",
"vin": "...",
"payload": {
"vin": "...",
"journeyId": "B795...3709",
"status": "COMPLETED",
"closeReason": "IGN_OFF",
"interimCount": 1,
"accountId": "...",
"location": {
"latitudeAtStart": 52.404, "longitudeAtStart": 4.8045,
"latitudeAtEnd": 52.5257, "longitudeAtEnd": 6.0619,
"locationHeading": 146
},
"odometer": {
"mileageCoveredInTrip": { "value": 126.6, "unit": "km" },
"totalDistanceStartTrip": { "value": 41615.6, "unit": "km" },
"totalDistanceEndTrip": { "value": 41742.1, "unit": "km" }
},
"speed": {
"averageTripSpeed": { "value": 87.9, "unit": "km/h" }
},
"header": { "stopTripTimestamp": "2026-08-17T15:48:09Z" }
}
}CHARGE.STATE.CHANGED
Sent when the vehicle's charge status changes — state-of-charge or battery capacity. Delivers the chargeStatus object (state of charge + battery capacity) + current location.
Charging-session state — chargeStatus, evChargePlugConnected and hvBatteryChargeType — is not carried on this event. Read it on demand from /charging.
| Group (JSON key) | Field | Type | Unit | Description / value meaning | Models |
|---|---|---|---|---|---|
chargeStatus | stateOfCharge | String | % | Battery state of charge (0.01 … 100) | All models |
chargeStatus | hvBatteryMaxCapacity | Number | Wh | Maximum traction-battery capacity | All models |
chargeStatus | hvRemainingCapacity | Number | Wh | Remaining traction-battery capacity | All models (EV-conditional) |
chargeStatus | statusEemsocBattery14V | Number | % | 12V / 14V auxiliary-battery state of charge | QASHQAI MC |
chargeStatus | lastUpdated | String | ISO-8601 | When the charge status was last updated | QASHQAI MC |
location | locationLatitude | Number | degrees | Current latitude of the vehicle (WGS-84) | All models |
location | locationLongitude | Number | degrees | Current longitude of the vehicle (WGS-84) | All models |
location | locationHeading | Number | degrees | Heading (0 = north, clockwise) | All models |
location | latitudeAtStart · latitudeAtEnd | Number | degrees | Latitude at the start / end of the last trip (WGS-84) | All models |
location | longitudeAtStart · longitudeAtEnd | Number | degrees | Longitude at the start / end of the last trip (WGS-84) | All models |
location | lastKnownLocationAltitude | Number | metres | Altitude — height above sea level | QASHQAI MC |
location | locationSource | Enum | — | Position source — { label, value }; 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
location | locationValidity | Enum | — | Location validity — { label, value }; 0 = VALID · 1 = NOT_VALID · 2 = Unavailable | QASHQAI MC |
location | locationSourceAtStart · locationSourceAtEnd | Number | — | Position source at trip start / end — 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
location | lastUpdated | String | ISO-8601 | When the location was last updated | QASHQAI MC |
SYSTEM.SAFETY.FAULT
Sent the instant a new safety or health fault is detected. Delivers the alerts object (a map of active alert codes) + current location. A fault is delivered as an alert code — for example OIL_PRESSURE_WARNING.
The alerts object is a map keyed by alert code; each value has these fields:
| Field | Type | Description | Models |
|---|---|---|---|
active | Boolean | Whether the alert is currently on. true = the fault/condition is present; false = not present (OK). This is the field to act on. | All models |
severity | Enum | Alert severity — INFO · WARN · HIGH · CRITICAL. | All models |
label | String | Human-readable state label for the raw value (e.g. WARNING, FAILURE, OK). | All models |
rawValue | Number | The raw signal value from the vehicle before interpretation. | All models |
timestamp | String | ISO-8601 time the alert value was captured. | QASHQAI MC |
rawTrigger | String | Internal trigger that produced the reading (e.g. Trg_IGN_OFF_Probe_DriverInfoPermit). | QASHQAI MC |
active flag to decide whether an alert is on — do not derive it from rawValue: the raw-to-active rule differs by code (most 1 = active; BRAKE_LOW_FLUID, LOW_VEHICLE_BATTERY and HV_HIGH_LEVEL are 2 = active; AIRBAG_OUT_OF_ORDER and WHEEL_* are active on any non-zero). The platform computes active for you. Each code appears once.| Alert code | Description | Value → meaning | Severity | Models |
|---|---|---|---|---|
ABS_FAIL | ABS malfunction | 0 = OK · 1 = FAILURE | HIGH | All models |
EBD_FAILURE | Electronic Brakeforce Distribution failure | 0 = OK · 1 = FAILURE | HIGH | QASHQAI MC |
AFU_FAILURE | Emergency-braking-system malfunction | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
CRBS_FAILURE | Cooperative regenerative braking failure | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
AIRBAG_FAILURE | Airbag malfunction | 0 = OK · 1 = MALFUNCTION | CRITICAL | QASHQAI MC |
STEERING_WARNING | EPS steering warning | 0 = OK · 1 = L1 · 2 = L2 · 3 = lamp check | HIGH | QASHQAI MC |
PARK_FAILURE | AT park failure | 0 = OK · 1 = FAILURE | WARN | QASHQAI MC |
POWER_LIMITATION | Power limitation (SLOW lamp) | 0 = OK · 1 = LIMITED | WARN | QASHQAI MC |
BRAKE_LOW_FLUID | Brake-fluid level | 1 = OK · 2 = LOW | HIGH | All models |
LOW_VEHICLE_BATTERY | Low 12V battery | 1 = OK · 2 = LOW | WARN | QASHQAI MC |
MIL_ON | MIL (check-engine) lamp on | 0 = OFF · 1 = ON | WARN | All models |
OIL_PRESSURE_WARNING | Oil-pressure warning | 0 = OK · 1 = WARNING | HIGH | All models |
OIL_PRESSURE_SWITCH | Oil-pressure switch warning | 0 = OK · 1 = WARNING | HIGH | All models |
ESC_BRAKING_FAILURE | ESC braking failure | 0 = OK · 1 = FAILURE | HIGH | ARIYA · QASHQAI · JUKE · LEAF · Navara |
AIRBAG_OUT_OF_ORDER | Crash-detection unit out of order | 0 = OK · 1–3 = malfunction zones | HIGH | QASHQAI MC |
TPMS_WARNING | TPMS warning lamp | 0 = OFF · 1 = ON | WARN | ARIYA · QASHQAI · JUKE · LEAF · Navara |
WHEEL_FL · WHEEL_FR · WHEEL_RL · WHEEL_RR | Per-wheel tyre-state safety alert | non-zero = fault | WARN | All models |
HV_BATTERY_LOW | Traction-battery low (xEV) | 0 = OK · 1 = LOW | WARN | QASHQAI MC |
HV_HIGH_LEVEL | Traction-battery high-level warning | 1 = OK · 2 = HIGH | WARN | QASHQAI MC |
Alongside the alert codes, the alerts object carries its own lastUpdated, and the event carries the current location object:
| Group (JSON key) | Field | Type | Unit | Description / value meaning | Models |
|---|---|---|---|---|---|
alerts | lastUpdated | String | ISO-8601 | When the alert map was last updated | All models |
location | locationLatitude | Number | degrees | Current latitude of the vehicle (WGS-84) | All models |
location | locationLongitude | Number | degrees | Current longitude of the vehicle (WGS-84) | All models |
location | locationHeading | Number | degrees | Heading (0 = north, clockwise) | All models |
location | latitudeAtStart · latitudeAtEnd | Number | degrees | Latitude at the start / end of the last trip (WGS-84) | All models |
location | longitudeAtStart · longitudeAtEnd | Number | degrees | Longitude at the start / end of the last trip (WGS-84) | All models |
location | lastKnownLocationAltitude | Number | metres | Altitude — height above sea level | QASHQAI MC |
location | locationSource | Enum | — | Position source — { label, value }; 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
location | locationValidity | Enum | — | Location validity — { label, value }; 0 = VALID · 1 = NOT_VALID · 2 = Unavailable | QASHQAI MC |
location | locationSourceAtStart · locationSourceAtEnd | Number | — | Position source at trip start / end — 0 = A_IVC · 1 = A_IVI · 2 = Unavailable | QASHQAI MC |
location | lastUpdated | String | ISO-8601 | When the location was last updated | QASHQAI MC |
The alerts map lists every monitored alert code with its current state — active: false means the alert is not raised (OK), active: true means it is currently raised.
{
"eventId": "a04fa8f6-...",
"eventType": "SYSTEM.SAFETY.FAULT",
"eventTime": "2026-09-07T05:31:04.933Z",
"vin": "*************5788",
"payload": {
"alerts": {
"MIL_ON": { "active": false, "rawValue": "0", "label": "OK", "severity": "WARN" },
"ABS_FAIL": { "active": false, "rawValue": "0", "label": "OK", "severity": "HIGH" },
"WHEEL_RR": { "active": false, "rawValue": "0", "label": "OK", "severity": "WARN" },
"OIL_PRESSURE_SWITCH": { "active": false, "rawValue": "0", "label": "OK", "severity": "HIGH" },
"OIL_PRESSURE_WARNING": { "active": true, "rawValue": "1", "label": "WARNING", "severity": "HIGH" },
"lastUpdated": "2026-09-07T05:31:04.933Z"
},
"location": {
"locationLatitude": 52.5216, "locationLongitude": 6.0607, "locationHeading": 0
}
}
}Compliance constraints you must design for
These are data-protection constraints enforced by the platform. Designing for them up front avoids confusing rejections and partial results.
Temporal limits on historical requests
- Earliest requestable date: 12 September 2025 (the effective date). You cannot request data older than this.
- Maximum 90 days per historical request. Split longer ranges into multiple requests.
- Lookback limited to ~3 years. Older history is not available.
Ownership / entitlement (Gate 3)
- Data is only eligible for the portion of your requested window during which the consenting owner actually owned the vehicle. A valid request can therefore return a shorter window than asked.
- Entitlement resolution differs by vehicle generation: for older generations an active ownership link suffices; newer generations additionally verify the active driver against the linked owner. The net effect for you: don't assume every request yields the full range — handle partial results.
Data minimization (Gate 2)
- You receive exactly the packages/scopes the owner approved. Need more? Initiate a new request.
Governance (Gate 1)
- Sanctioned or gatekeeper-designated entities are blocked at login and at request time.
Retention & deletion
- Delivered files and decisions are retained as audit records under the platform's retention policy. Financial records persist for tax compliance even after account deletion.
Errors & troubleshooting
| Symptom | Likely cause / fix |
|---|---|
401 | On /cms/oauth/accounts/... calls: missing or invalid access token. Send the owner's access token from the PKCE flow as Authorization: Bearer <access_token>. |
| 401 token expired | Refresh with /cms/oauth/token/refresh (App) or request a new token (M2M). |
| Real-time read returns 4xx / no data | No APPROVED request with GRANTED consent exists for that VIN/package yet — or consent was revoked/expired. Check requestStatus + consentStatus, not your token. |
| charging returns 404 | The vehicle is ICE (non-EV); charging is EV-only. Expected. |
| Historical result smaller than requested range | Gate 3 trimmed the window to the consenting owner's ownership period. Expected under the platform rules. |
| Authorize rejects the redirect | redirectUri does not exactly match a registered redirect URL. |
| Request blocked at creation | An onboarding gate failed: suspended account, incomplete billing / no valid payment method, unaccepted Data T&C, or a gatekeeper/sanctions block. Fix in settings; retrying without fixing will fail again. |
| Request goes INVALID immediately | Validation failed — invalid VIN, unresolvable user email, or no active owner–VIN pairing. |
| Consent never granted, request EXPIRED | Owner didn't act within the consent window. The link is dead; initiate a new request. |
| Download link doesn't work | Pre-signed URLs are time- and session/IP-limited. Re-fetch a fresh URL from the deliveries endpoint. |
| Webhook events not arriving | Registration challenge wasn't echoed correctly, or your URL isn't reachable over HTTPS. Re-verify the subscription. |
| More one-off charges than expected | A dynamically derived period makes every submission a new billable request. See Cost control. |
| Charged differently than expected | One-off/historical is prepaid (hold→capture on consent); subscriptions are billed via a single aggregated charge on the 1st. SME vs. Large rates differ. |
Rate limits & operational notes
- The API Gateway applies rate-limiting policies. Build in retry-with-backoff and treat
429as transient. - Validate against a development account (sandboxed, vehicle-count-limited) before going to production.
- Real-time/webhook delivery suits self-serve SME-to-mid volumes. If sustained run-rate or frequency grows beyond the platform's managed-streaming threshold, that's a managed high-throughput streaming tier conversation — contact your account team rather than working around webhook limits.
- Token hygiene: store the rotating refresh token after every refresh (App); never ship the client secret to a client device (M2M).
Glossary
| Term | Meaning |
|---|---|
| Account ID | Your business account identifier, used in API paths and the M2M token request. |
| Client ID / Secret | Integration credentials. The secret applies to M2M only. |
| VIN | 17-character Vehicle Identification Number. |
| Package | A catalog entry defining the data a request can access; consent and billing are granted at the package level. |
| Data family | Historical, Last Known Value, or Real-Time — determines delivery and billing. |
| Consent | The vehicle owner's explicit, scope-specific, time-bounded, revocable approval for a data request. |
| Consent vs. token | Two independent lifecycles. Tokens authenticate your client; consent authorizes data. Both must be valid. |
| 3-Gate engine | The sequential governance → consent-scope → ownership-time authorization run on every data access. |
| Entitlement | Whether the consenting owner owned the vehicle during the requested window (Gate 3). |
| Gatekeeper / blocklist | designated restricted entities blocked from receiving data (Gate 1). |
| PKCE | Proof Key for Code Exchange — secures the Authorization Code flow without a client secret. |
| Pre-auth hold / capture | A hold is placed for the exact price once the owner consents, then captured against the issued invoice (one-off/historical). |
| Aggregated billing | A single monthly charge on the 1st covering all active, consented VINs (subscriptions). |
| SME / Large Enterprise | Account tiers; SME gets the margin-free rate, Large the commercial rate. |
| Pre-signed URL | A time- and session-limited download link for historical file deliveries. |
API reference (Swagger)
The reference below is generated from the live OpenAPI specification. Use it for exact request/response schemas and to try endpoints interactively.
In the portal, the interactive Swagger UI is embedded below. The OpenAPI document is served (per environment) from: