Behavior rules
This page collects the normative MUST and SHOULD requirements that an AAP-compliant agent must follow. These rules are the bare minimum for interoperability and regulatory compliance; they are referenced from the per-skill pages and applied by the dealer-side test suite.
The keywords MUST, MUST NOT, SHOULD, SHOULD NOT, MAY, RECOMMENDED, and OPTIONAL are interpreted as in RFC 2119.
Inventory rules
Inventory MUSTs
- Inventory feeds MUST contain only in-stock statuses.
Vehicle.statusis a controlled enum:available|intransit|pending. Dealer agents MUST only return vehicles whosestatusis one of these three ininventory.searchresults. A vehicle in any other state is OUT OF STOCK: the dealer MUST omit it, and a buyer agent that somehow observes any other value MUST ignore the vehicle and treat it as unavailable.statusis REQUIRED on every inventory listing. updated_atis MANDATORY for availability claims. EveryVehiclereturned byinventory.searchandinventory.vehicleMUST includeupdated_atwhenever the agent is making availability claims about the listing. The field is an RFC 3339 timestamp indicating when the dealer last updated this listing's availability, price, and status.vehicle.vinorvehicle.stockSHOULD be present on detail responses.inventory.vehicleresponses SHOULD includevinorstock. When neither is present (e.g. a deeply pre-allocated unit), the response MUST includevehicle_idand SHOULD include free-textnotesexplaining the unit's identification.- When implemented,
inventory.searchMUST support anonymous calls. A dealer agent is not required to exposeinventory.search, but if it does, it MUST accept calls withoutcustomerinfo and withoutconsent. AAP RECOMMENDS dealer agents publish their search surface anonymously by default when they expose one.
Inventory SHOULDs
- Dealer agents SHOULD update
updated_atno less frequently than once per business day for each in-stock listing. - Dealer agents SHOULD echo the request's
pagination.skipandpagination.limitin the responsedata.skipanddata.limitso buyer agents can paginate without ambiguity. - Buyer agents SHOULD attach
privacy.anonymous: trueto everyinventory.searchcall by default and only attach customer identity when actually submitting a lead.
Lead rules

