{"contract_version": "1.0.0", "business": "both", "language": "en", "tools": [{"name": "coworking_confirm_booking", "title": "Confirm coworking booking", "description": "Confirm the reviewed personal coworking offer. Partially available series need explicit approval. Prices and occupancy are checked again. Retries do not create extra rental days or confirmations.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "ID of the booking offer previously prepared by the server."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Offer access key returned only on creation. Do not publish it or derive it from other accounts' data."}, "accept_privacy": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed privacy policy."}, "accept_terms": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed terms and offer price."}, "accept_cancellation": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed cancellation policy."}, "confirm_partial_series": {"type": "boolean", "default": false, "description": "For a shortened rental series, send true only after explicit approval of every omitted day."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Find available coworking days", "description": "Check a workspace's available rental days. Group and component occupancy is checked together. Other tenants' data is not disclosed.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Current numeric workspace ID from coworking_search_workspaces."}, "from_date": {"type": "string", "format": "date", "description": "First local calendar day in Munich, in YYYY-MM-DD format."}, "to_date": {"type": "string", "format": "date", "description": "Last local calendar day of the bounded search period, inclusive."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Check coworking approval", "description": "Check the connected account's current coworking approval. Return workspaces with approved prices and next steps without exposing other accounts' prices.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Inspect own rental booking", "description": "Read an own coworking booking and actual decisions on change requests. Other accounts' IDs do not grant access.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "ID of an own rental booking from coworking_list_bookings."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Retrieve own invoice", "description": "Retrieve an own invoice by ID. Unknown or foreign IDs are treated as unavailable.", "inputSchema": {"type": "object", "properties": {"invoice_id": {"type": "integer", "minimum": 1, "description": "ID of an own invoice from coworking_list_invoices."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Check personal coworking price", "description": "Check the personal rental price for explicit days. Respect current weekly terms, account approval and monthly agreements. A monthly agreement does not mean free rental.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Current numeric workspace ID from coworking_search_workspaces."}, "dates": {"type": "array", "items": {"type": "string", "format": "date"}, "minItems": 1, "maxItems": 180, "uniqueItems": true, "description": "Explicit local rental dates in YYYY-MM-DD format. The server checks every day and reports conflicts."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Check coworking offer", "description": "Check an own coworking offer including available days, prices and terms. The original account and access key are required.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "ID of the booking offer previously prepared by the server."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Offer access key returned only on creation. Do not publish it or derive it from other accounts' data."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Read own coworking bookings", "description": "Read only the connected account's rental bookings with their statuses and personal daily prices.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Maximum returned result count within the published limit."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "description": "Next-page result position; use next_offset from the previous response."}}, "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": "Read own invoices", "description": "Read the connected account's invoices with amounts, due dates and protected downloads. Do not return admin notes or other accounts' invoices.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Maximum returned result count within the published limit."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "description": "Next-page result position; use next_offset from the previous response."}}, "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": "Prepare coworking booking", "description": "Create a personal rental offer for selected or recurring days. Explicitly report conflicts. Preparation books nothing. Show monthly agreements and extra daily charges separately.", "inputSchema": {"type": "object", "properties": {"workspace_id": {"type": "integer", "minimum": 1, "description": "Current numeric workspace ID from coworking_search_workspaces."}, "dates": {"type": "array", "items": {"type": "string", "format": "date"}, "minItems": 1, "maxItems": 180, "uniqueItems": true, "description": "Explicit local rental dates in YYYY-MM-DD format. The server checks every day and reports conflicts."}, "recurrence": {"type": "object", "properties": {"rule": {"type": "string", "enum": ["weekly", "monthly"]}, "until": {"type": "string", "format": "date"}}, "required": ["rule", "until"], "additionalProperties": false, "description": "Optional weekly or monthly recurrence of explicitly selected days until the local end date."}, "notes": {"type": "string", "maxLength": 2000, "description": "Optional note from the booking user, at most 2000 characters."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Request coworking cancellation", "description": "Request cancellation of an own rental booking. A single durable request and notification are created; retries return the same request.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "ID of an own rental booking from coworking_list_bookings."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "reason": {"type": "string", "minLength": 1, "maxLength": 2000, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Request coworking change", "description": "Request an alternative rental booking for the connected account. Occupancy and pending requests are checked. The change stays open until the existing approval workflow completes.", "inputSchema": {"type": "object", "properties": {"booking_id": {"type": "integer", "minimum": 1, "description": "ID of an own rental booking from coworking_list_bookings."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "new_date": {"type": "string", "format": "date", "description": "Requested alternative rental date in YYYY-MM-DD format."}, "reason": {"type": "string", "minLength": 1, "maxLength": 2000, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Find coworking workspaces", "description": "Find beauty coworking resources in Munich by activity, equipment, capacity and date. Groups share occupancy with component places. Personal prices require an authorized price check.", "inputSchema": {"type": "object", "properties": {"query": {"type": "string", "maxLength": 500, "default": "", "description": "Short search terms for the desired treatment, activity or equipment."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Maximum returned result count within the published limit."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Next-page result position; use next_offset from the previous response."}, "equipment_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "uniqueItems": true, "maxItems": 50, "description": "All required equipment IDs must be present at the workspace."}, "min_persons": {"type": "integer", "minimum": 1, "maximum": 1000, "description": "Required minimum workspace capacity."}, "groups_only": {"type": "boolean", "description": "Return combined group workspaces only."}, "supported_uses": {"type": "array", "items": {"type": "string", "enum": ["cosmetics", "body_treatments", "pmu", "lashes", "brows", "manicure", "nail_design", "pedicure", "training"]}, "uniqueItems": true, "description": "Requested activity codes, for example manicure, lashes or cosmetics."}, "available_on": {"type": "string", "format": "date", "description": "Return only resources with actual free capacity on this local date."}}, "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": "Read own working hours", "description": "Read your own weekly hours, special days and blocked periods. Customer appointments and other specialists' data are not returned.", "inputSchema": {"type": "object", "properties": {"from_date": {"type": "string", "format": "date", "description": "First local calendar day in Munich, in YYYY-MM-DD format."}, "to_date": {"type": "string", "format": "date", "description": "Last local calendar day of the bounded search period, inclusive."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Create own blocked period", "description": "Create a blocked period for the connected specialist. Existing portal permissions and category assignments apply. The same submission ID does not create another block.", "inputSchema": {"type": "object", "properties": {"start_at": {"type": "string", "format": "date-time", "description": "Exact appointment start as an ISO datetime with timezone offset. Resolve relative times using the supplied Munich local clock first."}, "end_at": {"type": "string", "format": "date-time", "description": "End of own availability or blocked period as an ISO datetime with timezone offset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "service_category_id": {"type": "integer", "minimum": 1, "description": "Optional own service category; without a category the block applies to all own services."}, "reason": {"type": "string", "maxLength": 200, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Create own extra availability", "description": "Add a special available day for the connected specialist. Start and end must fall on the same local day.", "inputSchema": {"type": "object", "properties": {"start_at": {"type": "string", "format": "date-time", "description": "Exact appointment start as an ISO datetime with timezone offset. Resolve relative times using the supplied Munich local clock first."}, "end_at": {"type": "string", "format": "date-time", "description": "End of own availability or blocked period as an ISO datetime with timezone offset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Remove own blocked period", "description": "Remove an own blocked period. A repeated submission's result remains available after deletion.", "inputSchema": {"type": "object", "properties": {"block_id": {"type": "integer", "minimum": 1, "description": "ID of an own blocked period from coworking_staff_availability."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Remove own extra availability", "description": "Remove an own special available day. Other specialists' profiles remain outside this permission.", "inputSchema": {"type": "object", "properties": {"special_day_id": {"type": "integer", "minimum": 1, "description": "ID of an own special day from coworking_staff_availability."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Update own blocked period", "description": "Update an own blocked period with complete new time boundaries. Other specialists cannot be selected.", "inputSchema": {"type": "object", "properties": {"block_id": {"type": "integer", "minimum": 1, "description": "ID of an own blocked period from coworking_staff_availability."}, "start_at": {"type": "string", "format": "date-time", "description": "Exact appointment start as an ISO datetime with timezone offset. Resolve relative times using the supplied Munich local clock first."}, "end_at": {"type": "string", "format": "date-time", "description": "End of own availability or blocked period as an ISO datetime with timezone offset."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "service_category_id": {"type": ["integer", "null"], "minimum": 1, "description": "Optional own service category; without a category the block applies to all own services."}, "reason": {"type": "string", "maxLength": 200, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Identify connected account", "description": "Identify exactly the account connected by the current credentials. Its stable ID survives changes to email, name or credentials.", "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": "Read UCP product details", "description": "Retrieve complete current details of a priced resource. Specialist preferences and rental dates are checked separately in the booking offer.", "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": "Read UCP resources by ID", "description": "Retrieve current salon services and workspaces using stable product or variant IDs. Removed resources are not substituted. Unknown personal prices remain pending.", "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": "Confirm salon appointment", "description": "Book the reviewed salon offer after explicit approval of its price and terms. Recheck price, specialist and availability. Repeated confirmation returns the same booking. Booking confirmation messages are sent.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "ID of the booking offer previously prepared by the server."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Offer access key returned only on creation. Do not publish it or derive it from other accounts' data."}, "accept_privacy": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed privacy policy."}, "accept_terms": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed terms and offer price."}, "accept_cancellation": {"type": "boolean", "const": true, "description": "Send true only if the user accepted the displayed cancellation policy."}, "confirm_partial_series": {"type": "boolean", "default": false, "description": "For a shortened rental series, send true only after explicit approval of every omitted day."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Find available salon appointments", "description": "Find genuinely available appointments for the selected salon services. Respect specialist assignments, combined treatments and booking deadlines. Do not silently substitute a preferred specialist.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Current numeric service IDs from salon_search_services. Multiple services are checked as one continuous visit."}, "from_date": {"type": "string", "format": "date", "description": "First local calendar day in Munich, in YYYY-MM-DD format."}, "to_date": {"type": "string", "format": "date", "description": "Last local calendar day of the bounded search period, inclusive."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optional explicitly preferred specialist. An unsuitable or unavailable preference is not substituted."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 200, "default": 100, "description": "Maximum returned result count within the published limit."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Next-page result position; use next_offset from the previous response."}}, "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": "Read own salon appointment", "description": "Read the appointment itinerary and request decisions using its private booking key. Contacts and anamnesis are not returned.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Private key of the own salon appointment from its confirmation. It does not authorize access to other appointments."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Get current salon offer", "description": "Get the salon promotion currently published in the hero, including code, eligible customers and validity. A displayed code does not establish personal discount eligibility.", "inputSchema": {"type": "object", "properties": {"language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Check salon price", "description": "Calculate the current price of an exact salon appointment. Promo codes need real email and phone. The check neither reserves an appointment nor redeems a code.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Current numeric service IDs from salon_search_services. Multiple services are checked as one continuous visit."}, "start_at": {"type": "string", "format": "date-time", "description": "Exact appointment start as an ISO datetime with timezone offset. Resolve relative times using the supplied Munich local clock first."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optional explicitly preferred specialist. An unsuitable or unavailable preference is not substituted."}, "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": "Customer-provided contacts. Email and phone are both required for a personal promotion check."}, "promo_code": {"type": "string", "maxLength": 64, "description": "Promo code requested by the customer or currently published. Eligibility is checked by the server."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Check salon offer", "description": "Read an own salon offer using its ID and access key. Current changes are marked as requiring a new offer review. No other customers' contacts are disclosed.", "inputSchema": {"type": "object", "properties": {"quote_id": {"type": "string", "format": "uuid", "description": "ID of the booking offer previously prepared by the server."}, "quote_token": {"type": "string", "minLength": 32, "maxLength": 128, "description": "Offer access key returned only on creation. Do not publish it or derive it from other accounts' data."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Prepare salon booking", "description": "Create a short-lived offer for the selected salon services, contacts and exact appointment. This does not book or send email. Show complete prices and terms before confirmation.", "inputSchema": {"type": "object", "properties": {"service_ids": {"type": "array", "items": {"type": "integer", "minimum": 1}, "minItems": 1, "maxItems": 12, "uniqueItems": true, "description": "Current numeric service IDs from salon_search_services. Multiple services are checked as one continuous visit."}, "start_at": {"type": "string", "format": "date-time", "description": "Exact appointment start as an ISO datetime with timezone offset. Resolve relative times using the supplied Munich local clock first."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optional explicitly preferred specialist. An unsuitable or unavailable preference is not substituted."}, "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": "Customer-provided contacts. Email and phone are both required for a personal promotion check."}, "promo_code": {"type": "string", "maxLength": 64, "description": "Promo code requested by the customer or currently published. Eligibility is checked by the server."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Request salon cancellation", "description": "Request cancellation of an own salon appointment. The response contains the actual decision status. A request must not be treated as an approved cancellation.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Private key of the own salon appointment from its confirmation. It does not authorize access to other appointments."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "reason": {"type": "string", "maxLength": 2000, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Request salon appointment change", "description": "Request a change to an own salon appointment. Availability is checked again. The appointment changes only after approval. The same submission ID does not create a second request.", "inputSchema": {"type": "object", "properties": {"booking_token": {"type": "string", "minLength": 16, "maxLength": 128, "description": "Private key of the own salon appointment from its confirmation. It does not authorize access to other appointments."}, "submission_key": {"type": "string", "format": "uuid", "description": "Use a new UUID for a new request and exactly the same UUID for retries."}, "new_start_at": {"type": "string", "format": "date-time", "description": "Requested new start of the salon appointment as an ISO datetime with timezone offset."}, "reason": {"type": "string", "maxLength": 2000, "description": "User-provided note about the requested change or cancellation."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or 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": "Find salon services", "description": "Find current salon services in Munich by treatment, specialist, duration, indicative price and date. Results include live IDs and matched requirements. Prices are recalculated before booking.", "inputSchema": {"type": "object", "properties": {"query": {"type": "string", "maxLength": 500, "default": "", "description": "Short search terms for the desired treatment, activity or equipment."}, "language": {"type": "string", "enum": ["de", "en", "ru"], "default": "de", "description": "Preferred language for text and display formats: de, en or ru."}, "limit": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Maximum returned result count within the published limit."}, "offset": {"type": "integer", "minimum": 0, "maximum": 10000, "default": 0, "description": "Next-page result position; use next_offset from the previous response."}, "category_slug": {"type": "string", "maxLength": 120, "description": "Optional unchanged category slug from the current catalog."}, "staff_id": {"type": "integer", "minimum": 1, "description": "Optional explicitly preferred specialist. An unsuitable or unavailable preference is not substituted."}, "max_price_cents": {"type": "integer", "minimum": 0, "description": "Maximum indicative price in EUR cents before personal promotion eligibility is checked. Final price is calculated separately."}, "max_duration_minutes": {"type": "integer", "minimum": 1, "maximum": 1440, "description": "Maximum treatment duration in minutes; display formats are not input formats."}, "available_on": {"type": "string", "format": "date", "description": "Return only resources with actual free capacity on this local date."}}, "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": "Search UCP catalog", "description": "Search the current UCP catalog by terms, categories and price. Validate the platform profile. Personal rental prices require sign-in and explicitly chosen days; unknown prices are shown as pending price checks.", "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": []}