Lydira API
TR

API reference

Trips

8 endpoints

The itinerary aggregate: a trip holds days, days hold segments. Read-only over the API in v1, with one exception: share links can be minted and revoked, which is how an integration hands a traveller a public itinerary URL.

A day is addressed by its day_number (1, 2, 3 …), not by its id, so a deep link stays readable. A segment is addressed by id.

Money on a segment follows the key's role. price_amount, cost_amount and the commission fields are present only where the role can see them.

List trips

GET/api/v1/trips

Needs a key with the full scope.

Ordered by start_date ascending, so the next departure is first.

Parameters

Query

  • qstring

    Matches title or reference number.

  • statusstring
  • assigned_to_iduuid
  • scopeenum

    one ofactiveupcomingin_progressneeds_attention

  • limitintegerdefault 25

    Rows per page.

  • cursorstring

    Opaque; take it from the previous response's page.next_cursor.

Response · 200

  • dataobject[]required
    Show fields
    • iduuid
    • reference_numberstringnullable
    • titlestring
    • statusstring
    • trip_typestringnullable
    • start_datedatenullable
    • end_datedatenullable
    • duration_nightsintegernullable
    • destinationsstring[]
    • primary_currencystringnullable
    • cover_image_urlstringnullable
    • assigned_advisorobjectnullable

      A seat on the account, as referenced from other records.

      Show fields
      • iduuid
      • namestringnullable
      • emailstringnullable
    • primary_customerobjectnullable
      Show fields
      • iduuid
      • namestringnullable
    • traveler_countinteger
    • days_untilintegernullable

      Days from today to departure. Negative once the trip has started.

    • updated_atdate-time
  • pageobjectrequired

    The cursor for the list beside it. Re-send the same request with ?cursor=<next_cursor> while has_more is true. next_cursor is null on the last page.

    Show fields
    • next_cursorstringrequirednullable
    • has_morebooleanrequired
    • limitintegerrequired

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": [
    {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "reference_number": "TRP-2026-0117",
      "title": "Cappadocia, 4 nights",
      "status": "confirmed",
      "trip_type": "leisure",
      "start_date": "2026-03-14",
      "end_date": "2026-03-14",
      "duration_nights": 1,
      "destinations": [
        "Cappadocia",
        "Istanbul"
      ],
      "primary_currency": "EUR",
      "cover_image_url": "https://example.com/asset.pdf",
      "assigned_advisor": {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz",
        "email": "ayse@example.com"
      },
      "primary_customer": {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz"
      },
      "traveler_count": 3,
      "days_until": 1,
      "updated_at": "2026-03-14T09:30:00Z"
    }
  ],
  "page": {
    "next_cursor": "MjAyNi0wMy0xNFQwOTozMDowMC4wMDAwMDBafDk0MQ",
    "has_more": true,
    "limit": 25
  }
}

Read a trip

GET/api/v1/trips/{id}

Needs a key with the full scope.

Adds travellers, customers, the settings blob and day_count to the list shape. The days themselves are a separate call.

Parameters

Path

  • iduuidrequired

Response · 200

  • dataobject
    Show fields
    • iduuid
    • reference_numberstringnullable
    • titlestring
    • statusstring
    • trip_typestringnullable
    • start_datedatenullable
    • end_datedatenullable
    • duration_nightsintegernullable
    • destinationsstring[]
    • primary_currencystringnullable
    • cover_image_urlstringnullable
    • assigned_advisorobjectnullable

      A seat on the account, as referenced from other records.

      Show fields
      • iduuid
      • namestringnullable
      • emailstringnullable
    • primary_customerobjectnullable
      Show fields
      • iduuid
      • namestringnullable
    • traveler_countinteger
    • days_untilintegernullable

      Days from today to departure. Negative once the trip has started.

    • updated_atdate-time
    • summarystringnullable
    • internal_notesstringnullable
    • settingsobject
    • notification_preferencesobject
    • account_iduuid
    • company_iduuid
    • customersobject[]
      Show fields
      • iduuid
      • namestringnullable
      • emailstringnullable
    • travelersobject[]
      Show fields
      • iduuid
      • customer_iduuidnullable
      • namestringnullable
      • is_leadboolean
    • day_countinteger
    • created_atdate-time

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "reference_number": "TRP-2026-0117",
    "title": "Cappadocia, 4 nights",
    "status": "confirmed",
    "trip_type": "leisure",
    "start_date": "2026-03-14",
    "end_date": "2026-03-14",
    "duration_nights": 1,
    "destinations": [
      "Cappadocia",
      "Istanbul"
    ],
    "primary_currency": "EUR",
    "cover_image_url": "https://example.com/asset.pdf",
    "assigned_advisor": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com"
    },
    "primary_customer": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz"
    },
    "traveler_count": 3,
    "days_until": 1,
    "updated_at": "2026-03-14T09:30:00Z",
    "summary": "string",
    "internal_notes": "string",
    "settings": {},
    "notification_preferences": {},
    "account_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "company_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "customers": [
      {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz",
        "email": "ayse@example.com"
      }
    ],
    "travelers": [
      {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz",
        "is_lead": true
      }
    ],
    "day_count": 3,
    "created_at": "2026-03-14T09:30:00Z"
  }
}

