Lydira API
EN

API referansı

Leads

6 uç nokta

Inbound enquiries and the pipeline they move through. stage advances via PATCH /api/v1/leads/{id}/transition rather than a plain update, because the move is recorded with its actor and, for a loss, its reason.

POST /api/v1/leads/{id}/convert is the terminal step: it mints a Customer and a Trip from the lead in one transaction and answers with all three.

List leads

GET/api/v1/leads

full kapsamlı bir anahtar ister.

Most recently touched first (updated_at descending).

Parametreler

Sorgu

  • qstring

    Matches name, email or phone.

  • stagestring
  • sourcestring
  • assigned_to_iduuid
  • scopeenum

    A named slice, applied on top of the other filters. mine is relative to the key's principal, which for an unbound key is the account owner.

    şunlardan biriopenclosedstalemine

  • limitintegervarsayılan 25

    Rows per page.

  • cursorstring

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

Yanıt · 200

  • dataobject[]zorunlu
    Alanları göster
    • iduuid
    • namestringnull olabilir
    • emailstringnull olabilir
    • phonestringnull olabilir
    • stagestring
    • scoreintegernull olabilir
    • sourcestringnull olabilir
    • estimated_valuestringnull olabilir

      Decimal as a string, to avoid float rounding.

    • currencystringnull olabilir
    • destinationsstring[]
    • party_sizeintegernull olabilir
    • target_departure_ondatenull olabilir
    • target_return_ondatenull olabilir
    • assigned_toobjectnull olabilir

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

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
    • customer_iduuidnull olabilir

      Set once the lead converts.

    • trip_iduuidnull olabilir
    • updated_atdate-time
  • pageobjectzorunlu

    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.

    Alanları göster
    • next_cursorstringzorunlunull olabilir
    • has_morebooleanzorunlu
    • limitintegerzorunlu

Yanıtlar

  • 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/leads' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Yanıt
200
{
  "data": [
    {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com",
      "phone": "+90 532 111 22 33",
      "stage": "inbox",
      "score": 1,
      "source": "website_form",
      "estimated_value": "12500.00",
      "currency": "EUR",
      "destinations": [
        "Cappadocia",
        "Istanbul"
      ],
      "party_size": 1,
      "target_departure_on": "2026-03-14",
      "target_return_on": "2026-03-14",
      "assigned_to": {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz",
        "email": "ayse@example.com"
      },
      "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "updated_at": "2026-03-14T09:30:00Z"
    }
  ],
  "page": {
    "next_cursor": "MjAyNi0wMy0xNFQwOTozMDowMC4wMDAwMDBafDk0MQ",
    "has_more": true,
    "limit": 25
  }
}

Capture a lead

POST/api/v1/leads

full kapsamlı bir anahtar ister.

Defaults fill in what you leave out: stage starts at inbox, assigned_to_id and the creator both become the key's principal, and company_id falls back to that principal's home company.

A lead pushed from another system should go through POST /api/v1/imports/leads instead, which carries your external_id and upserts on it.

Parametreler

Başlık

  • 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.

Gövde

  • leadobjectzorunlu
    Alanları göster
    • namestring
    • emailemail
    • phonestring
    • sourcestring
    • party_sizeinteger
    • estimated_valuestring
    • currencystring
    • target_departure_ondate
    • target_return_ondate
    • notesstring
    • assigned_to_iduuid
    • company_iduuid
    • destinationsstring[]
    • preferencesobject

