Install
openclaw skills install ubtrippinManages travel for your user via UBTRIPPIN — trips, items, loyalty programs, family, city guides, events, concerts, notifications, and more. Use when the use...
openclaw skills install ubtrippinUBTRIPPIN is a personal travel tracker that parses booking confirmation emails and organises them into trips. It also handles event tickets — concerts, theater, sports, festivals — from providers like Ticketmaster, AXS, Eventbrite, and more. As an agent, you can read and manage a user's trips, items (flights, hotels, trains, tickets/events, etc.), loyalty vault, family groups, city guides, and more via REST API.
ubt_k1_<40 hex chars>. Store it securely.GET /api/v1/me/profile and offer to set the user's home airport, currency preference, and seat preference via PATCH /api/v1/me/profile.All API calls use a Bearer token:
Authorization: Bearer ubt_k1_<your_key>
Base URL: https://www.ubtrippin.xyz
Rate limit: 100 requests/minute per API key. HTTP 429 if exceeded — back off 60 seconds.
GET /api/v1/trips
Query params: ?status=upcoming (optional filter)
Response:
{
"data": [
{
"id": "uuid",
"title": "Tokyo Spring 2026",
"start_date": "2026-04-01",
"end_date": "2026-04-14",
"primary_location": "Tokyo, Japan",
"travelers": ["Ian Rogers"],
"notes": null,
"cover_image_url": "https://...",
"share_enabled": false,
"created_at": "2026-02-15T10:00:00Z",
"updated_at": "2026-02-15T10:00:00Z"
}
],
"meta": { "count": 1 }
}
Ordered by start_date descending (soonest upcoming / most recent first).
GET /api/v1/trips/:id
Response includes full trip object with nested items array. Each item has: id, trip_id, kind, provider, traveler_names, start_ts, end_ts, start_date, end_date, start_location, end_location, summary, details_json, status, confidence, needs_review, timestamps.
Item kinds: flight, hotel, train, car, ferry, activity, ticket, other
POST /api/v1/trips
Content-Type: application/json
{ "title": "Summer in Provence", "start_date": "2026-07-01", "end_date": "2026-07-14" }
PATCH /api/v1/trips/:id
Content-Type: application/json
{ "title": "Updated Title", "notes": "Remember sunscreen" }
DELETE /api/v1/trips/:id
POST /api/v1/trips/:id/rename
Content-Type: application/json
{ "title": "New Trip Name" }
POST /api/v1/trips/:id/merge
Content-Type: application/json
{ "source_trip_id": "uuid-of-trip-to-merge-in" }
Merges items from the source trip into the target trip.
GET /api/v1/trips/:id/status
Returns processing status for the trip.
GET /api/v1/trips/demo
Returns a sample trip for onboarding — no auth required.
GET /api/v1/items/:id
Response: { "data": <item> } — full Item shape with details_json containing confirmation numbers, seat assignments, etc.
PATCH /api/v1/items/:id
Content-Type: application/json
{ "summary": "Updated summary", "start_location": "Paris CDG" }
DELETE /api/v1/items/:id
POST /api/v1/trips/:id/items
Content-Type: application/json
Required fields: kind, start_date
All fields:
| Field | Type | Description |
|---|---|---|
kind | string | Required. One of: flight, hotel, car_rental, train, activity, restaurant, ticket, other |
start_date | string | Required. ISO date: YYYY-MM-DD |
end_date | string | ISO date. For hotels = checkout, flights = arrival date if different |
start_ts | string | ISO 8601 datetime with timezone: 2026-04-01T08:30:00Z |
end_ts | string | ISO 8601 datetime with timezone |
start_location | string | Departure/origin. City, airport code, or address (max 300 chars) |
end_location | string | Arrival/destination (max 300 chars) |
summary | string | One-line summary, e.g. "AF276 CDG→NRT" (max 1000 chars) |
provider | string | Airline, hotel chain, etc. e.g. "Air France" (max 200 chars) |
confirmation_code | string | Booking reference (max 200 chars) |
traveler_names | string[] | Array of traveler names (max 20, each max 200 chars) |
details_json | object | Freeform metadata — gate, seat, room type, etc. (max 10KB) |
notes | string | User notes |
status | string | Item status |
Example — Flight:
{
"kind": "flight",
"start_date": "2026-04-01",
"start_ts": "2026-04-01T08:30:00+01:00",
"end_ts": "2026-04-01T15:45:00+09:00",
"start_location": "Paris CDG",
"end_location": "Tokyo NRT",
"summary": "AF276 CDG→NRT",
"provider": "Air France",
"confirmation_code": "XK7J3M",
"traveler_names": ["Ian Rogers"],
"details_json": { "flight_number": "AF276", "seat": "14A", "class": "Economy" }
}
Example — Hotel:
{
"kind": "hotel",
"start_date": "2026-04-01",
"end_date": "2026-04-05",
"start_location": "Tokyo, Japan",
"summary": "Park Hyatt Tokyo",
"provider": "Hyatt",
"confirmation_code": "HY-889923",
"traveler_names": ["Ian Rogers", "Hedvig Rogers"],
"details_json": { "room_type": "King Deluxe", "check_in": "15:00", "check_out": "11:00" }
}
Example — Train:
{
"kind": "train",
"start_date": "2026-04-05",
"start_ts": "2026-04-05T09:00:00+09:00",
"end_ts": "2026-04-05T11:30:00+09:00",
"start_location": "Tokyo Station",
"end_location": "Kyoto Station",
"summary": "Shinkansen Nozomi 7",
"provider": "JR Central",
"confirmation_code": "JR-44521",
"details_json": { "car": "7", "seat": "3A", "class": "Green Car" }
}
Example — Restaurant:
{
"kind": "restaurant",
"start_date": "2026-04-03",
"start_ts": "2026-04-03T19:00:00+09:00",
"start_location": "Sukiyabashi Jiro, Ginza, Tokyo",
"summary": "Dinner at Sukiyabashi Jiro",
"details_json": { "party_size": 2, "reservation_name": "Rogers" }
}
Example — Ticket/Event (concert, sports, theater, festival, etc.):
{
"kind": "ticket",
"summary": "David Byrne at Théâtre du Châtelet",
"start_date": "2026-05-15",
"start_ts": "2026-05-15T20:00:00+02:00",
"start_location": "Paris",
"provider": "Ticketmaster",
"details_json": {
"event_name": "David Byrne: American Utopia",
"venue": "Théâtre du Châtelet",
"venue_address": "1 Place du Châtelet, 75001 Paris",
"performer": "David Byrne",
"event_time": "20:00",
"door_time": "19:00",
"section": "Orchestre",
"seat": "12",
"row": "G",
"ticket_count": 2,
"ticket_type": "Reserved",
"event_category": "concert"
}
}
Ticket detail fields:
| Field | Type | Description |
|---|---|---|
| event_name | string | Name of the event/show |
| venue | string | Venue name |
| venue_address | string? | Full address |
| event_time | HH:MM | Show start time |
| door_time | HH:MM? | Door opening time |
| section | string? | Seating section |
| seat | string? | Seat number |
| row | string? | Row identifier |
| ticket_count | number | Number of tickets |
| ticket_type | string? | GA, Reserved, VIP, etc. |
| performer | string? | Artist/performer/team |
| event_category | enum | concert, theater, sports, museum, festival, other |
Supported ticket providers: Ticketmaster, AXS, Eventbrite, Dice, SeeTickets, StubHub, Viagogo, venue direct sales. Forward the confirmation email to trips@ubtrippin.xyz and the ticket is extracted automatically.
Event-driven trips: When a ticket email creates a new trip (no overlapping dates), the trip is named after the event/performer and the cover image is of the performer — not the city.
POST /api/v1/trips/:id/items/batch
Content-Type: application/json
{ "items": [ <item>, <item>, ... ] }
Up to 50 items per request. Same fields as single item creation above.
Response: { "data": [...items], "meta": { "count": N } }
Tip for agents: When your user gives you a booking confirmation (email text, screenshot, pasted text), parse it yourself and use these endpoints to add structured items. You handle the extraction; UBTRIPPIN handles the storage, grouping, and display.
GET /api/v1/items/:id/status
POST /api/v1/items/:id/status/refresh
Re-checks live status (e.g. flight delays, gate changes).
GET /api/v1/me/loyalty
Response:
{
"data": [
{
"id": "uuid",
"provider_key": "delta_skymiles",
"provider_name": "Delta SkyMiles",
"member_number": "1234567890",
"tier": "Gold",
"notes": null
}
]
}
GET /api/v1/me/loyalty/lookup?provider_key=delta_skymiles
Returns matching loyalty entry for a specific provider.
POST /api/v1/me/loyalty
Content-Type: application/json
{ "provider_key": "delta_skymiles", "member_number": "1234567890", "tier": "Gold" }
PATCH /api/v1/me/loyalty/:id
Content-Type: application/json
{ "member_number": "9876543210", "tier": "Platinum" }
DELETE /api/v1/me/loyalty/:id
GET /api/v1/me/loyalty/export
Returns all loyalty data in a downloadable format.
GET /api/v1/loyalty/providers
Returns the full list of supported loyalty providers (no auth required).
GET /api/v1/me/profile
Response includes name, email, preferences, tier, and settings.
PUT /api/v1/me/profile
Content-Type: application/json
{ "display_name": "Ian Rogers", "timezone": "Europe/Paris" }
Also accepts POST with the same body.
GET /api/v1/families
POST /api/v1/families
Content-Type: application/json
{ "name": "The Rogers Family" }
GET /api/v1/families/:id
PATCH /api/v1/families/:id
Content-Type: application/json
{ "name": "Updated Family Name" }
DELETE /api/v1/families/:id
POST /api/v1/families/:id/members
Content-Type: application/json
{ "email": "partner@example.com", "role": "member" }
DELETE /api/v1/families/:id/members/:uid
GET /api/v1/families/:id/profiles
GET /api/v1/families/:id/trips
Returns all trips visible to family members.
GET /api/v1/families/:id/loyalty
GET /api/v1/families/:id/loyalty/lookup?provider_key=delta_skymiles
Look up a loyalty number across all family members.
GET /api/v1/families/:id/guides
GET /api/v1/family-invites/:token
POST /api/v1/family-invites/:token/accept
View and accept family invite links.
GET /api/v1/trips/:id/collaborators
POST /api/v1/trips/:id/collaborators
Content-Type: application/json
{ "email": "friend@example.com", "role": "viewer" }
PATCH /api/v1/trips/:id/collaborators/:uid
Content-Type: application/json
{ "role": "editor" }
DELETE /api/v1/trips/:id/collaborators/:uid
GET /api/v1/invites/:token
POST /api/v1/invites/:token/accept
View and accept trip collaboration invite links.
GET /api/v1/guides
Query params: ?family_id=uuid (optional)
POST /api/v1/guides
Content-Type: application/json
{ "city": "Tokyo", "title": "Tokyo Eats" }
GET /api/v1/guides/:id
PATCH /api/v1/guides/:id
DELETE /api/v1/guides/:id
GET /api/v1/guides/:id/entries
POST /api/v1/guides/:id/entries
Content-Type: application/json
{ "name": "Tsukiji Outer Market", "category": "food", "notes": "Go early" }
PATCH /api/v1/guides/:id/entries/:eid
DELETE /api/v1/guides/:id/entries/:eid
GET /api/v1/guides/nearby?lat=35.6762&lng=139.6503
Find guides near a location.
GET /api/v1/settings/senders
POST /api/v1/settings/senders
Content-Type: application/json
{ "email": "mywork@company.com" }
DELETE /api/v1/settings/senders/:id
GET /api/v1/calendar/token
Returns an iCal subscription URL for syncing trips to calendar apps.
POST /api/v1/calendar/token
Invalidates the old token and generates a new one.
GET /api/v1/notifications
Query params: ?unread=true (optional)
PATCH /api/v1/notifications/:id
Content-Type: application/json
{ "read": true }
GET /api/v1/webhooks
POST /api/v1/webhooks
Content-Type: application/json
{ "url": "https://example.com/hook", "events": ["trip.created", "item.added"] }
GET /api/v1/webhooks/:id
PATCH /api/v1/webhooks/:id
Content-Type: application/json
{ "url": "https://example.com/new-hook", "active": true }
DELETE /api/v1/webhooks/:id
POST /api/v1/webhooks/:id/test
Sends a test payload to verify the endpoint.
GET /api/v1/webhooks/:id/deliveries
Lists recent delivery attempts with status codes.
GET /api/v1/trains/:trainNumber/status
Returns real-time status for a train by number (delays, platform, etc.).
GET /api/v1/images/search?q=tokyo+tower
Search for destination/cover images.
GET /api/v1/imports
POST /api/v1/imports
Upload booking data for batch import.
GET /api/v1/imports/:id
GET /api/v1/billing/subscription
Returns current plan, tier, and billing period.
GET /api/v1/billing/portal
Returns a Stripe billing portal link for managing subscription.
GET /api/v1/billing/prices
Returns available plans and pricing.
POST /api/v1/checkout
Content-Type: application/json
{ "price_id": "price_xxx" }
Creates a Stripe checkout session.
GET /api/v1/activation/status
Returns whether the user's account is activated.
The primary way to add bookings is email forwarding. When your user receives a booking confirmation:
How to do this as an agent:
Works with: flights, hotels, trains (Eurostar, SNCF, Thalys, etc.), rental cars, ferry bookings, concert/event tickets (Ticketmaster, AXS, Eventbrite, Dice, SeeTickets, StubHub, Viagogo), and most major booking platforms (Booking.com, Expedia, Kayak, Trainline, etc.).
GET /api/v1/tripsGET /api/v1/trips — find the Tokyo trip IDGET /api/v1/trips/:id — get full itinerary with all itemsGET /api/v1/trips/:id to confirm it appearedGET /api/v1/me/loyalty/lookup?provider_key=delta_skymilesmember_number from the responsePOST /api/v1/me/loyalty with { "provider_key": "marriott_bonvoy", "member_number": "123456789" }GET /api/v1/familiesGET /api/v1/families/:id/loyalty/lookup?provider_key=delta_skymilesPOST /api/v1/families to create a family group (if none exists)POST /api/v1/families/:id/members with { "email": "partner@example.com" } for each memberPOST /api/v1/trips/:id/collaborators with { "email": "friend@example.com", "role": "viewer" }GET /api/v1/trains/:trainNumber/statusGET /api/v1/guides/nearby?lat=48.8566&lng=2.3522POST /api/v1/webhooks with { "url": "https://...", "events": ["item.added"] }GET /api/v1/calendar/token| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing/invalid API key |
| 400 | invalid_param | Bad UUID or missing field |
| 404 | not_found | Trip/item not found or belongs to another user |
| 429 | (body varies) | Rate limited — wait 60s |
| 500 | internal_error | Server error — retry once |
All errors return: { "error": { "code": "...", "message": "..." } }
YYYY-MM-DD for dates, YYYY-MM-DDTHH:MM:SSZ for timestamps).details_json contains raw parsed data — useful for confirmation numbers, seat assignments, loyalty numbers, etc.confidence (0–1): how confident the AI parser was. Items with needs_review: true may have errors.Users manage keys at ubtrippin.xyz/settings. Each key has a name and a masked preview. If a key is compromised, the user can revoke it from the settings page and generate a new one.