List the days of a trip

GET/api/v1/trips/{trip_id}/days

Needs a key with the full scope.

In itinerary order. Bounded by the length of the trip, so there is no page.

Parameters

Path

  • trip_iduuidrequired

Response · 200

  • dataobject[]required
    Show fields
    • iduuid
    • day_numberinteger

      The 1-based position. This is what /days/{id} takes.

    • datedatenullable
    • titlestringnullable
    • primary_locationstringnullable
    • positioninteger
    • segment_countinteger

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/days' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": [
    {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "day_number": 1,
      "date": "2026-03-14",
      "title": "Cappadocia, 4 nights",
      "primary_location": "Uçhisar",
      "position": 1,
      "segment_count": 3
    }
  ]
}

Read one day

GET/api/v1/trips/{trip_id}/days/{id}

Needs a key with the full scope.

id here is the day_number, the 1-based position in the itinerary, not a uuid. Day three of a trip is /days/3.

The day carries its segments inline, plus the cached intelligence for that date: weather, an FX snapshot and destination notes, each with its own updated_at so a client can tell fresh data from stale.

Parameters

Path

  • trip_iduuidrequired
  • idintegerrequired

    The day number (1, 2, 3 …).

Response · 200

  • dataobject
    Show fields
    • iduuid
    • day_numberinteger

      The 1-based position. This is what /days/{id} takes.

    • datedatenullable
    • titlestringnullable
    • primary_locationstringnullable
    • positioninteger
    • segment_countinteger
    • descriptionstringnullable
    • latitudenumbernullable
    • longitudenumbernullable
    • timezonestringnullable
    • cover_image_urlstringnullable
    • intelligenceobject

      Cached context for this date. Each block carries its own updated_at, and a null data means it has not been fetched yet rather than that there is nothing to report.

      Show fields
      • weatherobject
        Show fields
        • dataobjectnullable
        • providerstringnullable
        • updated_atdate-timenullable
      • currencyobject
        Show fields
        • dataobjectnullable
        • updated_atdate-timenullable
      • generalobject
        Show fields
        • dataobjectnullable
        • updated_atdate-timenullable
    • segmentsobject[]
      Show fields
      • iduuid
      • trip_iduuid
      • trip_day_iduuid
      • segment_typestring
      • statusstring
      • titlestringnullable
      • descriptionstringnullable
      • positioninteger
      • start_timedate-timenullable
      • end_timedate-timenullable
      • duration_minutesintegernullable
      • location_namestringnullable
      • location_addressstringnullable
      • is_optionalboolean
      • is_highlightedboolean
      • is_client_visibleboolean
      • cover_image_urlstringnullable
      • flight_numberstringnullable

        Flight segments only.

      • airline_codestringnullable

        Flight segments only.

      • departure_airportstringnullable

        Flight segments only.

      • arrival_airportstringnullable

        Flight segments only.

      • scheduled_departurestringnullable

        Flight segments only. Local wall clock at the airport, not UTC.

      • scheduled_arrivalstringnullable

        Flight segments only.

      • price_amountstringnullable

        Decimal as a string. What the traveller is billed.

      • currencystringnullable
    • created_atdate-time
    • updated_atdate-time

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/days/1' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "day_number": 1,
    "date": "2026-03-14",
    "title": "Cappadocia, 4 nights",
    "primary_location": "Uçhisar",
    "position": 1,
    "segment_count": 3,
    "description": "string",
    "latitude": 1,
    "longitude": 1,
    "timezone": "Europe/Istanbul",
    "cover_image_url": "https://example.com/asset.pdf",
    "intelligence": {
      "weather": {
        "data": {},
        "provider": "string",
        "updated_at": "2026-03-14T09:30:00Z"
      },
      "currency": {
        "data": {},
        "updated_at": "2026-03-14T09:30:00Z"
      },
      "general": {
        "data": {},
        "updated_at": "2026-03-14T09:30:00Z"
      }
    },
    "segments": [
      {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "trip_day_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "segment_type": "hotel_checkin",
        "status": "confirmed",
        "title": "Cappadocia, 4 nights",
        "description": "string",
        "position": 1,
        "start_time": "2026-03-14T09:30:00Z",
        "end_time": "2026-03-14T09:30:00Z",
        "duration_minutes": 1,
        "location_name": "Museum Hotel",
        "location_address": "Tekelli Mah. No 1, Uçhisar",
        "is_optional": true,
        "is_highlighted": true,
        "is_client_visible": true,
        "cover_image_url": "https://example.com/asset.pdf",
        "flight_number": "1955",
        "airline_code": "TK",
        "departure_airport": "IST",
        "arrival_airport": "ASR",
        "scheduled_departure": "string",
        "scheduled_arrival": "string",
        "price_amount": "1250.00",
        "currency": "EUR"
      }
    ],
    "created_at": "2026-03-14T09:30:00Z",
    "updated_at": "2026-03-14T09:30:00Z"
  }
}