Yanıt · 201

  • dataobject
    Alanları göster
    • iduuid
    • namestringnull olabilir
    • emailstringnull olabilir
    • phonestringnull olabilir
    • stagestring
    • scoreintegernull olabilir
    • sourcestringnull olabilir
    • estimated_valuestringnull olabilir

      Decimal as a string, to avoid float rounding.

    • currencystringnull olabilir
    • destinationsstring[]
    • party_sizeintegernull olabilir
    • target_departure_ondatenull olabilir
    • target_return_ondatenull olabilir
    • assigned_toobjectnull olabilir

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

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
    • customer_iduuidnull olabilir

      Set once the lead converts.

    • trip_iduuidnull olabilir
    • updated_atdate-time
    • notesstringnull olabilir
    • preferencesobject
    • qualified_atdate-timenull olabilir
    • won_atdate-timenull olabilir
    • lost_atdate-timenull olabilir
    • lost_reasonstringnull olabilir
    • scored_atdate-timenull olabilir
    • utmobject

      Only the keys that were captured.

      Alanları göster
      • sourcestring
      • mediumstring
      • campaignstring
      • termstring
      • contentstring
    • created_atdate-time

Yanıtlar

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 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/leads' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90' \
  -d '{
  "lead": {
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "source": "website_form",
    "party_size": 1,
    "estimated_value": "12500.00"
  }
}'
Yanıt
201
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "stage": "inbox",
    "score": 1,
    "source": "website_form",
    "estimated_value": "12500.00",
    "currency": "EUR",
    "destinations": [
      "Cappadocia",
      "Istanbul"
    ],
    "party_size": 1,
    "target_departure_on": "2026-03-14",
    "target_return_on": "2026-03-14",
    "assigned_to": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com"
    },
    "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "updated_at": "2026-03-14T09:30:00Z",
    "notes": "Prefers boutique hotels, no early flights.",
    "preferences": {},
    "qualified_at": "2026-03-14T09:30:00Z",
    "won_at": "2026-03-14T09:30:00Z",
    "lost_at": "2026-03-14T09:30:00Z",
    "lost_reason": "string",
    "scored_at": "2026-03-14T09:30:00Z",
    "utm": {
      "source": "website_form",
      "medium": "string",
      "campaign": "string",
      "term": "string",
      "content": "string"
    },
    "created_at": "2026-03-14T09:30:00Z"
  }
}

Read a lead

GET/api/v1/leads/{id}

full kapsamlı bir anahtar ister.

Parametreler

Yol

  • iduuidzorunlu

Yanıt · 200

  • dataobject
    Alanları göster
    • iduuid
    • namestringnull olabilir
    • emailstringnull olabilir
    • phonestringnull olabilir
    • stagestring
    • scoreintegernull olabilir
    • sourcestringnull olabilir
    • estimated_valuestringnull olabilir

      Decimal as a string, to avoid float rounding.

    • currencystringnull olabilir
    • destinationsstring[]
    • party_sizeintegernull olabilir
    • target_departure_ondatenull olabilir
    • target_return_ondatenull olabilir
    • assigned_toobjectnull olabilir

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

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
    • customer_iduuidnull olabilir

      Set once the lead converts.

    • trip_iduuidnull olabilir
    • updated_atdate-time
    • notesstringnull olabilir
    • preferencesobject
    • qualified_atdate-timenull olabilir
    • won_atdate-timenull olabilir
    • lost_atdate-timenull olabilir
    • lost_reasonstringnull olabilir
    • scored_atdate-timenull olabilir
    • utmobject

      Only the keys that were captured.

      Alanları göster
      • sourcestring
      • mediumstring
      • campaignstring
      • termstring
      • contentstring
    • created_atdate-time

Yanıtlar

  • 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/leads/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY'
Yanıt
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "stage": "inbox",
    "score": 1,
    "source": "website_form",
    "estimated_value": "12500.00",
    "currency": "EUR",
    "destinations": [
      "Cappadocia",
      "Istanbul"
    ],
    "party_size": 1,
    "target_departure_on": "2026-03-14",
    "target_return_on": "2026-03-14",
    "assigned_to": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com"
    },
    "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "updated_at": "2026-03-14T09:30:00Z",
    "notes": "Prefers boutique hotels, no early flights.",
    "preferences": {},
    "qualified_at": "2026-03-14T09:30:00Z",
    "won_at": "2026-03-14T09:30:00Z",
    "lost_at": "2026-03-14T09:30:00Z",
    "lost_reason": "string",
    "scored_at": "2026-03-14T09:30:00Z",
    "utm": {
      "source": "website_form",
      "medium": "string",
      "campaign": "string",
      "term": "string",
      "content": "string"
    },
    "created_at": "2026-03-14T09:30:00Z"
  }
}

