Reference · v1.2

ROLLIN API reference.

REST API over HTTPS. JSON request and response bodies. Authentication via the X-Api-Key header. Ten endpoints. Free tier covers 1,000 requests per month with no credit card. Starter tier ($9.99/mo) unlocks full address precision, photos, hours, and 5,000 monthly requests.

Base URL: https://joinrollin.com/api/v1. Full OpenAPI 3.1 spec at /openapi.yaml.

No key yet?

Free tier — 1,000 requests/month, no credit card.

Get free key →
01 · Authentication

Authentication

Send your API key in the X-Api-Key header on every request. Keys start with a tier prefix: rlf_ (free), rls_ (starter), rld_ (developer), rlb_ (business), rle_ (enterprise).

Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" "https://joinrollin.com/api/v1/health"

A missing or invalid key returns 401 Unauthorized. A revoked or expired key returns 403 Forbidden.

02 · Errors

Errors

Errors return standard HTTP status codes with a JSON body of the form { "error": { "code": "…", "message": "…" } }.

CodeMeaningWhen
400Bad RequestMissing or malformed parameters.
401UnauthorizedMissing or invalid X-Api-Key.
402Payment RequiredEndpoint requires a higher tier.
403ForbiddenKey revoked, expired, or origin-locked.
404Not FoundResource ID does not exist.
429Too Many RequestsRate limit hit. See Retry-After.
500Internal ErrorRetry with exponential backoff.
03 · Rate limits

Rate limits

Per-minute and per-month limits scale with tier. Hitting a limit returns 429 with a Retry-After header (seconds). The /v1/health endpoint is unauthenticated and uncounted.

TierPer minutePer monthPrice
Free101,000$0
Starter305,000$9.99
Developer6050,000$29
Business200500,000$149
04 · Pagination

Pagination

List endpoints accept a limit parameter (default 20, max 100) and return a next_cursor field when more results are available. Pass the cursor back as cursor to fetch the next page.

Endpoint
GET /api/v1/locations Free+

Search venues by location, query, or both. Results are pre-sorted by accessibility score, descending.

Query parameters

ParameterTypeDescription
latfloatLatitude. Required unless bbox is provided.
lngfloatLongitude. Required unless bbox is provided.
radiusfloatSearch radius in miles. Default 5, max 25 (Free tier max 10).
bboxstringBounding box south,west,north,east for map viewports. Replaces lat/lng/radius. Max span 1.0° latitude by 1.25° longitude.
min_scoreintFilter by minimum accessibility score (0–100).
categorystringComma-separated category filter (exact match), e.g. restaurant,cafe. Up to 10 values.
cuisinestringFilter by cuisine type (partial match), e.g. italian.
featuresstringComma-separated required features, e.g. wheelchair_entry,accessible_restroom. Only locations with all listed features confirmed are returned.
sortstringdistance (default), score, or updated.
lightingstringFilter by lighting level: bright, moderate, dim. Paid tiers only; ignored on Free.
limitintMax results per page. Default 20, max 50 (Free tier max 10).
cursorstringPagination cursor from next_cursor.
Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" \
  "https://joinrollin.com/api/v1/locations?lat=40.7580&lng=-73.9855&radius=500&min_score=70&limit=20"
200 OK
{
  "locations": [
    {
      "id": "abc-123-def",
      "name": "Devoción",
      "category": "cafe",
      "score": 86,
      "address": "69 Grand St, Brooklyn, NY 11249",
      "lat": 40.7148,
      "lng": -73.9614,
      "wheelchair_entry": true,
      "accessible_restroom": true,
      "level_entry": true,
      "accessible_parking": false,
      "wide_aisles": true,
      "elevator": null
    }
  ],
  "count": 20,
  "next_cursor": "eyJvZmZzZXQiOjIwfQ=="
}
Endpoint
GET /api/v1/locations/:id Free+ (premium fields Starter+)

Full venue detail including all six accessibility features, address, photos (Starter+), hours (Starter+), and verification status. Includes the sensory block — measured lighting and sound levels — on paid tiers (null where no readings exist yet); Free tier receives a locked stub {"locked": true, "min_tier": "developer"}.

Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" \
  "https://joinrollin.com/api/v1/locations/abc-123-def"
200 OK
{
  "id": "abc-123-def",
  "name": "Devoción",
  "score": 86,
  "category": "cafe",
  "cuisine_type": "coffee",
  "address": "69 Grand St",
  "city": "Brooklyn",
  "state": "NY",
  "phone": "+17184843090",
  "website": "https://devocion.com",
  "hours": { "mon": "7-19" },
  "features": {
    "wheelchair_entry": true,
    "accessible_restroom": true,
    "level_entry": true,
    "accessible_parking": false,
    "wide_aisles": true,
    "elevator": null
  },
  "verified": true,
  "last_updated": "2026-04-22T18:13:00Z"
}
Endpoint
POST /api/v1/locations/batch Free+

