For a business's own AI: put the business in the directory with its doors (MCP, A2A, OpenAPI, an API, UCP, ACP, a platform's door) and its facts (name, category, where, languages), and agree to the listing terms (/bot#terms). When its proof is not in place yet, the answer gives a challenge (a file or DNS record on its domain, its inbox manifest, a key's signature, or a code mailed to its domain) and the next call proves it. Mail, phone, forms and web pages are never doors. Free, and the order cannot be bought. Not listed: adult services, gambling, weapons, tobacco, cannabis and vaping, payday loans, bail bonds.
View input schema
{
"type": "object",
"properties": {
"agree": {
"const": true,
"description": "The business agrees to be listed by the network's published rules (GET /v1/ranking) and listing terms.",
"type": "boolean"
},
"alternate_names": {
"description": "Other names the business goes by; a name longer than the network keeps is dropped (the reference network keeps 60 characters and 4 words at most).",
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 5,
"type": "array"
},
"attributes": {
"additionalProperties": {
"anyOf": [
{
"type": "boolean"
},
{
"maxLength": 60,
"type": "string"
}
]
},
"description": "Keys of list_attributes.",
"propertyNames": {
"maxLength": 60,
"type": "string"
},
"type": "object"
},
"category": {
"description": "What the business is: one category, and at most two more.",
"properties": {
"alternates": {
"items": {
"maxLength": 80,
"type": "string"
},
"maxItems": 2,
"type": "array"
},
"primary": {
"description": "A place category id (GET /v1/categories?group=…) or a group slug.",
"maxLength": 80,
"type": "string"
}
},
"required": [
"primary"
],
"type": "object"
},
"claim_token": {
"description": "Given by a successful register_business: proof again for 90 days, for this listing only.",
"pattern": "^sdc_[A-Za-z0-9_-]{43}$",
"type": "string"
},
"currencies": {
"description": "ISO 4217.",
"items": {
"maxLength": 3,
"type": "string"
},
"maxItems": 5,
"type": "array"
},
"description": {
"description": "One line on what it does; the first line is at most 160.",
"maxLength": 500,
"minLength": 1,
"type": "string"
},
"domain": {
"description": "The business's own website domain. A business without a website is not supported yet.",
"maxLength": 253,
"minLength": 1,
"type": "string"
},
"doors": {
"items": {
"properties": {
"kinds": {
"description": "Of ask, quote, book, order: what it answers.",
"items": {
"maxLength": 20,
"type": "string"
},
"maxItems": 4,
"type": "array"
},
"protocol": {
"description": "What it speaks, for type \"other\": like beckn or graphql.",
"maxLength": 40,
"type": "string"
},
"rate_limit": {
"description": "Requests a day this door takes, 1 to 20; it only lowers the network's own.",
"type": "integer"
},
"terms_url": {
"maxLength": 2048,
"type": "string"
},
"type": {
"description": "inbox, mcp, a2a, openapi, api, ucp, acp, nlweb, webhook, other, or platform:<name>. Mail, phone, messaging, forms and web pages are human channels and never doors.",
"maxLength": 60,
"type": "string"
},
"url": {
"description": "https, with no user in it.",
"maxLength": 2048,
"type": "string"
}
},
"required": [
"type",
"url"
],
"type": "object"
},
"maxItems": 10,
"type": "array"
},
"hours": {
"description": "As a profile's hours: {\"timezone\": \"Europe/Paris\", \"weekly\": {\"tue\": [[\"09:00\", \"19:00\"]]}}.",
"properties": {
"closures": {
"items": {
"properties": {
"from": {
"maxLength": 10,
"type": "string"
},
"to": {
"maxLength": 10,
"type": "string"
}
},
"required": [
"from",
"to"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"timezone": {
"maxLength": 64,
"type": "string"
},
"weekly": {
"additionalProperties": {
"items": {
"items": {
"maxLength": 5,
"type": "string"
},
"type": "array"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"required": [
"timezone",
"weekly"
],
"type": "object"
},
"languages": {
"description": "Language tags, like pt or fr-CA.",
"items": {
"maxLength": 35,
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
},
"locale": {
"description": "The language to answer in.",
"maxLength": 35,
"type": "string"
},
"name": {
"description": "As the business writes it.",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"pay": {
"description": "Payment tokens of list_attributes.",
"items": {
"maxLength": 40,
"type": "string"
},
"maxItems": 30,
"type": "array"
},
"price_band": {
"description": "1 (cheapest) to 4.",
"type": "integer"
},
"proof": {
"properties": {
"challenge_id": {
"maxLength": 64,
"type": "string"
},
"code": {
"description": "code: the 8 digits sent to that address.",
"pattern": "^[0-9]{8}$",
"type": "string"
},
"email": {
"description": "code: an address at exactly the business's own domain (not a subdomain), typed by the owner; never a public mail or internet provider's domain.",
"maxLength": 254,
"type": "string"
},
"kid": {
"description": "key: the key that signed.",
"maxLength": 200,
"type": "string"
},
"method": {
"enum": [
"well_known",
"manifest",
"dns",
"key",
"code"
],
"type": "string"
},
"signature": {
"description": "key: base64url of the signature.",
"maxLength": 1024,
"type": "string"
}
},
"required": [
"method"
],
"type": "object"
},
"want_inbox": {
"type": "boolean"
},
"where": {
"description": "A storefront needs an address or geo, a service area its radius or countries, online its ships_to.",
"properties": {
"address": {
"properties": {
"country": {
"maxLength": 2,
"type": "string"
},
"locality": {
"maxLength": 100,
"type": "string"
},
"postal_code": {
"maxLength": 20,
"type": "string"
},
"region": {
"maxLength": 100,
"type": "string"
},
"street": {
"maxLength": 200,
"type": "string"
}
},
"type": "object"
},
"geo": {
"properties": {
"lat": {
"maximum": 90,
"minimum": -90,
"type": "number"
},
"lng": {
"maximum": 180,
"minimum": -180,
"type": "number"
}
},
"required": [
"lat",
"lng"
],
"type": "object"
},
"kind": {
"items": {
"enum": [
"storefront",
"service_area",
"online"
],
"type": "string"
},
"minItems": 1,
"type": "array"
},
"service_area": {
"properties": {
"countries": {
"description": "At most 50.",
"items": {
"maxLength": 2,
"type": "string"
},
"type": "array"
},
"radius_km": {
"description": "At most 300.",
"type": "number"
}
},
"type": "object"
},
"ships_to": {
"items": {
"maxLength": 2,
"type": "string"
},
"maxItems": 250,
"type": "array"
}
},
"required": [
"kind"
],
"type": "object"
}
},
"required": [
"domain",
"name",
"category",
"description",
"where",
"languages",
"agree"
]
}