Transportation — entry 026 of 69
REFUGE Restrooms
REFUGE Restrooms is a nonprofit, crowdsourced directory of gender-neutral and accessible restrooms, letting anyone search or submit locations by latitude/longitude or place name. The keyless REST API (currently listing over 58,000 restrooms) returns JSON with accessibility, unisex, and changing-table flags plus community upvotes/downvotes, and sends `Access-Control-Allow-Origin: *` so it can be called straight from the browser.
REFUGE Restrooms is a nonprofit, crowdsourced directory of gender-neutral and accessible restrooms, built to help transgender, intersex, and gender-nonconforming people find safe facilities. The keyless REST API lets you list, search by text, or search by coordinates over a live dataset of tens of thousands of community-submitted locations, each flagged for accessibility, unisex status, and changing tables.
GreatAPIs Score
Auth quickstart
- No API key required — requests are public and keyless, confirmed on `/restrooms`, `/restrooms/search`, and `/restrooms/by_location` alike.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
List the most recently added restrooms
GEThttps://www.refugerestrooms.org/api/v1/restrooms?per_page=1
[{"id":137418,"name":"Goodwill","street":"3134 5th Street","city":"Lewiston ","state":"Idaho ","accessible":true,"unisex":true,"directions":"On the right past dressing rooms. Single gender neutral bathroom.","comment":"","latitude":46.388671,"longitude":-117.0082183,"created_at":"2026-07-26T00:14:17.784Z","updated_at":"2026-07-26T00:14:17.919Z","downvote":0,"upvote":1,"country":"US","changing_table":false,"edit_id":137418,"approved":true}]Developer reference
https://www.refugerestrooms.org/api/v1Gotchas & limits
- CORS is enabled but only shows up when you actually send an `Origin` header — a plain `curl` request with no `Origin` gets back no `Access-Control-Allow-Origin` header at all, while adding `-H "Origin: https://example.com"` returns `Access-Control-Allow-Origin: *` and `Vary: Origin` — confirmed live, so testing CORS with a bare curl call (as opposed to an actual browser request) can look broken when it isn't.
- Pagination is entirely in **response headers**, not the JSON body — `X-Total`, `X-Total-Pages`, `X-Page`, `X-Per-Page`, `X-Next-Page`, and `X-Prev-Page` all come back on every `/restrooms` call (confirmed live, `X-Total: 58916` at time of writing) — the body itself is a bare array with no `meta`/`total` field, so you must read the headers to paginate correctly.
- Requesting a page past the end doesn't error — `?page=999999&per_page=1` returns `200` with an empty array `[]` (confirmed live), not a `404` or `400`.
- `/restrooms/by_location?lat=&lng=` adds two fields not present on the plain `/restrooms` listing: a `distance` (fractional, units undocumented — treat as a relative sort key, not a labeled unit) and a `bearing` in degrees as a **string** (e.g. `"236.46116215155"`), confirmed live — don't assume every restroom object has the same shape across endpoints.
- `/restrooms/search?query=` does a general text match against name/city/etc. rather than requiring an exact field match — confirmed live with `query=coffee` matching a restroom named "Coffee Times Coffee House" by substring, so it behaves more like a loose keyword search than a structured filter.