TravelPad Connect API
Version 1.0 · Last updated: October 1, 2026
TravelPad Connect lets AI assistants plan road trips for people who use TravelPad. With one linked account, an assistant can map a drive, recommend real places to stop along the way, check the weather and daylight for the trip, and save the plan to the person's TravelPad account, ready to navigate in Google Maps.
- Base URL
https://travelpad.travel/api/connect/v1- Authentication
- OAuth 2.0 Authorization Code + PKCE
- Format
- JSON over HTTPS (TLS 1.2+)
- OpenAPI 3.1 spec
- /developers/openapi.yaml
What the API does
Everything a traveler can do in the TravelPad planner, as tools an assistant can call:
- Plan drives. Map a route from A to B with real distance and driving time, optionally avoiding highways or tolls.
- Recommend stops along the route. TravelPad's ranking finds well-reviewed places spread evenly along the drive, matched to the person's interests and ranked by how small the detour is. Search for anything specific too: "lunch around the halfway point", "EV chargers", "scenic viewpoints".
- Route intelligence. Weather moving across the route on the travel date, sunrise and sunset, an elevation profile, and a route quality score with suggestions.
- Save and organize. Save drives, add and reorder stops, and group drives into multi-day trips with dates.
- Community knowledge. Browse road trips other travelers have shared and read their on-the-ground tips about places.
- Hand-off links. Every drive comes with a Google Maps link containing every stop for turn-by-turn navigation, and a TravelPad link to the full plan.
Every place is real. Recommendations come from verified Google Places listings with real ratings. TravelPad never returns invented places.
Quickstart
A typical conversation ("Plan a drive from Denver to Moab with a couple of good hikes") takes three calls once the account is linked.
1. Create the drive
curl -X POST https://travelpad.travel/api/connect/v1/drives \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c9a52-7d0e-4c6b-9a1e-2b8f5d4e6a10" \
-d '{ "start": { "text": "Denver, CO" }, "end": { "text": "Moab, UT" } }'
2. Get recommendations
curl -X POST https://travelpad.travel/api/connect/v1/recommendations \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "driveId": 4821, "query": "hiking trail", "limit": 3 }'
{
"driveId": 4821,
"route": { "distanceMeters": 569700, "durationSeconds": 19920,
"distanceText": "354 mi", "durationText": "5 hr 32 min" },
"recommendations": [
{
"googlePlaceId": "ChIJt-6zQ0pSR4cRZ9kz8mT7cGE",
"name": "Hanging Lake Trailhead",
"reason": "Hiking · ~2 hr 40 min in · 4.8★ from 6,100 reviews",
"address": "Hanging Lake Trail, Glenwood Springs, CO 81601",
"latitude": 39.6014, "longitude": -107.1918,
"category": "nature", "rating": 4.8, "ratingCount": 6100,
"routeFraction": 0.46, "detourMinutes": 6, "detourIsEstimate": false,
"googleMapsUrl": "https://www.google.com/maps/search/?api=1&query_place_id=ChIJt-6zQ0pSR4cRZ9kz8mT7cGE"
}
],
"count": 1,
"remaining": 2
}
3. Add the stops the person likes
curl -X POST https://travelpad.travel/api/connect/v1/drives/4821/stops \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "googlePlaceId": "ChIJt-6zQ0pSR4cRZ9kz8mT7cGE" }'
The response is the updated drive. Share links.googleMapsUrl for navigation and links.travelpadUrl for the full plan.
Authentication & account linking
Every endpoint acts on behalf of one TravelPad user, so every request needs an OAuth 2.0 access token. TravelPad implements the Authorization Code flow with PKCE (S256), per RFC 6749 and RFC 7636.
| Setting | Value |
|---|---|
| Authorization URL | https://travelpad.travel/oauth2/authorize |
| Token URL | https://travelpad.travel/oauth2/token |
| Revocation URL | https://travelpad.travel/oauth2/revoke |
| Server metadata | https://travelpad.travel/.well-known/oauth-authorization-server |
| Grant types | authorization_code, refresh_token |
| PKCE | Required, S256 |
| Client authentication | client_secret_basic or client_secret_post |
| Access token lifetime | 1 hour |
| Refresh token lifetime | 60 days, rotated on every use |
How linking works for the person
- The assistant sends the person to the authorization URL.
- The person signs in to TravelPad, or creates a free account on the spot.
- A consent screen lists exactly what the assistant is asking to do. The person approves or declines.
- TravelPad redirects back with a one-time code, which the assistant exchanges for tokens.
People can see and disconnect linked assistants at any time from their TravelPad account settings. Disconnecting revokes all tokens immediately.
Exchanging the code
curl -X POST https://travelpad.travel/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=authorization_code \
-d code=$CODE \
-d redirect_uri=$REDIRECT_URI \
-d code_verifier=$CODE_VERIFIER
{
"access_token": "eyJraWQiOi...",
"refresh_token": "kT9xQ2...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "profile:read drives:read drives:write trips:read trips:write community:read"
}
Send the access token on every request: Authorization: Bearer <access_token>. Client credentials are issued by TravelPad to approved partners; email hello@travelpad.travel with your redirect URIs.
Scopes
| Scope | Lets the assistant |
|---|---|
profile:read | See the person's first name, travel interests, and plan. |
drives:read | See saved drives, preview routes, get route insights and recommendations. |
drives:write | Create drives and add, remove, or reorder stops. |
trips:read | See trips the person owns or collaborates on. |
trips:write | Create trips and add drives to them. |
community:read | Browse shared community drives and read place tips. |
The API never exposes email addresses, passwords, payment details, direct messages, or the ability to delete drives, trips, or the account.
Requests & responses
- Request and response bodies are JSON (
Content-Type: application/json), UTF-8. - Distances are in meters, durations in seconds, and every response also includes human-readable
distanceText/durationText(US units). - Dates are
YYYY-MM-DD; timestamps are ISO 8601 in UTC. - Locations are passed as a
LocationInputobject with one of:text(free text such as"Zion National Park"),googlePlaceId, orlatitude+longitude. routeFractiondescribes where something sits along a drive:0is the start,0.5halfway,1the destination.- Pagination: list endpoints accept
limitandcursorand returnnextCursor(nullon the last page). - Idempotency: endpoints that create things accept an
Idempotency-Keyheader. Retrying with the same key within 24 hours returns the original result instead of a duplicate. - Every response carries an
X-Request-Idheader. Include it when contacting support.
Errors
Errors use standard HTTP status codes and one consistent body. message is plain English and safe to show to the person.
{
"error": {
"code": "PLAN_LIMIT_REACHED",
"message": "Free accounts can save 5 drives. Upgrade to TravelPad Pro for unlimited drives.",
"upgradeUrl": "https://travelpad.travel/pro"
}
}
| Status | Code | What to do |
|---|---|---|
| 400 | INVALID_REQUEST | Fix the field named in message. |
| 401 | UNAUTHORIZED | Refresh the access token; if that fails, ask the person to re-link. |
| 403 | INSUFFICIENT_SCOPE | Request the missing scope during linking. |
| 403 | FORBIDDEN | The person can view but not edit this drive or trip. |
| 403 | PLAN_LIMIT_REACHED | Tell the person, and share upgradeUrl. |
| 404 | NOT_FOUND | The drive or trip doesn't exist or isn't shared with this person. |
| 422 | PLACE_NOT_FOUND | Ask the person to clarify the location, or call resolvePlace. |
| 422 | NO_DRIVING_ROUTE | There's no road route (e.g. across an ocean). |
| 422 | ROUTE_TOO_SHORT | The drive is too short for along-route recommendations; use getNearbyIdeas. |
| 429 | RATE_LIMITED | Wait retryAfterSeconds (also in Retry-After), then retry. |
| 503 | UPSTREAM_UNAVAILABLE | A maps or weather provider is down. Retry shortly. |
| 500 | INTERNAL_ERROR | Retry once; contact support with X-Request-Id if it persists. |
Rate & plan limits
Rate limits apply per linked account: 60 requests per minute, of which at most 20 may be getStopRecommendations calls. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.
Plan limits are the same as in the TravelPad app. Free accounts have a limited number of saved drives and trips, and a limited number of recommendation requests per drive. TravelPad Pro removes these limits. getMyProfile reports what the person has left, and getStopRecommendations returns remaining for the drive. Previews, route insights, and reading saved data never count against plan limits.
Endpoint reference
All paths are relative to https://travelpad.travel/api/connect/v1. Full request and response schemas are in the OpenAPI specification.
Account
GET/meprofile:read
operationId: getMyProfile
The linked person's first name, travel interests (which personalize recommendations), plan tier, and remaining drives and trips.
Places
GET/places/resolve?query=…drives:read
operationId: resolvePlace
Turns a place name or address into up to 5 verified candidates with coordinates and googlePlaceId. Use it to disambiguate ("Springfield") before planning. Optional: every other endpoint also accepts free text.
GET/places/{googlePlaceId}/tipscommunity:read
operationId: getPlaceTips
Community tips about a place (parking, best time to go, what to skip), most helpful first. Tips marked verifiedOnSite come from travelers who checked in at the place with a photo.
Routes
POST/routes/previewdrives:read
operationId: previewRoute
Distance, driving time, and a Google Maps link from start to end, without saving anything. Body: start, end, optional avoidHighways, avoidTolls.
POST/routes/insightsdrives:read
operationId: getRouteInsights
Weather at points along the route for a travel date, sunrise and sunset, an elevation profile, and a 0–100 route quality score with suggested improvements. Pass a driveId, or start and end. Forecasts cover the next 14 days; later dates return seasonal norms (forecastType: "seasonal").
{ "driveId": 4821, "date": "2026-10-17" }
Recommendations
POST/recommendationsdrives:read
operationId: getStopRecommendations
TravelPad's core algorithm: real, well-reviewed places spread along the route, ranked by fit and detour time, ordered from start to destination. Each result has a short factual reason, rating, detour minutes, and a Google Maps link.
| Field | Description |
|---|---|
driveId or start + end | The route. A saved drive is preferred; places already on it are skipped. |
query | Optional. A category ("brewery", "hotel", "EV charger") or a named place. Omit for personalized picks. |
interests | Optional. Override the person's saved interests for this request. |
nearRouteFraction | Optional, 0–1. Focus on one part of the drive (0.5 = around halfway). |
maxDetourMinutes | Optional. Only places within this much extra driving. |
excludeGooglePlaceIds | Optional. Places the person already turned down. |
limit | 1–10, default 5. |
GET/recommendations/nearby?latitude=…&longitude=…drives:read
operationId: getNearbyIdeas
"What should I do around here today?" A handful of nearby ideas with a whyToday reason based on today's weather and season, plus the day's forecast and sunrise/sunset.
Drives
GET/drivesdrives:read
operationId: listDrives
The person's saved drives, newest first. Paginated.
POST/drivesdrives:write
operationId: createDrive
Saves a new drive from start to end, optionally with initial stops and avoidHighways / avoidTolls. Returns 201 with the full drive. Counts as one drive on the person's plan. Supports Idempotency-Key.
GET/drives/{driveId}drives:read
operationId: getDrive
A drive with its ordered stops, route summary, and links (travelpadUrl, googleMapsUrl, shareUrl).
PATCH/drives/{driveId}drives:write
operationId: updateDrivePreferences
Change avoidHighways and/or avoidTolls. Returns the drive with its recalculated route.
POST/drives/{driveId}/stopsdrives:write
operationId: addStop
Adds a place by googlePlaceId (preferred) or place (a LocationInput). Without position, TravelPad inserts it where it fits best along the route. Adding a place that's already on the drive is a no-op.
PUT/drives/{driveId}/stops/orderdrives:write
operationId: reorderStops
Body: stopIds, every stop on the drive in the new order.
DELETE/drives/{driveId}/stops/{stopId}drives:write
operationId: removeStop
Removes one stop and returns the updated drive.
Trips
GET/tripstrips:read
operationId: listTrips
Trips the person owns or collaborates on, with their role (owner, editor, viewer).
POST/tripstrips:write
operationId: createTrip
Creates a multi-day trip. Body: name, optional startDate, endDate. Counts against the person's trip limit.
GET/trips/{tripId}trips:read
operationId: getTrip
A trip with its drives in order, each with its scheduled date and links.
POST/trips/{tripId}/drivestrips:write
operationId: addDriveToTrip
Adds a saved drive to the trip. Body: driveId, optional scheduledDate.
Community
GET/community/drivescommunity:read
operationId: browseCommunityDrives
Road trips other travelers have shared publicly, optionally focused on an area with near ("Utah", "Pacific Coast Highway"). Paginated.
POST/community/drives/{postId}/savedrives:write
operationId: saveCommunityDrive
Copies a shared drive, with its stops, into the person's account as an editable drive. Counts like createDrive.
Data use & privacy
- The API only acts for the person who linked their account, within the scopes they approved.
- Community content is limited to what travelers chose to share publicly. Other people's email addresses and private drives are never returned.
- TravelPad doesn't sell personal data or use connector traffic for advertising. Request logs are kept for 30 days for security and debugging.
- Unlinking from TravelPad account settings revokes all tokens for that assistant immediately. Deleting a TravelPad account revokes everything and deletes the person's data.
The full policy is in the Privacy Policy; use of the API is subject to the Terms of Service.
Support & status
Questions, partner credentials, or a bug report: hello@travelpad.travel. Include the X-Request-Id from the response.
The API is versioned in the path (/v1). Breaking changes ship as a new version, with at least 90 days' notice before an old version is retired. Additive changes (new fields, new endpoints) can happen at any time, so clients should ignore fields they don't recognize.