Lead MUSTs
customeris REQUIRED on everylead.submitrequest. The unified lead is never anonymous. Everylead.submit.requestMUST include acustomerblock; the schema enforces this inrequired.consentis MANDATORY whenevercustomeris present (which is always forlead.submit). Everylead.submit.requestMUST include aconsent(ConsentGrant) block. A request that violates this MUST be rejected withCONTACT_CONSENT_REQUIRED.- Channel must be permitted. Dealer agents MUST reject the lead with
CONTACT_CONSENT_REQUIREDif the requested follow-up channel (or the channel implied bycustomer.preferred_contact) is not inconsent.allowed_channels[]. The dealer MUST NOT use a channel the user did not authorize. - Buyer agents MUST NOT include phone or email without explicit user authorization. A buyer agent MUST capture an explicit consent action from the user — verbatim text shown, channels selected, scope confirmed — before populating
customer.email,customer.phone, orcustomer.address. The verbatim text MUST be reproduced inconsent.consent_text. - Scope is fixed.
consent.scope[]MUST be["lead_submission"]. AConsentGrantwhosescopeis anything else MUST cause the dealer to reject withINVALID_CONSENT. - Condition vocabularies MUST NOT be mixed.
vehicle_of_interest.condition(when set) MUST be one ofnew|used|cpo.trade_in.condition(when set) MUST be one ofexcellent|good|fair|poor. Mixing these MUST be rejected withSCHEMA_VALIDATION_FAILED(the conditional schema enforces it) orINVALID_CONDITION.
Lead SHOULDs
- Dealer agents SHOULD return
status: "duplicate"(instead ofreceived) when the samecustomersubmits an equivalent lead within a short window (dealer-defined; commonly 24 hours). - Dealer agents SHOULD include a brief
messageon every successful lead response explaining the next step (e.g. "A sales rep will email Anna within 1 business day."). - Dealer agents SHOULD persist the full
ConsentGrantJSON as an audit record alongside the lead. ADF mapping does not specify a consent element; theConsentGrantis the AAP-side record. - Buyer agents SHOULD bundle
vehicle_of_interest,trade_in, andappointmentinto a SINGLElead.submit.requestwhen they belong to the same shopping intent, rather than making multiple consecutive submissions. This keeps the dealer CRM transactional and avoids re-stitching one customer intent.
Appointment rules
Appointment MUSTs
- Booking is not implied. A successful
lead.submitresponse does NOT guarantee an appointment booking unless thedata.appointment.statusisconfirmed.requestedandproposedmean the customer has expressed interest but has not been booked. - Non-confirmable requests SHOULD return
requestedorproposed. When the dealer agent cannot auto-confirm a request (manual review required, the requested time does not fit, etc.), it SHOULD respond withdata.appointment.status: "requested"ordata.appointment.status: "proposed"rather than rejecting the appointment. appointment_atMAY be omitted. When the buyer does not specify a time, the dealer SHOULD returnrequestedand follow up to schedule. When present,appointment_atMUST be an ISO 8601 / RFC 3339 timestamp with a timezone offset.vehicle_of_interestSHOULD be present fortest_drive. Whenappointment.appointment_typeistest_drive, the lead SHOULD also includevehicle_of_interestso the dealer knows which unit. A submission withoutvehicle_of_interestMAY be rejected withMISSING_REQUIRED_FIELDper dealer policy.
Appointment SHOULDs
- The dealer agent SHOULD include the dealer's primary phone (
data.dealer.phone, E.164) on every lead-with-appointment response so the buyer agent can surface it to the user. - The dealer agent SHOULD include
data.appointment.confirmed_aton everyconfirmedappointment status anddata.appointment.proposed_timeson everyproposedstatus. - Buyer agents that receive
data.appointment.status: "proposed"SHOULD present the alternative times to the user and re-submit a freshlead.submitwith the chosen time inappointment.appointment_at.
Defaults and locale rules
When optional context fields are omitted, AAP defines deterministic fallbacks so buyer agents and dealer agents agree without out-of-band coordination.
- Prices are integers in whole US dollars.
msrp,list_price,offered_price, andpriceare plain integers in whole US dollars (e.g.26780). - Address default country.
Address.countryis optional; when omitted, the assumed country isUS. - Idempotency. Buyer agents that retry
lead.submitafter a network failure SHOULD pass anidempotency_key(UUID recommended). Dealer agents SHOULD dedupe on this key for at least 24 hours and return the originallead_idand status on retries. - Consent expiration. When
ConsentGrant.expires_atis omitted, the dealer MAY apply its own default expiration window per local regulation; an explicitexpires_atalways wins. The dealer MUST reject the lead withINVALID_CONSENTif the grant has already expired.
Pricing rules
Pricing MUSTs
priceMUST reflect the FINAL out-the-door amount.Vehicle.priceis the FTC-final price the buyer would actually pay, including all incentives applied, all mandatory fees added, all required dealer add-ons added. Dealers MUST NOT advertise apricethat omits required fees, conditions on dealer financing, or required add-ons. See Pricing and FTC compliance for the underlying FTC enforcement context (March 2026 warnings + CARS Rule).price_min/price_maxandsort.field: "price"apply toprice.inventory.searchfilters.price_min,filters.price_max, andsort.field: "price"are evaluated against thepricefield, notlist_priceormsrp. Dealers MUST keeppriceaccurate for the same reason.offered_priceis conditional onzip.Vehicle.offered_priceMUST be omitted when nozipwas supplied or when the dealer does not support desking. It MUST NOT be a substitute forprice.
Pricing SHOULDs
- Dealer agents SHOULD publish
list_price,msrp, andpricetogether for transparency.list_priceis the base advertised number;priceis the final out-the-door number; the difference is the sum of mandatory fees and required add-ons. - Buyer agents SHOULD compare offers across dealers on
price(notlist_price). Comparing onlist_pricedeceives the user about the actual cost.
Authentication
AAP v0.2 defines no authentication of its own — agents are public by default. A dealer that needs to protect its endpoint uses A2A's native securitySchemes / securityRequirements on its agent card; obtaining and presenting credentials then follows A2A (a transport concern), not AAP. See Discovery.
Rate limits
- Dealer agents SHOULD return
RATE_LIMITED(HTTP 429 / JSON-RPC code -32002) withretryable: trueand a hint indetails.retry_after_mswhen the buyer agent exceeds a per-key quota.
Ordering of rules
When two rules appear to conflict, the more restrictive one wins. For example: a vehicle whose status is not one of available | intransit | pending is out of stock and MUST NOT be returned as available, even if the dealer's own internal cache says otherwise. The buyer agent's choice of privacy.anonymous: true does NOT override the consent rules — those apply only to lead.* skills, where customer info changes the call.