Transportation — entry 026 of 69

REFUGE Restrooms

Verified Jul 2026

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.

accessibilitylgbtqnonprofitcrowdsourcedopen-data
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score74out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 74 on greatapis.com
<a href="https://greatapis.com/api/refuge-restrooms/"><img src="https://greatapis.com/badge/refuge-restrooms.svg" alt="Scored 74 on greatapis.com"></a>

Auth quickstart

  1. No API key required — requests are public and keyless, confirmed on `/restrooms`, `/restrooms/search`, and `/restrooms/by_location` alike.
Stored keyNo key stored

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

200 application/json

[{"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

Base URLhttps://www.refugerestrooms.org/api/v1

Gotchas & 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.