Update a lead

PATCH/api/v1/leads/{id}

full kapsamlı bir anahtar ister.

Partial; PUT is routed to the same action. stage is deliberately not writable here. Move it with PATCH /api/v1/leads/{id}/transition, which records the actor and the reason.

Parametreler

Yol

  • iduuidzorunlu

Başlık

  • 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.

Gövde

  • leadobjectzorunlu
    Alanları göster
    • namestring
    • emailemail
    • phonestring
    • sourcestring
    • party_sizeinteger
    • estimated_valuestring
    • currencystring
    • target_departure_ondate
    • target_return_ondate
    • notesstring
    • assigned_to_iduuid
    • company_iduuid
    • destinationsstring[]
    • preferencesobject

Yanıt · 200

  • dataobject
    Alanları göster
    • iduuid
    • namestringnull olabilir
    • emailstringnull olabilir
    • phonestringnull olabilir
    • stagestring
    • scoreintegernull olabilir
    • sourcestringnull olabilir
    • estimated_valuestringnull olabilir

      Decimal as a string, to avoid float rounding.

    • currencystringnull olabilir
    • destinationsstring[]
    • party_sizeintegernull olabilir
    • target_departure_ondatenull olabilir
    • target_return_ondatenull olabilir
    • assigned_toobjectnull olabilir

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

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
    • customer_iduuidnull olabilir

      Set once the lead converts.

    • trip_iduuidnull olabilir
    • updated_atdate-time
    • notesstringnull olabilir
    • preferencesobject
    • qualified_atdate-timenull olabilir
    • won_atdate-timenull olabilir
    • lost_atdate-timenull olabilir
    • lost_reasonstringnull olabilir
    • scored_atdate-timenull olabilir
    • utmobject

      Only the keys that were captured.

      Alanları göster
      • sourcestring
      • mediumstring
      • campaignstring
      • termstring
      • contentstring
    • created_atdate-time

Yanıtlar

  • 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 PATCH 'https://YOUR-CELL.lydira.com/api/v1/leads/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90' \
  -d '{
  "lead": {
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "source": "website_form",
    "party_size": 1,
    "estimated_value": "12500.00"
  }
}'
Yanıt
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "stage": "inbox",
    "score": 1,
    "source": "website_form",
    "estimated_value": "12500.00",
    "currency": "EUR",
    "destinations": [
      "Cappadocia",
      "Istanbul"
    ],
    "party_size": 1,
    "target_departure_on": "2026-03-14",
    "target_return_on": "2026-03-14",
    "assigned_to": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com"
    },
    "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "updated_at": "2026-03-14T09:30:00Z",
    "notes": "Prefers boutique hotels, no early flights.",
    "preferences": {},
    "qualified_at": "2026-03-14T09:30:00Z",
    "won_at": "2026-03-14T09:30:00Z",
    "lost_at": "2026-03-14T09:30:00Z",
    "lost_reason": "string",
    "scored_at": "2026-03-14T09:30:00Z",
    "utm": {
      "source": "website_form",
      "medium": "string",
      "campaign": "string",
      "term": "string",
      "content": "string"
    },
    "created_at": "2026-03-14T09:30:00Z"
  }
}

Move a lead to another stage

PATCH/api/v1/leads/{id}/transition

full kapsamlı bir anahtar ister.

The audited way to change stage. The move is stamped with the actor and, when the new stage is lost, with reason.

