AIP Specification

Version 0.1.0 · Snapshot 2026-02-27 · Status: Draft


Overview

The Agent Intake Protocol (AIP) defines a standard interface for AI agents to discover, submit intake data to, and receive structured offers from business service endpoints. This document is the authoritative technical specification.

Terminology

TermDefinition
AgentAn AI agent acting on behalf of a human user.
ProviderA business or service that implements AIP endpoints.
ManifestThe agent-intake.json file describing available intakes.
IntakeA structured data submission from an agent to a provider.
Soft-contractA non-binding, structured offer returned by a provider.
BindThe act of accepting an offer, converting it to an active relationship.
PIIPersonally identifiable information (email, name, phone, etc.).

Protocol Lifecycle

1
Discover
2
Submit
3
Offer
4
Review
5
Bind

Stage 1: Discover

The agent sends an HTTP GET request to the provider's well-known path:

GET https://{domain}/.well-known/agent-intake.json
Accept: application/json

The provider MUST respond with a valid manifest (see Manifest Schema) and Content-Type: application/json.

Requirements:

Stage 2: Submit

The agent constructs an intake request and POSTs it to the intake endpoint specified in the manifest:

POST {intake.endpoint}
Content-Type: application/json

{
  "aip_version": "0.1.0",
  "agent": {
    "id": "agent-instance-id",
    "platform": "anthropic",
    "consent_scope": ["intake", "offer"]
  },
  "intake_data": {
    // Fields conforming to intake.input_schema
  },
  "session_id": "uuid-v4"
}

Requirements:

Stage 3: Offer

The provider processes the intake and returns a soft-contract offer:

{
  "aip_version": "0.1.0",
  "session_id": "uuid-v4",
  "status": "offer",
  "offer": {
    "id": "offer-uuid",
    "summary": "Human-readable summary for the user.",
    "details": { /* structured offer data */ },
    "expires": "2026-03-06T00:00:00Z",
    "bind_endpoint": "https://provider.com/api/aip/bind",
    "bind_requires": ["email", "full_name"]
  }
}

Response status codes:

Response statuses:

StatusMeaning
offerSuccessful. An offer is included in the response.
declinedThe provider cannot serve this intake. A decline_reason is provided.
pendingThe intake is being processed asynchronously. (Reserved for future use.)
errorAn error occurred. An error object with code and message is provided.

Stage 4: Review

The review stage is handled entirely by the agent. The protocol does not define message formats for this stage. The agent presents the offer(s) to the user and facilitates decision-making.

Stage 5: Bind

If the user accepts an offer, the agent sends a bind request:

POST {offer.bind_endpoint}
Content-Type: application/json

{
  "offer_id": "offer-uuid",
  "session_id": "uuid-v4",
  "bind_data": {
    "email": "user@example.com",
    "full_name": "Jane Doe"
  },
  "agent": {
    "id": "agent-instance-id",
    "consent_scope": ["intake", "offer", "bind"]
  }
}

Requirements:

JSON Schemas

All schemas use JSON Schema Draft 2020-12. The canonical schema files are in the spec/2026-02-27/ directory.

Manifest Schema: agent-intake.json

The manifest is served at /.well-known/agent-intake.json and describes the provider and available intakes.

Top-level fields

FieldTypeRequiredDescription
aip_versionstringYesProtocol version (semver).
providerobjectYesProvider information.
intakesarrayYesList of available intakes (min 1).
certificationobjectNoRegistry certification info.

Provider object

FieldTypeRequiredDescription
namestringYesProvider's display name.
urlstring (URI)YesProvider's primary URL.
descriptionstringNoBrief description of the provider.
logostring (URI)NoURL to provider's logo.
contact_emailstring (email)NoContact email for AIP inquiries.

Intake object

FieldTypeRequiredDescription
idstringYesUnique ID (lowercase, hyphens). Pattern: ^[a-z0-9-]+$
namestringYesHuman-readable name.
descriptionstringYesWhat this intake does.
endpointstring (URI)YesURL to POST intake submissions to.
methodstringYesHTTP method. Must be "POST".
categorystringNoCategory (e.g., health/assessment).
input_schemaobjectYesJSON Schema for the intake_data payload.
offer_typestringYesType of offer returned.
binding_availablebooleanYesWhether binding is supported.
requires_authbooleanNoWhether auth is required. Default: false.
privacyobjectNoPrivacy declarations.
rate_limitobjectNoRate limiting info.

Full example

