---
title: "Find the nearest public toilets"
method: GET
path: "/api/v1/toilets/nearest"
---

# Find the nearest public toilets

`GET /api/v1/toilets/nearest`

## Request

- Base URL: `https://wcway.com`
- URL: `https://wcway.com/api/v1/toilets/nearest`
- Auth: none required

Use this when the user asks for the nearest public toilet. Send place (text) or lat and lon. When both are missing the answer has status needs_location.

## Query parameters

- `place` string
- `country` string
- `lat` number
- `lon` number
- `limit` integer
- `open_now` boolean
- `wheelchair` boolean
- `changing_table` boolean
- `free` boolean
- `no_purchase_needed` boolean

## Response `200`

Toilets sorted by distance, or a status that asks for a location.

- FindResult
  - `status` 'ok' | 'no_results' | 'needs_location' | 'place_not_found', required: needs_location and place_not_found are not errors. Ask the user the question in ask_user.
  - `origin` object, nullable, required
    - `lat` number, required
    - `lon` number, required
    - `label` string, required: The place and its city. A position without a name shows its coordinates.
    - `source` 'place' | 'coordinates' | 'host_hint', required
  - `results` object[], required
    - `id` string, required
    - `name` string, nullable, required
    - `lat` number, required
    - `lon` number, required
    - `access` 'public' | 'permissive' | 'customers' | 'scheme' | 'unknown', required: Who may use the toilet. public: anyone. permissive: anyone, no purchase needed. customers: customers only. scheme: a public scheme opens a business toilet to everyone.
    - `access_rule` 'free' | 'fee' | 'customers' | 'key' | 'scheme' | 'unknown', required: free and fee: public toilet. customers: purchase or customer status needed. key: key needed. scheme: a public scheme opens a business toilet to everyone. unknown: fee not known.
    - `scheme_name` string, nullable, required
    - `fee` object, required
      - `required` boolean, nullable, required
      - `amount` number, nullable, required
      - `currency` string, nullable, required
    - `opening_hours` string, nullable, required: OpenStreetMap opening_hours syntax.
    - `open_now` union, required: Evaluated at the toilet's local time. The value unknown means the source has no usable hours.
      - boolean
      - 'unknown'
    - `closes_at` string, nullable, required: Local closing time with UTC offset. Null when unknown or when it never closes.
    - `wheelchair` 'yes' | 'limited' | 'no' | 'unknown', required
    - `changing_table` 'yes' | 'no' | 'unknown', required
    - `gender` string[], required: Who the toilet is for. Empty when not known.
    - `operator` string, nullable, required
    - `last_confirmed_at` string, nullable, required
    - `verification_state` 'unverified' | 'source_claimed' | 'community_confirmed' | 'partner_confirmed' | 'disputed', required: disputed: an open user report says the toilet is gone, closed or wrong.
    - `confirmations` integer, required: User confirmations in the last 12 months.
    - `cleanliness` object, nullable, required: User ratings from 1 (dirty) to 5 (spotless). Each person has one rating, and the latest counts. Null when nobody rated it.
      - `average` number, required
      - `count` integer, required
    - `confidence` 'high' | 'medium' | 'low', required
    - `source` string, required
    - `partner` object, nullable, required: Set when the business behind the toilet pays for a Verified Partner listing. It buys visibility and a label. It never changes the order of the results. Show it as a label only. Conditions, opening_hours and open_now are statements of the business. The toilet's own fields (access, opening_hours, open_now) stay as they are.
      - `name` string, required: Business name that the partner gave and a moderator approved.
      - `tier` 'basic' | 'plus', required
      - `conditions` 'everyone' | 'customers', nullable, required: What the business says about who may use the toilet. everyone: free for everyone. customers: customers only. Null when the business said nothing. It is the word of the business, not a checked fact.
      - `opening_hours` string, nullable, required: Opening hours that the business entered, in OpenStreetMap opening_hours syntax. Null when it entered none.
      - `open_now` union, required: Open state from the hours of the business and its live switch, at the toilet's local time. false: the business closed the toilet for now, or its hours say closed. unknown: the business gave no usable hours.
        - boolean
        - 'unknown'
      - `closes_at` string, nullable, required: Local closing time with UTC offset, from the hours of the business. Null when unknown or when it never closes.
    - `provenance` object, required: Where the facts come from. People can correct every fact. A value that most people vote for replaces the source value. Every fact comes from the source, unless decided lists it.
      - `source` string, required: Source of the toilet record, for example osm.
      - `checked` string, nullable, required: Month of the last check in the source, for example 2025-06.
      - `decided` object, required: Facts that people or a moderator decided. The keys are access, fee, fee_amount, wheelchair, changing_table, gender, opening_hours, name, operator and existence.
    - `url` string, uri, required
    - `directions` object, required
      - `google` string, uri, required
      - `apple` string, uri, required
    - `geo` string, required: geo: URI.
    - `distance_m` integer, required
    - `walk_min` integer, required
    - `bearing` integer, required: Degrees from north.
  - `bbox` number[]: west, south, east, north of the origin and the results.
  - `ask_user` string
  - `attribution` object, required
    - `text` string, required
    - `license` string, required
    - `url` string, uri, required
    - `license_notice_url` string, uri, required: The page that lists every source with its licence and offers the data dumps.
  - `display_note` string, required

## Other responses

- `400`: A parameter is invalid. invalid_params lists each one.
- `429`: Rate limit reached. Wait Retry-After seconds.
- `500`: Server error.
- `503`: The place lookup or the database is unavailable. Wait Retry-After seconds. A failed place lookup also accepts lat and lon.

---

[API](https://skmtc.dev/wcway/apis/wcway-api.md) · [All operations](https://skmtc.dev/wcway/apis/wcway-api/llms.txt) · [OpenAPI document](https://skmtc.dev/wcway/apis/wcway-api/revisions/34f42e2ca0e8?raw)
