> ## Documentation Index
> Fetch the complete documentation index at: https://api.leadey.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get lead timeline

> Everything that has happened to this lead — notes, status changes, sequence steps, calls, emails and SMS — newest first.

This endpoint is **cursor-paginated** rather than page and pageSize like the rest of the API. The feed merges several tables and new rows arrive while you page, so an offset would skip or repeat entries. Pass the returned `nextCursor` back as `cursor` to fetch the next page, and stop when `hasMore` is false.

Entries share `id`, `kind` and `timestamp` and then carry whatever else that kind has, so read them defensively.



## OpenAPI

````yaml /openapi.json get /leads/{id}/timeline
openapi: 3.1.0
info:
  title: Leadey API
  version: 1.4.0
  description: >-
    The Leadey API gives you programmatic access to your workspace: leads,
    companies, contacts, campaigns, meetings, opportunities and calls, plus the
    reporting metrics behind the Cockpit.


    Every request is authenticated with an organization-scoped API key, and
    every response is JSON. Reads work with any key. Writes — creating leads,
    adding notes, logging calls, managing tasks — need a key with write access,
    and are attributed to the workspace member that key belongs to. See [Writing
    data](/guides/writing-data).
servers:
  - url: https://backend.leadey.ai/v1
    description: Production
  - url: http://localhost:3001/v1
    description: Local development
security:
  - bearerAuth: []
tags:
  - name: Account
    description: The organization behind the API key.
  - name: Leads
    description: People enrolled in your campaigns.
  - name: Notes
    description: >-
      Free-text notes on a lead. Notes appear in the lead's timeline and in the
      Cockpit.
  - name: Tasks
    description: Follow-ups and reminders, each assigned to a workspace member.
  - name: Campaigns
    description: Outreach sequences and their performance.
  - name: Companies
    description: Companies in your workspace.
  - name: Contacts
    description: The canonical person record behind your leads.
  - name: Meetings
    description: Bookings merged across Calendly, Leadey and connected calendars.
  - name: Opportunities
    description: Deals, their value, and the pipelines they sit in.
  - name: Pipelines
    description: Deal pipelines and the stages inside them.
  - name: Calls
    description: Dial history, recordings and transcripts.
  - name: Metrics
    description: >-
      Aggregated reporting — meetings booked, sit rate, dial activity and
      pipeline value.
  - name: Reference
    description: The vocabularies other endpoints return values from.