{
  "aip_version": "0.1.0",
  "provider": {
    "name": "Man vs Health",
    "url": "https://manvshealth.com",
    "description": "Men's metabolic health optimization"
  },
  "intakes": [
    {
      "id": "metabolic-assessment",
      "name": "Metabolic Health Assessment",
      "description": "Submit metabolic markers for a personalized plan.",
      "endpoint": "https://manvshealth.com/api/aip/metabolic-assessment",
      "method": "POST",
      "category": "health/assessment",
      "input_schema": {
        "type": "object",
        "required": ["age_range", "sex", "primary_concern"],
        "properties": {
          "age_range": {
            "type": "string",
            "enum": ["30-39", "40-49", "50-59", "60+"]
          },
          "sex": {
            "type": "string",
            "enum": ["male", "female"]
          },
          "primary_concern": {
            "type": "string",
            "enum": ["weight", "energy", "insulin_resistance", "general"]
          },
          "fasting_glucose_range": {
            "type": "string",
            "enum": ["normal", "elevated", "high", "unknown"]
          },
          "activity_level": {
            "type": "string",
            "enum": ["sedentary", "light", "moderate", "active"]
          }
        }
      },
      "offer_type": "personalized_recommendation",
      "binding_available": true,
      "requires_auth": false,
      "privacy": {
        "data_retention": "none",
        "pii_required": false,
        "redacted_acceptable": true
      }
    }
  ],
  "certification": {
    "registry": "https://agentintake.io/registry",
    "certified": true,
    "cert_id": "aip-cert-2026-00142",
    "expires": "2027-02-27"
  }
}

Intake Request Schema

FieldTypeRequiredDescription
aip_versionstringYesProtocol version.
agentobjectYesAgent info (id, platform, consent_scope).
intake_dataobjectYesData conforming to the intake's input_schema.
session_idstring (UUID)YesSession identifier for correlation.
metadataobjectNoOptional metadata (timestamp, locale, timezone).

Agent object

FieldTypeRequiredDescription
idstringYesUnique agent instance identifier.
platformstringNoAgent platform (e.g., "anthropic", "openai").
namestringNoHuman-readable agent name.
consent_scopearrayYesAuthorized scopes: intake, offer, bind, account_creation, payment.

Offer Response Schema

FieldTypeRequiredDescription
aip_versionstringYesProtocol version.
session_idstring (UUID)YesEchoed from the request.
statusstringYesOne of: offer, declined, error, pending.
offerobjectConditionalRequired when status is offer.
decline_reasonstringNoPresent when status is declined.
errorobjectNoPresent when status is error.
metadataobjectNoOptional response metadata.

Offer object

FieldTypeRequiredDescription
idstringYesUnique offer identifier.
summarystringYesHuman-readable summary for the user.
detailsobjectNoStructured offer details (varies by provider).
expiresstring (date-time)NoWhen the offer expires.
bind_endpointstring (URI)NoURL for bind requests.
bind_requiresarrayNoFields required for binding.
terms_urlstring (URI)NoTerms and conditions URL.

Bind Request Schema

FieldTypeRequiredDescription
offer_idstringYesThe accepted offer's ID.
session_idstring (UUID)YesSession ID from the original intake.
bind_dataobjectYesUser-authorized PII data.
agentobjectYesAgent info with bind consent.
metadataobjectNoOptional metadata.

Common bind_data fields

FieldTypeDescription
emailstring (email)User's email address.
full_namestringUser's full name.
phonestringUser's phone number.
companystringCompany or organization name.
addressobjectAddress with street, city, state, postal_code, country.

Error Codes

CodeHTTP StatusDescription
INVALID_INPUT400Request body is malformed or missing required fields.
SCHEMA_MISMATCH400intake_data does not conform to the declared input_schema.
RATE_LIMITED429Too many requests. Retry after the specified period.
SERVICE_UNAVAILABLE503The intake service is temporarily unavailable.
OFFER_EXPIRED410The referenced offer has expired.
OFFER_NOT_FOUND404The referenced offer does not exist.
BIND_INCOMPLETE400bind_data is missing required fields.
INTERNAL_ERROR500An unexpected error occurred.
{
  "aip_version": "0.1.0",
  "session_id": "uuid-v4",
  "status": "error",
  "error": {
    "code": "SCHEMA_MISMATCH",
    "message": "Missing required field: age_range"
  }
}

Transport Requirements

Standard Categories

Categories follow the pattern {domain}/{type}:

CategoryDescriptionExample
health/assessmentHealth evaluations and screeningsMetabolic assessment
service/matchingService provider marketplacesFind a plumber
saas/onboardingSaaS trial and setupProject management trial
finance/quoteFinancial quotes and estimatesInsurance quote
tool/calculatorStateless calculationsBMI calculator
b2b/vendorB2B vendor evaluationCloud hosting proposal
education/courseEducational programsCurriculum recommendation

Providers MAY use custom categories following the same {domain}/{type} pattern.

Versioning

Security Considerations