An unknown stage answers 422 invalid_stage. A move the pipeline does not allow answers 422 validation_failed.

Parametreler

Yol

  • iduuidzorunlu

Başlık

  • 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.

Gövde

  • new_stagestringzorunlu

    A stage key. GET /api/v1/leads/{id} reports the current one.

  • reasonstring

    Recorded on the lead. Meaningful when moving to lost.

Yanıt · 200

  • dataobject
    Alanları göster
    • iduuid
    • namestringnull olabilir
    • emailstringnull olabilir
    • phonestringnull olabilir
    • stagestring
    • scoreintegernull olabilir
    • sourcestringnull olabilir
    • estimated_valuestringnull olabilir

      Decimal as a string, to avoid float rounding.

    • currencystringnull olabilir
    • destinationsstring[]
    • party_sizeintegernull olabilir
    • target_departure_ondatenull olabilir
    • target_return_ondatenull olabilir
    • assigned_toobjectnull olabilir

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

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
    • customer_iduuidnull olabilir

      Set once the lead converts.

    • trip_iduuidnull olabilir
    • updated_atdate-time
    • notesstringnull olabilir
    • preferencesobject
    • qualified_atdate-timenull olabilir
    • won_atdate-timenull olabilir
    • lost_atdate-timenull olabilir
    • lost_reasonstringnull olabilir
    • scored_atdate-timenull olabilir
    • utmobject

      Only the keys that were captured.

      Alanları göster
      • sourcestring
      • mediumstring
      • campaignstring
      • termstring
      • contentstring
    • created_atdate-time

Yanıtlar

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 422Unknown or illegal stage
  • 429Rate limit exceeded
curl -X PATCH 'https://YOUR-CELL.lydira.com/api/v1/leads/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/transition' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90' \
  -d '{
  "new_stage": "qualified",
  "reason": "Booked with another agency"
}'
Yanıt
200
{
  "data": {
    "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "name": "Ayşe Yılmaz",
    "email": "ayse@example.com",
    "phone": "+90 532 111 22 33",
    "stage": "inbox",
    "score": 1,
    "source": "website_form",
    "estimated_value": "12500.00",
    "currency": "EUR",
    "destinations": [
      "Cappadocia",
      "Istanbul"
    ],
    "party_size": 1,
    "target_departure_on": "2026-03-14",
    "target_return_on": "2026-03-14",
    "assigned_to": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com"
    },
    "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
    "updated_at": "2026-03-14T09:30:00Z",
    "notes": "Prefers boutique hotels, no early flights.",
    "preferences": {},
    "qualified_at": "2026-03-14T09:30:00Z",
    "won_at": "2026-03-14T09:30:00Z",
    "lost_at": "2026-03-14T09:30:00Z",
    "lost_reason": "string",
    "scored_at": "2026-03-14T09:30:00Z",
    "utm": {
      "source": "website_form",
      "medium": "string",
      "campaign": "string",
      "term": "string",
      "content": "string"
    },
    "created_at": "2026-03-14T09:30:00Z"
  }
}

Convert a lead into a customer and a trip

POST/api/v1/leads/{id}/convert

full kapsamlı bir anahtar ister.

One transaction: a Customer is created (or matched), a Trip is opened from the lead's destinations and dates, and the lead is linked to both. The response carries all three.

Not idempotent on its own. Converting an already-converted lead answers 422 conversion_failed; send an Idempotency-Key if your caller may retry.

Parametreler

Yol

  • iduuidzorunlu

Başlık

  • 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.