Read one segment

GET/api/v1/trips/{trip_id}/segments/{id}

Needs a key with the full scope.

A segment is one booked thing inside a day: a flight, a hotel night, a transfer, an activity. segment_type says which, and the type-specific detail lives in display_data / provider_data / metadata rather than in fixed columns. A flight additionally carries flat flight_number / airline_code / airport / scheduled-time fields.

Money is included where the key's role can see it: price_amount, cost_amount and the commission block are each gated separately.

Parameters

Path

  • trip_iduuidrequired
  • iduuidrequired

Response · 200

  • dataobject

    One booked item inside a day. The flight fields appear only when segment_type is flight; the money fields only where the role can read them.

    Show fields
    • iduuid
    • trip_iduuid
    • trip_day_iduuid
    • segment_typestring
    • statusstring
    • titlestringnullable
    • descriptionstringnullable
    • positioninteger
    • start_timedate-timenullable
    • end_timedate-timenullable
    • duration_minutesintegernullable
    • location_namestringnullable
    • location_addressstringnullable
    • is_optionalboolean
    • is_highlightedboolean
    • is_client_visibleboolean
    • cover_image_urlstringnullable
    • flight_numberstringnullable

      Flight segments only.

    • airline_codestringnullable

      Flight segments only.

    • departure_airportstringnullable

      Flight segments only.

    • arrival_airportstringnullable

      Flight segments only.

    • scheduled_departurestringnullable

      Flight segments only. Local wall clock at the airport, not UTC.

    • scheduled_arrivalstringnullable

      Flight segments only.

    • price_amountstringnullable

      Decimal as a string. What the traveller is billed.

    • currencystringnullable
    • advisor_notesstringnullable
    • supplier_namestringnullable
    • confirmation_numberstringnullable
    • booking_referencestringnullable
    • latitudenumbernullable
    • longitudenumbernullable
    • location_phonestringnullable
    • location_urlstringnullable
    • display_dataobjectnullable

      Type-specific fields for rendering, keyed by segment_type.

    • provider_dataobjectnullable
    • metadataobjectnullable
    • image_gallerystring[]nullable
    • live_statusstringnullable

      Flight tracking, where enabled.

    • live_dataobjectnullable
    • live_updated_atdate-timenullable
    • tracking_enabledboolean
    • cost_amountstringnullable

      What the supplier charges. Present only where the role can see costs.

    • commission_amountstringnullable
    • commission_typestringnullable
    • commission_ratestringnullable
    • commission_currencystringnullable
    • payout_statusstringnullable
    • created_atdate-time
    • updated_atdate-time

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/segments/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_day_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "segment_type": "hotel_checkin",
    "status": "confirmed",
    "title": "Cappadocia, 4 nights",
    "description": "string",
    "position": 1,
    "start_time": "2026-03-14T09:30:00Z",
    "end_time": "2026-03-14T09:30:00Z",
    "duration_minutes": 1,
    "location_name": "Museum Hotel",
    "location_address": "Tekelli Mah. No 1, Uçhisar",
    "is_optional": true,
    "is_highlighted": true,
    "is_client_visible": true,
    "cover_image_url": "https://example.com/asset.pdf",
    "flight_number": "1955",
    "airline_code": "TK",
    "departure_airport": "IST",
    "arrival_airport": "ASR",
    "scheduled_departure": "string",
    "scheduled_arrival": "string",
    "price_amount": "1250.00",
    "currency": "EUR",
    "advisor_notes": "string",
    "supplier_name": "Museum Hotel",
    "confirmation_number": "HTL-884213",
    "booking_reference": "QX7F2B",
    "latitude": 1,
    "longitude": 1,
    "location_phone": "string",
    "location_url": "https://example.com/asset.pdf",
    "display_data": {},
    "provider_data": {},
    "metadata": {},
    "image_gallery": [
      "string"
    ],
    "live_status": "on_time",
    "live_data": {},
    "live_updated_at": "2026-03-14T09:30:00Z",
    "tracking_enabled": true,
    "cost_amount": "1250.00",
    "commission_amount": "1250.00",
    "commission_type": "string",
    "commission_rate": "0.10",
    "commission_currency": "EUR",
    "payout_status": "pending",
    "created_at": "2026-03-14T09:30:00Z",
    "updated_at": "2026-03-14T09:30:00Z"
  }
}

