# info.summary
Read-only Sani4All bathrooms and binnenkijkers for agents and developers.

# info.description
Search public bathrooms, inspect filter facets, and discover real customer projects. The customer-domain facade fixes the brand and vertical from the host, exposes only already-public editorial content and no private customer records, requires no authentication, and provides no write operations. Backward-compatible fields may be added within v1; breaking changes use a new major API path. Planned deprecations are announced through RFC 9745 Deprecation and deprecation-policy links, with Sunset no earlier than 90 days after the announcement.

# externalDocs.description
Sani4All developer resources, versioning policy, and error guidance

# paths./api/public/v1.get.description
Lists the supported read-only resources, machine description, and human documentation.

# paths./api/public/v1.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./openapi.json.get.responses.4XX.description
The HTTP edge rejected the discovery request.

# paths./api/public/v1/openapi.json.get.summary
Get this OpenAPI document from the versioned API root

# paths./api/public/v1/openapi.json.get.responses.200.description
The same OpenAPI 3.1 JSON document as /openapi.json.

# paths./api/public/v1/openapi.json.get.responses.4XX.description
The HTTP edge rejected the discovery request.

# paths./api/public/v1/bathrooms.get.description
Returns Sani4All bathrooms from the public registry projection, enriched with verified customer-domain page metadata when a matching local page exists. Search, totals, and pagination cover at most the first 500 active registry records for this brand and vertical.

# paths./api/public/v1/bathrooms.get.parameters[].description
Case-insensitive search across public names, descriptions, and tags.

# paths./api/public/v1/bathrooms.get.parameters[].description
Repeat to match any listed showcase type.

# paths./api/public/v1/bathrooms.get.parameters[].description
Repeat to require every listed public tag.

# paths./api/public/v1/bathrooms.get.parameters[].description
Sort by name or effective price. A leading hyphen means descending.

# paths./api/public/v1/bathrooms.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1/bathrooms.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1/bathrooms.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1/bathrooms.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./api/public/v1/bathrooms/{slug}.get.description
Returns one exact Sani4All bathroom and its verified customer-domain page metadata when available.

# paths./api/public/v1/bathrooms/{slug}.get.parameters[].description
Exact public bathroom or binnenkijker slug returned by its collection.

# paths./api/public/v1/bathrooms/{slug}.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1/bathrooms/{slug}.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1/bathrooms/{slug}.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1/bathrooms/{slug}.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./api/public/v1/bathroom-facets.get.description
Returns the active Sani4All filter taxonomy for bathrooms.

# paths./api/public/v1/bathroom-facets.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1/bathroom-facets.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1/bathroom-facets.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1/bathroom-facets.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./api/public/v1/binnenkijkers.get.description
Returns public Sani4All customer projects from the website content layer.

# paths./api/public/v1/binnenkijkers.get.parameters[].description
Case-insensitive search across titles, locations, subtitles, and SEO text.

# paths./api/public/v1/binnenkijkers.get.parameters[].description
Sort by editorial chronology or title. A leading hyphen means descending; the editorial chronology may use a non-public ordering date when no genuine completion date is available.

# paths./api/public/v1/binnenkijkers.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1/binnenkijkers.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1/binnenkijkers.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1/binnenkijkers.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./api/public/v1/binnenkijkers/{slug}.get.description
Returns one Sani4All customer project, including its public gallery and canonical page.

# paths./api/public/v1/binnenkijkers/{slug}.get.parameters[].description
Exact public bathroom or binnenkijker slug returned by its collection.

# paths./api/public/v1/binnenkijkers/{slug}.get.responses.404.description
The collection or record does not exist for this brand.

# paths./api/public/v1/binnenkijkers/{slug}.get.responses.429.description
The client exceeded the public read rate limit.

# paths./api/public/v1/binnenkijkers/{slug}.get.responses.500.description
The public API could not complete the request.

# paths./api/public/v1/binnenkijkers/{slug}.get.responses.502.description
The registry source returned an unavailable or invalid response.

# paths./.well-known/api-catalog.get.summary
Discover APIs through the RFC 9727 API catalog

# paths./.well-known/api-catalog.get.description
Returns an RFC 9264 JSON Linkset using the RFC 9727 profile.

# paths./.well-known/api-catalog.get.responses.4XX.description
The HTTP edge rejected the discovery request.

# components.headers.Link.description
RFC 9727 api-catalog, RFC 8631 service description/documentation, and RFC 9745 deprecation-policy links.

# components.headers.RateLimitLimit.description
Compatibility form of the public-read request limit per policy window.

# components.headers.RateLimitPolicy.description
Structured public-read quota and 60-second window policy.

# components.headers.RateLimit.description
Structured rate-limit state for the exhausted public-read quota.

# components.headers.RateLimitRemaining.description
Compatibility form of the remaining request count.

# components.headers.RateLimitReset.description
Compatibility form of the seconds until the quota window resets.

# components.headers.RetryAfter.description
Seconds to wait before retrying a rate-limited request.

# components.parameters.Page.description
One-based page number. Pages beyond the final page return an empty data array.

# components.schemas.PaginationMeta.properties.sourceRecordLimit.description
The registry contract searches and totals at most its first 500 active records per brand and vertical.

# components.schemas.Binnenkijker.properties.completionDate.description
Genuine editorial completion date. Omitted when unavailable or when the source contains a placeholder date.

# x-api-lifecycle.deprecation_signal
RFC 9745 Deprecation header and rel="deprecation" Link