Contract manifest
Every AAP-compliant dealer agent publishes a second well-known file alongside its A2A agent card:
GET https://{dealer-domain}/.well-known/auto-agent-contract.json
This file is the contract manifest. The agent card points to it via capabilities.extensions[].params.manifest_url. The manifest enumerates the seven required skills, their request/response schema URLs, and per-skill anonymous_allowed / consent_required flags. It also declares the agent's auth_type and OPTIONAL LLM guidance.
A buyer agent — especially an LLM-driven one — uses the manifest to plan calls deterministically: which skills can be called anonymously, which require customer consent, and exactly which JSON Schema version to validate a request against.
Why a separate manifest
The A2A agent card is generic. It tells a buyer agent that an agent exists, what extensions it supports, and how to reach it. It does not say:
- Which exact JSON Schema URL describes each skill's request body for this version.
- Which skills allow anonymous use.
- Which skills require an explicit
ConsentGrantwhen customer info is included. - Whether the lead skills emit ADF-mappable payloads.
- What free-form rules the dealer would like LLM clients to follow.
The contract manifest carries all of that. It is small, deterministic, and cacheable — exactly the shape a planning LLM needs.
How a buyer agent uses it
For each skill the buyer agent intends to call, it:
- Looks up the entry in
a2a.skills[]byid. - Validates its outgoing AAP request payload against
request_schema(URL is absolute and version-pinned). - Honors the booleans:
anonymous_allowed: falsemeans the skill will reject calls without acustomerblock (e.g. lead.* skills).consent_required: truemeans whenever acustomerblock is present, aconsent(ConsentGrant) MUST be present too.
- If the manifest's top-level
auth_typeis"bearer", attachesAuthorization: Bearer <token>to every call. - Optionally reads
llm.rules[]andllm.guide_urlfor natural-language policy hints.
Full example
Below is a complete, valid AAP v0.1 contract manifest for a public dealer agent (auth_type: null) using the JSON-RPC binding.
{
"contract": {
"name": "Auto Agent Protocol A2A Automotive Retail Profile",
"version": "0.1.0",
"uri": "https://autoagentprotocol.org/v0.1/"
},
"dealer": {
"dealer_id": "dealer_demo_toyota",
"name": "Demo Toyota",
"managed_by": "Lumika AI"
},
"a2a": {
"endpoint": "https://demo-toyota.example.com/a2a/jsonrpc",
"protocol_binding": "JSONRPC",
"skills": [
{
"id": "dealer.information",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/dealer-information-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/dealer-information-response.schema.json",
"anonymous_allowed": true,
"consent_required": false
},
{
"id": "inventory.facets",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/inventory-facets-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/inventory-facets-response.schema.json",
"anonymous_allowed": true,
"consent_required": false
},
{
"id": "inventory.search",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/inventory-search-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/inventory-search-response.schema.json",
"anonymous_allowed": true,
"consent_required": false
},
{
"id": "inventory.vehicle",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/vehicle-detail-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/vehicle-detail-response.schema.json",
"anonymous_allowed": true,
"consent_required": false
},
{
"id": "lead.general",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/general-lead-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/lead-response.schema.json",
"anonymous_allowed": false,
"consent_required": true,
"adf_compatible": true
},
{
"id": "lead.vehicle",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/vehicle-lead-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/lead-response.schema.json",
"anonymous_allowed": false,
"consent_required": true,
"adf_compatible": true
},
{
"id": "lead.appointment",
"request_schema": "https://autoagentprotocol.org/v0.1/schemas/appointment-lead-request.schema.json",
"response_schema": "https://autoagentprotocol.org/v0.1/schemas/appointment-lead-response.schema.json",
"anonymous_allowed": false,
"consent_required": true,
"adf_compatible": true
}
]
},
"auth_type": null,
"llm": {
"guide_url": "https://demo-toyota.example.com/.well-known/auto-agent-llm-guide.md",
"rules": [
"Use inventory.search or inventory.vehicle before submitting a lead if the user is still researching.",
"Do not submit lead.general, lead.vehicle, or lead.appointment unless the user explicitly consents to share contact information with this dealer.",
"Use lead.vehicle for vehicle-specific CRM/ADF leads.",
"Use lead.appointment for test drive, call, video call, showroom visit, or trade-in appraisal appointment requests.",
"Never invent VIN, stock number, price, availability, or consent."
]
}
}
Field reference
contract
| Field | Type | Description |
|---|---|---|
name | string | Human name of the contract. AAP v0.1 uses Auto Agent Protocol A2A Automotive Retail Profile. |
version | string | Contract version (e.g. 0.1.0). |
uri | URI | Stable URI for this contract version (e.g. https://autoagentprotocol.org/v0.1/). |
dealer
| Field | Type | Description |
|---|---|---|
dealer_id | string | Stable dealer identifier (the same dealer_id returned by dealer.information). |
name | string | Dealer trade name. |
managed_by | string | Operator/integrator running this dealer agent (e.g. CRM vendor, AI platform). Optional. |