Mint a share link

POST/api/v1/trips/{trip_id}/shares

Needs a key with the full scope.

Creates a public itinerary URL the traveller can open with no account. The whole body is optional: with none at all you get a view-only itinerary link that expires in 30 days.

The token is returned once. Later reads publish the url but not the bare token, the same posture as an API key. Store the url if you need it again; otherwise revoke and mint a new one.

show_prices, show_costs and show_commission decide what the traveller sees on the page. Leave the last two off for a client-facing link.

Parameters

Path

  • trip_iduuidrequired

Headers

  • Idempotency-Keystring

    Your own unique string for this write (a UUID is the obvious choice), max 255 characters. Optional: omit it and nothing changes. Send it and a repeat of the same request returns this call's response verbatim, with Idempotent-Replay: true, instead of writing again.

Body

  • shareobject
    Show fields
    • share_typestringdefault itinerary
    • access_levelstringdefault view
    • requires_authboolean
    • show_pricesboolean
    • show_costsboolean

      Leave off for a traveller-facing link.

    • show_commissionboolean

      Leave off for a traveller-facing link.

    • expires_atdate-time

      Defaults to 30 days out.

    • pin_codestring

      Stored hashed. The page then asks for it.

    • allowed_emailsstring[]

Response · 201

  • dataobject
    Show fields
    • iduuid
    • trip_iduuid
    • tokenstring

      Returned once, at mint. Never published again.

    • urluri

      The link to hand the traveller.

    • share_typestring
    • access_levelstring
    • show_pricesboolean
    • show_costsboolean
    • show_commissionboolean
    • requires_authboolean
    • allowed_emailsstring[]
    • has_pinboolean
    • expires_atdate-timenullable
    • created_atdate-time

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 422The request was understood but the record could not be written. details maps each rejected attribute to its reasons, so a client can put the message next to the field that caused it.
  • 429Rate limit exceeded
curl -X POST 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/shares' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90' \
  -d '{
  "share": {
    "show_prices": true,
    "show_costs": false,
    "expires_at": "2026-06-30T23:59:59Z"
  }
}'
Response
201
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "token": "0b9a4d182c0f6b9a",
    "url": "https://example.com/hook",
    "share_type": "itinerary",
    "access_level": "view",
    "show_prices": true,
    "show_costs": true,
    "show_commission": true,
    "requires_auth": true,
    "allowed_emails": [
      "ayse@example.com"
    ],
    "has_pin": true,
    "expires_at": "2026-03-14T09:30:00Z",
    "created_at": "2026-03-14T09:30:00Z"
  }
}

Revoke a share link

DELETE/api/v1/trips/{trip_id}/shares/{id}

Needs a key with the full scope.

The URL stops resolving immediately. There is no undo; mint a new link instead.

Parameters

Path

  • trip_iduuidrequired
  • iduuidrequired

Headers

  • Idempotency-Keystring

    Your own unique string for this write (a UUID is the obvious choice), max 255 characters. Optional: omit it and nothing changes. Send it and a repeat of the same request returns this call's response verbatim, with Idempotent-Replay: true, instead of writing again.

Responses

  • 204Revoked
  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X DELETE 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/shares/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90'

Reminder timeline for a trip

GET/api/v1/trips/{trip_id}/notifications

Needs a key with the full scope.

What is queued to go out about this trip and what already went: the pre-departure checklist, the check-in nudge, the day-of note, the welcome home. This is the delivery schedule, not the bell.

Read-state is not here. It lives on the separate notification record at GET /api/v1/notifications.

Parameters

Path

  • trip_iduuidrequired

Query

  • statusenum

    one ofpendingdeliveredsuppressedfailedexpired

  • audienceenum

    one ofadvisortravelerboth

  • scopeenum

    one ofupcomingpast

Response · 200

  • dataobject[]required
    Show fields
    • iduuid
    • kindstring
    • channelstring
    • audienceenum

      one ofadvisortravelerboth

    • statusenum

      one ofpendingdeliveredsuppressedfailedexpired

    • scheduled_fordate-timenullable
    • delivered_atdate-timenullable
    • trip_day_iduuidnullable
    • trip_segment_iduuidnullable
    • user_iduuidnullable
    • customer_iduuidnullable

Responses

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 429Rate limit exceeded
curl -X GET 'https://YOUR-CELL.lydira.com/api/v1/trips/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/notifications' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Response
200
{
  "data": [
    {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "kind": "pre_departure_checklist",
      "channel": "push",
      "audience": "advisor",
      "status": "pending",
      "scheduled_for": "2026-03-14T09:30:00Z",
      "delivered_at": "2026-03-14T09:30:00Z",
      "trip_day_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "trip_segment_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "user_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18"
    }
  ]
}