{"ucp":{"version":"2026-04-08","services":{"dev.ucp.hospitality":{"rest":{"endpoint":"https://selfe.ai/api/registry/"},"a2a":{"endpoint":"https://selfe.ai/.well-known/agent-card.json"},"mcp":{"endpoint":"https://selfe.ai/mcp"}}},"capabilities":[{"name":"dev.ucp.shopping.catalog","version":"2026-04-08","invocations":[{"method":"POST","contentType":"application/json","requestSchema":{"type":"object","properties":{"query":{"type":"object","properties":{"text":{"type":"string","minLength":1,"description":"Natural-language query, e.g. \"boutique hotels in London with a spa\"."},"filter":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Optional dot-path field filters; each value is an array of strings (OR within a field), e.g. {\"tags\":[\"spa\"]}."}},"required":["text"],"additionalProperties":false},"federation":{"type":"string","enum":["auto","referrals","none"],"description":"Registry-to-registry federation mode (default auto)."},"pageSize":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of results to return."},"pageToken":{"type":"string","description":"Opaque cursor from a previous response, to fetch the next page."},"render":{"type":"object","properties":{"a2ui":{"type":"boolean","description":"Include an A2UI surface in the response."},"stream":{"type":"boolean","description":"Stream the response as it renders (SSE), instead of a single JSON body."},"catalogs":{"type":"array","items":{"type":"string"},"description":"A2UI catalog ids the caller can render."}},"additionalProperties":false,"description":"A2UI render negotiation. Set `a2ui:true` to also receive a renderable A2UI surface; list the A2UI catalog ids you support in `catalogs` (include \"https://selfe.ai/a2ui/catalog/v1\" for semantic molecules, otherwise a basic-atom fallback is emitted)."}},"required":["query"],"additionalProperties":false,"$schema":"https://json-schema.org/draft/2020-12/schema"},"example":{"query":{"text":"boutique hotels in London with a spa"},"pageSize":10},"responseType":"application/ai-registry+json"},{"method":"POST","contentType":"application/json","requestSchema":{"type":"object","properties":{"query":{"type":"object","properties":{"text":{"type":"string","minLength":1,"description":"Natural-language query, e.g. \"boutique hotels in London with a spa\"."},"filter":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Optional dot-path field filters; each value is an array of strings (OR within a field), e.g. {\"tags\":[\"spa\"]}."}},"required":["text"],"additionalProperties":false},"stay":{"type":"object","properties":{"checkIn":{"type":"string","minLength":1,"description":"Arrival date, ISO YYYY-MM-DD."},"checkOut":{"type":"string","minLength":1,"description":"Departure date, ISO YYYY-MM-DD."},"party":{"type":"object","properties":{"adults":{"type":"integer","exclusiveMinimum":0,"description":"Number of adults."},"children":{"type":"integer","minimum":0,"description":"Number of children."}},"required":["adults"],"additionalProperties":false}},"required":["checkIn","checkOut","party"],"additionalProperties":false,"description":"REQUIRED booking context — match grounds availability + price against it. Without a full stay the answer would be a guess, so all three fields are mandatory."},"federation":{"type":"string","enum":["auto","referrals","none"],"description":"Registry-to-registry federation mode (default auto)."},"pageSize":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of candidates to ground."},"pageToken":{"type":"string","description":"Opaque cursor from a previous response."},"render":{"type":"object","properties":{"a2ui":{"type":"boolean","description":"Include an A2UI surface in the response."},"stream":{"type":"boolean","description":"Stream the response as it renders (SSE), instead of a single JSON body."},"catalogs":{"type":"array","items":{"type":"string"},"description":"A2UI catalog ids the caller can render."}},"additionalProperties":false,"description":"A2UI render negotiation. Set `a2ui:true` to also receive a renderable A2UI surface; list the A2UI catalog ids you support in `catalogs` (include \"https://selfe.ai/a2ui/catalog/v1\" for semantic molecules, otherwise a basic-atom fallback is emitted)."}},"required":["query","stay"],"additionalProperties":false,"$schema":"https://json-schema.org/draft/2020-12/schema"},"example":{"query":{"text":"boutique hotels in Norwich"},"stay":{"checkIn":"2026-08-02","checkOut":"2026-08-04","party":{"adults":2}},"pageSize":10},"responseType":"application/ai-registry+json"},{"method":"POST","contentType":"application/json","requestSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The place name to resolve, e.g. \"The Pheasant Inn\"."},"website":{"type":"string","minLength":1,"description":"The place's website — the strongest identity signal."},"location":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"radiusKm":{"type":"number"}},"additionalProperties":false,"description":"Optional geo/city hint to disambiguate (boosts/filters, never brings in an unnamed place)."},"limit":{"type":"integer","minimum":1,"maximum":10,"description":"Maximum answers (capped by tier)."}},"additionalProperties":false,"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"required":["name"]},{"required":["website"]}]},"example":{"website":"https://the-pheasant.co.uk","location":{"city":"Keswick"}},"responseType":"application/ai-registry+json"}]},{"name":"dev.ucp.hospitality.venue","version":"2026-04-08"},{"name":"dev.ucp.shopping.checkout","version":"2026-04-08","invocations":[{"method":"POST","contentType":"application/json","requestSchema":{"type":"object","properties":{"event":{"type":"object","properties":{"name":{"type":"string","const":"submit_booking"},"context":{"type":"object","additionalProperties":{}}},"required":["name","context"],"additionalProperties":false,"description":"A raw A2UI event, posted verbatim from a rendered BookingForm."},"venueId":{"type":"string","description":"The venue to book (required, flat or in event.context)."},"venueName":{"type":"string"},"from":{"type":"string","description":"Arrival date, ISO YYYY-MM-DD."},"to":{"type":"string","description":"Departure date, ISO YYYY-MM-DD."},"partySize":{"type":"integer"},"ratePlan":{"type":"string","description":"The chosen rate/option id from the matched answer."},"optionId":{"type":"string","description":"Grounded option id from a prior match — required to reserve for real."},"hotelCode":{"type":"string","description":"Supplier hotel code from the grounded option (multi-property engines)."},"provider":{"type":"string","enum":["travelgate","liteapi","resnexus","glampmanager","apaleo"],"description":"The booking engine that produced the grounded option."},"price":{"type":"object","properties":{"net":{"type":"number"},"currency":{"type":"string"}},"required":["net","currency"],"additionalProperties":false,"description":"Agreed net price from the grounded option — the reserve is checked against it."},"mandate":{"type":"object","additionalProperties":{},"description":"A signed AP2 Cart Mandate authorising THIS booking, for a caller without a Selfe session (a foreign/aggregator agent). May instead be sent base64url-encoded in the X-UCP-Mandate header. It authorises the reservation only — payment is time-gated and mandated separately at capture. Must be signed by a Selfe-trusted issuer and bind the grounded option (venueId/optionId/dates) at or under its price ceiling."},"render":{"type":"object","properties":{"a2ui":{"type":"boolean"},"catalogs":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false,"description":"Submit a booking intent, flat or as a raw A2UI submit_booking event. venueId is required (flat or in event.context).","$schema":"https://json-schema.org/draft/2020-12/schema"},"example":{"event":{"name":"submit_booking","context":{"venueId":"venue-id","from":"2026-08-02","to":"2026-08-04","partySize":2}},"render":{"a2ui":true,"catalogs":["https://selfe.ai/a2ui/catalog/v1"]}},"responseType":"application/ai-registry+json"}]},{"name":"dev.ucp.hospitality.booking-terms","version":"2026-04-08","extends":"dev.ucp.shopping.checkout"},{"name":"dev.ucp.shopping.ap2_mandate","version":"2026-04-08"}],"payment_handlers":{"dev.ucp.shopping.ap2_mandate":{"status":"supported","mandates":["cart","payment"],"capture":"payment-mandate-at-capture"},"stripe":{"type":"native"}},"signing_keys":[{"kty":"EC","x":"PAUJB6xHVj7BH89RbhS6l7fBKRkjrCewJNMSiOcKoR8","y":"rfByk2k2qTLPoGF21FKzT8gm0KfymruwF-qj32fP2NE","crv":"P-256","alg":"ES256","kid":"did:web:selfe.ai#key-1","use":"sig"}]},"signature":"eyJhbGciOiJFUzI1NiIsImtpZCI6ImRpZDp3ZWI6c2VsZmUuYWkja2V5LTEifQ..OCbw3KfOq_v5Gssaa5Yiisd1D-UjLXG7KSePGidywCNa0QS7qFoHXkzuLUVZUnPnXwx19SIyDPCbWaV1N57LYA"}