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

# Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries

> Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries.



## OpenAPI

````yaml /api-reference/openapi.json get /campaigns/people/{enrollmentId}/timeline
openapi: 3.1.0
info:
  title: Dench API
  version: 1.0.0
  description: >-
    Versioned Dench workspace API. The operation registry is shared with the
    Dench CLI parity layer, so every CLI command maps to an endpoint here.
servers:
  - url: https://www.dench.com/api/v1
security: []
tags:
  - name: agent-config
    description: Agent Config operations.
  - name: approvals
    description: Approvals operations.
  - name: apps
    description: Apps operations.
  - name: auth
    description: Auth operations.
  - name: billing
    description: Billing operations.
  - name: browser
    description: Browser operations.
  - name: campaigns
    description: Campaigns operations.
  - name: chat
    description: Chat operations.
  - name: crm
    description: Crm operations.
  - name: email
    description: Email operations.
  - name: files
    description: Files operations.
  - name: gateway
    description: Gateway operations.
  - name: lists
    description: Lists operations.
  - name: local
    description: Local operations.
  - name: meetings
    description: Meetings operations.
  - name: members
    description: Members operations.
  - name: memory
    description: Memory operations.
  - name: meta
    description: Meta operations.
  - name: notifications
    description: Notifications operations.
  - name: routines
    description: Routines operations.
  - name: settings
    description: Settings operations.
  - name: workspace
    description: Workspace operations.
