RFC-001 · ACP v1.1.0 · Fleet Commerce Extension

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.

Architectural context: This extension is a minor version addition to ACP v1.0.0, published as v1.1.0. All v1.0 consumer envelopes remain fully valid. Fleet envelopes use two new top-level objects (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 EnvelopeUse Consumer Envelope
Initiating party is a vehicle agent or fleet ops systemInitiating party is a human consumer
Service demand is telematics-triggered or predictiveCustomer books service via chat, phone, or web
Fleet pricing agreement governs labor and parts ratesRetail pricing applies
No conversation transcript existsConversation transcript is the source of truth
Vehicle identity (VIN) is the primary entity, not a personCustomer contact is the primary entity
NHTSA recall action triggered programmaticallyCustomer calls about a recall notice
Fleet replacement cycle for aged-out vehicleIndividual 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

Vehicle Layer
Autonomous Vehicle Telematics OS Fleet Ops System
▼ ACP Fleet Envelope (fleet + service_request)
Protocol Layer
ACP v1.1 Enforcement ECL · TCPA/CCPA Idempotency · HMAC
▼ Validated + Audited
Dealer Layer
DMS Service Scheduler RO System Fleet Desk
▼ Confirmation Event (ACP Delta)
Vehicle Agent receives appointment confirmation

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 ObjectConsumer EnvelopeFleet 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_analysisOptionalOptional (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.

FieldTypeReqDescription
operator_idstringMUSTUnique identifier for the fleet operator. Used for routing and pricing agreement lookup.
operator_namestringMUSTDisplay name of the fleet operator (e.g., "Waymo LLC").
contract_tierstringSHOULD"enterprise", "standard", "pilot". Used to resolve pricing rules.
vehicleobjectMUSTVehicle identity and telematics state. See fleet.vehicle.
healthobjectMUSTVehicle health state at time of envelope generation. See fleet.health.
dispatch_prioritystringSHOULD"immediate", "normal", "deferred". Overrides severity-based routing when present.

fleet.vehicle REQUIRED

FieldTypeReqDescription
vinstringMUST17-character VIN. Receivers should validate via NHTSA vPIC if VIN decode is required for parts lookup.
yearintegerSHOULDModel year.
makestringSHOULDManufacturer.
modelstringSHOULDModel name.
trimstringMAYTrim level.
odometerintegerSHOULDCurrent odometer reading in miles. Used for maintenance eligibility and warranty determination.
telematics_sourcestringSHOULDTelematics system that generated the health data (e.g., "waymo_os_v4", "obd2_gateway").
autonomous_levelinteger (0–5)MAYSAE autonomy level. Informs service bay requirements and technician certification needs.
fleet_unit_idstringMAYOperator-assigned unit identifier. May differ from VIN-based identity.

fleet.health REQUIRED

FieldTypeReqDescription
severitystring (enum)MUSTUrgency classification. Drives routing and scheduling priority. See severity levels below.
health_scoreinteger (0–100)SHOULDComposite vehicle health score. 100 = perfect condition. Producer-defined algorithm.
dtc_codesarray<string>SHOULDActive Diagnostic Trouble Codes in standard OBD-II format (e.g., ["C1234", "P0301"]).
systems_flaggedarray<string>SHOULDHuman-readable system descriptions requiring attention (e.g., ["brake_pads", "cabin_filter"]).
predicted_failure_window_daysintegerMAYTelematics-estimated days until system failure. Null for reactive faults.
last_service_datestring (date)MAYISO 8601 date of most recent service event.
recall_idsarray<string>MAYNHTSA recall campaign numbers if this request is recall-driven (e.g., ["24V-123"]).

Health Severity Levels

ValueMeaningExpected SLA
immediateSafety-critical fault. Vehicle may be unsafe to operate.Same-day response required
scheduledKnown maintenance item within service interval.Schedule within 14 days
predictiveTelematics-forecasted need. Not yet a fault.Schedule within 30 days
recallNHTSA 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.

FieldTypeReqDescription
idstringMUSTUnique service request identifier. Pattern: ^sr_.
typestring (enum)MUSTService request classification. See request types below.
stagestring (enum)MUSTCurrent lifecycle stage. See service stages below.
initiated_bystring (enum)MUST"vehicle_agent", "fleet_ops_agent", "recall_agent", "human_operator".
last_updateddate-timeMUSTWhen service request state last changed.
work_itemsarraySHOULDItemized list of required work. See work_items[].
fleet_pricing_agreement_idstringSHOULDReferences a pre-negotiated fleet pricing contract. Receivers use this to apply fleet labor and parts rates without human negotiation.
appointmentobjectSHOULDRequested and confirmed appointment state. See appointment.
ro_numberstring or nullMAYDMS repair order number. Null until RO is opened by dealer system.
loaner_requiredbooleanMAYWhether a loaner or replacement unit is needed during service.
estimated_downtime_hoursnumberMAYFleet operator's estimated out-of-rotation time.
invoiceobjectMAYInvoice state. See invoice.

Service Request Stages

detected → dispatched → scheduled → in_bay → completed → invoiced → closed
StageDescriptionOwner
detectedHealth condition identified by vehicle or telematics system.Vehicle agent
dispatchedACP envelope transmitted to dealership. Awaiting acknowledgment.Vehicle agent / fleet ops
scheduledDealer confirmed appointment. appointment.scheduled_at must be non-null.Dealer
in_bayVehicle is at the dealership and service has begun.Dealer
completedWork items complete. Vehicle ready for return to rotation.Dealer
invoicedInvoice generated. invoice.total must be non-null.Dealer
closedInvoice 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

predictive_maintenance reactive_repair scheduled_service recall_action fleet_replacement warranty_claim inspection
TypeDescription
predictive_maintenanceTelematics forecast indicates future failure. No active DTC. predicted_failure_window_days should be set.
reactive_repairActive fault detected. DTCs present. Vehicle may be grounded pending service.
scheduled_serviceInterval-based maintenance (oil, tires, filters). Triggered by odometer or calendar.
recall_actionNHTSA recall campaign. health.recall_ids required. Parts cost to manufacturer.
fleet_replacementEnd-of-lifecycle vehicle replacement. May trigger Trade Hunt workflow at receiving dealer.
warranty_claimFault within manufacturer warranty window. work_items[].warranty_eligible must be true.
inspectionRegulatory, operator, or manufacturer-required inspection.

service_request.work_items[]

FieldTypeReqDescription
op_codestringSHOULDStandard operation code (e.g., "BRK-PAD-R"). Enables automated DMS RO creation.
descriptionstringMUSTHuman-readable description of the work item.
labor_hoursnumberMAYEstimated labor hours. Used for bay scheduling and fleet pricing calculation.
parts_requiredbooleanSHOULDWhether parts must be sourced prior to scheduling.
warranty_eligiblebooleanSHOULDWhether this work item is covered under manufacturer or extended warranty.
recall_campaign_idstringMAYNHTSA campaign ID if this item is recall-driven. Must match an entry in health.recall_ids.
estimated_parts_costnumberMAYFleet operator's estimated parts cost. For reference only — dealer invoice governs.

service_request.appointment

FieldTypeReqDescription
requested_window_startdate-timeSHOULDEarliest acceptable appointment time from fleet operator.
requested_window_enddate-timeSHOULDLatest acceptable appointment time. Enables bay capacity matching.
scheduled_atdate-time or nullMAYConfirmed appointment time. Set by dealer in confirmation delta. Null until confirmed.
bay_assignedstring or nullMAYDealer-assigned service bay identifier.
statusstring (enum)MUST"pending", "confirmed", "in_progress", "completed", "cancelled".
drop_off_methodstringMAY"self_driving", "flat_bed", "operator_delivered". Relevant for autonomous fleet logistics.

service_request.invoice

FieldTypeReqDescription
statusstringMUST"not_started", "open", "pending_approval", "approved", "settled".
ro_totalnumber or nullMAYTotal repair order value before fleet pricing adjustment.
fleet_adjusted_totalnumber or nullMAYTotal after fleet pricing agreement rates applied.
labor_totalnumber or nullMAYLabor portion of invoice.
parts_totalnumber or nullMAYParts portion of invoice.
warranty_coverednumber or nullMAYAmount covered by warranty (reduces fleet liability).
closed_atdate-time or nullMAYTimestamp 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.

ValueDescription
vehicle_agentMachine-initiated envelope. No human in the initiation chain. The originating intelligence is the vehicle's onboard system.
fleet_ops_agentFleet operator system acting on behalf of one or more vehicles. May aggregate multiple vehicles into a batch request.
recall_agentNHTSA 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 TypeDescriptionTypical Producer
vehicle_health_detectedTelematics system identified a health condition. Payload includes DTC codes and severity.vehicle_agent
service_request_initiatedACP fleet envelope generated and queued for transmission.vehicle_agent / fleet_ops_agent
ro_openedDealer DMS created a repair order. Payload includes ro_number.Dealer system (via delta)
ro_updatedRepair order modified. Payload includes changed work items or labor estimate.Dealer system (via delta)
invoice_closedInvoice settled. Payload includes final totals and warranty coverage amounts.Dealer system (via delta)
fleet_rotation_returnedVehicle returned to operational rotation after service completion.fleet_ops_agent

New Intent Types NEW v1.1

FLEET_SERVICE_DEMAND RECALL_COMPLIANCE FLEET_REPLACEMENT WARRANTY_CLAIM

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.

JSON Predictive Maintenance — 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.

JSON Dealer Confirmation Delta — Appointment Scheduled
{
  "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.

IP Boundary: This specification defines the reference field only. The structure of fleet pricing agreements, how rates are calculated, and how they are enforced against invoice line items are implementation-specific concerns left to the receiving platform. AutomotiveAI's Deal Desk is one such implementation.

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:

ConstraintRequirement
health.recall_idsMUST be non-empty. Each entry must be a valid NHTSA campaign number.
Work itemsEach work item must include recall_campaign_id matching an entry in health.recall_ids.
Parts costRecall work items are reimbursed by manufacturer. invoice.warranty_covered should reflect full recall labor and parts.
Fleet pricingfleet_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

Elevated trust requirements: Fleet envelopes are machine-generated with no human in the initiation chain. Receivers must apply stricter authentication to vehicle_agent and fleet_ops_agent sources than to consumer envelopes, as a compromised fleet endpoint could generate fraudulent service requests at scale.
ConcernRequirement
VIN validationReceivers should validate VINs against NHTSA vPIC before opening repair orders. An invalid VIN must reject with INVALID_SCHEMA.
Fleet operator authenticationReceivers must verify fleet.operator_id against an authenticated fleet account before processing. Unrecognized operators must be rejected with UNAUTHORIZED_SOURCE.
Rate limitingFleet endpoints are especially vulnerable to volume attacks. Receivers should enforce per-operator rate limits separately from consumer envelope limits.
Envelope signingFleet producers should sign envelopes with X-ACP-Signature. Receivers should reject unsigned fleet envelopes in production environments.
PII minimizationFleet 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.

CodeHTTPDescription
UNKNOWN_FLEET_OPERATOR404The fleet.operator_id does not map to a known fleet account. Producer must establish fleet account before retrying.
UNKNOWN_PRICING_AGREEMENT422The fleet_pricing_agreement_id is not recognized. Producer must not assume retail pricing fallback.
INVALID_VIN400The fleet.vehicle.vin failed format validation or NHTSA vPIC decode.
FLEET_LEAD_CONFLICT400Envelope contains both fleet and lead. These are mutually exclusive in snapshot envelopes.
INVALID_RECALL_ID422A recall work item references a campaign ID not present in health.recall_ids.