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_locationalike.
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
Originheader — a plaincurlrequest with noOrigingets back noAccess-Control-Allow-Originheader at all, while adding-H "Origin: https://example.com"returnsAccess-Control-Allow-Origin: *andVary: 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, andX-Prev-Pageall come back on every/restroomscall (confirmed live,X-Total: 58916at time of writing) — the body itself is a bare array with nometa/totalfield, so you must read the headers to paginate correctly. - Requesting a page past the end doesn't error —
?page=999999&per_page=1returns200with an empty array[](confirmed live), not a404or400. /restrooms/by_location?lat=&lng=adds two fields not present on the plain/restroomslisting: adistance(fractional, units undocumented — treat as a relative sort key, not a labeled unit) and abearingin 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 withquery=coffeematching a restroom named "Coffee Times Coffee House" by substring, so it behaves more like a loose keyword search than a structured filter.