Fleet Commerce Extension
Machine-initiated automotive commerce. A protocol extension enabling autonomous vehicles, fleet operators, and telematics systems to initiate service requests, maintenance scheduling, and lifecycle events — without human intervention at any point in the initiation chain.
fleet, service_request) in place of lead and transaction.
A conformant v1.0 receiver must ignore unknown top-level objects without error per the forward-compatibility rules
already defined in the base specification.
What Is Fleet Commerce
ACP v1.0 was designed for human-initiated consumer commerce: a person begins a conversation,
an AI agent captures intent, and a lead flows to a dealership's CRM. Every object in the base
spec — lead, conversation, transaction — assumes a
human consumer as the initiating party.
The Fleet Commerce Extension addresses a fundamentally different commerce pattern: machine-initiated service demand. An autonomous or connected vehicle detects a maintenance condition through its onboard systems, generates a structured ACP envelope identifying the vehicle, its health state, and the work required, and transmits that envelope directly to a dealership's service system — with no human scheduler, no phone call, and no service advisor involved in the initiation.
This is the protocol seam between autonomous vehicle operations and the dealer service network. It defines how machines become first-class commerce participants in automotive retail.
When to Use Fleet Envelopes
| Use Fleet Envelope | Use Consumer Envelope |
|---|---|
| Initiating party is a vehicle agent or fleet ops system | Initiating party is a human consumer |
| Service demand is telematics-triggered or predictive | Customer books service via chat, phone, or web |
| Fleet pricing agreement governs labor and parts rates | Retail pricing applies |
| No conversation transcript exists | Conversation transcript is the source of truth |
| Vehicle identity (VIN) is the primary entity, not a person | Customer contact is the primary entity |
| NHTSA recall action triggered programmatically | Customer calls about a recall notice |
| Fleet replacement cycle for aged-out vehicle | Individual consumer trade-in |
Fleet envelopes and consumer envelopes may coexist in the same dealership system. A conformant
receiver must route them independently based on the presence of fleet vs lead
at the top level.
Architecture
The vehicle agent is a first-class ACP participant with its own identity, odometer state, and event stream. The protocol layer validates the envelope, enforces the fleet pricing agreement, and writes an append-only audit record before the envelope reaches dealership systems. The confirmation loop closes with an ACP delta transmitted back to the originating fleet operator.
Fleet vs Consumer Envelope Structure
| Top-Level Object | Consumer Envelope | Fleet Envelope |
|---|---|---|
acp | ✓ Required | ✓ Required (unchanged) |
source | ✓ Required | ✓ Required (new agent_types) |
dealership | ✓ Required | ✓ Required (unchanged) |
lead | ✓ Required | — Omitted in fleet envelopes |
transaction | ✓ Required | — Omitted in fleet envelopes |
conversation | ✓ Required | — Omitted (no human conversation) |
events | ✓ Required | ✓ Required (new event types) |
ai_analysis | Optional | Optional (unchanged) |
fleet NEW v1.1 | — Not present | ✓ Required in fleet envelopes |
service_request NEW v1.1 | — Not present | ✓ Required in fleet envelopes |
A fleet envelope is detected by the receiver via the presence of fleet at the top
level. Receivers must not require lead, transaction, or
conversation when fleet is present. The JSON Schema enforces mutual
exclusivity: fleet and lead must not coexist in the same snapshot envelope.
fleet — Fleet Identity REQUIRED in fleet envelopes NEW v1.1
Identifies the fleet operator and the specific vehicle originating this envelope. Replaces
lead when the initiating party is non-human. Producers must include operator_id,
vehicle, and health.
| Field | Type | Req | Description |
|---|---|---|---|
operator_id | string | MUST | Unique identifier for the fleet operator. Used for routing and pricing agreement lookup. |
operator_name | string | MUST | Display name of the fleet operator (e.g., "Waymo LLC"). |
contract_tier | string | SHOULD | "enterprise", "standard", "pilot". Used to resolve pricing rules. |
vehicle | object | MUST | Vehicle identity and telematics state. See fleet.vehicle. |
health | object | MUST | Vehicle health state at time of envelope generation. See fleet.health. |
dispatch_priority | string | SHOULD | "immediate", "normal", "deferred". Overrides severity-based routing when present. |
fleet.vehicle REQUIRED
| Field | Type | Req | Description |
|---|---|---|---|
vin | string | MUST | 17-character VIN. Receivers should validate via NHTSA vPIC if VIN decode is required for parts lookup. |
year | integer | SHOULD | Model year. |
make | string | SHOULD | Manufacturer. |
model | string | SHOULD | Model name. |
trim | string | MAY | Trim level. |
odometer | integer | SHOULD | Current odometer reading in miles. Used for maintenance eligibility and warranty determination. |
telematics_source | string | SHOULD | Telematics system that generated the health data (e.g., "waymo_os_v4", "obd2_gateway"). |
autonomous_level | integer (0–5) | MAY | SAE autonomy level. Informs service bay requirements and technician certification needs. |
fleet_unit_id | string | MAY | Operator-assigned unit identifier. May differ from VIN-based identity. |
fleet.health REQUIRED
| Field | Type | Req | Description |
|---|---|---|---|
severity | string (enum) | MUST | Urgency classification. Drives routing and scheduling priority. See severity levels below. |
health_score | integer (0–100) | SHOULD | Composite vehicle health score. 100 = perfect condition. Producer-defined algorithm. |
dtc_codes | array<string> | SHOULD | Active Diagnostic Trouble Codes in standard OBD-II format (e.g., ["C1234", "P0301"]). |
systems_flagged | array<string> | SHOULD | Human-readable system descriptions requiring attention (e.g., ["brake_pads", "cabin_filter"]). |
predicted_failure_window_days | integer | MAY | Telematics-estimated days until system failure. Null for reactive faults. |
last_service_date | string (date) | MAY | ISO 8601 date of most recent service event. |
recall_ids | array<string> | MAY | NHTSA recall campaign numbers if this request is recall-driven (e.g., ["24V-123"]). |
Health Severity Levels
| Value | Meaning | Expected SLA |
|---|---|---|
immediate | Safety-critical fault. Vehicle may be unsafe to operate. | Same-day response required |
scheduled | Known maintenance item within service interval. | Schedule within 14 days |
predictive | Telematics-forecasted need. Not yet a fault. | Schedule within 30 days |
recall | NHTSA recall action. Recall IDs must be present in health.recall_ids. | Operator-defined per campaign |
service_request — Commerce State REQUIRED in fleet envelopes NEW v1.1
Models the lifecycle of a machine-initiated service event from detection through invoice close.
Replaces transaction in fleet envelopes. Producers must include id,
type, stage, and initiated_by.
| Field | Type | Req | Description |
|---|---|---|---|
id | string | MUST | Unique service request identifier. Pattern: ^sr_. |
type | string (enum) | MUST | Service request classification. See request types below. |
stage | string (enum) | MUST | Current lifecycle stage. See service stages below. |
initiated_by | string (enum) | MUST | "vehicle_agent", "fleet_ops_agent", "recall_agent", "human_operator". |
last_updated | date-time | MUST | When service request state last changed. |
work_items | array | SHOULD | Itemized list of required work. See work_items[]. |
fleet_pricing_agreement_id | string | SHOULD | References a pre-negotiated fleet pricing contract. Receivers use this to apply fleet labor and parts rates without human negotiation. |
appointment | object | SHOULD | Requested and confirmed appointment state. See appointment. |
ro_number | string or null | MAY | DMS repair order number. Null until RO is opened by dealer system. |
loaner_required | boolean | MAY | Whether a loaner or replacement unit is needed during service. |
estimated_downtime_hours | number | MAY | Fleet operator's estimated out-of-rotation time. |
invoice | object | MAY | Invoice state. See invoice. |
Service Request Stages
| Stage | Description | Owner |
|---|---|---|
detected | Health condition identified by vehicle or telematics system. | Vehicle agent |
dispatched | ACP envelope transmitted to dealership. Awaiting acknowledgment. | Vehicle agent / fleet ops |
scheduled | Dealer confirmed appointment. appointment.scheduled_at must be non-null. | Dealer |
in_bay | Vehicle is at the dealership and service has begun. | Dealer |
completed | Work items complete. Vehicle ready for return to rotation. | Dealer |
invoiced | Invoice generated. invoice.total must be non-null. | Dealer |
closed | Invoice settled. Vehicle returned to fleet rotation. Terminal stage. | Fleet ops |
Stage progression is non-linear. A scheduled appointment may revert to
dispatched if the dealer cancels. The closed stage is terminal —
producers must create a new service request if follow-up work is required.
Service Request Types
| Type | Description |
|---|---|
predictive_maintenance | Telematics forecast indicates future failure. No active DTC. predicted_failure_window_days should be set. |
reactive_repair | Active fault detected. DTCs present. Vehicle may be grounded pending service. |
scheduled_service | Interval-based maintenance (oil, tires, filters). Triggered by odometer or calendar. |
recall_action | NHTSA recall campaign. health.recall_ids required. Parts cost to manufacturer. |
fleet_replacement | End-of-lifecycle vehicle replacement. May trigger Trade Hunt workflow at receiving dealer. |
warranty_claim | Fault within manufacturer warranty window. work_items[].warranty_eligible must be true. |
inspection | Regulatory, operator, or manufacturer-required inspection. |
service_request.work_items[]
| Field | Type | Req | Description |
|---|---|---|---|
op_code | string | SHOULD | Standard operation code (e.g., "BRK-PAD-R"). Enables automated DMS RO creation. |
description | string | MUST | Human-readable description of the work item. |
labor_hours | number | MAY | Estimated labor hours. Used for bay scheduling and fleet pricing calculation. |
parts_required | boolean | SHOULD | Whether parts must be sourced prior to scheduling. |
warranty_eligible | boolean | SHOULD | Whether this work item is covered under manufacturer or extended warranty. |
recall_campaign_id | string | MAY | NHTSA campaign ID if this item is recall-driven. Must match an entry in health.recall_ids. |
estimated_parts_cost | number | MAY | Fleet operator's estimated parts cost. For reference only — dealer invoice governs. |
service_request.appointment
| Field | Type | Req | Description |
|---|---|---|---|
requested_window_start | date-time | SHOULD | Earliest acceptable appointment time from fleet operator. |
requested_window_end | date-time | SHOULD | Latest acceptable appointment time. Enables bay capacity matching. |
scheduled_at | date-time or null | MAY | Confirmed appointment time. Set by dealer in confirmation delta. Null until confirmed. |
bay_assigned | string or null | MAY | Dealer-assigned service bay identifier. |
status | string (enum) | MUST | "pending", "confirmed", "in_progress", "completed", "cancelled". |
drop_off_method | string | MAY | "self_driving", "flat_bed", "operator_delivered". Relevant for autonomous fleet logistics. |
service_request.invoice
| Field | Type | Req | Description |
|---|---|---|---|
status | string | MUST | "not_started", "open", "pending_approval", "approved", "settled". |
ro_total | number or null | MAY | Total repair order value before fleet pricing adjustment. |
fleet_adjusted_total | number or null | MAY | Total after fleet pricing agreement rates applied. |
labor_total | number or null | MAY | Labor portion of invoice. |
parts_total | number or null | MAY | Parts portion of invoice. |
warranty_covered | number or null | MAY | Amount covered by warranty (reduces fleet liability). |
closed_at | date-time or null | MAY | Timestamp of invoice settlement. |
New source.agent_type Values NEW v1.1
The following values are added to the source.agent_type enum in v1.1.
Existing values from v1.0 remain valid.
| Value | Description |
|---|---|
vehicle_agent | Machine-initiated envelope. No human in the initiation chain. The originating intelligence is the vehicle's onboard system. |
fleet_ops_agent | Fleet operator system acting on behalf of one or more vehicles. May aggregate multiple vehicles into a batch request. |
recall_agent | NHTSA recall compliance trigger. Envelope is generated programmatically when a VIN matches an active recall campaign. |
New Standard Event Types NEW v1.1
Six new standard event types added in v1.1. All existing v1.0 event types remain valid. Receivers conformant with v1.0 must ignore these without error per forward-compatibility rules.
| Event Type | Description | Typical Producer |
|---|---|---|
vehicle_health_detected | Telematics system identified a health condition. Payload includes DTC codes and severity. | vehicle_agent |
service_request_initiated | ACP fleet envelope generated and queued for transmission. | vehicle_agent / fleet_ops_agent |
ro_opened | Dealer DMS created a repair order. Payload includes ro_number. | Dealer system (via delta) |
ro_updated | Repair order modified. Payload includes changed work items or labor estimate. | Dealer system (via delta) |
invoice_closed | Invoice settled. Payload includes final totals and warranty coverage amounts. | Dealer system (via delta) |
fleet_rotation_returned | Vehicle returned to operational rotation after service completion. | fleet_ops_agent |
New Intent Types NEW v1.1
These intent types may appear in lead.intents[] when a fleet event also
involves a human follow-up (e.g., a fleet manager reviewing a service request). In
pure machine-initiated envelopes, the intents array is typically absent.
Full Fleet Envelope Example
A complete snapshot envelope for a predictive maintenance event on an autonomous vehicle.
{
"acp": {
"version": "1.1.0",
"protocol": "acp",
"generated_at": "2026-04-06T08:14:22Z",
"envelope_id": "acp_1744027200_f9k3m1",
"parent_envelope_id": null
},
"source": {
"provider": "AutomotiveAI",
"agent_type": "vehicle_agent", // NEW in v1.1
"channel": "telematics",
"session_id": "vtl_waymo_vin5k2_20260406"
},
"dealership": {
"id": "dealer_costa_mesa_001",
"name": "Pacific Jaguar Land Rover",
"dms_provider": "dealer_center",
"timezone": "America/Los_Angeles"
},
"fleet": { // NEW in v1.1 — replaces "lead"
"operator_id": "waymo_fleet_west_001",
"operator_name": "Waymo LLC",
"contract_tier": "enterprise",
"dispatch_priority": "normal",
"vehicle": {
"vin": "SALYB2EX3LA123456",
"year": 2023,
"make": "Jaguar",
"model": "I-PACE",
"odometer": 48247,
"telematics_source": "waymo_os_v4.2",
"autonomous_level": 4,
"fleet_unit_id": "WM-LA-0047"
},
"health": {
"severity": "predictive",
"health_score": 71,
"dtc_codes": [],
"systems_flagged": ["brake_pads_rear", "cabin_air_filter"],
"predicted_failure_window_days": 12,
"last_service_date": "2025-10-14"
}
},
"service_request": { // NEW in v1.1 — replaces "transaction"
"id": "sr_1744027200_k8f2",
"type": "predictive_maintenance",
"stage": "dispatched",
"initiated_by": "vehicle_agent",
"last_updated": "2026-04-06T08:14:22Z",
"fleet_pricing_agreement_id": "fpa_waymo_socal_2026",
"loaner_required": false,
"estimated_downtime_hours": 3.5,
"work_items": [
{
"op_code": "BRK-PAD-REAR-IPACE",
"description": "Rear brake pad replacement",
"labor_hours": 1.5,
"parts_required": true,
"warranty_eligible": false
},
{
"op_code": "FILTER-CABIN-IPACE",
"description": "Cabin air filter replacement",
"labor_hours": 0.5,
"parts_required": true,
"warranty_eligible": false
}
],
"appointment": {
"requested_window_start": "2026-04-10T07:00:00-07:00",
"requested_window_end": "2026-04-12T17:00:00-07:00",
"scheduled_at": null,
"bay_assigned": null,
"status": "pending",
"drop_off_method": "self_driving"
},
"invoice": {
"status": "not_started",
"fleet_adjusted_total": null,
"closed_at": null
}
},
"events": [
{
"type": "vehicle_health_detected", // NEW in v1.1
"timestamp": "2026-04-06T06:01:44Z",
"data": {
"systems": ["brake_pads_rear", "cabin_air_filter"],
"severity": "predictive",
"health_score_at_detection": 71
}
},
{
"type": "service_request_initiated", // NEW in v1.1
"timestamp": "2026-04-06T08:14:22Z",
"data": {
"service_request_id": "sr_1744027200_k8f2",
"initiated_by": "vehicle_agent"
}
}
]
}
Dealer Confirmation Delta
When the dealer schedules the appointment, they transmit an ACP delta back to the fleet operator. This closes the loop — the vehicle agent receives confirmation without any human-to-human communication.
{
"acp": {
"version": "1.1.0",
"protocol": "acp",
"generated_at": "2026-04-06T11:30:00Z",
"envelope_id": "acp_1744038600_d2x9",
"parent_envelope_id": "acp_1744027200_f9k3m1"
},
"events": [
{
"type": "appointment_confirmed",
"timestamp": "2026-04-06T11:30:00Z",
"data": {
"service_request_id": "sr_1744027200_k8f2",
"scheduled_at": "2026-04-11T09:00:00-07:00",
"bay_assigned": "BAY-4",
"ro_number": "RO-2026-04847",
"stage": "scheduled"
}
},
{
"type": "ro_opened", // NEW in v1.1
"timestamp": "2026-04-06T11:30:00Z",
"data": {
"ro_number": "RO-2026-04847",
"dms_provider": "dealer_center"
}
}
]
}
Fleet Pricing Agreements
The fleet_pricing_agreement_id field references a pre-negotiated contract stored
in the receiving dealer's system. When present, the dealer's enforcement layer applies fleet
labor rates and parts pricing automatically — no human price negotiation occurs.
A conformant receiver receiving a fleet_pricing_agreement_id it does not
recognize must respond with error code UNKNOWN_PRICING_AGREEMENT (HTTP 422)
rather than falling back to retail pricing silently.
Recall Handling
When service_request.type is "recall_action", the following
additional constraints apply:
| Constraint | Requirement |
|---|---|
health.recall_ids | MUST be non-empty. Each entry must be a valid NHTSA campaign number. |
| Work items | Each work item must include recall_campaign_id matching an entry in health.recall_ids. |
| Parts cost | Recall work items are reimbursed by manufacturer. invoice.warranty_covered should reflect full recall labor and parts. |
| Fleet pricing | fleet_pricing_agreement_id does not apply to recall line items. Recall reimbursement rates are governed by manufacturer agreement. |
Conformance
Systems implementing the Fleet Commerce Extension may claim conformance as "ACP v1.1 Fleet Producer" or "ACP v1.1 Fleet Receiver" if they meet the following requirements in addition to the base v1.0 conformance requirements.
Fleet Producer Conformance
A conformant fleet producer must:
| 1. | Produce fleet envelopes with fleet and service_request in place of lead, transaction, and conversation. |
| 2. | Include fleet.vehicle.vin, fleet.health.severity, service_request.initiated_by, and service_request.stage in every fleet snapshot. |
| 3. | Set source.agent_type to one of the three new v1.1 agent types when generating fleet envelopes. |
| 4. | Transmit a final snapshot envelope upon service request closure, regardless of how many delta envelopes were previously sent. |
| 5. | Not include both fleet and lead in the same snapshot envelope. |
Fleet Receiver Conformance
A conformant fleet receiver must:
| 1. | Route fleet envelopes (identified by presence of fleet) independently from consumer envelopes. |
| 2. | Not require lead, transaction, or conversation when fleet is present. |
| 3. | Return UNKNOWN_PRICING_AGREEMENT (HTTP 422) when fleet_pricing_agreement_id is present but not recognized. |
| 4. | Transmit confirmation deltas upon appointment scheduling and RO opening. |
| 5. | Apply fleet labor and parts rates when a recognized fleet_pricing_agreement_id is present. |
Security Considerations
vehicle_agent and fleet_ops_agent sources than to consumer envelopes,
as a compromised fleet endpoint could generate fraudulent service requests at scale.
| Concern | Requirement |
|---|---|
| VIN validation | Receivers should validate VINs against NHTSA vPIC before opening repair orders. An invalid VIN must reject with INVALID_SCHEMA. |
| Fleet operator authentication | Receivers must verify fleet.operator_id against an authenticated fleet account before processing. Unrecognized operators must be rejected with UNAUTHORIZED_SOURCE. |
| Rate limiting | Fleet endpoints are especially vulnerable to volume attacks. Receivers should enforce per-operator rate limits separately from consumer envelope limits. |
| Envelope signing | Fleet producers should sign envelopes with X-ACP-Signature. Receivers should reject unsigned fleet envelopes in production environments. |
| PII minimization | Fleet envelopes contain vehicle identity but typically no human PII. Producers must not include driver or passenger data in fleet envelopes. |
Additional Error Codes NEW v1.1
The following error codes are added in v1.1 for fleet-specific failure conditions.
| Code | HTTP | Description |
|---|---|---|
UNKNOWN_FLEET_OPERATOR | 404 | The fleet.operator_id does not map to a known fleet account. Producer must establish fleet account before retrying. |
UNKNOWN_PRICING_AGREEMENT | 422 | The fleet_pricing_agreement_id is not recognized. Producer must not assume retail pricing fallback. |
INVALID_VIN | 400 | The fleet.vehicle.vin failed format validation or NHTSA vPIC decode. |
FLEET_LEAD_CONFLICT | 400 | Envelope contains both fleet and lead. These are mutually exclusive in snapshot envelopes. |
INVALID_RECALL_ID | 422 | A recall work item references a campaign ID not present in health.recall_ids. |