Skip to content
District 76 Riders

Organizer Tools & API

Your rides,everywhere riders look.

Put your upcoming rides on your crew's, shop's or event's website with one paste, or connect your own tools to D76 to manage the events, crews and shops you run.
  • Embeds
    No code
  • Events, crews
    and shops
  • Approved
    access
  • Test keys
    Drafts only

No code

Embeds

A live list of your upcoming rides on your own website. Post a ride on D76 and it shows up there; past rides drop off on their own.

  • One copy-paste snippet, light, dark or matching the visitor's device
  • For a crew, an organizer, a shop, a state or city, or the toy runs
  • No key, no cookies, no analytics on your visitors

For builders

The D76 API

Read upcoming events, crews and shops, and manage the ones you run, from your own tools. Everything goes to https://api.d76riders.com/v1.

  • Events, crews and shops: read, post, edit and cancel what you run
  • Test keys write drafts and dry runs only you can see
  • Never a rider's personal details: counts, not people

For organizers

Move your group to D76

Your riders, your rides, one place. Free for you and everyone who rides with you. Your group keeps its name, its rules and its colors.

How API access works

Every D76 API key needs approval first, read keys included. Tell us what you're building, and we'll review it.

  1. 01

    Ask for API access

    What are you building? What will it need?

  2. 02

    We review it

    Your request for API access is waiting for review. We'll let you know when it's decided.

  3. 03

    Make a test key

    Build against drafts and dry runs that never reach a rider.

  4. 04

    Go live

    Swap in a live key when it works. Revoke any key at any time.

Quick start

Every D76 API key needs approval first, read keys included. Tell us what you're building, and we'll review it. Ask from your API keys page; once it's approved, make a key there. Every request goes to https://api.d76riders.com/v1 with your key as a bearer token. Keep it on your server, never in a browser or an app, and list upcoming events:

List events
curl "https://api.d76riders.com/v1/events?state=TN&type=BIKE_NIGHT,GROUP_RIDE&limit=10" \
  -H "Authorization: Bearer $D76_API_KEY"

Keys and scopes

A key belongs to your D76 account and can never do more than you can on the site. It's shown once; D76 keeps only a fingerprint of it. Revoke one any time and anything using it stops at once.

  • events:read

    Read events

    Upcoming public events, by area, type and date, and your own events.

  • events:write

    Manage events

    Post, edit and cancel events you organize. Needs two-step sign-in.

  • crews:read

    Read crews

    Public crews, their events and public members, and the crews you run.

  • crews:write

    Manage crews

    Edit the details of crews you lead and post their events. Needs two-step sign-in.

  • shops:read

    Read shops

    Shop listings as the site shows them, their review ratings and backed rides, and the shops you own.

  • shops:write

    Manage shops

    Update hours, contact details and listing details of shops you own, back rides, and reply to reviews. Needs two-step sign-in.

Every key needs approved API access and a confirmed email. Managing events, crews and shops also needs two-step sign-in on your account. Both are checked on every call, so withdrawn access stops every key at once, and turning two-step sign-in off stops a write key straight away.

Test keys

Keys starting d76_test_ read the same data. An event a test key creates is a draft only you can see, a test key can change only those drafts, and a crew or shop change is checked without being saved (dry_run: true). Wire up your tool without a test ride landing on anyone's calendar.

Posting an event

Send times in ISO 8601 with the IANA time_zone they're in. A group ride needs a kickstands-up time. Before your first event, accept the Organizer Agreement once on the site. Send an Idempotency-Key so a retry never posts twice.

Create an event
curl -X POST "https://api.d76riders.com/v1/events" \
  -H "Authorization: Bearer $D76_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: toy-run-2026-12-12" \
  -d '{
    "title": "Toys for Tots Ride",
    "type": "CHARITY",
    "time_zone": "America/Chicago",
    "starts_at": "2026-12-12T10:00:00-06:00",
    "meet": { "name": "Liberty Park", "address": "1188 Cumberland Dr, Clarksville, TN" },
    "excerpt": "Bring a new, unwrapped toy."
  }'

Managing a shop

The verified owner of a listing can change it. Hours and phone go live at once; anything else waits for our team's review, as on the site (review: true). Only the days you send in hours change.

Update shop hours
curl -X PATCH "https://api.d76riders.com/v1/shops/your-shop" \
  -H "Authorization: Bearer $D76_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "hours": { "sat": { "open": "09:00", "close": "15:00" }, "sun": null } }'

Errors

Every error has the same shape. The code is stable; the message is a sentence you can show a person.

Error
{
  "error": {
    "code": "forbidden",
    "status": 403,
    "message": "This key doesn't have the events:write scope."
  }
}

Codes: unauthorized (401), forbidden (403), not_found (404), invalid_input (400), conflict (409), rate_limited (429), unavailable (503).

Pagination

Lists take limit (1–100, default 25) and cursor, and answer { data, next_cursor }. Pass next_cursor back as cursor for the next page; it's null on the last one.

Idempotency

Send an Idempotency-Key (8–100 letters, digits, - or _) on POST and PATCH. A retry with the same key gets the first answer back for 7 days, marked Idempotent-Replayed: true. One still running gets 409; the same key on a different request gets 422.

Rate limits

Per key: 600 reads and 60 writes a minute. Every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds); a 429 adds Retry-After. Writes also stay under the site's own limits for your account.

Endpoints

EndpointWhatScope
GET/eventsUpcoming public events: q, type, state, city, from, to, near=lat,lng, radius_mievents:read
GET/events/{slug}One event, with going, waitlist and check-in countsevents:read
POST/eventsPost an event you organizeevents:write
PATCH/events/{id}Change the fields you sendevents:write
POST/events/{id}/cancelCall it off; everyone with a place is toldevents:write
GET/me/eventsEvents your account hosts, drafts includedevents:read
GET/crewsPublic crewscrews:read
GET/crews/{slug}One crewcrews:read
GET/crews/{slug}/membersMembers as the crew page shows themcrews:read
GET/crews/{slug}/eventsThe crew's events (when=past for past ones)crews:read
PATCH/crews/{slug}Change a crew you leadcrews:write
POST/crews/{slug}/eventsPost an event under a crew you belong tocrews:write + events:write
GET/me/crewsCrews you lead or co-leadcrews:read
GET/shopsShop listings on the directoryshops:read
GET/shops/{slug}One listing: hours, links, ratingshops:read
GET/shops/{slug}/reviewsPublic reviews and your repliesshops:read
GET/shops/{slug}/eventsUpcoming rides the shop backsshops:read
PATCH/shops/{slug}Change a listing you ownshops:write
POST/shops/{slug}/eventsBack an upcoming ride (event_slug)shops:write
POST/shops/{slug}/events/{event_slug}/removeStop backing a rideshops:write
POST/shops/{slug}/reviews/{review_id}/replyReply to a review (empty removes it)shops:write
GET/me/shopsListings your account ownsshops:read

Every field and answer is in the API reference, generated from the same contract the API runs on (https://api.d76riders.com/v1/openapi.json).

What the API never shares

Anything about a rider that isn't already public on D76: no RSVP lists, messages, live locations, ride logs, Emergency ID, Rider Assist or email addresses. Counts appear only where the site already shows them.