Skip to main content

Trips

V2 trip fetch endpoints​

V2 trip routes are read-only. Use the existing v1 routes for creating, updating, and deleting.

GET /v2/trips​

Lists trips accessible to the authenticated user using a lean, paginated response.

Authentication: required.

Accessible means the caller is the trip owner, an edit collaborator, or a view collaborator.

Query parameters:

  • page optional page number
  • deleted=true optional to return soft-deleted trips instead of active trips
  • updatedSince optional ISO-8601 datetime
  • fields=... optional
  • fields!=... optional

Notes:

  • Paginated at 100 trips per page.
  • Accepts timestamps such as 2026-03-17T00:00:00Z.
  • The implementation subtracts 2 days before filtering updatedSince.
  • Includes trips changed directly or through nested emails, permissions, activities, hostings, transportations, and expenses.
  • Collaborator trips are always included in the filtered response.
  • emails are never embedded in the v2 trip payload.
  • collaborators_count is not returned; use collaborators.
  • When deleted=true is present, each result contains only id.
curl -X GET "https://api.tripsy.app/v2/trips?updatedSince=2026-03-15T00:00:00Z" \
-H "Authorization: Token YOUR_TOKEN_HERE"

Success response uses the standard paginated list envelope:

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 42,
"internal_identifier": "trip_42_local",
"name": "Italy",
"timezone": "Europe/Rome",
"hidden": false,
"description": "Summer vacation",
"starts_at": "2026-06-01",
"ends_at": "2026-06-15",
"cover_gradient": 3,
"cover_image_url": null,
"owner": 1,
"collaborators": 2,
"has_dates": true,
"number_of_days": 0,
"guests": []
}
]
}

GET /v2/trip/{trip_id}/hostings​

GET /v2/trip/{trip_id}/activities​

GET /v2/trip/{trip_id}/transportations​

Lists hostings, activities, or transportations for one accessible trip using lean, paginated responses.

Authentication: required.

Permissions: trip must be accessible to the caller.

Query parameters:

  • page optional page number
  • deleted=true optional to return soft-deleted child objects instead of active child objects
  • updatedSince optional ISO-8601 datetime
  • activityType=... optional exact-match filter for activities only
  • transportationType=... optional exact-match filter for transportations only
  • fields=... optional
  • fields!=... optional

Notes:

  • Paginated at 100 objects per page.
  • emails are never embedded in v2 child-object list payloads.
  • updatedSince includes the object's own updated_at changes and related email updates.
  • Deleted child objects are returned only when the parent trip is still active and accessible.
  • When deleted=true is present, each result contains only id.
  • price and currency may be omitted when the caller cannot see expenses.
  • Transportation objects include departure_apple_maps_id, arrival_apple_maps_id, and actual_transport_number.
curl -X GET "https://api.tripsy.app/v2/trip/42/hostings" \
-H "Authorization: Token YOUR_TOKEN_HERE"

curl -X GET "https://api.tripsy.app/v2/trip/42/activities?activityType=restaurant" \
-H "Authorization: Token YOUR_TOKEN_HERE"

curl -X GET "https://api.tripsy.app/v2/trip/42/transportations?transportationType=airplane" \
-H "Authorization: Token YOUR_TOKEN_HERE"

Success response:

  • Paginated list envelope.
  • Hostings use the same fields as the hosting object, except emails.
  • Activities use the same fields as the activity object, except emails.
  • Transportations use the same fields as the transportation object, except emails.

GET /v2/trip/{trip_id}/hosting/{id}​

GET /v2/trip/{trip_id}/activity/{id}​

GET /v2/trip/{trip_id}/transportation/{id}​

Retrieves one child object from an accessible trip.

Authentication: required.

Permissions: trip must be accessible to the caller.

Success response: object response without the pagination envelope.

Failure response: 404 Not Found when the object does not exist, is deleted, is not in the trip, or the trip is not accessible.

GET /v2/trip/{trip_id}/emails​

Use the email list/detail routes and document list/detail routes to retrieve attachments. Trip-level routes aggregate attachments from the trip and its active itinerary. These reads require document visibility permission and active Pro for the trip owner; permitted collaborators do not need their own Pro.

GET /v2/trip/{trip_id}/hosting/{hosting_id}/emails​

GET /v2/trip/{trip_id}/activity/{activity_id}/emails​

GET /v2/trip/{trip_id}/transportation/{transportation_id}/emails​

See the attached booking-email guide for exact child scope, permissions, pagination, and individual retrieval. Existing email section anchors remain available here.

GET /v1/trips​

Lists trips accessible to the authenticated user.

Authentication: required.

Accessible means the caller is the trip owner, an edit collaborator, or a view collaborator.

Query parameters:

  • updatedSince optional ISO-8601 datetime
  • fields=... optional
  • fields!=... optional

Notes on updatedSince:

  • Accepts timestamps such as 2026-03-17T00:00:00Z.
  • The implementation subtracts 2 days before filtering.
  • Includes trips changed directly or via nested updates.
  • Collaborator trips are always included in the filtered response.
curl -X GET "https://api.tripsy.app/v1/trips?updatedSince=2026-03-15T00:00:00Z" \
-H "Authorization: Token YOUR_TOKEN_HERE"

Success response uses the custom trips envelope:

{
"results": [
{
"id": 42,
"name": "Italy",
"timezone": "Europe/Rome",
"starts_at": "2026-06-01",
"ends_at": "2026-06-15",
"emails": []
}
]
}

POST /v1/trips​

Creates a new trip.

Authentication: required.

Writable fields:

  • internal_identifier
  • name
  • timezone
  • hidden
  • description
  • starts_at
  • ends_at
  • cover_gradient
  • cover_image_url
  • has_dates
  • number_of_days
  • guest_invites (create only): an array of objects with numeric user_id and permissions for known guests; use guest management for existing trips

has_dates=false is authoritative: ignore stored start/end date values in that case.

curl -X POST "https://api.tripsy.app/v1/trips" \
-H "Authorization: Token YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
-d '{
"name": "Italy",
"starts_at": "2026-06-01",
"ends_at": "2026-06-15",
"timezone": "Europe/Rome",
"description": "Summer vacation"
}'

Success: 201 Created with a trip object.

Important behavior:

  • The server sets owner to the authenticated user.
  • The trip owner automatically receives full permissions.
  • If internal_identifier already exists for another trip owned by the same user and is longer than 5 characters, the endpoint returns an empty 200 response instead of creating a duplicate.

GET /v1/trips/{id}​

Returns one trip accessible to the current user.

Authentication: required.

Success response: trip object.

PUT /v1/trips/{id}​

PATCH /v1/trips/{id}​

Updates a trip.

Authentication: required.

Writable fields are the same trip fields used on create, except guest_invites, which is processed only during creation.

For uploaded trip cover images, call POST /v1/storage/uploads with purpose=trip_cover, upload the bytes to S3, then save the returned public_url into cover_image_url.

If the trip already exists, the client may also send parent_type="trip" and the trip id, but that is optional.

Success response: trip object.

DELETE /v1/trips/{id}​

Deletes a trip.

Authentication: required.

Success: 204 No Content.