paths:
  /leads/{id}/timeline:
    get:
      tags:
        - Leads
      summary: Get lead timeline
      description: >-
        Everything that has happened to this lead — notes, status changes,
        sequence steps, calls, emails and SMS — newest first.


        This endpoint is **cursor-paginated** rather than page and pageSize like
        the rest of the API. The feed merges several tables and new rows arrive
        while you page, so an offset would skip or repeat entries. Pass the
        returned `nextCursor` back as `cursor` to fetch the next page, and stop
        when `hasMore` is false.


        Entries share `id`, `kind` and `timestamp` and then carry whatever else
        that kind has, so read them defensively.
      operationId: getLeadTimeline
      parameters:
        - $ref: '#/components/parameters/LeadId'
        - name: limit
          in: query
          description: Entries per page, 1 to 100. Defaults to 50.
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: cursor
          in: query
          description: The `nextCursor` from the previous page. Omit for the first page.
          schema:
            type: string
        - name: types
          in: query
          description: >-
            Comma-separated entry kinds to include, for example `call,email`.
            Defaults to everything.
          schema:
            type: string
      responses:
        '200':
          description: A page of the lead's history.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      items:
                        type: array
                        items:
                          $ref: '#/components/schemas/TimelineItem'
                      nextCursor:
                        type:
                          - string
                          - 'null'
                        description: >-
                          Pass as `cursor` for the next page. Null on the last
                          page.
                      hasMore:
                        type: boolean
                        description: Whether more entries exist.
                    required:
                      - items
                      - nextCursor
                      - hasMore
                required:
                  - data
              example:
                data:
                  items:
                    - id: call_3Zm6yPdL
                      kind: call
                      timestamp: '2026-08-03T11:04:12.000Z'
                      leadId: lead_8Kq2mXvR
                      funnelId: fnl_Q3OutboundUK
                      funnelName: Q3 outbound, UK logistics
                      contact:
                        personKey: mc_9Yv3sHnD
                        masterContactId: mc_9Yv3sHnD
                        name: Priya Raman
                      call:
                        id: call_3Zm6yPdL
                        direction: outbound
                        from: manual
                        to: '+442071838750'
                        contactName: Priya Raman
                        companyName: Northwind Logistics
                        duration: 412
                        disposition: completed
                        outcome: connected
                        outcomeManual: true
                        summary: Wants a proposal for 240 vehicles.
                        hasRecording: true
                    - id: event_6Tk9wRmB
                      kind: event
                      timestamp: '2026-08-03T11:09:20.000Z'
                      leadId: lead_8Kq2mXvR
                      funnelId: fnl_Q3OutboundUK
                      funnelName: Q3 outbound, UK logistics
                      contact:
                        personKey: mc_9Yv3sHnD
                        masterContactId: mc_9Yv3sHnD
                        name: Priya Raman
                      event:
                        type: note
                        outcome: null
                        stepIndex: 0
                        meta:
                          text: Asked for pricing on a 240-vehicle fleet.
                          userId: user_2pXn4Rk
                  nextCursor: MjAyNi0wOC0wMyAxMTowNDoxMi4wMDAwMDArMDB8Y2FsbF8zWm02eVBkTA==
                  hasMore: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    LeadId:
      name: id
      in: path
      required: true
      description: The lead id.
      schema:
        type: string
  schemas:
    TimelineItem:
      description: >-
        One entry in a lead's history. Every entry has `id`, `kind` and
        `timestamp`; the detail sits under the key named by `kind`, so a call is
        under `call` and a note is an `event` whose `event.type` is `note`. Only
        that one key is present on any given entry.
      type: object
      properties:
        id:
          type: string
          description: Id of the underlying record.
        kind:
          type: string
          description: >-
            Which source the entry came from. The detail object is under the key
            of the same name.
          enum:
            - event
            - call
            - email
            - sms
        timestamp:
          type: string
          description: When it happened.
          format: date-time
        leadId:
          type:
            - string
            - 'null'
          description: The lead row this entry is stamped to.
        funnelId:
          type:
            - string
            - 'null'
          description: Campaign the entry belongs to.
        funnelName:
          type:
            - string
            - 'null'
          description: Campaign name, denormalised.
        contact:
          type:
            - object
            - 'null'
          description: The person the entry concerns.
          properties:
            personKey:
              type: string
              description: Stable identity key for the person.
            masterContactId:
              type:
                - string
                - 'null'
              description: Canonical contact id.
            name:
              type: string
              description: Their name.
        event:
          description: Present when `kind` is `event`.
          type: object
          properties:
            type:
              type: string
              description: >-
                Event type, for example `note`, `status_change` or
                `step_outcome`.
            outcome:
              type:
                - string
                - 'null'
              description: Outcome, where the event has one.
            stepIndex:
              type: integer
              description: Sequence step this event belongs to, or 0.
            meta:
              type: object
              description: Type-specific payload. A note carries `text` and `userId`.
              additionalProperties: true
        call:
          description: Present when `kind` is `call`.
          type: object
          properties:
            id:
              type: string
              description: Call record id.
            direction:
              type: string
              description: '`inbound` or `outbound`.'
            from:
              type: string
              description: >-
                Originating number. `manual` for a call logged through `POST
                /calls`.
            to:
              type: string
              description: Number dialled.
            contactName:
              type:
                - string
                - 'null'
              description: Who was called.
            companyName:
              type:
                - string
                - 'null'
              description: Their company.
            duration:
              type: integer
              description: Length in seconds.
            disposition:
              type: string
              description: How the call ended, for example `completed` or `no-answer`.
            outcome:
              type:
                - string
                - 'null'
              description: The rep's disposition, from `GET /call-outcomes`.
            outcomeManual:
              type: boolean
              description: >-
                True when a person set the outcome rather than it being
                inferred.
            hasRecording:
              type: boolean
              description: >-
                Whether audio was captured. Leadey does not serve the audio
                itself — the transcript and summary are what the call contained.
            recordingDuration:
              type:
                - integer
                - 'null'
              description: Recording length in seconds.
            transcript:
              type:
                - string
                - 'null'
              description: Full transcript, when transcription ran.
            summary:
              type:
                - string
                - 'null'
              description: >-
                Summary of the call. Holds the `notes` you sent to `POST
                /calls`.
        email:
          description: Present when `kind` is `email`.
          type: object
          properties:
            id:
              type: string
              description: Message id.
            direction:
              type: string
              description: '`inbound` or `outbound`.'
            fromEmail:
              type:
                - string
                - 'null'
              description: Sender address.
            fromName:
              type:
                - string
                - 'null'
              description: Sender name.
            toEmail:
              type:
                - string
                - 'null'
              description: Recipient address.
            subject:
              type:
                - string
                - 'null'
              description: Subject line.
            bodyText:
              type:
                - string
                - 'null'
              description: Plain-text body.
            status:
              type:
                - string
                - 'null'
              description: Delivery status.
            openedAt:
              type:
                - string
                - 'null'
              description: First open, when tracked.
              format: date-time
            openCount:
              type: integer
              description: How many times it was opened.
            createdAt:
              type: string
              description: When it was sent or received.
              format: date-time
        sms:
          description: Present when `kind` is `sms`.
          type: object
          properties:
            id:
              type: string
              description: Message id.
            direction:
              type: string
              description: '`inbound` or `outbound`.'
            fromNumber:
              type:
                - string
                - 'null'
              description: Sender number.
            toNumber:
              type:
                - string
                - 'null'
              description: Recipient number.
            body:
              type:
                - string
                - 'null'
              description: Message text.
            status:
              type:
                - string
                - 'null'
              description: Delivery status.
            createdAt:
              type: string
              description: When it was sent or received.
              format: date-time
      required:
        - id
        - kind
        - timestamp
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
              description: Human-readable error message.
            details:
              type:
                - object
                - array
                - string
                - 'null'
              description: Optional structured detail.
          required:
            - message
  responses:
    Unauthorized:
      description: The API key is missing, invalid, or revoked.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              message: Invalid or revoked API key.
              details: null
    NotFound:
      description: The resource does not exist or is not in your workspace.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              message: Lead not found
              details: null
    RateLimited:
      description: Too many requests. Retry after the period in the `Retry-After` header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              message: Rate limit exceeded. Retry in 42s.
              details: null
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your API key, created in the Leadey dashboard under Settings → API Keys.
        Send it as `Authorization: Bearer leadey_sk_live_…`.

````