{"openapi":"3.1.0","info":{"title":"CleanWhale Assistant API","version":"1.0.0","description":"Read live textile-cleaning catalogs and availability across seven independent brands, then create a calculator link. The API accepts no customer personal data and never reserves, charges, sends SMS, or creates an order.","contact":{"url":"https://cleanwhale.pl/en/questions-and-answers"}},"servers":[{"url":"https://dry-cleaning.pl/api/order/v1/assistant"}],"externalDocs":{"description":"CleanWhale privacy policy","url":"https://cleanwhale.pl/privacy-policy"},"paths":{"/sites":{"get":{"operationId":"list_partner_sites","summary":"List the seven CleanWhale-powered partner brands and service cities","description":"Call first unless the customer already named an exact partner domain. Use the returned site_domain for every later action.","responses":{"200":{"description":"Successful live CleanWhale response.","content":{"application/json":{"schema":{"type":"object","properties":{"selection_required":{"type":"boolean","const":true},"note":{"type":"string"},"sites":{"type":"array","items":{"type":"object","properties":{"site_domain":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]},"brand":{"type":"string"},"city":{"type":"string"},"market":{"type":"string","enum":["warsaw","krakow","wroclaw"]},"service":{"type":"string","enum":["dry-cleaning"]},"supported_locales":{"type":"array","items":{"type":"string","enum":["pl","en","uk","zh"]}},"default_locale":{"type":"string","enum":["pl","en","uk","zh"]},"booking_origin":{"type":"string","format":"uri"}},"required":["site_domain","brand","city","market","service","supported_locales","default_locale","booking_origin"],"additionalProperties":false}}},"required":["selection_required","note","sites"],"additionalProperties":false}}}},"400":{"description":"The assistant supplied unsupported or invalid fields.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"429":{"description":"The safe public assistant API rate limit was reached.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"502":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"503":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"504":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}}}}},"/catalog":{"get":{"operationId":"get_service_catalog","summary":"Get the selected partner site live catalog and current PLN prices","description":"Use this response instead of remembered or uploaded prices.","parameters":[{"name":"site_domain","in":"query","required":true,"description":"Exact partner domain selected with list_partner_sites.","schema":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]}}],"responses":{"200":{"description":"Successful live CleanWhale response.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]},"brand":{"type":"string"},"market":{"type":"string","enum":["warsaw","krakow","wroclaw"]},"service":{"type":"string","enum":["dry-cleaning"]},"currency":{"type":"string","enum":["PLN"]},"items":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"unit":{"type":"string"},"max":{"type":"integer","minimum":1},"price_minor":{"type":"integer","minimum":0},"price_display":{"type":"string"}},"required":["key","label","unit","max","price_minor","price_display"],"additionalProperties":false}}},"required":["domain","brand","market","service","currency","items"],"additionalProperties":false}}}},"400":{"description":"The assistant supplied unsupported or invalid fields.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"429":{"description":"The safe public assistant API rate limit was reached.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"502":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"503":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"504":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}}}}},"/availability":{"get":{"operationId":"check_availability","summary":"Check current dates and time slots without reserving them","parameters":[{"name":"site_domain","in":"query","required":true,"description":"Exact partner domain selected with list_partner_sites.","schema":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]}},{"name":"date","in":"query","required":false,"description":"Optional requested date in YYYY-MM-DD format.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Successful live CleanWhale response.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]},"market":{"type":"string","enum":["warsaw","krakow","wroclaw"]},"service":{"type":"string","enum":["dry-cleaning"]},"requested_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"available":{"type":"boolean"},"dates":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"times":{"type":"array","items":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$"}},"discount_percent":{"type":"number"},"coefficient_percent":{"type":"number"}},"required":["date","times"],"additionalProperties":false}}},"required":["domain","market","service","available","dates"],"additionalProperties":false}}}},"400":{"description":"The assistant supplied unsupported or invalid fields.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"429":{"description":"The safe public assistant API rate limit was reached.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"502":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"503":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"504":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}}}}},"/booking-link":{"post":{"operationId":"create_booking_link","summary":"Create a partner-site calculator link for the selected services","description":"This creates only a link. The customer enters personal details, confirms by SMS, and pays on the selected partner site.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"site_domain":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"],"description":"Exact domain selected from listPartnerSites."},"locale":{"type":"string","enum":["pl","en","uk","zh"],"description":"Checkout page language. Polish is the usual default."},"items":{"type":"array","minItems":1,"maxItems":16,"items":{"type":"object","properties":{"key":{"type":"string","enum":["sofa-2","sofa-3","corner-4","corner-5-6","corner-7-plus","armchair","chair","office-chair","headboard","carpet","single-mattress","single-mattress-both","double-mattress","double-mattress-both","fitted-carpet","stroller"],"description":"Product key returned by getServiceCatalog."},"quantity":{"type":"integer","minimum":1,"maximum":500}},"required":["key","quantity"],"additionalProperties":false}}},"required":["site_domain","items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful live CleanWhale response.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["booking_link_ready"]},"booking_url":{"type":"string","format":"uri"},"domain":{"type":"string","enum":["dry-cleaning.pl","pranie-kanapy-warszawa.pl","pranie-dywanu.pl","pranie-dywanow.com","pranie-wroclaw.pl","pranie-krakow.pl","pranie-dywanow-i-kanap.pl"]},"locale":{"type":"string","enum":["pl","en","uk","zh"]},"market":{"type":"string","enum":["warsaw","krakow","wroclaw"]},"service":{"type":"string","enum":["dry-cleaning"]},"currency":{"type":"string","enum":["PLN"]},"items":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"integer","minimum":1},"unit_price_minor":{"type":"integer","minimum":0},"unit_price_display":{"type":"string"},"line_total_minor":{"type":"integer","minimum":0},"line_total_display":{"type":"string"}},"required":["key","label","unit","quantity","unit_price_minor","unit_price_display","line_total_minor","line_total_display"],"additionalProperties":false}},"catalog_subtotal_minor":{"type":"integer","minimum":0},"catalog_subtotal_display":{"type":"string"},"note":{"type":"string"}},"required":["status","booking_url","domain","locale","market","service","currency","items","catalog_subtotal_minor","catalog_subtotal_display","note"],"additionalProperties":false}}}},"400":{"description":"The assistant supplied unsupported or invalid fields.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"429":{"description":"The safe public assistant API rate limit was reached.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"502":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"503":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}},"504":{"description":"Live service data is temporarily unavailable. No order was created.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"detail":{"type":"string"},"retry_after_seconds":{"type":"integer","minimum":1}},"required":["ok","error"],"additionalProperties":false}}}}}}}}}