Developer Docs · v1.4

Ship in five minutes.

Quick start, copy-paste recipes, and SDKs for the ROLLIN accessibility API. Free tier — 1,000 requests/month, no credit card. Starter $9.99/mo for production.

01

Get a key

Free tier — 1,000 requests/month, no credit card. Sign up at the portal.

Get free key
02

Authenticate

Send your key in the X-Api-Key header. Use environment variables, never commit secrets.

03

Make a call

Hit /v1/locations with lat/lng. JSON in. JSON out. Done.

01

Authenticate

Send your key in X-Api-Key.

Pull the key from environment variables. Never commit secrets. The unauthenticated /v1/health endpoint is the easiest sanity check.

# Set once in your shell export ROLLIN_API_KEY="rls_..." # Use in any request curl -H "X-Api-Key: $ROLLIN_API_KEY" \ "https://joinrollin.com/api/v1/health"
// Pull from env, never hardcode const KEY = process.env.ROLLIN_API_KEY; const res = await fetch( 'https://joinrollin.com/api/v1/health', { headers: { 'X-Api-Key': KEY } } ); const health = await res.json();
# Pull from env, never hardcode import os from rollin import Rollin client = Rollin(api_key=os.environ["ROLLIN_API_KEY"]) health = client.health.check()
02

Recipes

Four patterns. Copy, paste, ship.

recipe · 01

Search nearby venues.

The bread-and-butter call. Pass lat/lng + radius (meters), filter by minimum score, paginate with limit. Results are pre-sorted by accessibility score.

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"
const params = new URLSearchParams({ lat: 40.7580, lng: -73.9855, radius: 500, min_score: 70, limit: 20 }); const res = await fetch( `https://joinrollin.com/api/v1/locations?${params}`, { headers: { 'X-Api-Key': KEY } } ); const { locations } = await res.json();
results = client.locations.search( lat=40.7580, lng=-73.9855, radius=500, min_score=70, limit=20 ) for loc in results.locations: print(loc.name, loc.score)
recipe · 02

Get full venue detail.

One ID in, complete feature breakdown out — score, all six features, address, photos (Starter+), hours (Starter+), cuisine tags, last verified timestamp.

curl -H "X-Api-Key: $ROLLIN_API_KEY" \ "https://joinrollin.com/api/v1/locations/abc-123-def"
const id = 'abc-123-def'; const res = await fetch( `https://joinrollin.com/api/v1/locations/${id}`, { headers: { 'X-Api-Key': KEY } } ); const location = await res.json();
loc = client.locations.retrieve("abc-123-def") print(loc.score, loc.features)
recipe · 03 · Developer+

Submit feedback.

POST corrections, missing-venue reports, or verification confirmations. Reviewed by the ROLLIN team. Helps the score get more accurate over time.

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"
const res = await fetch( 'https://joinrollin.com/api/v1/feedback', { method: 'POST', headers: { 'X-Api-Key': KEY, 'Content-Type': 'application/json' }, body: JSON.stringify({ location_id: 'abc-123', type: 'correction', message: 'Restroom is no longer step-free as of last visit.' }) } );
client.feedback.submit( location_id="abc-123", type="correction", message="Restroom is no longer step-free as of last visit." )
recipe · 04

Check your quota.

Returns current usage across the per-minute, per-day, and per-month windows for your key, plus your current tier. Useful for showing remaining quota in your own UI.

# Check current quota usage for your key curl -H "X-Api-Key: $ROLLIN_API_KEY" \ "https://joinrollin.com/api/v1/usage"
const res = await fetch( 'https://joinrollin.com/api/v1/usage', { headers: { 'X-Api-Key': KEY } } ); const usage = await res.json(); // usage.tier, usage.minute, usage.day, usage.month
usage = client.usage.retrieve() print(usage.tier, usage.month.used, usage.month.limit)
03

Endpoints

Eight endpoints. Full reference in /api-docs.

GET/api/v1/locationsSearch by lat/lng, city/state, query string. Paginated.
GET/api/v1/locations/:idFull venue detail — score, features, address, photos.
GET/api/v1/regionsCoverage stats by state and metro region.
GET/api/v1/score/:idDetailed score breakdown by category (Business+).
POST/api/v1/feedbackSubmit accessibility feedback (Developer+).
GET/api/v1/usageCurrent key usage across rate-limit windows.
GET/api/v1/trial/*Public trial proxy — no key, IP-rate-limited.
GET/api/v1/healthAPI status — no auth needed, no quota cost.
04

Rate limits

Per-minute and per-month scale with tier.

Hit a limit, get a 429 with a Retry-After header. The /v1/health endpoint is uncounted. Upgrade or downgrade in the portal.

Free
1K
requests / month
10 / minute
Starter · $9.99
5K
requests / month
30 / minute
Developer · $29
50K
requests / month
60 / minute
Business · $149
500K
requests / month
200 / minute
05

Error codes

Standard HTTP, structured payloads.

Every error returns a JSON body with code, message, and (when relevant) hints for resolution.

400 Bad Request Invalid params — missing lat/lng, malformed coords, unknown query.
401 Unauthorized Missing or invalid X-Api-Key header.
402 Payment Required Endpoint requires a higher tier. Upgrade in the portal.
403 Forbidden Key revoked, expired, or origin-locked to a different domain.
404 Not Found Venue ID does not exist or has been removed.
429 Too Many Requests Rate limit hit. Honor the Retry-After header.
500 Internal Error Something on our end. Retry with exponential backoff.
06

Production checklist

Before you ship to real users.

The handful of things that turn a working integration into a production-ready one. Skip them and your first incident will teach you the same lessons more expensively.

  1. 01

    Keep keys in env vars, never in source

    Set ROLLIN_API_KEY in your platform’s secret store (Netlify env, Vercel env, Doppler, 1Password). Never commit the key. Rotate from the portal if it leaks.

  2. 02

    Honor 429 with Retry-After

    Rate limit hits return 429 with a Retry-After header (seconds). Wait that long before retrying. Implement exponential backoff for 5xx errors with jitter.

  3. 03

    Cache aggressively client-side

    Venue data changes daily-to-monthly, not by the second. Cache /v1/locations/:id responses for 24 hours. The /v1/usage endpoint shows your remaining quota — display it in your dashboard.

  4. 04

    Surface scores honestly to users

    A score of 60 isn’t the same as a score of 90. Show the number, not just “accessible / not accessible.” Link the user to ROLLIN for the breakdown — your users will trust your app more if you don’t flatten the data.

  5. 05

    Forward feedback to /v1/feedback

    If your users tell you a venue’s data is wrong, send it back to ROLLIN via POST /v1/feedback (Developer+). Helps the score get more accurate for everyone — including you next time.

  6. 06

    Plan for tier limits before launch day

    Estimate your monthly call volume from your projected DAU. If it’s above 5K/mo, upgrade to Starter before launch — not after the first 429 storm. Annual billing on Developer+ saves 20%.

First call in under 60 seconds.

Devs: free key, no credit card, copy any recipe, ship it. Teams shipping at scale: talk to sales for annual pricing and dedicated onboarding.