Yanıt · 201

  • dataobject
    Alanları göster
    • leadobjectzorunlu
      Alanları göster
      • iduuid
      • namestringnull olabilir
      • emailstringnull olabilir
      • phonestringnull olabilir
      • stagestring
      • scoreintegernull olabilir
      • sourcestringnull olabilir
      • estimated_valuestringnull olabilir

        Decimal as a string, to avoid float rounding.

      • currencystringnull olabilir
      • destinationsstring[]
      • party_sizeintegernull olabilir
      • target_departure_ondatenull olabilir
      • target_return_ondatenull olabilir
      • assigned_toobjectnull olabilir

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

        Alanları göster
        • iduuid
        • namestringnull olabilir
        • emailstringnull olabilir
      • customer_iduuidnull olabilir

        Set once the lead converts.

      • trip_iduuidnull olabilir
      • updated_atdate-time
      • notesstringnull olabilir
      • preferencesobject
      • qualified_atdate-timenull olabilir
      • won_atdate-timenull olabilir
      • lost_atdate-timenull olabilir
      • lost_reasonstringnull olabilir
      • scored_atdate-timenull olabilir
      • utmobject

        Only the keys that were captured.

        Alanları göster
        • sourcestring
        • mediumstring
        • campaignstring
        • termstring
        • contentstring
      • created_atdate-time
    • tripobjectzorunlu
      Alanları göster
      • iduuid
      • titlestring
      • statusstring
      • start_datedatenull olabilir
    • customerobjectzorunlu

      List shape. name, email and phone are personal data: a key whose role cannot read PII gets null, and a customer carrying a restricted tag has its name masked too.

      Alanları göster
      • iduuid
      • namestringnull olabilir
      • customer_typestring
      • emailstringnull olabilir
      • phonestringnull olabilir
      • lifecycle_stagestringnull olabilir
      • vip_tierstringnull olabilir
      • activeboolean
      • tagsstring[]
      • company_iduuid

Yanıtlar

  • 401Missing or invalid Bearer token
  • 403Policy denied or account has no owner
  • 404Resource not found
  • 422The lead could not be converted
  • 429Rate limit exceeded
curl -X POST 'https://YOUR-CELL.lydira.com/api/v1/leads/9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18/convert' \
  -H 'Authorization: Bearer sek_YOUR_API_KEY' \
  -H 'Idempotency-Key: 8f14e45f-ea2c-4f33-9a3b-6d0c1b7e5a90'
Yanıt
201
{
  "data": {
    "lead": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "email": "ayse@example.com",
      "phone": "+90 532 111 22 33",
      "stage": "inbox",
      "score": 1,
      "source": "website_form",
      "estimated_value": "12500.00",
      "currency": "EUR",
      "destinations": [
        "Cappadocia",
        "Istanbul"
      ],
      "party_size": 1,
      "target_departure_on": "2026-03-14",
      "target_return_on": "2026-03-14",
      "assigned_to": {
        "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
        "name": "Ayşe Yılmaz",
        "email": "ayse@example.com"
      },
      "customer_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "trip_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "updated_at": "2026-03-14T09:30:00Z",
      "notes": "Prefers boutique hotels, no early flights.",
      "preferences": {},
      "qualified_at": "2026-03-14T09:30:00Z",
      "won_at": "2026-03-14T09:30:00Z",
      "lost_at": "2026-03-14T09:30:00Z",
      "lost_reason": "string",
      "scored_at": "2026-03-14T09:30:00Z",
      "utm": {
        "source": "website_form",
        "medium": "string",
        "campaign": "string",
        "term": "string",
        "content": "string"
      },
      "created_at": "2026-03-14T09:30:00Z"
    },
    "trip": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "title": "Cappadocia, 4 nights",
      "status": "confirmed",
      "start_date": "2026-03-14"
    },
    "customer": {
      "id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18",
      "name": "Ayşe Yılmaz",
      "customer_type": "individual",
      "email": "ayse@example.com",
      "phone": "+90 532 111 22 33",
      "lifecycle_stage": "active",
      "vip_tier": "gold",
      "active": true,
      "tags": [
        "vip",
        "repeat"
      ],
      "company_id": "9d2f7c3a-1b4e-4a7d-8e51-2c0f6b9a4d18"
    }
  }
}