paths:
  /campaigns/people/{enrollmentId}/timeline:
    get:
      tags:
        - campaigns
      summary: >-
        Everything a campaign did for one person, step by step: what was sent
        (subject and text), whether it was opened or clicked, what was skipped
        and why, waits, failures and retries
      description: >-
        Everything a campaign did for one person, step by step: what was sent
        (subject and text), whether it was opened or clicked, what was skipped
        and why, waits, failures and retries.
      operationId: campaigns_people_timeline
      parameters:
        - name: enrollmentId
          in: path
          required: true
          schema:
            type: string
            description: From dench campaign people.
          description: From dench campaign people.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  enrollment:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties: {}
                    description: 'The person in this campaign: status, lastError, repliedAt.'
                  sequence:
                    anyOf:
                      - type: object
                        propertyNames:
                          type: string
                        additionalProperties: {}
                      - type: 'null'
                  steps:
                    type: array
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                          enum:
                            - email
                            - wait
                            - linkedin_visit
                            - linkedin_connection
                            - linkedin_message
                            - linkedin_like_post
                            - linkedin_inmail
                          description: Step type.
                        waitHours:
                          description: 'wait steps: hours to wait before the next step.'
                          type: number
                        emailMailboxAccountId:
                          description: >-
                            Legacy email step sender. Pool campaigns choose
                            senders in emailMailboxAccountIds on the campaign,
                            not on individual steps.
                          type: string
                        emailSubject:
                          description: >-
                            email steps: subject; {{Column}} merge tokens
                            allowed.
                          type: string
                        emailHtmlBody:
                          description: >-
                            email steps: HTML body. Sent instead of
                            emailTextBody when both are set, so when you edit
                            the text, update or drop this too.
                          type: string
                        emailTextBody:
                          description: >-
                            email steps: plain-text body; used as the email when
                            there is no emailHtmlBody.
                          type: string
                        emailReplyToPrevious:
                          description: >-
                            email steps: thread under the previous email step
                            instead of a new subject.
                          type: boolean
                        onlyIf:
                          description: >-
                            email and linkedin_like_post only: always (default),
                            connected or not_connected. InMail automatically
                            skips connected people; do not set a condition on
                            it.
                          type: string
                          enum:
                            - always
                            - connected
                            - not_connected
                        linkedinAccountId:
                          description: >-
                            Legacy LinkedIn step sender. Pool campaigns use the
                            campaign's linkedinAccountIds instead.
                          type: string
                        linkedinMessageBody:
                          description: >-
                            linkedin_connection: the invite note (optional, up
                            to 300 chars; sent without it if LinkedIn refuses
                            the note); linkedin_message: the required message
                            (up to 3000 chars); linkedin_inmail: the required
                            message (up to 1900 chars).
                          type: string
                        linkedinMessageMode:
                          description: >-
                            linkedin_message: what to do when the invite is
                            still pending.
                          type: string
                          enum:
                            - skip_if_not_connected
                            - wait_until_connected
                        connectionTimeoutHours:
                          description: >-
                            linkedin_message with
                            linkedinMessageMode=wait_until_connected: wait
                            1-2160 hours for acceptance (default 720). After a
                            connection step this mode is the default.
                          type: number
                          minimum: 1
                          maximum: 2160
                        likeReaction:
                          description: >-
                            linkedin_like_post only: the reaction to leave
                            (default like).
                          type: string
                          enum:
                            - like
                            - celebrate
                            - support
                            - love
                            - insightful
                            - funny
                        likeMaxPostAgeDays:
                          description: >-
                            linkedin_like_post only: select the newest eligible
                            original post from the last 1-365 days (default 30).
                          type: integer
                          minimum: 1
                          maximum: 365
                        likeSkipNextWait:
                          description: >-
                            linkedin_like_post only: skip consecutive following
                            wait steps whenever the reaction step is skipped
                            (default true). False keeps those waits.
                          type: boolean
                        inmailSubject:
                          description: >-
                            linkedin_inmail only: optional subject, up to 200
                            characters; merge tokens allowed. Clear with an
                            empty string.
                          type: string
                        withdrawAfterHours:
                          description: >-
                            linkedin_connection only: withdraw a still-pending
                            invitation sent by this campaign after 168-2160
                            hours (7-90 days). Omitted means off on creation;
                            null turns it off on edit.
                          anyOf:
                            - type: number
                              minimum: 168
                              maximum: 2160
                            - type: 'null'
                      required:
                        - type
                      additionalProperties: {}
                    description: The campaign's steps in order, each with its _id.
                  runs:
                    type: array
                    items:
                      type: object
                      properties:
                        _id:
                          type: string
                        stepId:
                          type: string
                          description: The step's _id, as in steps[].
                        stepIndex:
                          type: number
                          description: The step's place, from 0.
                        type:
                          type: string
                          enum:
                            - email
                            - wait
                            - linkedin_visit
                            - linkedin_connection
                            - linkedin_message
                            - linkedin_like_post
                            - linkedin_inmail
                          description: Step type.
                        status:
                          type: string
                          enum:
                            - queued
                            - running
                            - waiting
                            - retry
                            - sent
                            - skipped
                            - failed
                            - unknown
                          description: >-
                            sent: done (a wait that finished is sent too).
                            skipped: see result.reason. retry: will be tried
                            again at retryAt. unknown: needs a look.
                        scheduledAt:
                          type: number
                        startedAt:
                          type: number
                        waitUntil:
                          type: number
                        retryAt:
                          type: number
                        completedAt:
                          type: number
                        emailMessageId:
                          description: The email this run sent, in emailMessages[].
                          type: string
                        lastError:
                          type: string
                        result:
                          description: For a skipped step, { reason } says why.
                      required:
                        - _id
                        - stepId
                        - stepIndex
                        - type
                        - status
                      additionalProperties: {}
                    description: One run for each step the person has reached, in order.
                  emailMessages:
                    type: array
                    items:
                      type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    description: >-
                      The emails those runs sent: subject, textBody, status,
                      sentAt, firstOpenedAt, firstClickedAt.
                  linkedinMessages:
                    type: array
                    items:
                      type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    description: >-
                      The LinkedIn messages those runs sent: text, sentAt,
                      deliveredAt, readAt, outreachStepRunId.
                required:
                  - enrollment
                  - sequence
                  - steps
                  - runs
                  - emailMessages
                  - linkedinMessages
                additionalProperties: {}
              example:
                enrollment:
                  _id: <enrollmentId>
                  displayName: Grace Hopper
                  status: active
                sequence:
                  _id: <sequenceId>
                  name: Founder outreach
                steps:
                  - _id: <stepId1>
                    order: 0
                    type: email
                    emailSubject: Hello
                  - _id: <stepId2>
                    order: 1
                    type: wait
                    waitHours: 72
                runs:
                  - _id: <runId1>
                    stepId: <stepId1>
                    stepIndex: 0
                    type: email
                    status: sent
                    completedAt: 1765526400000
                    emailMessageId: <emailId1>
                  - _id: <runId2>
                    stepId: <stepId2>
                    stepIndex: 1
                    type: wait
                    status: waiting
                    waitUntil: 1765785600000
                emailMessages:
                  - _id: <emailId1>
                    subject: Hello
                    textBody: Hi Grace, ...
                    status: opened
                    sentAt: 1765526400000
                    firstOpenedAt: 1765530000000
                linkedinMessages: []
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - DenchApiKey: []
        - AgentSession: []
components:
  responses:
    BadRequest:
      description: Invalid request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Unauthorized:
      description: Missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Operation or resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    InternalError:
      description: Server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  schemas:
    ApiError:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - message
            - type
            - code
          properties:
            message:
              type: string
            type:
              type: string
            code:
              type: string
            details: {}
  securitySchemes:
    DenchApiKey:
      type: http
      scheme: bearer
      bearerFormat: DENCH_API_KEY
      description: >-
        Workspace-scoped Dench API key from workspace settings. This is the same
        key used by DENCH_API_KEY in sandboxes.
    AgentSession:
      type: http
      scheme: bearer
      bearerFormat: dch_agent_*
      description: >-
        Agent session token created by `dench signin`. Gateway-backed routes
        exchange this token for the workspace gateway key.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.