Developer Docs
Integrate My Rider guest preference data directly into your PMS, POS, or CRM. Pull verified preferences, AI insights, and ready-made revenue opportunities for any guest who has shared their MRN with you.
Authentication
All API requests must include your API key as a Bearer token in the Authorization header. Your API key is available in the My Rider partner portal after signing in.
Authorization: Bearer mk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
⚠️ Keep your API key private. Do not expose it in client-side code or public repositories. If compromised, contact us to rotate it.
Base URL
https://buildmyrider.com
All endpoints are versioned under /api/v1/. Prefix every path below with the base URL above.
Endpoints
/api/v1/rider/:mrnFetch full preference profile for a guest by their My Rider Number.
/api/v1/rider/:mrn/opportunitiesFetch AI insights and revenue opportunities for a guest's most recent rider.
GET /api/v1/rider/:mrn
Returns the full preference profile for the guest with the given MRN. Guests may have multiple riders (one per trip mode). Use the trip_mode query parameter to filter to a specific one.
Path parameters
:mrn | string | The guest's My Rider Number, e.g. MYR-AB12CD. Case-insensitive. |
Query parameters
trip_modeoptional | string | Filter riders by mode. One of: leisure, business, family, adventure, romance. Omit to return all. |
Example request
curl -X GET "https://buildmyrider.com/api/v1/rider/MYR-AB12CD" \ -H "Authorization: Bearer mk_your_api_key"
Example response
{
"mrn": "MYR-AB12CD",
"name": "Jane Smith",
"birthday": { "month": "3", "day": "14" },
"favorite_travel": "Beach destinations",
"retrieved_by": "The Grand Hotel",
"retrieved_at": "2026-04-23T10:00:00.000Z",
"riders": [
{
"trip_mode": "leisure",
"vibe": "luxury",
"breakfast": "Avocado toast and fresh juice",
"juice": "Green juice",
"coffee": "Oat milk flat white",
"activity": "Morning yoga",
"news": "The New York Times",
"snack": "Dark chocolate",
"beverage": "Sparkling water",
"liquor": "Champagne",
"indulgence": "Long bath with candles",
"gift": "Fresh flowers",
"scent": "Jasmine",
"children": null,
"partner_mrn": "MYR-XY99ZZ",
"share_id": "abc123"
}
]
}Response fields
mrn | string | The guest's My Rider Number. |
name | string | Guest's display name. |
birthday | object | null | Birth month and day (no year). Null if not provided. |
favorite_travel | string | null | Guest's self-described travel style. |
retrieved_by | string | Your business name, confirming the request was attributed correctly. |
retrieved_at | string | ISO 8601 timestamp of this API call. |
riders | array | All riders for this guest (or filtered by trip_mode). May be empty. |
riders[].trip_mode | string | One of: leisure, business, family, adventure, romance. |
riders[].vibe | string | Guest personality: comfort, explorer, wellness, luxury, adventure, headsdown. |
riders[].breakfast | string | Preferred breakfast. |
riders[].coffee | string | Coffee or tea preference. |
riders[].juice | string | Morning juice preference. |
riders[].activity | string | Morning activity or ritual. |
riders[].snack | string | Preferred snack. |
riders[].beverage | string | Non-alcoholic afternoon beverage. |
riders[].liquor | string | Alcoholic drink preference. May be 'none'. |
riders[].indulgence | string | Signature personal indulgence. |
riders[].gift | string | Ideal welcome gift. |
riders[].scent | string | Preferred room scent. |
riders[].news | string | Preferred news source. |
riders[].partner_mrn | string | null | Linked partner's MRN, if the guest connected a partner rider. |
riders[].children | array | null | Child preference objects (name, age, breakfast, snack, drink, activity, allergies). Null if no children. |
GET /api/v1/rider/:mrn/opportunities
Returns AI-generated preference insights and personalized revenue opportunities for the guest's most recent rider. Each opportunity includes a ready-to-use email template. Ideal for triggering pre-arrival upsell emails automatically from your PMS.
Query parameters
trip_modeoptional | string | Filter to a specific rider. Same values as above. |
Example request
curl -X GET "https://buildmyrider.com/api/v1/rider/MYR-AB12CD/opportunities" \ -H "Authorization: Bearer mk_your_api_key"
Example response
{
"mrn": "MYR-AB12CD",
"name": "Jane Smith",
"trip_mode": "leisure",
"vibe": "luxury",
"retrieved_by": "The Grand Hotel",
"retrieved_at": "2026-04-23T10:00:00.000Z",
"insights": [
{
"icon": "🌱",
"label": "Morning Drink",
"value": "Plant-based preference — have oat or almond milk available."
},
{
"icon": "🧘",
"label": "Morning Ritual",
"value": "Wellness-oriented — offer a quiet space or yoga mat on request."
}
],
"opportunities": [
{
"category": "Wellness",
"icon": "🧘",
"title": "In-room yoga or meditation session",
"description": "Jane practices yoga. Offer a private in-room session with a local instructor.",
"revenue_estimate": "$50–150 per session",
"email_subject": "Your peaceful morning — in-room yoga available during your stay",
"email_body": "Hi Jane,\n\nWe noticed you enjoy yoga..."
}
],
"opportunity_summary": {
"total_count": 3,
"categories": ["Wellness", "Food & Beverage", "Welcome"],
"estimated_revenue_range": "$20–150 per stay"
}
}Response fields
insights | array | AI-generated preference notes. Each has icon, label, value. |
opportunities | array | Personalized upsell opportunities. |
opportunities[].category | string | One of: Food & Beverage, Experiences, Wellness, Upgrades, Family, Welcome. |
opportunities[].revenue_estimate | string | Estimated revenue range, e.g. '$50–150 per session'. |
opportunities[].email_subject | string | Ready-to-send email subject line. |
opportunities[].email_body | string | Ready-to-send email body, personalized with guest name and your property name. |
opportunity_summary | object | Quick summary: total count, categories, and combined revenue range. |
Error codes
401 Unauthorized | API key is missing or invalid. Check your Authorization header. |
403 Forbidden | Your API key is valid but the account is inactive. Contact support. |
404 Not Found | No rider found for this MRN, or the MRN doesn't exist. |
400 Bad Request | Malformed request (e.g. invalid query parameter). |
500 Internal Server Error | Something went wrong on our end. Try again or contact support. |
All error responses follow the shape: { "error": "message" }
Trip mode values
Use these exact strings with the trip_mode query parameter:
leisure | 🌴 | Leisure / holiday travel |
business | 💼 | Business travel |
family | 👨👩👧 | Family trips — includes children preferences |
adventure | 🧗 | Adventure / outdoor travel |
romance | 💑 | Couples / romantic travel |
Code examples
Node.js
const MRN = 'MYR-AB12CD'
const API_KEY = process.env.MY_RIDER_API_KEY
const res = await fetch(
`https://buildmyrider.com/api/v1/rider/${MRN}`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
)
if (!res.ok) {
const { error } = await res.json()
throw new Error(error)
}
const guest = await res.json()
console.log(guest.name, guest.riders[0].coffee)Python
import os, requests
MRN = "MYR-AB12CD"
API_KEY = os.environ["MY_RIDER_API_KEY"]
response = requests.get(
f"https://buildmyrider.com/api/v1/rider/{MRN}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
response.raise_for_status()
guest = response.json()
print(guest["name"], guest["riders"][0]["coffee"])Fetch opportunities & auto-send email
// Run this when a reservation is confirmed
async function sendPreArrivalEmail(mrn, guestEmail) {
const res = await fetch(
`https://buildmyrider.com/api/v1/rider/${mrn}/opportunities`,
{ headers: { Authorization: `Bearer ${process.env.MY_RIDER_API_KEY}` } }
)
const data = await res.json()
if (!data.opportunities?.length) return
// Pick the highest-value opportunity
const top = data.opportunities[0]
await sendEmail({
to: guestEmail,
subject: top.email_subject,
body: top.email_body,
})
}Rate limits & tiers
API access is available on Pro ($99/mo) and Growth ($299/mo) plans. Starter plan ($29/mo) includes manual portal lookup only.
| Plan | Monthly lookups | API access | Webhooks |
|---|---|---|---|
| Starter | 50 | ✗ | ✗ |
| Pro | 300 | ✓ | ✗ |
| Growth | 1,000 | ✓ | ✓ |
Need more than 1,000 lookups/month? Contact us for Enterprise pricing.