Fetch up to 50 locations by id in one request — one round trip instead of 50. Same location shape and tier gating as detail. Invalid or unknown ids are dropped silently; compare requested vs found in the response. Free-tier daily location limits apply.

Request
curl -X POST -H "X-Api-Key: $ROLLIN_API_KEY" -H "Content-Type: application/json" \
  -d '{"ids": ["285b526b-fe60-4554-9c41-bb5ca8c298f7", "037fdaa9-e83a-4141-9a71-b8db62ba637e"]}' \
  "https://joinrollin.com/api/v1/locations/batch"
Endpoint
GET /api/v1/changes Developer+

Incremental sync feed: locations whose profile or sensory data changed in the last days days (1–30, default 7). Minimal payload with a changed array (profile, sensory) — re-fetch full records via detail or batch. Poll daily to stay in sync instead of re-pulling entire regions.

ParameterTypeDescription
daysintChange window in days. Default 7, max 30.
statestringTwo-letter state filter, e.g. NY.
limitintMax results per page. Default 100, max 500.
cursorstringPagination cursor from next_cursor.
Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" \
  "https://joinrollin.com/api/v1/changes?days=7&state=NY"
Endpoint
GET /api/v1/regions Free+

Coverage stats — 15 US states, 48 metro regions, total scored venues per region.

Endpoint
GET /api/v1/score/:id Business+

Detailed score breakdown — per-feature value, weight, and confidence.

Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" \
  "https://joinrollin.com/api/v1/score/abc-123-def"
200 OK
{
  "id": "abc-123-def",
  "score": 86,
  "breakdown": {
    "wheelchair_entry": { "value": true, "weight": 22, "confidence": 0.95 },
    "accessible_restroom": { "value": true, "weight": 22, "confidence": 0.88 },
    "level_entry": { "value": true, "weight": 18, "confidence": 0.92 }
  }
}
Endpoint
POST /api/v1/feedback Developer+

Submit accessibility feedback or corrections for a venue. Reviewed by the ROLLIN team.

Body

FieldTypeDescription
location_id requiredstringVenue ID.
type requiredenumOne of: correction, missing, verify.
messagestringPlain-text description. Max 2,000 chars.
Request
curl -X POST -H "X-Api-Key: $ROLLIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"location_id":"abc-123","type":"correction","message":"..."}' \
  "https://joinrollin.com/api/v1/feedback"
Endpoint
GET /api/v1/usage Free+

Current usage stats for the authenticated key. Shows used vs. limit across the per-minute, per-day, and per-month windows, plus the current tier.

Request
curl -H "X-Api-Key: $ROLLIN_API_KEY" \
  "https://joinrollin.com/api/v1/usage"
200 OK
{
  "tier": "starter",
  "minute": { "used": 3, "limit": 30 },
  "day": { "used": 42, "limit": 167 },
  "month": { "used": 1284, "limit": 5000 }
}
Endpoint
GET /api/v1/trial/* No key · IP-rate-limited

Public trial proxy. No API key required. IP-rate-limited to 5 requests, optionally tracked per-session via the X-Trial-Session header. Mirrors the regular endpoints under /v1/trial/locations, /v1/trial/locations/:id, /v1/trial/score/:id, /v1/trial/regions, /v1/trial/feedback, and /v1/trial/health with free-tier restrictions applied. Used by the MCP server’s trial mode.

Request · no auth
# Public trial proxy — no key, IP-rate-limited (5 calls)
curl "https://joinrollin.com/api/v1/trial/locations?lat=40.7580&lng=-73.9855"
Endpoint
GET /api/v1/health No auth · uncounted

Status check. No API key required, doesn't count against quota. Use for liveness probes.

Request
curl "https://joinrollin.com/api/v1/health"
200 OK
{ "status": "ok", "version": "1.4.0" }
Tooling

SDKs

Python — auto-generated by Stainless. Type-safe, async support, pagination built in.

OpenAPI 3.1 — full spec. Generate clients in any language with openapi-generator or Stainless.

TypeScript and Go SDKs are on the roadmap.

Tooling

MCP server

The ROLLIN MCP server gives Claude Desktop, Cursor, VS Code, and any MCP-compatible client direct access to ROLLIN data through five tools. Two ways to connect: the hosted server (a URL, nothing to run) or the npm package via npx.

Hosted server (recommended)

Streamable HTTP at https://joinrollin.com/api/mcp. Send your API key as an Authorization: Bearer or X-Api-Key header. Any tier works, including Free.

Claude Code
claude mcp add --transport http rollin https://joinrollin.com/api/mcp \
  --header "X-Api-Key: $ROLLIN_API_KEY"

Ready to ship?

Free tier — 1,000 requests/month, no credit card. Starter $9.99/mo when you outgrow it.

Get free key →