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
- Sold vehicles MUST NOT be returned as available. Dealer agents MUST NOT include known-sold vehicles in
inventory.searchresults unless theirstatusclearly communicates the sold state. Buyer agents that observe astatusindicating a sold disposition MUST treat the vehicle as unavailable. last_verified_atis MANDATORY for availability claims. EveryVehiclereturned byinventory.searchand everyVehicleDetailreturned byinventory.vehicleMUST includelast_verified_atwhenever the agent is making availability claims about the listing. The field is an ISO 8601 datetime indicating when the dealer last reconciled 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.inventory.searchMUST support anonymous calls. Unless the agent card and contract manifest explicitly state otherwise (anonymous_allowed: false),inventory.searchMUST accept calls without authentication, withoutcustomerinfo, and withoutconsent. AAP RECOMMENDS dealer agents publish their search surface anonymously by default.
Inventory SHOULDs
- Dealer agents SHOULD update
last_verified_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
consent_grantis MANDATORY whencustomeris present. Everylead.general,lead.vehicle, andlead.appointmentrequest that includes acustomerblock MUST also include aconsent(ConsentGrant) block. The schemas enforce this withdependentRequired. 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 must match the skill.
consent.scope[]MUST includegeneral_inquiryforlead.general,vehicle_inquiryforlead.vehicle, andappointmentforlead.appointment. AConsentGrantwhosescopedoes not cover the called skill MUST cause the dealer to reject withINVALID_CONSENT.
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 prefer
lead.vehicleoverlead.generalwhenever a specific vehicle is identified, becauselead.vehicleis ADF-mappable and reaches the dealer's CRM as a structured lead.
Appointment rules
Appointment MUSTs
- Booking is not implied. A successful
lead.appointmentresponse does NOT guarantee a booking unless thedata.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, none of the user's windows fit, etc.), it SHOULD respond withstatus: "requested"orstatus: "proposed"rather than rejecting. - At least one window is required.
requested_windows[]MUST contain at least one entry (minItems: 1) unless the dealer's policy explicitly allows open-ended scheduling. Open-ended scheduling MUST be communicated out of band — AAP v0.1 does not standardize a flag for it on the agent card. vehicles[]is REQUIRED fortest_driveandhandover. The schema enforces this with a conditionalif/thenblock. A request fortest_drivewithoutvehicles[]MUST be rejected withMISSING_REQUIRED_FIELD.
Appointment SHOULDs
- The dealer agent SHOULD include the dealer's primary phone (
data.dealer.phone, E.164) on every appointment response so the buyer agent can surface it to the user. - The dealer agent SHOULD include
confirmed_windowon everyconfirmedresponse andproposed_slotson everyproposedresponse. - Buyer agents that receive
proposedSHOULD present the alternative slots to the user and re-submit a freshlead.appointmentwith the chosen slot inrequested_windows[].
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_code.Vehicle.offered_priceMUST be omitted when nozip_codewas 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 and rate limits
Auth MUSTs
auth_typeagreement. The agent card'ssecurity_requirementsand the contract manifest'sauth_typeMUST agree. Ifsecurity_requirementsrequiresbearer,auth_typeMUST be"bearer"; ifsecurity_requirementsis empty/absent,auth_typeMUST benull.- Bearer tokens MUST be passed in the
Authorizationheader.Authorization: Bearer <token>is the only auth scheme AAP v0.1 documents. Other schemes (mTLS, OAuth client credentials with downstream JWT, signed requests) are out of scope.
Rate-limit SHOULDs
- 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.status of "Sold" indicates the listing 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.