{"contract_version": "1.0.0", "business": "both", "language": "de", "tools": [{"name": "coworking_confirm_booking", "title": "Coworking verbindlich buchen", "description": "Das eigene gepr\u00fcfte Coworking-Angebot verbindlich buchen. Teilweise verf\u00fcgbare Serien m\u00fcssen ausdr\u00fccklich best\u00e4tigt werden. Preise und Belegung werden erneut gepr\u00fcft. Wiederholungen erzeugen keine weiteren Miettage oder Best\u00e4tigungen.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "Kennung des zuvor vom Server vorbereiteten Buchungsangebots."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Nur beim Erstellen ausgegebener Zugriffsschl\u00fcssel des Angebots. Nicht ver\u00f6ffentlichen oder aus fremden Daten ableiten."}, "accept_privacy": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer den gezeigten Datenschutzbedingungen zugestimmt hat."}, "accept_terms": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer die gezeigten Nutzungsbedingungen und den Angebotspreis best\u00e4tigt hat."}, "accept_cancellation": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer die gezeigten Stornierungsbedingungen best\u00e4tigt hat."}, "confirm_partial_series": {"type": "boolean", "default": false, "description": "Bei einer verk\u00fcrzten Mietserie nur nach ausdr\u00fccklicher Zustimmung zu allen ausgelassenen Tagen true senden."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["quote_id", "quote_token", "accept_privacy", "accept_terms"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string", "const": "confirmed"}, "booking": {"type": "object"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "booking"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:book"]}], "de.dollea/operation": "coworking_confirm_booking"}}, {"name": "coworking_find_dates", "title": "Freie Coworking-Tage finden", "description": "Freie Miettage eines Workspaces pr\u00fcfen. Die Belegung von Gruppen und enthaltenen Arbeitspl\u00e4tzen wird gemeinsam ber\u00fccksichtigt. Es werden keine Daten anderer Mieter offengelegt.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Aktuelle numerische Workspace-Kennung aus coworking_search_workspaces."}, "from_date": {"type": "string", "format": "date", "description": "Erster lokaler Kalendertag in M\u00fcnchen, im Format JJJJ-MM-TT."}, "to_date": {"type": "string", "format": "date", "description": "Letzter lokaler Kalendertag des begrenzten Suchzeitraums, einschlie\u00dflich dieses Tages."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["workspace_id", "from_date"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "workspace_id": {"type": "integer", "minimum": 1}, "available_dates": {"type": "array", "items": {"type": "string", "format": "date"}}, "dates": {"type": "array", "items": {"type": "object", "properties": {"date": {"type": "string", "format": "date"}, "available": {"type": "boolean"}}, "required": ["date", "available"]}}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "workspace_id", "available_dates", "dates"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "coworking_availability"}}, {"name": "coworking_get_account", "title": "Coworking-Freigabe pr\u00fcfen", "description": "Den aktuellen Freigabestatus des eigenen Coworking-Kontos pr\u00fcfen. Die Antwort nennt Workspaces mit freigeschalteten Preisen und n\u00e4chste Schritte, ohne Preise anderer Nutzer offenzulegen.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["account:read"]}], "de.dollea/operation": "coworking_account"}}, {"name": "coworking_get_booking", "title": "Eigene Mietbuchung pr\u00fcfen", "description": "Eine eigene Coworking-Buchung und die tats\u00e4chlichen Entscheidungen \u00fcber \u00c4nderungsanfragen lesen. Fremde Kennungen erlauben keinen Zugriff.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Mietbuchung aus coworking_list_bookings."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_get_booking"}}, {"name": "coworking_get_invoice", "title": "Eigene Rechnung abrufen", "description": "Eine eigene Rechnung anhand ihrer Kennung abrufen. Eine fremde oder unbekannte Kennung wird als nicht verf\u00fcgbar behandelt.", "inputSchema": {"type": "object", "properties": {"invoice_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Rechnung aus coworking_list_invoices."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["invoice_id"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_get_invoice"}}, {"name": "coworking_get_price", "title": "Pers\u00f6nlichen Coworking-Preis pr\u00fcfen", "description": "Den pers\u00f6nlichen Mietpreis f\u00fcr konkrete Tage pr\u00fcfen. Aktuelle Wochenkonditionen, Account-Freigabe und Monatspauschalen werden ber\u00fccksichtigt. Eine Monatspauschale ist keine kostenlose Miete.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Aktuelle numerische Workspace-Kennung aus coworking_search_workspaces."}, "dates": {"type": "array", "items": {"type": "string", "format": "date"}, "minItems": 1, "maxItems": 180, "uniqueItems": true, "description": "Explizite lokale Miettage im Format JJJJ-MM-TT. Der Server pr\u00fcft jeden Tag und kennzeichnet Konflikte."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["workspace_id", "dates"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "workspace_id": {"type": "integer", "minimum": 1}, "dates": {"type": "array", "items": {"type": "string", "format": "date"}}, "rejected_dates": {"type": "array", "items": {"type": "string", "format": "date"}}, "partial_series": {"type": "boolean"}, "lines": {"type": "array", "items": {"type": "object", "properties": {"date": {"type": "string", "format": "date"}, "price": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}}, "required": ["date", "price"]}}, "total": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "additional_booking_total": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "monthly_agreement": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "billing_mode": {"type": "string", "enum": ["per_day", "monthly_agreement"]}, "existing_price_changes": {"type": "array", "items": {"type": "object"}}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "workspace_id", "dates", "rejected_dates", "partial_series", "lines", "total", "additional_booking_total", "monthly_agreement", "billing_mode", "existing_price_changes"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_price"}}, {"name": "coworking_get_quote", "title": "Coworking-Angebot pr\u00fcfen", "description": "Ein eigenes Coworking-Angebot samt g\u00fcltigen Tagen, Preisen und Bedingungen pr\u00fcfen. Das urspr\u00fcngliche Konto und der Zugriffsschl\u00fcssel sind erforderlich.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "Kennung des zuvor vom Server vorbereiteten Buchungsangebots."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Nur beim Erstellen ausgegebener Zugriffsschl\u00fcssel des Angebots. Nicht ver\u00f6ffentlichen oder aus fremden Daten ableiten."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["quote_id", "quote_token"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string"}, "expires_at": {"type": "string", "format": "date-time"}, "offer": {"type": "object"}, "requires_confirmation": {"type": "boolean"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "expires_at", "offer", "requires_confirmation"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_get_quote"}}, {"name": "coworking_list_bookings", "title": "Eigene Coworking-Buchungen lesen", "description": "Ausschlie\u00dflich Mietbuchungen des aktuell verbundenen Kontos mit Status und pers\u00f6nlichen Tagespreisen lesen.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Maximale Anzahl zur\u00fcckgegebener Ergebnisse innerhalb der ver\u00f6ffentlichten Grenze."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "description": "Ergebnisposition f\u00fcr die n\u00e4chste Seite; next_offset aus der vorherigen Antwort verwenden."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_list_bookings"}}, {"name": "coworking_list_invoices", "title": "Eigene Rechnungen lesen", "description": "Rechnungen des aktuell verbundenen Kontos mit Betr\u00e4gen, F\u00e4lligkeit und gesch\u00fctztem Download lesen. Keine Verwaltungsnotizen oder fremden Rechnungen ausgeben.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Maximale Anzahl zur\u00fcckgegebener Ergebnisse innerhalb der ver\u00f6ffentlichten Grenze."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "description": "Ergebnisposition f\u00fcr die n\u00e4chste Seite; next_offset aus der vorherigen Antwort verwenden."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "coworking_list_invoices"}}, {"name": "coworking_prepare_booking", "title": "Coworking-Buchung vorbereiten", "description": "Ein pers\u00f6nliches Mietangebot f\u00fcr ausgew\u00e4hlte oder wiederkehrende Tage erstellen. Konflikte werden ausdr\u00fccklich ausgewiesen. Die Vorbereitung bucht nichts. Monatspauschalen und zus\u00e4tzliche Tagesgeb\u00fchren getrennt darstellen.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Aktuelle numerische Workspace-Kennung aus coworking_search_workspaces."}, "dates": {"type": "array", "items": {"type": "string", "format": "date"}, "minItems": 1, "maxItems": 180, "uniqueItems": true, "description": "Explizite lokale Miettage im Format JJJJ-MM-TT. Der Server pr\u00fcft jeden Tag und kennzeichnet Konflikte."}, "recurrence": {"type": "object", "properties": {"rule": {"type": "string", "enum": ["weekly", "monthly"]}, "until": {"type": "string", "format": "date"}}, "required": ["rule", "until"], "additionalProperties": false, "description": "Optionale w\u00f6chentliche oder monatliche Wiederholung der ausdr\u00fccklich gew\u00e4hlten Tage bis zum lokalen Enddatum."}, "notes": {"type": "string", "maxLength": 2000, "description": "Optionaler Hinweis des buchenden Nutzers, maximal 2000 Zeichen."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["workspace_id", "dates"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string"}, "expires_at": {"type": "string", "format": "date-time"}, "offer": {"type": "object"}, "requires_confirmation": {"type": "boolean"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "expires_at", "offer", "requires_confirmation"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:book"]}], "de.dollea/operation": "coworking_prepare_booking"}}, {"name": "coworking_request_cancellation", "title": "Coworking-Stornierung anfragen", "description": "Eine Stornierung der eigenen Mietbuchung anfragen. Nur eine dauerhafte Anfrage wird angelegt und benachrichtigt; Wiederholungen geben dieselbe Anfrage zur\u00fcck.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Mietbuchung aus coworking_list_bookings."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "reason": {"type": "string", "minLength": 1, "maxLength": 2000, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_id", "submission_key", "reason"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:manage"]}], "de.dollea/operation": "coworking_request_cancellation"}}, {"name": "coworking_request_change", "title": "Coworking-\u00c4nderung anfragen", "description": "Eine alternative Mietbuchung f\u00fcr das eigene Konto anfragen. Belegung und laufende Anfragen werden gepr\u00fcft. Die \u00c4nderung bleibt bis zur bestehenden Genehmigung offen.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Mietbuchung aus coworking_list_bookings."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "new_date": {"type": "string", "format": "date", "description": "Gew\u00fcnschter alternativer Miettag im Format JJJJ-MM-TT."}, "reason": {"type": "string", "minLength": 1, "maxLength": 2000, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_id", "submission_key", "new_date", "reason"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["coworking:manage"]}], "de.dollea/operation": "coworking_request_change"}}, {"name": "coworking_search_workspaces", "title": "Coworking-Arbeitspl\u00e4tze finden", "description": "Beauty-Coworking-Ressourcen in M\u00fcnchen nach T\u00e4tigkeit, Ausstattung, Personenzahl und Datum finden. Gruppen teilen die Belegung mit ihren Einzelpl\u00e4tzen. Pers\u00f6nliche Mietpreise erfordern eine autorisierte Preispr\u00fcfung.", "inputSchema": {"type": "object", "properties": {"query": {"type": "string", "maxLength": 500, "default": "", "description": "Kurze Suchbegriffe zur gew\u00fcnschten Behandlung, T\u00e4tigkeit oder Ausstattung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Maximale Anzahl zur\u00fcckgegebener Ergebnisse innerhalb der ver\u00f6ffentlichten Grenze."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Ergebnisposition f\u00fcr die n\u00e4chste Seite; next_offset aus der vorherigen Antwort verwenden."}, "equipment_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "uniqueItems": true, "maxItems": 50, "description": "Alle erforderlichen Ausstattungskennungen m\u00fcssen am Workspace vorhanden sein."}, "min_persons": {"type": "integer", "minimum": 1, "maximum": 1000, "description": "Ben\u00f6tigte Mindestkapazit\u00e4t des Workspaces."}, "groups_only": {"type": "boolean", "description": "Nur kombinierte Gruppen-Workspaces anzeigen."}, "supported_uses": {"type": "array", "items": {"type": "string", "enum": ["cosmetics", "body_treatments", "pmu", "lashes", "brows", "manicure", "nail_design", "pedicure", "training"]}, "uniqueItems": true, "description": "Gew\u00fcnschte T\u00e4tigkeiten als strukturierte Kennungen, beispielsweise manicure, lashes oder cosmetics."}, "available_on": {"type": "string", "format": "date", "description": "Nur Ressourcen mit tats\u00e4chlich freier Kapazit\u00e4t an diesem lokalen Datum anzeigen."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "items": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "string", "pattern": "^(salon|coworking):[1-9][0-9]*$"}, "name": {"type": "string"}, "description": {"type": "string"}, "price": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "url": {"type": "string", "format": "uri"}}, "required": ["id", "name", "description", "price", "url"]}}, "total": {"type": "integer", "minimum": 0}, "offset": {"type": "integer", "minimum": 0}, "limit": {"type": "integer", "minimum": 1}, "next_offset": {"type": ["integer", "null"]}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "items", "total", "offset", "limit", "next_offset"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "coworking_catalog"}}, {"name": "coworking_staff_availability", "title": "Eigene Arbeitszeiten lesen", "description": "Die eigenen Wochenzeiten, besonderen Tage und Sperrzeiten lesen. Kundentermine und fremde Mitarbeiterdaten werden nicht ausgegeben.", "inputSchema": {"type": "object", "properties": {"from_date": {"type": "string", "format": "date", "description": "Erster lokaler Kalendertag in M\u00fcnchen, im Format JJJJ-MM-TT."}, "to_date": {"type": "string", "format": "date", "description": "Letzter lokaler Kalendertag des begrenzten Suchzeitraums, einschlie\u00dflich dieses Tages."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["from_date"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:read"]}], "de.dollea/operation": "coworking_staff_availability"}}, {"name": "coworking_staff_create_block", "title": "Eigene Sperrzeit anlegen", "description": "F\u00fcr den verbundenen Mitarbeiter eine Sperrzeit anlegen. Bestehende Portalberechtigungen und Kategoriezuordnungen gelten. Dieselbe \u00dcbermittlungskennung erzeugt keine zweite Sperre.", "inputSchema": {"type": "object", "properties": {"start_at": {"type": "string", "format": "date-time", "description": "Konkreter Terminbeginn als ISO-Datum mit Zeitzonenoffset. Relative Zeiten zuerst anhand der mitgelieferten M\u00fcnchner Ortszeit aufl\u00f6sen."}, "end_at": {"type": "string", "format": "date-time", "description": "Ende der eigenen Verf\u00fcgbarkeit oder Sperrzeit als ISO-Datum mit Zeitzonenoffset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "service_category_id": {"type": "integer", "minimum": 1, "description": "Optionale eigene Leistungskategorie; ohne Kategorie gilt die Sperre f\u00fcr alle eigenen Leistungen."}, "reason": {"type": "string", "maxLength": 200, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["start_at", "end_at", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:write"]}], "de.dollea/operation": "coworking_staff_create_block"}}, {"name": "coworking_staff_create_special_day", "title": "Eigene Zusatzverf\u00fcgbarkeit anlegen", "description": "F\u00fcr den verbundenen Mitarbeiter einen besonderen verf\u00fcgbaren Tag anlegen. Start und Ende m\u00fcssen am selben lokalen Tag liegen.", "inputSchema": {"type": "object", "properties": {"start_at": {"type": "string", "format": "date-time", "description": "Konkreter Terminbeginn als ISO-Datum mit Zeitzonenoffset. Relative Zeiten zuerst anhand der mitgelieferten M\u00fcnchner Ortszeit aufl\u00f6sen."}, "end_at": {"type": "string", "format": "date-time", "description": "Ende der eigenen Verf\u00fcgbarkeit oder Sperrzeit als ISO-Datum mit Zeitzonenoffset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["start_at", "end_at", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:write"]}], "de.dollea/operation": "coworking_staff_create_special_day"}}, {"name": "coworking_staff_delete_block", "title": "Eigene Sperrzeit entfernen", "description": "Eine eigene Sperrzeit entfernen. Die Antwort einer wiederholten \u00dcbermittlung bleibt auch nach dem L\u00f6schen abrufbar.", "inputSchema": {"type": "object", "properties": {"block_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Sperrzeit aus coworking_staff_availability."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["block_id", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:write"]}], "de.dollea/operation": "coworking_staff_delete_block"}}, {"name": "coworking_staff_delete_special_day", "title": "Eigene Zusatzverf\u00fcgbarkeit entfernen", "description": "Einen eigenen besonderen verf\u00fcgbaren Tag entfernen. Andere Mitarbeiterprofile bleiben au\u00dferhalb dieser Berechtigung.", "inputSchema": {"type": "object", "properties": {"special_day_id": {"type": "integer", "minimum": 1, "description": "Kennung eines eigenen besonderen Tages aus coworking_staff_availability."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["special_day_id", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:write"]}], "de.dollea/operation": "coworking_staff_delete_special_day"}}, {"name": "coworking_staff_update_block", "title": "Eigene Sperrzeit \u00e4ndern", "description": "Eine eigene Sperrzeit mit vollst\u00e4ndigen neuen Zeitgrenzen \u00e4ndern. Fremde Mitarbeiter k\u00f6nnen nicht ausgew\u00e4hlt werden.", "inputSchema": {"type": "object", "properties": {"block_id": {"type": "integer", "minimum": 1, "description": "Kennung einer eigenen Sperrzeit aus coworking_staff_availability."}, "start_at": {"type": "string", "format": "date-time", "description": "Konkreter Terminbeginn als ISO-Datum mit Zeitzonenoffset. Relative Zeiten zuerst anhand der mitgelieferten M\u00fcnchner Ortszeit aufl\u00f6sen."}, "end_at": {"type": "string", "format": "date-time", "description": "Ende der eigenen Verf\u00fcgbarkeit oder Sperrzeit als ISO-Datum mit Zeitzonenoffset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "service_category_id": {"type": ["integer", "null"], "minimum": 1, "description": "Optionale eigene Leistungskategorie; ohne Kategorie gilt die Sperre f\u00fcr alle eigenen Leistungen."}, "reason": {"type": "string", "maxLength": 200, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["block_id", "start_at", "end_at", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["staff:write"]}], "de.dollea/operation": "coworking_staff_update_block"}}, {"name": "dollea_get_profile", "title": "Verbundenes Konto erkennen", "description": "Genau das durch die aktuellen Zugangsdaten verbundene Konto erkennen. Die best\u00e4ndige Kennung bleibt bei \u00c4nderungen an E-Mail, Namen oder Zugangsdaten erhalten.", "inputSchema": {"type": "object", "properties": {}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"id": {"type": "string", "minLength": 1, "pattern": "\\S"}, "name": {"type": "string"}, "email": {"type": "string"}, "nickname": {"type": "string"}}, "required": ["id"], "additionalProperties": false}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["account:read"]}], "de.dollea/operation": "get_profile", "openai/profile": true}}, {"name": "get_product", "title": "UCP-Produktdetails lesen", "description": "Die vollst\u00e4ndigen aktuellen Daten einer bepreisten Ressource abrufen. Mitarbeiterpr\u00e4ferenzen und Miettage werden separat im Buchungsangebot gepr\u00fcft.", "inputSchema": {"type": "object", "properties": {"meta": {"type": "object", "properties": {"ucp-agent": {"type": "object", "properties": {"profile": {"type": "string", "format": "uri", "maxLength": 2048}}, "required": ["profile"], "additionalProperties": false}}, "required": ["ucp-agent"], "additionalProperties": false}, "catalog": {"$ref": "#/$defs/r_42221a9e0976392592e0"}}, "required": ["meta", "catalog"], "additionalProperties": false, "$defs": {"r_42221a9e0976392592e0": {"type": "object", "description": "Request body for single-product retrieval. Supports interactive variant narrowing via selected and preferences.", "required": ["id"], "properties": {"id": {"type": "string", "description": "Product or variant identifier. Implementations MUST support product ID and variant ID."}, "selected": {"type": "array", "items": {"$ref": "#/$defs/r_7013e6ffdb05f46d5980"}, "description": "Partial or full option selections for interactive variant narrowing. When provided, response option values include availability signals (available, exists) relative to these selections."}, "preferences": {"type": "array", "items": {"type": "string"}, "description": "Option names in relaxation priority order. When no exact variant matches all selections, the server drops options from the end of this list first. E.g., ['Color', 'Size'] keeps Color and relaxes Size."}, "filters": {"$ref": "#/$defs/r_28e4d5c6ab7e15f55c34", "description": "Filter criteria to narrow returned variants. All specified filters combine with AND logic."}, "context": {"$ref": "#/$defs/r_3b843cbd4c36e56119c6"}, "signals": {"$ref": "#/$defs/r_78ecafc6e2820de61415"}, "attribution": {"$ref": "#/$defs/r_7daee799628e45737af8"}}}, "r_7013e6ffdb05f46d5980": {"title": "Selected Option", "description": "A specific option selection on a variant (e.g., Size: Large).", "type": "object", "required": ["name", "label"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size')."}, "id": {"type": "string", "description": "Optional option value identifier from option_value.id. When present, the server SHOULD use it for matching; name and label remain required for display."}, "label": {"type": "string", "description": "Selected option label (e.g., 'Large')."}}}, "r_28e4d5c6ab7e15f55c34": {"title": "Search Filters", "description": "Filter criteria to narrow search results. All specified filters combine with AND logic.", "type": "object", "properties": {"categories": {"type": "array", "items": {"type": "string"}, "description": "Filter by product categories (OR logic \u2014 matches products in any listed categories). Values match against the value field in product category entries. Valid values can be discovered from the categories field in search results, merchant documentation, or standard taxonomies that businesses may align with."}, "price": {"$ref": "#/$defs/r_c28f892525d94e0c3751"}}, "additionalProperties": true}, "r_c28f892525d94e0c3751": {"title": "Price Filter", "description": "Price range filter denominated in context.currency. When context.currency matches the presentment currency, businesses apply the filter directly. When it differs, businesses SHOULD convert filter values to the presentment currency before applying; if conversion is not supported, businesses MAY ignore the filter and SHOULD indicate this via a message. When context.currency is absent, filter denomination is ambiguous and businesses MAY ignore it.", "type": "object", "properties": {"min": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Minimum price in ISO 4217 minor units."}, "max": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Maximum price in ISO 4217 minor units."}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_3b843cbd4c36e56119c6": {"title": "Context", "description": "Provisional buyer signals for relevance and localization\u2014not authoritative data. Businesses SHOULD use these values when verified inputs (e.g., shipping address) are absent, and MAY ignore or down-rank them if inconsistent with higher-confidence signals (authenticated account, risk detection) or regulatory constraints (export controls). Eligibility and policy enforcement MUST occur at checkout time using binding transaction data. Context SHOULD be non-identifying and can be disclosed progressively\u2014coarse signals early, finer resolution as the session progresses. Higher-resolution data (shipping address, billing address) supersedes context.", "type": "object", "additionalProperties": true, "allOf": [{"$ref": "#/$defs/r_042ca95cba1774389c88"}, {"type": "object", "additionalProperties": true, "properties": {"location": {"type": "string", "description": "Stable, opaque identifier for a Location in the Business's namespace. This provisional, non-binding hint is distinct from the Buyer's locality. The operation specification or an active capability/extension defines its effects. A common example in retail shopping is the default home store ID selected and saved by the user when purchasing groceries."}, "intent": {"type": "string", "description": "Background context describing buyer's intent (e.g., 'looking for a gift under $50', 'need something durable for outdoor use'). Informs relevance, recommendations, and personalization."}, "language": {"type": "string", "description": "Preferred language for content. Use IETF BCP 47 language tags (e.g., 'en', 'fr-CA', 'zh-Hans'). For REST, equivalent to Accept-Language header\u2014platforms SHOULD fall back to Accept-Language when this field is absent; when provided, overrides Accept-Language. Businesses MAY return content in a different language if unavailable."}, "currency": {"type": "string", "description": "Preferred currency (ISO 4217, e.g., 'EUR', 'USD'). Businesses determine presentment currency from context and authoritative signals; this hint MAY inform selection in multi-currency markets. Also serves as the denomination for price filter values \u2014 platforms SHOULD include this field when sending price filters. Response prices include explicit currency confirming the resolution."}, "eligibility": {"type": "array", "description": "Buyer claims about eligible benefits such as loyalty membership, payment instrument perks, and similar. Recognized claims MAY inform the Business response (e.g., member-only product availability, adjusted pricing in catalog, provisional discounts at cart or checkout). Businesses MUST ignore unrecognized values without error. Values MUST use reverse-domain naming (e.g., 'com.example.loyalty_gold', 'org.school.student') and MUST be non-identifying.", "uniqueItems": true, "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}}, "payment": {"type": "array", "description": "Buyer-preferred payment handlers in priority order (most preferred first). Each entry names a handler advertised in the Business profile's `ucp.payment_handlers`, optionally narrowed to preferred instrument types. The Business SHOULD use it to preselect or prioritize the handler (and type, when given) and MAY ignore unavailable or ineligible entries; unrecognized values MUST be ignored without error.", "items": {"type": "object", "required": ["handler"], "properties": {"handler": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Handler registry key advertised in the Business profile's `ucp.payment_handlers`."}, "types": {"type": "array", "description": "Optional preferred instrument types for this handler, in priority order, aligned with the handler's advertised `payment_instrument.type` values (for example `card` or `bank`). Unrecognized values MUST be ignored.", "items": {"type": "string"}}}}}}}]}, "r_042ca95cba1774389c88": {"title": "Locality", "description": "A coarse geographic location \u2014 country, region, and postal code. A lightweight alternative to a full postal address.", "type": "object", "additionalProperties": true, "properties": {"address_country": {"type": "string", "description": "The country, as a 2-letter ISO 3166-1 alpha-2 code (e.g. \"US\"). A 3-letter alpha-3 code or full country name MAY also be used."}, "address_region": {"type": "string", "description": "The first-level administrative region within the country (e.g. a state or province such as California)."}, "postal_code": {"type": "string", "description": "The postal code (e.g. \"94043\")."}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_78ecafc6e2820de61415": {"title": "Signals", "description": "Environment data provided by the platform to support authorization and abuse prevention. Values MUST NOT be buyer-asserted claims \u2014 platforms provide signals based on direct observation or independently verifiable third-party attestations. All signal keys MUST use reverse-domain naming to ensure provenance and prevent collisions when multiple extensions contribute to the shared namespace.", "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Reverse-domain identifier (e.g., dev.ucp.buyer_ip, com.example.device_id)."}, "properties": {"dev.ucp.buyer_ip": {"type": "string", "description": "Client's IP address (IPv4 or IPv6)."}, "dev.ucp.user_agent": {"type": "string", "description": "Client's HTTP User-Agent header or equivalent."}}, "additionalProperties": true}, "r_7daee799628e45737af8": {"title": "Attribution", "description": "Platform-emitted referral and conversion-event context \u2014 campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows.", "type": "object", "additionalProperties": {"type": "string", "description": "URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string."}}}}, "outputSchema": {"type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "$ref": "#/$defs/r_09ba4c3bc2c92bd6258d", "$defs": {"r_09ba4c3bc2c92bd6258d": {"type": "object", "required": ["ucp", "product"], "properties": {"ucp": {"$ref": "#/$defs/r_31dbdfed656c20d0289d"}, "product": {"$ref": "#/$defs/r_bac63a2a2a53b4bd016d", "description": "The requested product with full detail. Singular \u2014 this is a single-resource operation."}, "actions": {"$ref": "#/$defs/r_9d983cfdd670073bf08f", "description": "Outstanding extension-defined Actions for this product response.", "ucp_request": "omit"}, "messages": {"type": "array", "items": {"$ref": "#/$defs/r_3071c80f2258926c6eb8"}, "description": "Warnings or informational messages about the product (e.g., price recently changed, limited availability)."}, "policies": {"type": "array", "items": {"$ref": "#/$defs/r_a351b7a88b54cccfabbc"}, "description": "Policies (e.g., return/refund terms) that apply to this product. `applies_to` targets are relative to the response root; when absent or empty, refer to the URLs in `links[]`."}}}, "r_31dbdfed656c20d0289d": {"title": "UCP Catalog Response Schema", "description": "UCP metadata for catalog responses.", "allOf": [{"$ref": "#/$defs/r_7116a3b12e850856e319"}, {"properties": {"capabilities": {"additionalProperties": {"items": {"$ref": "#/$defs/r_258cad0ffb5ad23c68a4"}}}}}]}, "r_7116a3b12e850856e319": {"description": "Base UCP metadata with shared properties for all schema types.", "type": "object", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831"}, "map_order": {"$ref": "#/$defs/r_da7e6cd3fc02ee7a6bdd", "description": "Preferred key-traversal order for sibling registry fields inside the root `ucp` envelope (`services`, `capabilities`, and `payment_handlers`).", "ucp_request": "omit"}, "status": {"type": "string", "enum": ["success", "error"], "default": "success", "description": "Application-level status of the UCP operation."}, "services": {"type": "object", "description": "Service registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_a2d0c5c2aaa51537d5cd"}}}, "capabilities": {"type": "object", "description": "Capability registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}}}, "payment_handlers": {"type": "object", "description": "Payment handler registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_251976d6bc875de7dba3"}}}}}, "r_6ca21bff46d30c1de831": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Version identifier in YYYY-MM-DD format."}, "r_da7e6cd3fc02ee7a6bdd": {"type": "object", "description": "Preferred key order for map-valued fields in the scope annotated by the containing `ucp` member. Each property names a target map, and its array lists target keys in preferred order. Lists may be partial and are not allowlists.", "additionalProperties": {"type": "array", "items": {"type": "string"}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_a2d0c5c2aaa51537d5cd": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["transport"], "properties": {"transport": {"type": "string", "enum": ["rest", "mcp", "a2a", "embedded"], "description": "Transport protocol for this service binding."}, "endpoint": {"type": "string", "format": "uri", "description": "Endpoint URL for this transport binding."}}}]}, "r_a2eb0eadda944d606d8d": {"type": "object", "description": "Shared foundation for all UCP entities.", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831", "description": "Entity version in YYYY-MM-DD format."}, "spec": {"type": "string", "format": "uri", "description": "URL to human-readable specification document."}, "schema": {"type": "string", "format": "uri", "description": "URL to JSON Schema defining this entity's structure and payloads."}, "id": {"type": "string", "description": "Unique identifier for this entity instance. Used to disambiguate when multiple instances exist."}, "config": {"type": "object", "description": "Entity-specific configuration. Structure defined by each entity's schema.", "additionalProperties": true}}}, "r_ddfcd1f84f7738d6744b": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "properties": {"extends": {"oneOf": [{"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, {"type": "array", "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "minItems": 1}], "description": "Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions."}}}]}, "r_251976d6bc875de7dba3": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["id"]}, {"type": "object", "properties": {"available_instruments": {"type": "array", "items": {"$ref": "#/$defs/r_2b8f633efdee89ee73e5"}, "description": "Instrument types this handler supports, with optional constraints. When absent, every instrument should be considered available.", "minItems": 1}}}]}, "r_2b8f633efdee89ee73e5": {"title": "Available Payment Instrument", "description": "An instrument type available from a payment handler with optional constraints.", "type": "object", "required": ["type"], "properties": {"type": {"type": "string", "description": "The instrument type identifier (e.g., 'card', 'gift_card'). References an instrument schema's type constant."}, "constraints": {"$ref": "#/$defs/r_df7cea4ad60ad14269a2", "description": "A Constraint Expression describing the instrument this entry makes available. Keys in `properties` name members of the `constraint_target` declared by the instrument schema for this `type`. Requirements on submitted request data belong in `ucp.request_constraints` instead."}}}, "r_df7cea4ad60ad14269a2": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_8e969bc3c31dfc5e8f34": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_01121ad4caedb74fd9d5": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}, "r_258cad0ffb5ad23c68a4": {"title": "Capability (Response Schema)", "description": "Capability reference in responses. Only name/version required to confirm active capabilities.", "allOf": [{"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}]}, "r_bac63a2a2a53b4bd016d": {"description": "A product in a get_product response, extended with effective selections and availability signals on option values.", "type": "object", "allOf": [{"$ref": "#/$defs/r_032acacb42b993f8b0e3"}], "properties": {"selected": {"type": "array", "items": {"$ref": "#/$defs/r_7013e6ffdb05f46d5980"}, "description": "Effective option selections that anchor the featured variant and availability signals. Required when the product has configurable options; may be empty or omitted for products with no option axes."}, "options": {"type": "array", "items": {"type": "object", "required": ["name", "values"], "properties": {"name": {"type": "string"}, "values": {"type": "array", "items": {"$ref": "#/$defs/r_82e357f65836f16e2c74"}, "minItems": 1}}}, "description": "Product options with availability signals relative to the effective selections."}}}, "r_032acacb42b993f8b0e3": {"title": "Product", "description": "A product in the catalog with variants and options.", "type": "object", "required": ["id", "title", "description", "price_range", "variants"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this product."}, "handle": {"type": "string", "description": "URL-safe slug for SEO-friendly URLs (e.g., 'blue-runner-pro'). Use id for stable API references."}, "title": {"type": "string", "description": "Product title."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Product description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical product page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Product categories with optional taxonomy identifiers."}, "price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "Price range across all variants."}, "list_price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "List price range before discounts (for strikethrough display)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Product media (images, videos, 3D models). First item is the featured media for listings."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7819ee2b082046b3267f"}, "description": "Product options (Size, Color, etc.)."}, "variants": {"type": "array", "items": {"$ref": "#/$defs/r_bfcb08b4789ccef0057d"}, "minItems": 1, "description": "Purchasable variants of this product. First item is the featured variant for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Aggregate product rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Product tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard product model."}}}, "r_f0d6c56eaf863a32e380": {"title": "Description", "description": "Description content in one or more formats. At least one format must be provided.", "type": "object", "properties": {"plain": {"type": "string", "description": "Plain text content."}, "html": {"type": "string", "description": "HTML-formatted content. Security: Platforms MUST sanitize before rendering\u2014strip scripts, event handlers, and untrusted elements. Treat all rich text as untrusted input."}, "markdown": {"type": "string", "description": "Markdown-formatted content."}}, "minProperties": 1}, "r_1d1541c3d7066157e070": {"title": "Category", "description": "A product category with optional taxonomy identifier.", "type": "object", "required": ["value"], "properties": {"value": {"type": "string", "description": "Category value or path (e.g., 'Apparel > Shirts', '1604')."}, "taxonomy": {"type": "string", "description": "Source taxonomy. Well-known values: `google_product_category`, `shopify`, `merchant`."}}}, "r_09586324eb40756c3c6f": {"title": "Price Range", "description": "A price range representing minimum and maximum values (e.g., a common example in retail shopping is when prices vary across product variants).", "type": "object", "required": ["min", "max"], "properties": {"min": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Minimum price in the range."}, "max": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Maximum price in the range."}}}, "r_580318bc70fdf8477779": {"title": "Price", "description": "Price with explicit currency.", "type": "object", "required": ["amount", "currency"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Amount in ISO 4217 minor units. Use 0 for free items."}, "currency": {"type": "string", "description": "ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP').", "pattern": "^[A-Z]{3}$"}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_fad91f406aba9b92dbb0": {"title": "Media", "description": "Media item (image, video, etc.).", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Media type. Well-known values: `image`, `video`, `model_3d`."}, "url": {"type": "string", "format": "uri", "description": "URL to the media resource."}, "alt_text": {"type": "string", "description": "Accessibility text describing the media."}, "width": {"type": "integer", "minimum": 1, "description": "Width in pixels (for images/video)."}, "height": {"type": "integer", "minimum": 1, "description": "Height in pixels (for images/video)."}}}, "r_7819ee2b082046b3267f": {"title": "Product Option", "description": "A product option such as size, color, or material.", "type": "object", "required": ["name", "values"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size', 'Color')."}, "values": {"type": "array", "items": {"$ref": "#/$defs/r_048eadb025b666eec338"}, "minItems": 1, "description": "Available values for this option."}}}, "r_048eadb025b666eec338": {"title": "Option Value", "description": "A selectable value for a product option.", "type": "object", "required": ["label"], "properties": {"id": {"type": "string", "description": "Optional server-assigned identifier for this option value. When present in a selected_option, the server SHOULD use it for matching instead of label."}, "label": {"type": "string", "description": "Display text for this option value (e.g., 'Small', 'Blue')."}}}, "r_bfcb08b4789ccef0057d": {"title": "Variant", "description": "A purchasable variant of a product with specific option selections.", "type": "object", "required": ["id", "title", "description", "price"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this variant. Used as item.id in checkout."}, "sku": {"type": "string", "description": "Business-assigned identifier for inventory and fulfillment."}, "barcodes": {"type": "array", "items": {"type": "object", "required": ["type", "value"], "properties": {"type": {"type": "string", "description": "Barcode standard. Well-known values: UPC, EAN, ISBN, GTIN, JAN."}, "value": {"type": "string", "description": "Barcode value."}}}, "description": "Industry-standard product identifiers for cross-reference and correlation."}, "handle": {"type": "string", "description": "URL-safe variant handle/slug."}, "title": {"type": "string", "description": "Variant display title (e.g., 'Blue / Large')."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Variant description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical variant page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Variant categories with optional taxonomy identifiers."}, "price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Current selling price. Price is the amount per one whole `quantity_unit.unit` (for example, per lb or per hour); when `quantity_unit` is absent, it is per `each`. Line total is `price \u00d7 quantity \u00d7 10^-scale`, computed and rounded once by the Business; `totals` remain authoritative."}, "quantity_unit": {"$ref": "#/$defs/r_0d55f12cd1240424e2a9", "description": "Sale basis this variant's `quantity` is denominated in. The default sale basis is `each`, whose machine identity is (`C62`, 0); `C62` is the UN/CEFACT Rec20 code for one/each. An absent catalog descriptor encodes that default. An `increment` advertises the ordering granularity in steps (for example, `scale` 2 with `increment` 25 sells in 0.25-unit multiples)."}, "list_price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "List price before discounts (for strikethrough display)."}, "unit_price": {"$ref": "#/$defs/r_e00c60be8af44c2409fd", "description": "Price per standard unit of measurement, for shelf-style comparison display. MAY be omitted when unit pricing does not apply."}, "availability": {"$ref": "#/$defs/r_711f2de553f2bc08d5e4", "description": "Variant availability for purchase."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7013e6ffdb05f46d5980"}, "description": "Option values that define this variant (e.g., Color: Blue, Size: Large)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Variant media (images, videos, 3D models). First item is the featured media for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Variant rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Variant tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard variant model."}, "seller": {"type": "object", "description": "Optional seller context for this variant.", "properties": {"name": {"type": "string", "description": "Seller display name."}, "links": {"type": "array", "items": {"$ref": "#/$defs/r_78eb2bf7d8f853718428"}, "description": "Seller policy and information links."}}}}}, "r_0d55f12cd1240424e2a9": {"title": "Quantity Unit", "description": "Sale-basis descriptor for quantities: the shared unit descriptor plus the Business's ordering policy. Its unit-descriptor machine identity remains (`unit`, effective `scale`); `display_text` and `increment` are excluded from identity and mismatch comparison.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "properties": {"increment": {"type": "integer", "minimum": 1, "default": 1, "description": "Ordering granularity, denominated in steps: the Business sells this item in integer multiples of `increment` steps. Its effective value is the provided value or 1. Advisory merchandising policy, not a representational bound: Platform-authored quantities SHOULD be integer multiples of the effective increment; the Business MAY accept, revise, or reject an off-increment request with a recoverable business outcome and MUST NOT silently reinterpret it. Business-authored quantities (checkout revisions, fulfillment events, adjustments) are bounded only by `scale`."}}}]}, "r_5c66eb03f4d3021766c4": {"title": "Unit", "description": "A reusable unit descriptor for quantities and measures. Its unit-descriptor machine identity is (`unit`, effective `scale`), where effective `scale` is the provided `scale` or 0; `display_text` is excluded.", "type": "object", "required": ["unit", "display_text"], "properties": {"unit": {"type": "string", "description": "Stable machine identifier. The Business SHOULD use the exact UN/CEFACT Rec20 Common Code when one accurately identifies the unit. Otherwise, the Business MAY use a custom unit identifier and MUST use it consistently for the same unit. The Platform MUST treat an unrecognized identifier as opaque."}, "scale": {"type": "integer", "minimum": 0, "maximum": 15, "default": 0, "description": "One step equals `10^-scale` of `unit`. When `unit` is `C62`, `scale`, if present, MUST be 0. The maximum of 15 is derived from the interoperable integer range: at scale 16 a single whole unit (10^16 steps) is no longer representable, so larger scales cannot denominate one unit of their own basis. Businesses needing finer granularity use a smaller unit."}, "display_text": {"type": "string", "description": "Required printable unit label provided by the Business. The Platform MUST use it when it does not recognize `unit`; for a recognized UN/CEFACT Rec 20 Common Code, the Platform MAY substitute its own localized label. It does not participate in unit identity or mismatch comparison."}}, "allOf": [{"if": {"properties": {"unit": {"const": "C62"}}, "required": ["unit"]}, "then": {"properties": {"scale": {"const": 0}}}}]}, "r_e00c60be8af44c2409fd": {"title": "Unit Price", "description": "Price per standard unit of measurement. MAY be omitted when unit pricing does not apply. `unit_price.currency` MUST equal `price.currency`; the comparator MUST NOT perform currency conversion. `measure.unit` and `reference.unit` MUST be identical; cross-unit conversion is not permitted. Their scales MAY differ; each value represents `value \u00d7 10^-scale`.", "type": "object", "required": ["amount", "currency", "measure", "reference"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Unit price in ISO 4217 minor units. After satisfying the same-unit invariant, the Business MUST compute the comparator as `(price.amount / (measure.value \u00d7 10^-measure.scale)) \u00d7 (reference.value \u00d7 10^-reference.scale)` and round it once to ISO 4217 minor units according to its pricing rules. The returned `unit_price.amount` is authoritative; the Platform MUST NOT recompute or substitute its own result."}, "currency": {"type": "string", "pattern": "^[A-Z]{3}$", "description": "ISO 4217 currency code."}, "measure": {"description": "Product quantity in packaging/content (for example, a 750 mL bottle), distinct from `quantity_unit`, which defines the sale basis. Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}, "reference": {"description": "Denominator for unit price display (for example, per 100 mL or per 1 kg). Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}}}, "r_432d134f0f52d9379ad6": {"title": "Measure", "description": "A measure composed of an integer value and a unit descriptor. Its value is the integer count of `10^-scale` units of `unit`.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "required": ["value"], "properties": {"value": {"type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991, "description": "Integer count of `10^-scale` units of `unit`."}}}]}, "r_711f2de553f2bc08d5e4": {"title": "Availability", "description": "Availability of an item: whether it can be obtained, and a qualifying status.", "type": "object", "properties": {"available": {"type": "boolean", "description": "Whether this can be obtained. See status for fulfillment details."}, "status": {"type": "string", "description": "Qualifies available with fulfillment state. Well-known values: `in_stock`, `backorder`, `preorder`, `out_of_stock`, `discontinued`."}}}, "r_7013e6ffdb05f46d5980": {"title": "Selected Option", "description": "A specific option selection on a variant (e.g., Size: Large).", "type": "object", "required": ["name", "label"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size')."}, "id": {"type": "string", "description": "Optional option value identifier from option_value.id. When present, the server SHOULD use it for matching; name and label remain required for display."}, "label": {"type": "string", "description": "Selected option label (e.g., 'Large')."}}}, "r_8d848da0073855027813": {"title": "Rating", "description": "Product rating aggregate.", "type": "object", "required": ["value", "scale_max"], "properties": {"value": {"type": "number", "minimum": 0, "description": "Average rating value."}, "scale_min": {"type": "number", "minimum": 0, "default": 1, "description": "Minimum value on the rating scale (e.g., 1 for 1-5 stars)."}, "scale_max": {"type": "number", "minimum": 1, "description": "Maximum value on the rating scale (e.g., 5 for 5-star)."}, "count": {"type": "integer", "minimum": 0, "description": "Number of reviews contributing to the rating."}}}, "r_78eb2bf7d8f853718428": {"title": "Link", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Type of link. Well-known values: `privacy_policy`, `terms_of_service`, `refund_policy`, `shipping_policy`, `faq`. Consumers SHOULD handle unknown values gracefully by displaying them using the `title` field or omitting the link."}, "url": {"type": "string", "description": "The actual URL pointing to the content to be displayed.", "format": "uri"}, "title": {"type": "string", "description": "Optional display text for the link. When provided, use this instead of generating from type."}}}, "r_82e357f65836f16e2c74": {"title": "Detail Option Value", "description": "An option value with availability signals relative to the current selections. Used in get_product responses where selected context exists.", "type": "object", "allOf": [{"$ref": "#/$defs/r_048eadb025b666eec338"}], "properties": {"available": {"type": "boolean", "description": "Whether a variant matching this value and the current option selections is purchasable."}, "exists": {"type": "boolean", "description": "Whether a variant matching this value and the current option selections exists in the catalog."}}}, "r_9d983cfdd670073bf08f": {"title": "Actions", "description": "Outstanding extension-defined Action instances, keyed by reverse-domain Action type, not extension name.", "$defs": {"instance": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}}, "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "description": "Non-empty instances of one Action type. JSON preserves array order; the declaring extension defines whether order has processing semantics.", "minItems": 1, "items": {"$ref": "#/$defs/r_901ebc24b81656362162"}}}, "r_901ebc24b81656362162": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}, "r_3071c80f2258926c6eb8": {"title": "Message", "type": "object", "description": "Container for error, warning, or info messages.", "oneOf": [{"$ref": "#/$defs/r_14e3b8ead1e88b408c50"}, {"$ref": "#/$defs/r_f9623226067b01b25500"}, {"$ref": "#/$defs/r_8857abde4865c3419043"}]}, "r_14e3b8ead1e88b408c50": {"title": "Message Error", "type": "object", "required": ["type", "code", "content", "severity"], "properties": {"type": {"type": "string", "const": "error", "description": "Message type discriminator."}, "code": {"$ref": "#/$defs/r_4ac9f67da2708b5e56d6"}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}, "severity": {"type": "string", "enum": ["recoverable", "requires_buyer_input", "requires_buyer_review", "unrecoverable"], "description": "Reflects the resource state and recommended action. 'recoverable': platform can resolve the condition in band, for example by modifying inputs or processing a related Action, and submit a new operation when needed. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules. 'unrecoverable': no valid resource exists to act on, retry with new resource or inputs. Errors with 'requires_*' severity contribute to 'status: requires_escalation'."}}}, "r_4ac9f67da2708b5e56d6": {"title": "Error Code", "description": "Error code identifying the type of error. Standard errors are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["not_found", "out_of_stock", "item_unavailable", "address_undeliverable", "payment_failed", "eligibility_invalid", "identity_required", "insufficient_scope"]}, "r_f9623226067b01b25500": {"title": "Message Warning", "type": "object", "required": ["type", "code", "content"], "properties": {"type": {"type": "string", "const": "warning", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_edb637acae7c006c6550"}, "content": {"type": "string", "description": "Human-readable warning message that MUST be displayed."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "presentation": {"type": "string", "default": "notice", "description": "Rendering contract for this warning. 'notice' (default): platform MUST display, MAY dismiss. 'disclosure': platform MUST display in proximity to the path-referenced component, MUST NOT hide or auto-dismiss. See specification for full contract."}, "image_url": {"type": "string", "format": "uri", "description": "URL to a required visual element (e.g., warning symbol, energy class label)."}, "url": {"type": "string", "format": "uri", "description": "Reference URL for more information (e.g., regulatory site, registry entry, policy page)."}}}, "r_edb637acae7c006c6550": {"title": "Warning Code", "description": "Warning code identifying the type of warning. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["final_sale", "prop65", "fulfillment_changed", "payment_term_changed", "age_restricted"]}, "r_8857abde4865c3419043": {"title": "Message Info", "type": "object", "required": ["type", "content"], "properties": {"type": {"type": "string", "const": "info", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_2fb517c12e3bdb498ea6"}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}}}, "r_2fb517c12e3bdb498ea6": {"title": "Info Code", "description": "Info code identifying the type of informational message. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["identity_optional", "signal", "free_shipping", "not_found"]}, "r_a351b7a88b54cccfabbc": {"title": "Policy", "description": "A durable business rule about the items in a response \u2014 return/refund terms, warranty, and the like \u2014 at the time of purchase. Every policy carries a `type` (an open reverse-DNS vocabulary) and a `description` so a platform can present it without understanding its type-specific fields; type-specific fields (gated by `type`) add structured context for platforms that model that type. Policies are reference data; the obligation to display a term to the buyer is carried by a `messages[]` warning whose `code` equals the policy `type` \u2014 see the Policies section of the specification.", "type": "object", "required": ["type", "description"], "additionalProperties": true, "properties": {"type": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Policy type discriminator. Open reverse-DNS vocabulary. Well-known values: `dev.ucp.shopping.policy.return` (return terms), `dev.ucp.shopping.policy.warranty` (warranty terms). Businesses MAY define custom types in their own domain (e.g., `com.example.policy.price_match`). Platforms MUST tolerate unknown values."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Human-readable policy summary in one or more formats (plain, markdown, html). Required on every policy so a platform can present it without understanding any type-specific fields. This is not the buyer-facing disclosure \u2014 display is compelled by a `messages[]` warning (see the Policies section)."}, "applies_to": {"type": "array", "items": {"type": "string"}, "description": "RFC 9535 JSONPath expressions identifying the nodes this policy applies to, relative to the embedding response root (e.g., `$.line_items[0]` in cart/checkout, `$.products[2]` in catalog). Each target covers the node it names and everything nested under it, so a target on a product also covers its variants. A singular query (RFC 9535 Section 2.3.5.1; name and index selectors only) names a single node; filters, wildcards, and slices match a set. When omitted, the policy applies to the entire response. When policies of the same `type` contest a node, the narrowest target wins and overrides the rest. See the Policies section for how specificity resolves."}, "url": {"type": "string", "format": "uri", "description": "Optional link to the full policy document."}}}}}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}, {"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "ucp_get_product"}}, {"name": "lookup_catalog", "title": "UCP-Ressourcen nach Kennung lesen", "description": "Aktuelle Salonleistungen und Workspaces anhand ihrer stabilen Produkt- oder Variantenkennungen abrufen. Entfernte Ressourcen werden nicht ersetzt. Unbekannte pers\u00f6nliche Preise bleiben ausstehend.", "inputSchema": {"type": "object", "properties": {"meta": {"type": "object", "properties": {"ucp-agent": {"type": "object", "properties": {"profile": {"type": "string", "format": "uri", "maxLength": 2048}}, "required": ["profile"], "additionalProperties": false}}, "required": ["ucp-agent"], "additionalProperties": false}, "catalog": {"$ref": "#/$defs/r_150ebb0008836802167e"}}, "required": ["meta", "catalog"], "additionalProperties": false, "$defs": {"r_150ebb0008836802167e": {"type": "object", "description": "Request body for catalog lookup.", "required": ["ids"], "properties": {"ids": {"type": "array", "items": {"type": "string"}, "minItems": 1, "description": "Identifiers to lookup. Implementations MUST support product ID and variant ID; MAY support secondary identifiers (SKU, handle, etc.)."}, "filters": {"$ref": "#/$defs/r_28e4d5c6ab7e15f55c34", "description": "Filter criteria to narrow returned products and variants. All specified filters combine with AND logic."}, "context": {"$ref": "#/$defs/r_3b843cbd4c36e56119c6"}, "signals": {"$ref": "#/$defs/r_78ecafc6e2820de61415"}, "attribution": {"$ref": "#/$defs/r_7daee799628e45737af8"}}}, "r_28e4d5c6ab7e15f55c34": {"title": "Search Filters", "description": "Filter criteria to narrow search results. All specified filters combine with AND logic.", "type": "object", "properties": {"categories": {"type": "array", "items": {"type": "string"}, "description": "Filter by product categories (OR logic \u2014 matches products in any listed categories). Values match against the value field in product category entries. Valid values can be discovered from the categories field in search results, merchant documentation, or standard taxonomies that businesses may align with."}, "price": {"$ref": "#/$defs/r_c28f892525d94e0c3751"}}, "additionalProperties": true}, "r_c28f892525d94e0c3751": {"title": "Price Filter", "description": "Price range filter denominated in context.currency. When context.currency matches the presentment currency, businesses apply the filter directly. When it differs, businesses SHOULD convert filter values to the presentment currency before applying; if conversion is not supported, businesses MAY ignore the filter and SHOULD indicate this via a message. When context.currency is absent, filter denomination is ambiguous and businesses MAY ignore it.", "type": "object", "properties": {"min": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Minimum price in ISO 4217 minor units."}, "max": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Maximum price in ISO 4217 minor units."}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_3b843cbd4c36e56119c6": {"title": "Context", "description": "Provisional buyer signals for relevance and localization\u2014not authoritative data. Businesses SHOULD use these values when verified inputs (e.g., shipping address) are absent, and MAY ignore or down-rank them if inconsistent with higher-confidence signals (authenticated account, risk detection) or regulatory constraints (export controls). Eligibility and policy enforcement MUST occur at checkout time using binding transaction data. Context SHOULD be non-identifying and can be disclosed progressively\u2014coarse signals early, finer resolution as the session progresses. Higher-resolution data (shipping address, billing address) supersedes context.", "type": "object", "additionalProperties": true, "allOf": [{"$ref": "#/$defs/r_042ca95cba1774389c88"}, {"type": "object", "additionalProperties": true, "properties": {"location": {"type": "string", "description": "Stable, opaque identifier for a Location in the Business's namespace. This provisional, non-binding hint is distinct from the Buyer's locality. The operation specification or an active capability/extension defines its effects. A common example in retail shopping is the default home store ID selected and saved by the user when purchasing groceries."}, "intent": {"type": "string", "description": "Background context describing buyer's intent (e.g., 'looking for a gift under $50', 'need something durable for outdoor use'). Informs relevance, recommendations, and personalization."}, "language": {"type": "string", "description": "Preferred language for content. Use IETF BCP 47 language tags (e.g., 'en', 'fr-CA', 'zh-Hans'). For REST, equivalent to Accept-Language header\u2014platforms SHOULD fall back to Accept-Language when this field is absent; when provided, overrides Accept-Language. Businesses MAY return content in a different language if unavailable."}, "currency": {"type": "string", "description": "Preferred currency (ISO 4217, e.g., 'EUR', 'USD'). Businesses determine presentment currency from context and authoritative signals; this hint MAY inform selection in multi-currency markets. Also serves as the denomination for price filter values \u2014 platforms SHOULD include this field when sending price filters. Response prices include explicit currency confirming the resolution."}, "eligibility": {"type": "array", "description": "Buyer claims about eligible benefits such as loyalty membership, payment instrument perks, and similar. Recognized claims MAY inform the Business response (e.g., member-only product availability, adjusted pricing in catalog, provisional discounts at cart or checkout). Businesses MUST ignore unrecognized values without error. Values MUST use reverse-domain naming (e.g., 'com.example.loyalty_gold', 'org.school.student') and MUST be non-identifying.", "uniqueItems": true, "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}}, "payment": {"type": "array", "description": "Buyer-preferred payment handlers in priority order (most preferred first). Each entry names a handler advertised in the Business profile's `ucp.payment_handlers`, optionally narrowed to preferred instrument types. The Business SHOULD use it to preselect or prioritize the handler (and type, when given) and MAY ignore unavailable or ineligible entries; unrecognized values MUST be ignored without error.", "items": {"type": "object", "required": ["handler"], "properties": {"handler": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Handler registry key advertised in the Business profile's `ucp.payment_handlers`."}, "types": {"type": "array", "description": "Optional preferred instrument types for this handler, in priority order, aligned with the handler's advertised `payment_instrument.type` values (for example `card` or `bank`). Unrecognized values MUST be ignored.", "items": {"type": "string"}}}}}}}]}, "r_042ca95cba1774389c88": {"title": "Locality", "description": "A coarse geographic location \u2014 country, region, and postal code. A lightweight alternative to a full postal address.", "type": "object", "additionalProperties": true, "properties": {"address_country": {"type": "string", "description": "The country, as a 2-letter ISO 3166-1 alpha-2 code (e.g. \"US\"). A 3-letter alpha-3 code or full country name MAY also be used."}, "address_region": {"type": "string", "description": "The first-level administrative region within the country (e.g. a state or province such as California)."}, "postal_code": {"type": "string", "description": "The postal code (e.g. \"94043\")."}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_78ecafc6e2820de61415": {"title": "Signals", "description": "Environment data provided by the platform to support authorization and abuse prevention. Values MUST NOT be buyer-asserted claims \u2014 platforms provide signals based on direct observation or independently verifiable third-party attestations. All signal keys MUST use reverse-domain naming to ensure provenance and prevent collisions when multiple extensions contribute to the shared namespace.", "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Reverse-domain identifier (e.g., dev.ucp.buyer_ip, com.example.device_id)."}, "properties": {"dev.ucp.buyer_ip": {"type": "string", "description": "Client's IP address (IPv4 or IPv6)."}, "dev.ucp.user_agent": {"type": "string", "description": "Client's HTTP User-Agent header or equivalent."}}, "additionalProperties": true}, "r_7daee799628e45737af8": {"title": "Attribution", "description": "Platform-emitted referral and conversion-event context \u2014 campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows.", "type": "object", "additionalProperties": {"type": "string", "description": "URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string."}}}}, "outputSchema": {"type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "$ref": "#/$defs/r_282ff5fe5fc736eafb20", "$defs": {"r_282ff5fe5fc736eafb20": {"type": "object", "required": ["ucp", "products"], "properties": {"ucp": {"$ref": "#/$defs/r_31dbdfed656c20d0289d"}, "products": {"type": "array", "items": {"allOf": [{"$ref": "#/$defs/r_032acacb42b993f8b0e3"}, {"properties": {"variants": {"items": {"$ref": "#/$defs/r_21d86ce8fbf701dfc150"}}}}]}, "description": "Products matching the requested identifiers. May contain fewer items if some identifiers not found, or more if identifiers match multiple products."}, "actions": {"$ref": "#/$defs/r_9d983cfdd670073bf08f", "description": "Outstanding extension-defined Actions for this catalog lookup response.", "ucp_request": "omit"}, "messages": {"type": "array", "items": {"$ref": "#/$defs/r_3071c80f2258926c6eb8"}, "description": "Errors, warnings, or informational messages about the requested items."}, "policies": {"type": "array", "items": {"$ref": "#/$defs/r_a351b7a88b54cccfabbc"}, "description": "Policies (e.g., return/refund terms) that apply to the products in this response. `applies_to` targets are relative to the response root; when absent or empty, refer to the URLs in `links[]`."}}}, "r_31dbdfed656c20d0289d": {"title": "UCP Catalog Response Schema", "description": "UCP metadata for catalog responses.", "allOf": [{"$ref": "#/$defs/r_7116a3b12e850856e319"}, {"properties": {"capabilities": {"additionalProperties": {"items": {"$ref": "#/$defs/r_258cad0ffb5ad23c68a4"}}}}}]}, "r_7116a3b12e850856e319": {"description": "Base UCP metadata with shared properties for all schema types.", "type": "object", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831"}, "map_order": {"$ref": "#/$defs/r_da7e6cd3fc02ee7a6bdd", "description": "Preferred key-traversal order for sibling registry fields inside the root `ucp` envelope (`services`, `capabilities`, and `payment_handlers`).", "ucp_request": "omit"}, "status": {"type": "string", "enum": ["success", "error"], "default": "success", "description": "Application-level status of the UCP operation."}, "services": {"type": "object", "description": "Service registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_a2d0c5c2aaa51537d5cd"}}}, "capabilities": {"type": "object", "description": "Capability registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}}}, "payment_handlers": {"type": "object", "description": "Payment handler registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_251976d6bc875de7dba3"}}}}}, "r_6ca21bff46d30c1de831": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Version identifier in YYYY-MM-DD format."}, "r_da7e6cd3fc02ee7a6bdd": {"type": "object", "description": "Preferred key order for map-valued fields in the scope annotated by the containing `ucp` member. Each property names a target map, and its array lists target keys in preferred order. Lists may be partial and are not allowlists.", "additionalProperties": {"type": "array", "items": {"type": "string"}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_a2d0c5c2aaa51537d5cd": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["transport"], "properties": {"transport": {"type": "string", "enum": ["rest", "mcp", "a2a", "embedded"], "description": "Transport protocol for this service binding."}, "endpoint": {"type": "string", "format": "uri", "description": "Endpoint URL for this transport binding."}}}]}, "r_a2eb0eadda944d606d8d": {"type": "object", "description": "Shared foundation for all UCP entities.", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831", "description": "Entity version in YYYY-MM-DD format."}, "spec": {"type": "string", "format": "uri", "description": "URL to human-readable specification document."}, "schema": {"type": "string", "format": "uri", "description": "URL to JSON Schema defining this entity's structure and payloads."}, "id": {"type": "string", "description": "Unique identifier for this entity instance. Used to disambiguate when multiple instances exist."}, "config": {"type": "object", "description": "Entity-specific configuration. Structure defined by each entity's schema.", "additionalProperties": true}}}, "r_ddfcd1f84f7738d6744b": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "properties": {"extends": {"oneOf": [{"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, {"type": "array", "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "minItems": 1}], "description": "Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions."}}}]}, "r_251976d6bc875de7dba3": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["id"]}, {"type": "object", "properties": {"available_instruments": {"type": "array", "items": {"$ref": "#/$defs/r_2b8f633efdee89ee73e5"}, "description": "Instrument types this handler supports, with optional constraints. When absent, every instrument should be considered available.", "minItems": 1}}}]}, "r_2b8f633efdee89ee73e5": {"title": "Available Payment Instrument", "description": "An instrument type available from a payment handler with optional constraints.", "type": "object", "required": ["type"], "properties": {"type": {"type": "string", "description": "The instrument type identifier (e.g., 'card', 'gift_card'). References an instrument schema's type constant."}, "constraints": {"$ref": "#/$defs/r_df7cea4ad60ad14269a2", "description": "A Constraint Expression describing the instrument this entry makes available. Keys in `properties` name members of the `constraint_target` declared by the instrument schema for this `type`. Requirements on submitted request data belong in `ucp.request_constraints` instead."}}}, "r_df7cea4ad60ad14269a2": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_8e969bc3c31dfc5e8f34": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_01121ad4caedb74fd9d5": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}, "r_258cad0ffb5ad23c68a4": {"title": "Capability (Response Schema)", "description": "Capability reference in responses. Only name/version required to confirm active capabilities.", "allOf": [{"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}]}, "r_032acacb42b993f8b0e3": {"title": "Product", "description": "A product in the catalog with variants and options.", "type": "object", "required": ["id", "title", "description", "price_range", "variants"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this product."}, "handle": {"type": "string", "description": "URL-safe slug for SEO-friendly URLs (e.g., 'blue-runner-pro'). Use id for stable API references."}, "title": {"type": "string", "description": "Product title."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Product description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical product page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Product categories with optional taxonomy identifiers."}, "price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "Price range across all variants."}, "list_price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "List price range before discounts (for strikethrough display)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Product media (images, videos, 3D models). First item is the featured media for listings."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7819ee2b082046b3267f"}, "description": "Product options (Size, Color, etc.)."}, "variants": {"type": "array", "items": {"$ref": "#/$defs/r_bfcb08b4789ccef0057d"}, "minItems": 1, "description": "Purchasable variants of this product. First item is the featured variant for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Aggregate product rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Product tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard product model."}}}, "r_f0d6c56eaf863a32e380": {"title": "Description", "description": "Description content in one or more formats. At least one format must be provided.", "type": "object", "properties": {"plain": {"type": "string", "description": "Plain text content."}, "html": {"type": "string", "description": "HTML-formatted content. Security: Platforms MUST sanitize before rendering\u2014strip scripts, event handlers, and untrusted elements. Treat all rich text as untrusted input."}, "markdown": {"type": "string", "description": "Markdown-formatted content."}}, "minProperties": 1}, "r_1d1541c3d7066157e070": {"title": "Category", "description": "A product category with optional taxonomy identifier.", "type": "object", "required": ["value"], "properties": {"value": {"type": "string", "description": "Category value or path (e.g., 'Apparel > Shirts', '1604')."}, "taxonomy": {"type": "string", "description": "Source taxonomy. Well-known values: `google_product_category`, `shopify`, `merchant`."}}}, "r_09586324eb40756c3c6f": {"title": "Price Range", "description": "A price range representing minimum and maximum values (e.g., a common example in retail shopping is when prices vary across product variants).", "type": "object", "required": ["min", "max"], "properties": {"min": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Minimum price in the range."}, "max": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Maximum price in the range."}}}, "r_580318bc70fdf8477779": {"title": "Price", "description": "Price with explicit currency.", "type": "object", "required": ["amount", "currency"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Amount in ISO 4217 minor units. Use 0 for free items."}, "currency": {"type": "string", "description": "ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP').", "pattern": "^[A-Z]{3}$"}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_fad91f406aba9b92dbb0": {"title": "Media", "description": "Media item (image, video, etc.).", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Media type. Well-known values: `image`, `video`, `model_3d`."}, "url": {"type": "string", "format": "uri", "description": "URL to the media resource."}, "alt_text": {"type": "string", "description": "Accessibility text describing the media."}, "width": {"type": "integer", "minimum": 1, "description": "Width in pixels (for images/video)."}, "height": {"type": "integer", "minimum": 1, "description": "Height in pixels (for images/video)."}}}, "r_7819ee2b082046b3267f": {"title": "Product Option", "description": "A product option such as size, color, or material.", "type": "object", "required": ["name", "values"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size', 'Color')."}, "values": {"type": "array", "items": {"$ref": "#/$defs/r_048eadb025b666eec338"}, "minItems": 1, "description": "Available values for this option."}}}, "r_048eadb025b666eec338": {"title": "Option Value", "description": "A selectable value for a product option.", "type": "object", "required": ["label"], "properties": {"id": {"type": "string", "description": "Optional server-assigned identifier for this option value. When present in a selected_option, the server SHOULD use it for matching instead of label."}, "label": {"type": "string", "description": "Display text for this option value (e.g., 'Small', 'Blue')."}}}, "r_bfcb08b4789ccef0057d": {"title": "Variant", "description": "A purchasable variant of a product with specific option selections.", "type": "object", "required": ["id", "title", "description", "price"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this variant. Used as item.id in checkout."}, "sku": {"type": "string", "description": "Business-assigned identifier for inventory and fulfillment."}, "barcodes": {"type": "array", "items": {"type": "object", "required": ["type", "value"], "properties": {"type": {"type": "string", "description": "Barcode standard. Well-known values: UPC, EAN, ISBN, GTIN, JAN."}, "value": {"type": "string", "description": "Barcode value."}}}, "description": "Industry-standard product identifiers for cross-reference and correlation."}, "handle": {"type": "string", "description": "URL-safe variant handle/slug."}, "title": {"type": "string", "description": "Variant display title (e.g., 'Blue / Large')."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Variant description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical variant page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Variant categories with optional taxonomy identifiers."}, "price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Current selling price. Price is the amount per one whole `quantity_unit.unit` (for example, per lb or per hour); when `quantity_unit` is absent, it is per `each`. Line total is `price \u00d7 quantity \u00d7 10^-scale`, computed and rounded once by the Business; `totals` remain authoritative."}, "quantity_unit": {"$ref": "#/$defs/r_0d55f12cd1240424e2a9", "description": "Sale basis this variant's `quantity` is denominated in. The default sale basis is `each`, whose machine identity is (`C62`, 0); `C62` is the UN/CEFACT Rec20 code for one/each. An absent catalog descriptor encodes that default. An `increment` advertises the ordering granularity in steps (for example, `scale` 2 with `increment` 25 sells in 0.25-unit multiples)."}, "list_price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "List price before discounts (for strikethrough display)."}, "unit_price": {"$ref": "#/$defs/r_e00c60be8af44c2409fd", "description": "Price per standard unit of measurement, for shelf-style comparison display. MAY be omitted when unit pricing does not apply."}, "availability": {"$ref": "#/$defs/r_711f2de553f2bc08d5e4", "description": "Variant availability for purchase."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7013e6ffdb05f46d5980"}, "description": "Option values that define this variant (e.g., Color: Blue, Size: Large)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Variant media (images, videos, 3D models). First item is the featured media for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Variant rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Variant tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard variant model."}, "seller": {"type": "object", "description": "Optional seller context for this variant.", "properties": {"name": {"type": "string", "description": "Seller display name."}, "links": {"type": "array", "items": {"$ref": "#/$defs/r_78eb2bf7d8f853718428"}, "description": "Seller policy and information links."}}}}}, "r_0d55f12cd1240424e2a9": {"title": "Quantity Unit", "description": "Sale-basis descriptor for quantities: the shared unit descriptor plus the Business's ordering policy. Its unit-descriptor machine identity remains (`unit`, effective `scale`); `display_text` and `increment` are excluded from identity and mismatch comparison.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "properties": {"increment": {"type": "integer", "minimum": 1, "default": 1, "description": "Ordering granularity, denominated in steps: the Business sells this item in integer multiples of `increment` steps. Its effective value is the provided value or 1. Advisory merchandising policy, not a representational bound: Platform-authored quantities SHOULD be integer multiples of the effective increment; the Business MAY accept, revise, or reject an off-increment request with a recoverable business outcome and MUST NOT silently reinterpret it. Business-authored quantities (checkout revisions, fulfillment events, adjustments) are bounded only by `scale`."}}}]}, "r_5c66eb03f4d3021766c4": {"title": "Unit", "description": "A reusable unit descriptor for quantities and measures. Its unit-descriptor machine identity is (`unit`, effective `scale`), where effective `scale` is the provided `scale` or 0; `display_text` is excluded.", "type": "object", "required": ["unit", "display_text"], "properties": {"unit": {"type": "string", "description": "Stable machine identifier. The Business SHOULD use the exact UN/CEFACT Rec20 Common Code when one accurately identifies the unit. Otherwise, the Business MAY use a custom unit identifier and MUST use it consistently for the same unit. The Platform MUST treat an unrecognized identifier as opaque."}, "scale": {"type": "integer", "minimum": 0, "maximum": 15, "default": 0, "description": "One step equals `10^-scale` of `unit`. When `unit` is `C62`, `scale`, if present, MUST be 0. The maximum of 15 is derived from the interoperable integer range: at scale 16 a single whole unit (10^16 steps) is no longer representable, so larger scales cannot denominate one unit of their own basis. Businesses needing finer granularity use a smaller unit."}, "display_text": {"type": "string", "description": "Required printable unit label provided by the Business. The Platform MUST use it when it does not recognize `unit`; for a recognized UN/CEFACT Rec 20 Common Code, the Platform MAY substitute its own localized label. It does not participate in unit identity or mismatch comparison."}}, "allOf": [{"if": {"properties": {"unit": {"const": "C62"}}, "required": ["unit"]}, "then": {"properties": {"scale": {"const": 0}}}}]}, "r_e00c60be8af44c2409fd": {"title": "Unit Price", "description": "Price per standard unit of measurement. MAY be omitted when unit pricing does not apply. `unit_price.currency` MUST equal `price.currency`; the comparator MUST NOT perform currency conversion. `measure.unit` and `reference.unit` MUST be identical; cross-unit conversion is not permitted. Their scales MAY differ; each value represents `value \u00d7 10^-scale`.", "type": "object", "required": ["amount", "currency", "measure", "reference"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Unit price in ISO 4217 minor units. After satisfying the same-unit invariant, the Business MUST compute the comparator as `(price.amount / (measure.value \u00d7 10^-measure.scale)) \u00d7 (reference.value \u00d7 10^-reference.scale)` and round it once to ISO 4217 minor units according to its pricing rules. The returned `unit_price.amount` is authoritative; the Platform MUST NOT recompute or substitute its own result."}, "currency": {"type": "string", "pattern": "^[A-Z]{3}$", "description": "ISO 4217 currency code."}, "measure": {"description": "Product quantity in packaging/content (for example, a 750 mL bottle), distinct from `quantity_unit`, which defines the sale basis. Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}, "reference": {"description": "Denominator for unit price display (for example, per 100 mL or per 1 kg). Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}}}, "r_432d134f0f52d9379ad6": {"title": "Measure", "description": "A measure composed of an integer value and a unit descriptor. Its value is the integer count of `10^-scale` units of `unit`.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "required": ["value"], "properties": {"value": {"type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991, "description": "Integer count of `10^-scale` units of `unit`."}}}]}, "r_711f2de553f2bc08d5e4": {"title": "Availability", "description": "Availability of an item: whether it can be obtained, and a qualifying status.", "type": "object", "properties": {"available": {"type": "boolean", "description": "Whether this can be obtained. See status for fulfillment details."}, "status": {"type": "string", "description": "Qualifies available with fulfillment state. Well-known values: `in_stock`, `backorder`, `preorder`, `out_of_stock`, `discontinued`."}}}, "r_7013e6ffdb05f46d5980": {"title": "Selected Option", "description": "A specific option selection on a variant (e.g., Size: Large).", "type": "object", "required": ["name", "label"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size')."}, "id": {"type": "string", "description": "Optional option value identifier from option_value.id. When present, the server SHOULD use it for matching; name and label remain required for display."}, "label": {"type": "string", "description": "Selected option label (e.g., 'Large')."}}}, "r_8d848da0073855027813": {"title": "Rating", "description": "Product rating aggregate.", "type": "object", "required": ["value", "scale_max"], "properties": {"value": {"type": "number", "minimum": 0, "description": "Average rating value."}, "scale_min": {"type": "number", "minimum": 0, "default": 1, "description": "Minimum value on the rating scale (e.g., 1 for 1-5 stars)."}, "scale_max": {"type": "number", "minimum": 1, "description": "Maximum value on the rating scale (e.g., 5 for 5-star)."}, "count": {"type": "integer", "minimum": 0, "description": "Number of reviews contributing to the rating."}}}, "r_78eb2bf7d8f853718428": {"title": "Link", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Type of link. Well-known values: `privacy_policy`, `terms_of_service`, `refund_policy`, `shipping_policy`, `faq`. Consumers SHOULD handle unknown values gracefully by displaying them using the `title` field or omitting the link."}, "url": {"type": "string", "description": "The actual URL pointing to the content to be displayed.", "format": "uri"}, "title": {"type": "string", "description": "Optional display text for the link. When provided, use this instead of generating from type."}}}, "r_21d86ce8fbf701dfc150": {"description": "Variant with required correlation metadata for lookup responses.", "allOf": [{"$ref": "#/$defs/r_bfcb08b4789ccef0057d"}, {"required": ["inputs"], "properties": {"inputs": {"type": "array", "items": {"$ref": "#/$defs/r_9dc5acbb679bc0c9dbc1"}, "minItems": 1, "description": "Which request identifiers resolved to this variant, and how. Each entry maps a request ID to its match type."}}}]}, "r_9dc5acbb679bc0c9dbc1": {"title": "Input Correlation", "description": "Maps a request identifier to the variant it resolved to, with match semantics.", "type": "object", "required": ["id"], "properties": {"id": {"type": "string", "description": "The identifier from the lookup request that resolved to this variant."}, "match": {"type": "string", "description": "How the request identifier resolved to this variant. Well-known values: `exact` (input directly identifies this variant, e.g., variant ID, SKU), `featured` (server selected this variant as representative, e.g., product ID resolved to best match). Businesses MAY implement and provide additional resolution strategies.", "examples": ["exact", "featured"]}}}, "r_9d983cfdd670073bf08f": {"title": "Actions", "description": "Outstanding extension-defined Action instances, keyed by reverse-domain Action type, not extension name.", "$defs": {"instance": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}}, "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "description": "Non-empty instances of one Action type. JSON preserves array order; the declaring extension defines whether order has processing semantics.", "minItems": 1, "items": {"$ref": "#/$defs/r_901ebc24b81656362162"}}}, "r_901ebc24b81656362162": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}, "r_3071c80f2258926c6eb8": {"title": "Message", "type": "object", "description": "Container for error, warning, or info messages.", "oneOf": [{"$ref": "#/$defs/r_14e3b8ead1e88b408c50"}, {"$ref": "#/$defs/r_f9623226067b01b25500"}, {"$ref": "#/$defs/r_8857abde4865c3419043"}]}, "r_14e3b8ead1e88b408c50": {"title": "Message Error", "type": "object", "required": ["type", "code", "content", "severity"], "properties": {"type": {"type": "string", "const": "error", "description": "Message type discriminator."}, "code": {"$ref": "#/$defs/r_4ac9f67da2708b5e56d6"}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}, "severity": {"type": "string", "enum": ["recoverable", "requires_buyer_input", "requires_buyer_review", "unrecoverable"], "description": "Reflects the resource state and recommended action. 'recoverable': platform can resolve the condition in band, for example by modifying inputs or processing a related Action, and submit a new operation when needed. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules. 'unrecoverable': no valid resource exists to act on, retry with new resource or inputs. Errors with 'requires_*' severity contribute to 'status: requires_escalation'."}}}, "r_4ac9f67da2708b5e56d6": {"title": "Error Code", "description": "Error code identifying the type of error. Standard errors are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["not_found", "out_of_stock", "item_unavailable", "address_undeliverable", "payment_failed", "eligibility_invalid", "identity_required", "insufficient_scope"]}, "r_f9623226067b01b25500": {"title": "Message Warning", "type": "object", "required": ["type", "code", "content"], "properties": {"type": {"type": "string", "const": "warning", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_edb637acae7c006c6550"}, "content": {"type": "string", "description": "Human-readable warning message that MUST be displayed."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "presentation": {"type": "string", "default": "notice", "description": "Rendering contract for this warning. 'notice' (default): platform MUST display, MAY dismiss. 'disclosure': platform MUST display in proximity to the path-referenced component, MUST NOT hide or auto-dismiss. See specification for full contract."}, "image_url": {"type": "string", "format": "uri", "description": "URL to a required visual element (e.g., warning symbol, energy class label)."}, "url": {"type": "string", "format": "uri", "description": "Reference URL for more information (e.g., regulatory site, registry entry, policy page)."}}}, "r_edb637acae7c006c6550": {"title": "Warning Code", "description": "Warning code identifying the type of warning. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["final_sale", "prop65", "fulfillment_changed", "payment_term_changed", "age_restricted"]}, "r_8857abde4865c3419043": {"title": "Message Info", "type": "object", "required": ["type", "content"], "properties": {"type": {"type": "string", "const": "info", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_2fb517c12e3bdb498ea6"}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}}}, "r_2fb517c12e3bdb498ea6": {"title": "Info Code", "description": "Info code identifying the type of informational message. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["identity_optional", "signal", "free_shipping", "not_found"]}, "r_a351b7a88b54cccfabbc": {"title": "Policy", "description": "A durable business rule about the items in a response \u2014 return/refund terms, warranty, and the like \u2014 at the time of purchase. Every policy carries a `type` (an open reverse-DNS vocabulary) and a `description` so a platform can present it without understanding its type-specific fields; type-specific fields (gated by `type`) add structured context for platforms that model that type. Policies are reference data; the obligation to display a term to the buyer is carried by a `messages[]` warning whose `code` equals the policy `type` \u2014 see the Policies section of the specification.", "type": "object", "required": ["type", "description"], "additionalProperties": true, "properties": {"type": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Policy type discriminator. Open reverse-DNS vocabulary. Well-known values: `dev.ucp.shopping.policy.return` (return terms), `dev.ucp.shopping.policy.warranty` (warranty terms). Businesses MAY define custom types in their own domain (e.g., `com.example.policy.price_match`). Platforms MUST tolerate unknown values."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Human-readable policy summary in one or more formats (plain, markdown, html). Required on every policy so a platform can present it without understanding any type-specific fields. This is not the buyer-facing disclosure \u2014 display is compelled by a `messages[]` warning (see the Policies section)."}, "applies_to": {"type": "array", "items": {"type": "string"}, "description": "RFC 9535 JSONPath expressions identifying the nodes this policy applies to, relative to the embedding response root (e.g., `$.line_items[0]` in cart/checkout, `$.products[2]` in catalog). Each target covers the node it names and everything nested under it, so a target on a product also covers its variants. A singular query (RFC 9535 Section 2.3.5.1; name and index selectors only) names a single node; filters, wildcards, and slices match a set. When omitted, the policy applies to the entire response. When policies of the same `type` contest a node, the narrowest target wins and overrides the rest. See the Policies section for how specificity resolves."}, "url": {"type": "string", "format": "uri", "description": "Optional link to the full policy document."}}}}}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}, {"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "ucp_lookup_catalog"}}, {"name": "salon_confirm_booking", "title": "Salontermin verbindlich buchen", "description": "Das zuvor gepr\u00fcfte Salonangebot nach ausdr\u00fccklicher Zustimmung zu Preis und Bedingungen buchen. Der Server pr\u00fcft Preis, Mitarbeiter und Verf\u00fcgbarkeit erneut. Wiederholte Best\u00e4tigung gibt dieselbe Buchung zur\u00fcck. Es werden Buchungsbest\u00e4tigungen versendet.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "Kennung des zuvor vom Server vorbereiteten Buchungsangebots."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Nur beim Erstellen ausgegebener Zugriffsschl\u00fcssel des Angebots. Nicht ver\u00f6ffentlichen oder aus fremden Daten ableiten."}, "accept_privacy": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer den gezeigten Datenschutzbedingungen zugestimmt hat."}, "accept_terms": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer die gezeigten Nutzungsbedingungen und den Angebotspreis best\u00e4tigt hat."}, "accept_cancellation": {"type": "boolean", "const": true, "description": "Nur true senden, wenn der Nutzer die gezeigten Stornierungsbedingungen best\u00e4tigt hat."}, "confirm_partial_series": {"type": "boolean", "default": false, "description": "Bei einer verk\u00fcrzten Mietserie nur nach ausdr\u00fccklicher Zustimmung zu allen ausgelassenen Tagen true senden."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["quote_id", "quote_token", "accept_privacy", "accept_cancellation"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string", "const": "confirmed"}, "booking": {"type": "object"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "booking"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:book"]}], "de.dollea/operation": "salon_confirm_booking"}}, {"name": "salon_find_slots", "title": "Freie Salontermine finden", "description": "Tats\u00e4chlich freie Termine f\u00fcr ausgew\u00e4hlte Salonleistungen finden. Mitarbeiterzuordnung, kombinierte Behandlungen und Buchungsfristen werden ber\u00fccksichtigt. Eine Mitarbeiterpr\u00e4ferenz wird nicht stillschweigend ersetzt.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Aktuelle numerische Leistungskennungen aus salon_search_services. Mehrere Leistungen werden als zusammenh\u00e4ngender Besuch gepr\u00fcft."}, "from_date": {"type": "string", "format": "date", "description": "Erster lokaler Kalendertag in M\u00fcnchen, im Format JJJJ-MM-TT."}, "to_date": {"type": "string", "format": "date", "description": "Letzter lokaler Kalendertag des begrenzten Suchzeitraums, einschlie\u00dflich dieses Tages."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optionaler ausdr\u00fccklich gew\u00fcnschter Mitarbeiter. Eine ungeeignete oder nicht verf\u00fcgbare Pr\u00e4ferenz wird nicht ersetzt."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 200, "default": 100, "description": "Maximale Anzahl zur\u00fcckgegebener Ergebnisse innerhalb der ver\u00f6ffentlichten Grenze."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Ergebnisposition f\u00fcr die n\u00e4chste Seite; next_offset aus der vorherigen Antwort verwenden."}}, "required": ["service_ids", "from_date"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}}, "slots": {"type": "array", "items": {"type": "object", "properties": {"date": {"type": "string", "format": "date"}, "time": {"type": "string"}, "appointments": {"type": "array", "items": {"type": "object"}}}, "required": ["date", "time"]}}, "total": {"type": "integer", "minimum": 0}, "next_offset": {"type": ["integer", "null"]}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "service_ids", "slots", "total", "next_offset"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "salon_availability"}}, {"name": "salon_get_booking", "title": "Eigenen Salontermin lesen", "description": "Mit dem privaten Buchungsschl\u00fcssel Terminablauf und Anfrageentscheidungen lesen. Kontaktdaten und Anamnese werden nicht ausgegeben.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Privater Schl\u00fcssel des eigenen Salontermins aus der Buchungsbest\u00e4tigung. Er berechtigt nicht zum Zugriff auf andere Termine."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_token"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:read"]}], "de.dollea/operation": "salon_get_booking"}}, {"name": "salon_get_campaign", "title": "Aktuelle Salonaktion abrufen", "description": "Die aktuell im Hero ver\u00f6ffentlichte Salonaktion einschlie\u00dflich Code, Kundenkreis und G\u00fcltigkeit abrufen. Ein angezeigter Code best\u00e4tigt noch keine pers\u00f6nliche Rabattberechtigung.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "campaign": {"type": ["object", "null"], "properties": {"code": {"type": "string"}, "discount_percent": {"type": "string"}, "customer_eligibility": {"type": "string"}, "requires_contact_check": {"type": "boolean"}, "source": {"type": "string", "const": "homepage_hero"}}, "required": ["code", "discount_percent", "customer_eligibility", "requires_contact_check", "source"]}, "hero_highlight": {"type": ["object", "null"]}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "campaign", "hero_highlight"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "salon_campaign"}}, {"name": "salon_get_price", "title": "Salonpreis pr\u00fcfen", "description": "Den aktuellen Preis f\u00fcr einen konkreten Salontermin berechnen. F\u00fcr einen Promocode werden echte E-Mail-Adresse und Telefonnummer ben\u00f6tigt. Die Pr\u00fcfung reserviert keinen Termin und verbraucht keine Einl\u00f6sung.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Aktuelle numerische Leistungskennungen aus salon_search_services. Mehrere Leistungen werden als zusammenh\u00e4ngender Besuch gepr\u00fcft."}, "start_at": {"type": "string", "format": "date-time", "description": "Konkreter Terminbeginn als ISO-Datum mit Zeitzonenoffset. Relative Zeiten zuerst anhand der mitgelieferten M\u00fcnchner Ortszeit aufl\u00f6sen."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optionaler ausdr\u00fccklich gew\u00fcnschter Mitarbeiter. Eine ungeeignete oder nicht verf\u00fcgbare Pr\u00e4ferenz wird nicht ersetzt."}, "customer": {"type": "object", "properties": {"first_name": {"type": "string", "minLength": 1, "maxLength": 100}, "last_name": {"type": "string", "minLength": 1, "maxLength": 100}, "email": {"type": "string", "format": "email", "maxLength": 254}, "phone": {"type": "string", "minLength": 6, "maxLength": 50}}, "required": ["email", "phone"], "additionalProperties": false, "description": "Vom Kunden bereitgestellte Kontaktdaten. F\u00fcr eine pers\u00f6nliche Aktionspr\u00fcfung m\u00fcssen E-Mail und Telefonnummer vorhanden sein."}, "promo_code": {"type": "string", "maxLength": 64, "description": "Vom Kunden gew\u00fcnschter oder aktuell ver\u00f6ffentlichter Promocode. Seine Berechtigung wird serverseitig gepr\u00fcft."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["service_ids", "start_at"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "slot": {"type": "object"}, "pricing": {"type": "object"}, "subtotal": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "discount": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "total": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "slot", "pricing", "subtotal", "discount", "total"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "salon_price"}}, {"name": "salon_get_quote", "title": "Salonangebot pr\u00fcfen", "description": "Ein eigenes Salonangebot mit Kennung und Zugriffsschl\u00fcssel lesen. Aktuelle \u00c4nderungen werden als erneute Angebotspr\u00fcfung gekennzeichnet. Keine fremden Kontaktdaten werden offengelegt.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "Kennung des zuvor vom Server vorbereiteten Buchungsangebots."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Nur beim Erstellen ausgegebener Zugriffsschl\u00fcssel des Angebots. Nicht ver\u00f6ffentlichen oder aus fremden Daten ableiten."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["quote_id", "quote_token"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string"}, "expires_at": {"type": "string", "format": "date-time"}, "offer": {"type": "object"}, "requires_confirmation": {"type": "boolean"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "expires_at", "offer", "requires_confirmation"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:read"]}], "de.dollea/operation": "salon_get_quote"}}, {"name": "salon_prepare_booking", "title": "Salonbuchung vorbereiten", "description": "Ein kurzlebiges Angebot f\u00fcr die gew\u00e4hlten Salonleistungen, Kontaktdaten und den konkreten Termin erstellen. Dies bucht noch keinen Termin und sendet keine E-Mail. Vor Best\u00e4tigung die vollst\u00e4ndige Preis\u00fcbersicht und Bedingungen zeigen.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Aktuelle numerische Leistungskennungen aus salon_search_services. Mehrere Leistungen werden als zusammenh\u00e4ngender Besuch gepr\u00fcft."}, "start_at": {"type": "string", "format": "date-time", "description": "Konkreter Terminbeginn als ISO-Datum mit Zeitzonenoffset. Relative Zeiten zuerst anhand der mitgelieferten M\u00fcnchner Ortszeit aufl\u00f6sen."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optionaler ausdr\u00fccklich gew\u00fcnschter Mitarbeiter. Eine ungeeignete oder nicht verf\u00fcgbare Pr\u00e4ferenz wird nicht ersetzt."}, "customer": {"type": "object", "properties": {"first_name": {"type": "string", "minLength": 1, "maxLength": 100}, "last_name": {"type": "string", "minLength": 1, "maxLength": 100}, "email": {"type": "string", "format": "email", "maxLength": 254}, "phone": {"type": "string", "minLength": 6, "maxLength": 50}}, "required": ["first_name", "last_name", "email", "phone"], "additionalProperties": false, "description": "Vom Kunden bereitgestellte Kontaktdaten. F\u00fcr eine pers\u00f6nliche Aktionspr\u00fcfung m\u00fcssen E-Mail und Telefonnummer vorhanden sein."}, "promo_code": {"type": "string", "maxLength": 64, "description": "Vom Kunden gew\u00fcnschter oder aktuell ver\u00f6ffentlichter Promocode. Seine Berechtigung wird serverseitig gepr\u00fcft."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["service_ids", "start_at", "customer"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "quote_id": {"type": "string", "format": "uuid"}, "status": {"type": "string"}, "expires_at": {"type": "string", "format": "date-time"}, "offer": {"type": "object"}, "requires_confirmation": {"type": "boolean"}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "quote_id", "status", "expires_at", "offer", "requires_confirmation"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:book"]}], "de.dollea/operation": "salon_prepare_booking"}}, {"name": "salon_request_cancellation", "title": "Salonstornierung anfragen", "description": "Eine Stornierung des eigenen Salontermins anfragen. Die Antwort enth\u00e4lt den tats\u00e4chlichen Entscheidungsstatus. Anfrage und genehmigte Stornierung nicht gleichsetzen.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Privater Schl\u00fcssel des eigenen Salontermins aus der Buchungsbest\u00e4tigung. Er berechtigt nicht zum Zugriff auf andere Termine."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "reason": {"type": "string", "maxLength": 2000, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_token", "submission_key"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:manage"]}], "de.dollea/operation": "salon_request_cancellation"}}, {"name": "salon_request_change", "title": "Salontermin\u00e4nderung anfragen", "description": "Eine \u00c4nderung des eigenen Salontermins anfragen. Verf\u00fcgbarkeit wird erneut gepr\u00fcft. Die Anfrage \u00e4ndert den Termin erst nach Genehmigung. Dieselbe \u00dcbermittlungskennung erzeugt keine zweite Anfrage.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Privater Schl\u00fcssel des eigenen Salontermins aus der Buchungsbest\u00e4tigung. Er berechtigt nicht zum Zugriff auf andere Termine."}, "submission_key": {"type": "string", "format": "uuid", "description": "Neue UUID f\u00fcr eine neue Anfrage; bei Wiederholungen exakt dieselbe UUID verwenden."}, "new_start_at": {"type": "string", "format": "date-time", "description": "Gew\u00fcnschter neuer Beginn des Salontermins als ISO-Datum mit Zeitzonenoffset."}, "reason": {"type": "string", "maxLength": 2000, "description": "Vom Nutzer bereitgestellter Hinweis zur gew\u00fcnschten \u00c4nderung oder Stornierung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}}, "required": ["booking_token", "submission_key", "new_start_at"], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}}, "required": ["contract_version", "business", "language", "timezone", "local_date"], "additionalProperties": true}, "annotations": {"readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}, "_meta": {"securitySchemes": [{"type": "oauth2", "scopes": ["salon:manage"]}], "de.dollea/operation": "salon_request_change"}}, {"name": "salon_search_services", "title": "Salonleistungen finden", "description": "Aktuelle Salonleistungen in M\u00fcnchen nach Behandlung, Mitarbeiter, Dauer, Richtpreis und Datum finden. Ergebnisse enthalten Live-Kennungen und erf\u00fcllte Anforderungen. Preise werden vor der Buchung erneut berechnet.", "inputSchema": {"type": "object", "properties": {"query": {"type": "string", "maxLength": 500, "default": "", "description": "Kurze Suchbegriffe zur gew\u00fcnschten Behandlung, T\u00e4tigkeit oder Ausstattung."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Gew\u00fcnschte Sprache f\u00fcr Texte und Anzeigeformate: de, en oder ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Maximale Anzahl zur\u00fcckgegebener Ergebnisse innerhalb der ver\u00f6ffentlichten Grenze."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Ergebnisposition f\u00fcr die n\u00e4chste Seite; next_offset aus der vorherigen Antwort verwenden."}, "category_slug": {"type": "string", "maxLength": 120, "description": "Optionaler unver\u00e4nderter Kategorie-Slug aus dem aktuellen Katalog."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optionaler ausdr\u00fccklich gew\u00fcnschter Mitarbeiter. Eine ungeeignete oder nicht verf\u00fcgbare Pr\u00e4ferenz wird nicht ersetzt."}, "max_price_cents": {"type": "integer", "minimum": 0, "description": "H\u00f6chster Richtpreis in EUR-Cent vor einer pers\u00f6nlichen Aktionspr\u00fcfung. Der endg\u00fcltige Preis wird separat berechnet."}, "max_duration_minutes": {"type": "integer", "minimum": 1, "maximum": 1440, "description": "Maximale Behandlungsdauer in Minuten; Anzeigeformate sind kein Eingabeformat."}, "available_on": {"type": "string", "format": "date", "description": "Nur Ressourcen mit tats\u00e4chlich freier Kapazit\u00e4t an diesem lokalen Datum anzeigen."}}, "required": [], "additionalProperties": false}, "outputSchema": {"type": "object", "properties": {"contract_version": {"type": "string"}, "business": {"type": "string", "enum": ["salon", "coworking"]}, "language": {"type": "string", "enum": ["de", "en", "ru"]}, "timezone": {"type": "string"}, "local_date": {"type": "string", "format": "date"}, "items": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "string", "pattern": "^(salon|coworking):[1-9][0-9]*$"}, "name": {"type": "string"}, "description": {"type": "string"}, "price": {"type": ["object", "null"], "properties": {"amount_cents": {"type": "integer", "minimum": 0}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{2}$"}, "currency": {"type": "string", "const": "EUR"}, "display": {"type": "string"}}, "required": ["amount_cents", "amount", "currency", "display"]}, "url": {"type": "string", "format": "uri"}}, "required": ["id", "name", "description", "price", "url"]}}, "total": {"type": "integer", "minimum": 0}, "offset": {"type": "integer", "minimum": 0}, "limit": {"type": "integer", "minimum": 1}, "next_offset": {"type": ["integer", "null"]}, "campaign": {"type": ["object", "null"], "properties": {"code": {"type": "string"}, "discount_percent": {"type": "string"}, "customer_eligibility": {"type": "string"}, "requires_contact_check": {"type": "boolean"}, "source": {"type": "string", "const": "homepage_hero"}}, "required": ["code", "discount_percent", "customer_eligibility", "requires_contact_check", "source"]}}, "required": ["contract_version", "business", "language", "timezone", "local_date", "items", "total", "offset", "limit", "next_offset", "campaign"], "additionalProperties": true}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}], "de.dollea/operation": "salon_catalog"}}, {"name": "search_catalog", "title": "UCP-Katalog durchsuchen", "description": "Den aktuellen UCP-Katalog nach Begriffen, Kategorien und Preis durchsuchen. Das Plattformprofil wird gepr\u00fcft. Pers\u00f6nliche Mietpreise erfordern Anmeldung und ausdr\u00fccklich gew\u00e4hlte Tage; unbekannte Preise werden als ausstehende Preispr\u00fcfung ausgewiesen.", "inputSchema": {"type": "object", "properties": {"meta": {"type": "object", "properties": {"ucp-agent": {"type": "object", "properties": {"profile": {"type": "string", "format": "uri", "maxLength": 2048}}, "required": ["profile"], "additionalProperties": false}}, "required": ["ucp-agent"], "additionalProperties": false}, "catalog": {"$ref": "#/$defs/r_c61f1ae24b6326b79930"}}, "required": ["meta", "catalog"], "additionalProperties": false, "$defs": {"r_c61f1ae24b6326b79930": {"type": "object", "properties": {"query": {"type": "string", "description": "Free-text search query."}, "context": {"$ref": "#/$defs/r_3b843cbd4c36e56119c6"}, "signals": {"$ref": "#/$defs/r_78ecafc6e2820de61415"}, "attribution": {"$ref": "#/$defs/r_7daee799628e45737af8"}, "filters": {"$ref": "#/$defs/r_28e4d5c6ab7e15f55c34"}, "pagination": {"$ref": "#/$defs/r_8420277a28fadf1ef978"}}}, "r_3b843cbd4c36e56119c6": {"title": "Context", "description": "Provisional buyer signals for relevance and localization\u2014not authoritative data. Businesses SHOULD use these values when verified inputs (e.g., shipping address) are absent, and MAY ignore or down-rank them if inconsistent with higher-confidence signals (authenticated account, risk detection) or regulatory constraints (export controls). Eligibility and policy enforcement MUST occur at checkout time using binding transaction data. Context SHOULD be non-identifying and can be disclosed progressively\u2014coarse signals early, finer resolution as the session progresses. Higher-resolution data (shipping address, billing address) supersedes context.", "type": "object", "additionalProperties": true, "allOf": [{"$ref": "#/$defs/r_042ca95cba1774389c88"}, {"type": "object", "additionalProperties": true, "properties": {"location": {"type": "string", "description": "Stable, opaque identifier for a Location in the Business's namespace. This provisional, non-binding hint is distinct from the Buyer's locality. The operation specification or an active capability/extension defines its effects. A common example in retail shopping is the default home store ID selected and saved by the user when purchasing groceries."}, "intent": {"type": "string", "description": "Background context describing buyer's intent (e.g., 'looking for a gift under $50', 'need something durable for outdoor use'). Informs relevance, recommendations, and personalization."}, "language": {"type": "string", "description": "Preferred language for content. Use IETF BCP 47 language tags (e.g., 'en', 'fr-CA', 'zh-Hans'). For REST, equivalent to Accept-Language header\u2014platforms SHOULD fall back to Accept-Language when this field is absent; when provided, overrides Accept-Language. Businesses MAY return content in a different language if unavailable."}, "currency": {"type": "string", "description": "Preferred currency (ISO 4217, e.g., 'EUR', 'USD'). Businesses determine presentment currency from context and authoritative signals; this hint MAY inform selection in multi-currency markets. Also serves as the denomination for price filter values \u2014 platforms SHOULD include this field when sending price filters. Response prices include explicit currency confirming the resolution."}, "eligibility": {"type": "array", "description": "Buyer claims about eligible benefits such as loyalty membership, payment instrument perks, and similar. Recognized claims MAY inform the Business response (e.g., member-only product availability, adjusted pricing in catalog, provisional discounts at cart or checkout). Businesses MUST ignore unrecognized values without error. Values MUST use reverse-domain naming (e.g., 'com.example.loyalty_gold', 'org.school.student') and MUST be non-identifying.", "uniqueItems": true, "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}}, "payment": {"type": "array", "description": "Buyer-preferred payment handlers in priority order (most preferred first). Each entry names a handler advertised in the Business profile's `ucp.payment_handlers`, optionally narrowed to preferred instrument types. The Business SHOULD use it to preselect or prioritize the handler (and type, when given) and MAY ignore unavailable or ineligible entries; unrecognized values MUST be ignored without error.", "items": {"type": "object", "required": ["handler"], "properties": {"handler": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Handler registry key advertised in the Business profile's `ucp.payment_handlers`."}, "types": {"type": "array", "description": "Optional preferred instrument types for this handler, in priority order, aligned with the handler's advertised `payment_instrument.type` values (for example `card` or `bank`). Unrecognized values MUST be ignored.", "items": {"type": "string"}}}}}}}]}, "r_042ca95cba1774389c88": {"title": "Locality", "description": "A coarse geographic location \u2014 country, region, and postal code. A lightweight alternative to a full postal address.", "type": "object", "additionalProperties": true, "properties": {"address_country": {"type": "string", "description": "The country, as a 2-letter ISO 3166-1 alpha-2 code (e.g. \"US\"). A 3-letter alpha-3 code or full country name MAY also be used."}, "address_region": {"type": "string", "description": "The first-level administrative region within the country (e.g. a state or province such as California)."}, "postal_code": {"type": "string", "description": "The postal code (e.g. \"94043\")."}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_78ecafc6e2820de61415": {"title": "Signals", "description": "Environment data provided by the platform to support authorization and abuse prevention. Values MUST NOT be buyer-asserted claims \u2014 platforms provide signals based on direct observation or independently verifiable third-party attestations. All signal keys MUST use reverse-domain naming to ensure provenance and prevent collisions when multiple extensions contribute to the shared namespace.", "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Reverse-domain identifier (e.g., dev.ucp.buyer_ip, com.example.device_id)."}, "properties": {"dev.ucp.buyer_ip": {"type": "string", "description": "Client's IP address (IPv4 or IPv6)."}, "dev.ucp.user_agent": {"type": "string", "description": "Client's HTTP User-Agent header or equivalent."}}, "additionalProperties": true}, "r_7daee799628e45737af8": {"title": "Attribution", "description": "Platform-emitted referral and conversion-event context \u2014 campaign identifiers, click IDs, source/medium markers, etc. The same parameters platforms communicate via URL query parameters in browser-based flows.", "type": "object", "additionalProperties": {"type": "string", "description": "URL-style parameter value, encoded as a string. Numeric or boolean values MUST be string-encoded as they would be in a URL query string."}}, "r_28e4d5c6ab7e15f55c34": {"title": "Search Filters", "description": "Filter criteria to narrow search results. All specified filters combine with AND logic.", "type": "object", "properties": {"categories": {"type": "array", "items": {"type": "string"}, "description": "Filter by product categories (OR logic \u2014 matches products in any listed categories). Values match against the value field in product category entries. Valid values can be discovered from the categories field in search results, merchant documentation, or standard taxonomies that businesses may align with."}, "price": {"$ref": "#/$defs/r_c28f892525d94e0c3751"}}, "additionalProperties": true}, "r_c28f892525d94e0c3751": {"title": "Price Filter", "description": "Price range filter denominated in context.currency. When context.currency matches the presentment currency, businesses apply the filter directly. When it differs, businesses SHOULD convert filter values to the presentment currency before applying; if conversion is not supported, businesses MAY ignore the filter and SHOULD indicate this via a message. When context.currency is absent, filter denomination is ambiguous and businesses MAY ignore it.", "type": "object", "properties": {"min": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Minimum price in ISO 4217 minor units."}, "max": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Maximum price in ISO 4217 minor units."}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_8420277a28fadf1ef978": {"type": "object", "description": "Pagination parameters for requests.", "properties": {"cursor": {"type": "string", "description": "Opaque cursor from previous response."}, "limit": {"type": "integer", "minimum": 1, "description": "Requested page size, not a guaranteed result count. When omitted, the Business MUST apply a default page size. A default of 10 is RECOMMENDED, but the Business MAY choose another value. The Business MAY return fewer results than the requested or default page size, including when enforcing its maximum page size. A Platform MUST NOT assume that the response count equals either value."}}}}}, "outputSchema": {"type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "$ref": "#/$defs/r_d569cc6abcf18d0254a1", "$defs": {"r_d569cc6abcf18d0254a1": {"type": "object", "required": ["ucp", "products"], "properties": {"ucp": {"$ref": "#/$defs/r_31dbdfed656c20d0289d"}, "products": {"type": "array", "items": {"$ref": "#/$defs/r_032acacb42b993f8b0e3"}, "description": "Products matching the search criteria."}, "pagination": {"$ref": "#/$defs/r_36cdd449e8dacb7765cd"}, "actions": {"$ref": "#/$defs/r_9d983cfdd670073bf08f", "description": "Outstanding extension-defined Actions for this catalog search response.", "ucp_request": "omit"}, "messages": {"type": "array", "items": {"$ref": "#/$defs/r_3071c80f2258926c6eb8"}, "description": "Errors, warnings, or informational messages about the search results."}, "policies": {"type": "array", "items": {"$ref": "#/$defs/r_a351b7a88b54cccfabbc"}, "description": "Policies (e.g., return/refund terms) that apply to the products in these search results. `applies_to` targets are relative to the response root; when absent or empty, refer to the URLs in `links[]`."}}}, "r_31dbdfed656c20d0289d": {"title": "UCP Catalog Response Schema", "description": "UCP metadata for catalog responses.", "allOf": [{"$ref": "#/$defs/r_7116a3b12e850856e319"}, {"properties": {"capabilities": {"additionalProperties": {"items": {"$ref": "#/$defs/r_258cad0ffb5ad23c68a4"}}}}}]}, "r_7116a3b12e850856e319": {"description": "Base UCP metadata with shared properties for all schema types.", "type": "object", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831"}, "map_order": {"$ref": "#/$defs/r_da7e6cd3fc02ee7a6bdd", "description": "Preferred key-traversal order for sibling registry fields inside the root `ucp` envelope (`services`, `capabilities`, and `payment_handlers`).", "ucp_request": "omit"}, "status": {"type": "string", "enum": ["success", "error"], "default": "success", "description": "Application-level status of the UCP operation."}, "services": {"type": "object", "description": "Service registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_a2d0c5c2aaa51537d5cd"}}}, "capabilities": {"type": "object", "description": "Capability registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}}}, "payment_handlers": {"type": "object", "description": "Payment handler registry keyed by reverse-domain name.", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "items": {"$ref": "#/$defs/r_251976d6bc875de7dba3"}}}}}, "r_6ca21bff46d30c1de831": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Version identifier in YYYY-MM-DD format."}, "r_da7e6cd3fc02ee7a6bdd": {"type": "object", "description": "Preferred key order for map-valued fields in the scope annotated by the containing `ucp` member. Each property names a target map, and its array lists target keys in preferred order. Lists may be partial and are not allowlists.", "additionalProperties": {"type": "array", "items": {"type": "string"}}}, "r_6d74f404bcd6e0f16829": {"title": "Reverse Domain Name", "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold'). Segments after the first are domain- or identifier-derived: they may contain interior hyphens, may start with a digit, and may contain underscores (e.g., 'com.example-shop.checkout', 'com.2example.cart', 'dev.ucp.common.identity_linking'), but must not start or end with a hyphen. The first segment (the reversed top-level domain) is letters and digits, and may contain interior hyphens to support internationalized (punycode) top-level domains such as 'xn--p1ai'.", "type": "string", "pattern": "^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9_])?)+$", "examples": ["dev.ucp.shopping.checkout", "dev.ucp.common.identity_linking", "com.example.loyalty_gold", "com.example-shop.checkout", "com.2example.cart", "uk.co.example-shop.checkout", "xn--p1ai.example.checkout"]}, "r_a2d0c5c2aaa51537d5cd": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["transport"], "properties": {"transport": {"type": "string", "enum": ["rest", "mcp", "a2a", "embedded"], "description": "Transport protocol for this service binding."}, "endpoint": {"type": "string", "format": "uri", "description": "Endpoint URL for this transport binding."}}}]}, "r_a2eb0eadda944d606d8d": {"type": "object", "description": "Shared foundation for all UCP entities.", "required": ["version"], "properties": {"version": {"$ref": "#/$defs/r_6ca21bff46d30c1de831", "description": "Entity version in YYYY-MM-DD format."}, "spec": {"type": "string", "format": "uri", "description": "URL to human-readable specification document."}, "schema": {"type": "string", "format": "uri", "description": "URL to JSON Schema defining this entity's structure and payloads."}, "id": {"type": "string", "description": "Unique identifier for this entity instance. Used to disambiguate when multiple instances exist."}, "config": {"type": "object", "description": "Entity-specific configuration. Structure defined by each entity's schema.", "additionalProperties": true}}}, "r_ddfcd1f84f7738d6744b": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "properties": {"extends": {"oneOf": [{"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, {"type": "array", "items": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "minItems": 1}], "description": "Parent capability(s) this extends. Present for extensions, absent for root capabilities. Use array for multi-parent extensions."}}}]}, "r_251976d6bc875de7dba3": {"allOf": [{"$ref": "#/$defs/r_a2eb0eadda944d606d8d"}, {"type": "object", "required": ["id"]}, {"type": "object", "properties": {"available_instruments": {"type": "array", "items": {"$ref": "#/$defs/r_2b8f633efdee89ee73e5"}, "description": "Instrument types this handler supports, with optional constraints. When absent, every instrument should be considered available.", "minItems": 1}}}]}, "r_2b8f633efdee89ee73e5": {"title": "Available Payment Instrument", "description": "An instrument type available from a payment handler with optional constraints.", "type": "object", "required": ["type"], "properties": {"type": {"type": "string", "description": "The instrument type identifier (e.g., 'card', 'gift_card'). References an instrument schema's type constant."}, "constraints": {"$ref": "#/$defs/r_df7cea4ad60ad14269a2", "description": "A Constraint Expression describing the instrument this entry makes available. Keys in `properties` name members of the `constraint_target` declared by the instrument schema for this `type`. Requirements on submitted request data belong in `ucp.request_constraints` instead."}}}, "r_df7cea4ad60ad14269a2": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_8e969bc3c31dfc5e8f34": {"title": "Constraint Expression", "description": "A closed JSON Schema Draft 2020-12 constraint expression with Object and Value Constraint positions.", "type": "object", "properties": {"required": {"type": "array", "description": "Property names required by the constrained object. Must be non-empty: an empty array applies no constraint.", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}}, "properties": {"type": "object", "description": "Constraints keyed by property name. Must be non-empty: an empty object applies no constraint.", "minProperties": 1, "additionalProperties": {"oneOf": [{"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34"}, {"$ref": "#/$defs/r_01121ad4caedb74fd9d5"}]}}, "anyOf": {"type": "array", "description": "Alternative Object Constraints. The constrained object must satisfy at least one. A branch must be non-empty: an empty branch is satisfied by every object and neutralizes the alternation.", "minItems": 1, "items": {"$ref": "#/$defs/r_8e969bc3c31dfc5e8f34", "minProperties": 1}}}, "additionalProperties": false, "$defs": {"value_constraint": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}}}, "r_01121ad4caedb74fd9d5": {"type": "object", "description": "A Value Constraint containing `enum`, `const`, or both.", "anyOf": [{"required": ["enum"]}, {"required": ["const"]}], "properties": {"enum": {"type": "array", "description": "A non-empty array of unique JSON values.", "minItems": 1, "uniqueItems": true}, "const": {}}, "additionalProperties": false}, "r_258cad0ffb5ad23c68a4": {"title": "Capability (Response Schema)", "description": "Capability reference in responses. Only name/version required to confirm active capabilities.", "allOf": [{"$ref": "#/$defs/r_ddfcd1f84f7738d6744b"}]}, "r_032acacb42b993f8b0e3": {"title": "Product", "description": "A product in the catalog with variants and options.", "type": "object", "required": ["id", "title", "description", "price_range", "variants"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this product."}, "handle": {"type": "string", "description": "URL-safe slug for SEO-friendly URLs (e.g., 'blue-runner-pro'). Use id for stable API references."}, "title": {"type": "string", "description": "Product title."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Product description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical product page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Product categories with optional taxonomy identifiers."}, "price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "Price range across all variants."}, "list_price_range": {"$ref": "#/$defs/r_09586324eb40756c3c6f", "description": "List price range before discounts (for strikethrough display)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Product media (images, videos, 3D models). First item is the featured media for listings."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7819ee2b082046b3267f"}, "description": "Product options (Size, Color, etc.)."}, "variants": {"type": "array", "items": {"$ref": "#/$defs/r_bfcb08b4789ccef0057d"}, "minItems": 1, "description": "Purchasable variants of this product. First item is the featured variant for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Aggregate product rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Product tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard product model."}}}, "r_f0d6c56eaf863a32e380": {"title": "Description", "description": "Description content in one or more formats. At least one format must be provided.", "type": "object", "properties": {"plain": {"type": "string", "description": "Plain text content."}, "html": {"type": "string", "description": "HTML-formatted content. Security: Platforms MUST sanitize before rendering\u2014strip scripts, event handlers, and untrusted elements. Treat all rich text as untrusted input."}, "markdown": {"type": "string", "description": "Markdown-formatted content."}}, "minProperties": 1}, "r_1d1541c3d7066157e070": {"title": "Category", "description": "A product category with optional taxonomy identifier.", "type": "object", "required": ["value"], "properties": {"value": {"type": "string", "description": "Category value or path (e.g., 'Apparel > Shirts', '1604')."}, "taxonomy": {"type": "string", "description": "Source taxonomy. Well-known values: `google_product_category`, `shopify`, `merchant`."}}}, "r_09586324eb40756c3c6f": {"title": "Price Range", "description": "A price range representing minimum and maximum values (e.g., a common example in retail shopping is when prices vary across product variants).", "type": "object", "required": ["min", "max"], "properties": {"min": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Minimum price in the range."}, "max": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Maximum price in the range."}}}, "r_580318bc70fdf8477779": {"title": "Price", "description": "Price with explicit currency.", "type": "object", "required": ["amount", "currency"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Amount in ISO 4217 minor units. Use 0 for free items."}, "currency": {"type": "string", "description": "ISO 4217 currency code (e.g., 'USD', 'EUR', 'GBP').", "pattern": "^[A-Z]{3}$"}}}, "r_f0b3beb3f454c97ab361": {"title": "Amount", "description": "Monetary amount in the currency's minor unit as defined by ISO 4217. Refer to the currency's exponent to determine minor-to-major ratio (e.g., 2 for USD, 0 for JPY, 3 for KWD).", "type": "integer", "minimum": 0, "maximum": 9007199254740991}, "r_fad91f406aba9b92dbb0": {"title": "Media", "description": "Media item (image, video, etc.).", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Media type. Well-known values: `image`, `video`, `model_3d`."}, "url": {"type": "string", "format": "uri", "description": "URL to the media resource."}, "alt_text": {"type": "string", "description": "Accessibility text describing the media."}, "width": {"type": "integer", "minimum": 1, "description": "Width in pixels (for images/video)."}, "height": {"type": "integer", "minimum": 1, "description": "Height in pixels (for images/video)."}}}, "r_7819ee2b082046b3267f": {"title": "Product Option", "description": "A product option such as size, color, or material.", "type": "object", "required": ["name", "values"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size', 'Color')."}, "values": {"type": "array", "items": {"$ref": "#/$defs/r_048eadb025b666eec338"}, "minItems": 1, "description": "Available values for this option."}}}, "r_048eadb025b666eec338": {"title": "Option Value", "description": "A selectable value for a product option.", "type": "object", "required": ["label"], "properties": {"id": {"type": "string", "description": "Optional server-assigned identifier for this option value. When present in a selected_option, the server SHOULD use it for matching instead of label."}, "label": {"type": "string", "description": "Display text for this option value (e.g., 'Small', 'Blue')."}}}, "r_bfcb08b4789ccef0057d": {"title": "Variant", "description": "A purchasable variant of a product with specific option selections.", "type": "object", "required": ["id", "title", "description", "price"], "properties": {"id": {"type": "string", "description": "Global ID (GID) uniquely identifying this variant. Used as item.id in checkout."}, "sku": {"type": "string", "description": "Business-assigned identifier for inventory and fulfillment."}, "barcodes": {"type": "array", "items": {"type": "object", "required": ["type", "value"], "properties": {"type": {"type": "string", "description": "Barcode standard. Well-known values: UPC, EAN, ISBN, GTIN, JAN."}, "value": {"type": "string", "description": "Barcode value."}}}, "description": "Industry-standard product identifiers for cross-reference and correlation."}, "handle": {"type": "string", "description": "URL-safe variant handle/slug."}, "title": {"type": "string", "description": "Variant display title (e.g., 'Blue / Large')."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Variant description in one or more formats."}, "url": {"type": "string", "format": "uri", "description": "Canonical variant page URL."}, "categories": {"type": "array", "items": {"$ref": "#/$defs/r_1d1541c3d7066157e070"}, "description": "Variant categories with optional taxonomy identifiers."}, "price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "Current selling price. Price is the amount per one whole `quantity_unit.unit` (for example, per lb or per hour); when `quantity_unit` is absent, it is per `each`. Line total is `price \u00d7 quantity \u00d7 10^-scale`, computed and rounded once by the Business; `totals` remain authoritative."}, "quantity_unit": {"$ref": "#/$defs/r_0d55f12cd1240424e2a9", "description": "Sale basis this variant's `quantity` is denominated in. The default sale basis is `each`, whose machine identity is (`C62`, 0); `C62` is the UN/CEFACT Rec20 code for one/each. An absent catalog descriptor encodes that default. An `increment` advertises the ordering granularity in steps (for example, `scale` 2 with `increment` 25 sells in 0.25-unit multiples)."}, "list_price": {"$ref": "#/$defs/r_580318bc70fdf8477779", "description": "List price before discounts (for strikethrough display)."}, "unit_price": {"$ref": "#/$defs/r_e00c60be8af44c2409fd", "description": "Price per standard unit of measurement, for shelf-style comparison display. MAY be omitted when unit pricing does not apply."}, "availability": {"$ref": "#/$defs/r_711f2de553f2bc08d5e4", "description": "Variant availability for purchase."}, "options": {"type": "array", "items": {"$ref": "#/$defs/r_7013e6ffdb05f46d5980"}, "description": "Option values that define this variant (e.g., Color: Blue, Size: Large)."}, "media": {"type": "array", "items": {"$ref": "#/$defs/r_fad91f406aba9b92dbb0"}, "description": "Variant media (images, videos, 3D models). First item is the featured media for listings."}, "rating": {"$ref": "#/$defs/r_8d848da0073855027813", "description": "Variant rating."}, "tags": {"type": "array", "items": {"type": "string"}, "description": "Variant tags for categorization and search."}, "metadata": {"type": "object", "description": "Business-defined custom data extending the standard variant model."}, "seller": {"type": "object", "description": "Optional seller context for this variant.", "properties": {"name": {"type": "string", "description": "Seller display name."}, "links": {"type": "array", "items": {"$ref": "#/$defs/r_78eb2bf7d8f853718428"}, "description": "Seller policy and information links."}}}}}, "r_0d55f12cd1240424e2a9": {"title": "Quantity Unit", "description": "Sale-basis descriptor for quantities: the shared unit descriptor plus the Business's ordering policy. Its unit-descriptor machine identity remains (`unit`, effective `scale`); `display_text` and `increment` are excluded from identity and mismatch comparison.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "properties": {"increment": {"type": "integer", "minimum": 1, "default": 1, "description": "Ordering granularity, denominated in steps: the Business sells this item in integer multiples of `increment` steps. Its effective value is the provided value or 1. Advisory merchandising policy, not a representational bound: Platform-authored quantities SHOULD be integer multiples of the effective increment; the Business MAY accept, revise, or reject an off-increment request with a recoverable business outcome and MUST NOT silently reinterpret it. Business-authored quantities (checkout revisions, fulfillment events, adjustments) are bounded only by `scale`."}}}]}, "r_5c66eb03f4d3021766c4": {"title": "Unit", "description": "A reusable unit descriptor for quantities and measures. Its unit-descriptor machine identity is (`unit`, effective `scale`), where effective `scale` is the provided `scale` or 0; `display_text` is excluded.", "type": "object", "required": ["unit", "display_text"], "properties": {"unit": {"type": "string", "description": "Stable machine identifier. The Business SHOULD use the exact UN/CEFACT Rec20 Common Code when one accurately identifies the unit. Otherwise, the Business MAY use a custom unit identifier and MUST use it consistently for the same unit. The Platform MUST treat an unrecognized identifier as opaque."}, "scale": {"type": "integer", "minimum": 0, "maximum": 15, "default": 0, "description": "One step equals `10^-scale` of `unit`. When `unit` is `C62`, `scale`, if present, MUST be 0. The maximum of 15 is derived from the interoperable integer range: at scale 16 a single whole unit (10^16 steps) is no longer representable, so larger scales cannot denominate one unit of their own basis. Businesses needing finer granularity use a smaller unit."}, "display_text": {"type": "string", "description": "Required printable unit label provided by the Business. The Platform MUST use it when it does not recognize `unit`; for a recognized UN/CEFACT Rec 20 Common Code, the Platform MAY substitute its own localized label. It does not participate in unit identity or mismatch comparison."}}, "allOf": [{"if": {"properties": {"unit": {"const": "C62"}}, "required": ["unit"]}, "then": {"properties": {"scale": {"const": 0}}}}]}, "r_e00c60be8af44c2409fd": {"title": "Unit Price", "description": "Price per standard unit of measurement. MAY be omitted when unit pricing does not apply. `unit_price.currency` MUST equal `price.currency`; the comparator MUST NOT perform currency conversion. `measure.unit` and `reference.unit` MUST be identical; cross-unit conversion is not permitted. Their scales MAY differ; each value represents `value \u00d7 10^-scale`.", "type": "object", "required": ["amount", "currency", "measure", "reference"], "properties": {"amount": {"$ref": "#/$defs/r_f0b3beb3f454c97ab361", "description": "Unit price in ISO 4217 minor units. After satisfying the same-unit invariant, the Business MUST compute the comparator as `(price.amount / (measure.value \u00d7 10^-measure.scale)) \u00d7 (reference.value \u00d7 10^-reference.scale)` and round it once to ISO 4217 minor units according to its pricing rules. The returned `unit_price.amount` is authoritative; the Platform MUST NOT recompute or substitute its own result."}, "currency": {"type": "string", "pattern": "^[A-Z]{3}$", "description": "ISO 4217 currency code."}, "measure": {"description": "Product quantity in packaging/content (for example, a 750 mL bottle), distinct from `quantity_unit`, which defines the sale basis. Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}, "reference": {"description": "Denominator for unit price display (for example, per 100 mL or per 1 kg). Its integer `value` MUST be at least 1.", "allOf": [{"$ref": "#/$defs/r_432d134f0f52d9379ad6"}, {"type": "object", "properties": {"value": {"minimum": 1}}}]}}}, "r_432d134f0f52d9379ad6": {"title": "Measure", "description": "A measure composed of an integer value and a unit descriptor. Its value is the integer count of `10^-scale` units of `unit`.", "allOf": [{"$ref": "#/$defs/r_5c66eb03f4d3021766c4"}, {"type": "object", "required": ["value"], "properties": {"value": {"type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991, "description": "Integer count of `10^-scale` units of `unit`."}}}]}, "r_711f2de553f2bc08d5e4": {"title": "Availability", "description": "Availability of an item: whether it can be obtained, and a qualifying status.", "type": "object", "properties": {"available": {"type": "boolean", "description": "Whether this can be obtained. See status for fulfillment details."}, "status": {"type": "string", "description": "Qualifies available with fulfillment state. Well-known values: `in_stock`, `backorder`, `preorder`, `out_of_stock`, `discontinued`."}}}, "r_7013e6ffdb05f46d5980": {"title": "Selected Option", "description": "A specific option selection on a variant (e.g., Size: Large).", "type": "object", "required": ["name", "label"], "properties": {"name": {"type": "string", "description": "Option name (e.g., 'Size')."}, "id": {"type": "string", "description": "Optional option value identifier from option_value.id. When present, the server SHOULD use it for matching; name and label remain required for display."}, "label": {"type": "string", "description": "Selected option label (e.g., 'Large')."}}}, "r_8d848da0073855027813": {"title": "Rating", "description": "Product rating aggregate.", "type": "object", "required": ["value", "scale_max"], "properties": {"value": {"type": "number", "minimum": 0, "description": "Average rating value."}, "scale_min": {"type": "number", "minimum": 0, "default": 1, "description": "Minimum value on the rating scale (e.g., 1 for 1-5 stars)."}, "scale_max": {"type": "number", "minimum": 1, "description": "Maximum value on the rating scale (e.g., 5 for 5-star)."}, "count": {"type": "integer", "minimum": 0, "description": "Number of reviews contributing to the rating."}}}, "r_78eb2bf7d8f853718428": {"title": "Link", "type": "object", "required": ["type", "url"], "properties": {"type": {"type": "string", "description": "Type of link. Well-known values: `privacy_policy`, `terms_of_service`, `refund_policy`, `shipping_policy`, `faq`. Consumers SHOULD handle unknown values gracefully by displaying them using the `title` field or omitting the link."}, "url": {"type": "string", "description": "The actual URL pointing to the content to be displayed.", "format": "uri"}, "title": {"type": "string", "description": "Optional display text for the link. When provided, use this instead of generating from type."}}}, "r_36cdd449e8dacb7765cd": {"type": "object", "description": "Pagination information in responses.", "properties": {"cursor": {"type": "string", "description": "Cursor to fetch the next page of results. MUST be present when has_next_page is true."}, "has_next_page": {"type": "boolean", "description": "Whether more results are available."}, "total_count": {"type": "integer", "minimum": 0, "description": "Total number of matching items, if available."}}, "required": ["has_next_page"], "if": {"properties": {"has_next_page": {"const": true}}, "required": ["has_next_page"]}, "then": {"required": ["cursor"]}}, "r_9d983cfdd670073bf08f": {"title": "Actions", "description": "Outstanding extension-defined Action instances, keyed by reverse-domain Action type, not extension name.", "$defs": {"instance": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}}, "type": "object", "propertyNames": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829"}, "additionalProperties": {"type": "array", "description": "Non-empty instances of one Action type. JSON preserves array order; the declaring extension defines whether order has processing semantics.", "minItems": 1, "items": {"$ref": "#/$defs/r_901ebc24b81656362162"}}}, "r_901ebc24b81656362162": {"type": "object", "description": "Common fields for one outstanding Action instance are id and optional config. The extension declaring the Action type defines type-specific processing data under config. Additional properties are permitted for forward compatibility.", "required": ["id"], "additionalProperties": true, "properties": {"id": {"type": "string", "minLength": 1, "description": "Identifier for this Action instance.", "ucp_request": "omit"}, "config": {"type": "object", "description": "Configuration defined by the extension that declares this Action type.", "additionalProperties": true, "ucp_request": "omit"}}}, "r_3071c80f2258926c6eb8": {"title": "Message", "type": "object", "description": "Container for error, warning, or info messages.", "oneOf": [{"$ref": "#/$defs/r_14e3b8ead1e88b408c50"}, {"$ref": "#/$defs/r_f9623226067b01b25500"}, {"$ref": "#/$defs/r_8857abde4865c3419043"}]}, "r_14e3b8ead1e88b408c50": {"title": "Message Error", "type": "object", "required": ["type", "code", "content", "severity"], "properties": {"type": {"type": "string", "const": "error", "description": "Message type discriminator."}, "code": {"$ref": "#/$defs/r_4ac9f67da2708b5e56d6"}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}, "severity": {"type": "string", "enum": ["recoverable", "requires_buyer_input", "requires_buyer_review", "unrecoverable"], "description": "Reflects the resource state and recommended action. 'recoverable': platform can resolve the condition in band, for example by modifying inputs or processing a related Action, and submit a new operation when needed. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules. 'unrecoverable': no valid resource exists to act on, retry with new resource or inputs. Errors with 'requires_*' severity contribute to 'status: requires_escalation'."}}}, "r_4ac9f67da2708b5e56d6": {"title": "Error Code", "description": "Error code identifying the type of error. Standard errors are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["not_found", "out_of_stock", "item_unavailable", "address_undeliverable", "payment_failed", "eligibility_invalid", "identity_required", "insufficient_scope"]}, "r_f9623226067b01b25500": {"title": "Message Warning", "type": "object", "required": ["type", "code", "content"], "properties": {"type": {"type": "string", "const": "warning", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_edb637acae7c006c6550"}, "content": {"type": "string", "description": "Human-readable warning message that MUST be displayed."}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "presentation": {"type": "string", "default": "notice", "description": "Rendering contract for this warning. 'notice' (default): platform MUST display, MAY dismiss. 'disclosure': platform MUST display in proximity to the path-referenced component, MUST NOT hide or auto-dismiss. See specification for full contract."}, "image_url": {"type": "string", "format": "uri", "description": "URL to a required visual element (e.g., warning symbol, energy class label)."}, "url": {"type": "string", "format": "uri", "description": "Reference URL for more information (e.g., regulatory site, registry entry, policy page)."}}}, "r_edb637acae7c006c6550": {"title": "Warning Code", "description": "Warning code identifying the type of warning. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["final_sale", "prop65", "fulfillment_changed", "payment_term_changed", "age_restricted"]}, "r_8857abde4865c3419043": {"title": "Message Info", "type": "object", "required": ["type", "content"], "properties": {"type": {"type": "string", "const": "info", "description": "Message type discriminator."}, "path": {"type": "string", "description": "RFC 9535 JSONPath to the component the message refers to (e.g., $.line_items[0])."}, "code": {"$ref": "#/$defs/r_2fb517c12e3bdb498ea6"}, "content_type": {"type": "string", "enum": ["plain", "markdown"], "default": "plain", "description": "Content format, default = plain."}, "content": {"type": "string", "description": "Human-readable message."}}}, "r_2fb517c12e3bdb498ea6": {"title": "Info Code", "description": "Info code identifying the type of informational message. Standard codes are defined in capability specifications (see examples) and have standardized semantics; freeform codes are permitted.", "type": "string", "examples": ["identity_optional", "signal", "free_shipping", "not_found"]}, "r_a351b7a88b54cccfabbc": {"title": "Policy", "description": "A durable business rule about the items in a response \u2014 return/refund terms, warranty, and the like \u2014 at the time of purchase. Every policy carries a `type` (an open reverse-DNS vocabulary) and a `description` so a platform can present it without understanding its type-specific fields; type-specific fields (gated by `type`) add structured context for platforms that model that type. Policies are reference data; the obligation to display a term to the buyer is carried by a `messages[]` warning whose `code` equals the policy `type` \u2014 see the Policies section of the specification.", "type": "object", "required": ["type", "description"], "additionalProperties": true, "properties": {"type": {"$ref": "#/$defs/r_6d74f404bcd6e0f16829", "description": "Policy type discriminator. Open reverse-DNS vocabulary. Well-known values: `dev.ucp.shopping.policy.return` (return terms), `dev.ucp.shopping.policy.warranty` (warranty terms). Businesses MAY define custom types in their own domain (e.g., `com.example.policy.price_match`). Platforms MUST tolerate unknown values."}, "description": {"$ref": "#/$defs/r_f0d6c56eaf863a32e380", "description": "Human-readable policy summary in one or more formats (plain, markdown, html). Required on every policy so a platform can present it without understanding any type-specific fields. This is not the buyer-facing disclosure \u2014 display is compelled by a `messages[]` warning (see the Policies section)."}, "applies_to": {"type": "array", "items": {"type": "string"}, "description": "RFC 9535 JSONPath expressions identifying the nodes this policy applies to, relative to the embedding response root (e.g., `$.line_items[0]` in cart/checkout, `$.products[2]` in catalog). Each target covers the node it names and everything nested under it, so a target on a product also covers its variants. A singular query (RFC 9535 Section 2.3.5.1; name and index selectors only) names a single node; filters, wildcards, and slices match a set. When omitted, the policy applies to the entire response. When policies of the same `type` contest a node, the narrowest target wins and overrides the rest. See the Policies section for how specificity resolves."}, "url": {"type": "string", "format": "uri", "description": "Optional link to the full policy document."}}}}}, "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}, "_meta": {"securitySchemes": [{"type": "noauth"}, {"type": "oauth2", "scopes": ["coworking:read"]}], "de.dollea/operation": "ucp_search_catalog"}}], "browser_tools": []}