TravelPad Connect API

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:

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.

SettingValue
Authorization URLhttps://travelpad.travel/oauth2/authorize
Token URLhttps://travelpad.travel/oauth2/token
Revocation URLhttps://travelpad.travel/oauth2/revoke
Server metadatahttps://travelpad.travel/.well-known/oauth-authorization-server
Grant typesauthorization_code, refresh_token
PKCERequired, S256
Client authenticationclient_secret_basic or client_secret_post
Access token lifetime1 hour
Refresh token lifetime60 days, rotated on every use

How linking works for the person

  1. The assistant sends the person to the authorization URL.
  2. The person signs in to TravelPad, or creates a free account on the spot.
  3. A consent screen lists exactly what the assistant is asking to do. The person approves or declines.
  4. 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

ScopeLets the assistant
profile:readSee the person's first name, travel interests, and plan.
drives:readSee saved drives, preview routes, get route insights and recommendations.
drives:writeCreate drives and add, remove, or reorder stops.
trips:readSee trips the person owns or collaborates on.
trips:writeCreate trips and add drives to them.
community:readBrowse 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

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"
  }
}
StatusCodeWhat to do
400INVALID_REQUESTFix the field named in message.
401UNAUTHORIZEDRefresh the access token; if that fails, ask the person to re-link.
403INSUFFICIENT_SCOPERequest the missing scope during linking.
403FORBIDDENThe person can view but not edit this drive or trip.
403PLAN_LIMIT_REACHEDTell the person, and share upgradeUrl.
404NOT_FOUNDThe drive or trip doesn't exist or isn't shared with this person.
422PLACE_NOT_FOUNDAsk the person to clarify the location, or call resolvePlace.
422NO_DRIVING_ROUTEThere's no road route (e.g. across an ocean).
422ROUTE_TOO_SHORTThe drive is too short for along-route recommendations; use getNearbyIdeas.
429RATE_LIMITEDWait retryAfterSeconds (also in Retry-After), then retry.
503UPSTREAM_UNAVAILABLEA maps or weather provider is down. Retry shortly.
500INTERNAL_ERRORRetry 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.

FieldDescription
driveId or start + endThe route. A saved drive is preferred; places already on it are skipped.
queryOptional. A category ("brewery", "hotel", "EV charger") or a named place. Omit for personalized picks.
interestsOptional. Override the person's saved interests for this request.
nearRouteFractionOptional, 0–1. Focus on one part of the drive (0.5 = around halfway).
maxDetourMinutesOptional. Only places within this much extra driving.
excludeGooglePlaceIdsOptional. Places the person already turned down.
limit1–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 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.