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

# Retrieve campaign engagement

> Return raw Custom Link funnel and activity counts for a campaign.

Requires `custom_links:read` or `custom_links:write`.

Counts are raw observations for generated links, human loads and page views,
unique visitors, sessions, leads, meeting clicks and bookings, and bot-only
scans. `visitorCountMode` is `estimated` whenever ephemeral page views
contributed to `uniqueVisitorCount`; in that mode, `loadsPerUniqueVisitor` is
also approximate. `persistentUniqueVisitorCount` and
`ephemeralPageViewCount` remain exact raw counts.

Hobbes does not treat generated links as confirmed sends or deliveries.
Reconcile sent, delivered, and bounced totals with the outbound sending
platform before calculating upper-funnel conversion rates. UTM attribution is
available on session detail rather than aggregated in this response.


## OpenAPI

````yaml api-reference/openapi.json GET /api/v1/custom-link-campaigns/{campaign_id}/engagement
openapi: 3.1.0
info:
  title: Hobbes API
  description: >

    Use the Hobbes API to read your organization's analyzed demo sessions,

    prospects, accounts, transcripts, and funnel metrics, and to create and
    manage

    personalized Custom Links.


    **Authentication**: create an API key in Settings → API Keys, then send it

    as `Authorization: Bearer <key>` (or `x-api-key: <key>`). Keys are

    org-scoped; responses only ever contain your organization's data.


    **Scopes**: keys carry scopes (`sessions:read`, `people:read`,

    `accounts:read`, `analytics:read`, `transcripts:read`, `custom_links:read`,

    `custom_links:write`). `custom_links:write` also satisfies read access. Raw

    transcript access is a separate opt-in scope with a daily quota. Existing
    API

    keys do not receive Custom Link scopes automatically.


    **Rate limits**: keys allow 120 requests per minute by default. Responses

    include `X-RateLimit-Limit` and `X-RateLimit-Remaining`; 429 responses
    include

    `Retry-After`. Transcript access has a separate quota of 2,000 reads per

    organization per UTC day. Custom Link mutations are limited to 10 requests
    per

    minute per organization. Creation and thumbnail rendering also use weighted

    hourly and daily organization quotas, so one request containing 500 links is

    one HTTP request but consumes up to 500 creation and 500 render units.


    **Support**: every response carries an `X-Request-ID` header. Include it
    when

    reporting an issue so we can find the exact request in our logs.


    **Stability**: changes within v1 are additive only. Fields may be added to

    responses; existing fields are never removed or renamed.
  version: 1.0.0
servers:
  - url: https://api-us.hihobbes.com
    description: Production
security:
  - bearer: []
  - apiKeyHeader: []
tags:
  - name: Sessions
    description: Analyzed demo sessions and their transcripts.
  - name: People
    description: Prospect profiles aggregated across sessions.
  - name: Accounts
    description: Company-level engagement rollups by email domain.
  - name: Metrics
    description: Aggregate funnel performance over a trailing window.
  - name: Custom Links
    description: Create and manage personalized links.
  - name: Custom Link Jobs
    description: Poll, cancel, and retry asynchronous Custom Link work.
  - name: Custom Link Campaigns
    description: Organize Custom Links into campaigns.
paths:
  /api/v1/custom-link-campaigns/{campaign_id}/engagement:
    get:
      tags:
        - Custom Link Campaigns
      summary: Retrieve campaign engagement
      description: >-
        Return raw generated-link, Opened, Started, Engaged, lead, meeting,
        visitor, page-view, session, and bot-only counts. Generated links are
        not a delivered-send denominator.
      operationId: v1_get_custom_link_campaign_engagement
      parameters:
        - name: campaign_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            title: Campaign Id
            description: Custom Link campaign UUID.
          description: Custom Link campaign UUID.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignEngagementResponse'
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
            X-RateLimit-Limit:
              description: Request limit for this key in the current 60-second window.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Requests remaining for this key in the current window.
              schema:
                type: integer
                example: 119
        '401':
          description: API key required or invalid.
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
          content:
            application/json:
              schema:
                type: object
                required:
                  - detail
                properties:
                  detail:
                    type: string
                    example: API key required or invalid.
        '403':
          description: API key does not include the required scope.
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
          content:
            application/json:
              schema:
                type: object
                required:
                  - detail
                properties:
                  detail:
                    type: string
                    example: API key does not include the required scope.
        '404':
          description: Custom Link campaign not found in the key's organization.
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
          content:
            application/json:
              schema:
                type: object
                required:
                  - detail
                properties:
                  detail:
                    type: string
                    example: Custom Link campaign not found in the key's organization.
        '422':
          description: A path, query, header, or request field failed validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
        '429':
          description: Rate limit or organization quota exceeded.
          headers:
            X-Request-ID:
              description: Unique request identifier to include in support requests.
              schema:
                type: string
                example: req_01JABCDEF23456789
            X-RateLimit-Limit:
              description: Request limit for this key in the current 60-second window.
              schema:
                type: integer
                example: 120
            X-RateLimit-Remaining:
              description: Requests remaining for this key in the current window.
              schema:
                type: integer
                example: 119
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                example: 30
            X-RateLimit-Reset:
              description: Unix timestamp when the limiting window resets.
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: object
                required:
                  - detail
                properties:
                  detail:
                    type: string
                    example: Rate limit or organization quota exceeded.
components:
  schemas:
    CampaignEngagementResponse:
      properties:
        campaignId:
          type: string
          format: uuid
          title: Campaignid
        generatedLinkCount:
          type: integer
          title: Generatedlinkcount
        activeLinkCount:
          type: integer
          title: Activelinkcount
        openedLinkCount:
          type: integer
          title: Openedlinkcount
        startedLinkCount:
          type: integer
          title: Startedlinkcount
        engagedLinkCount:
          type: integer
          title: Engagedlinkcount
        leadSubmittedLinkCount:
          type: integer
          title: Leadsubmittedlinkcount
        meetingBookedLinkCount:
          type: integer
          title: Meetingbookedlinkcount
        botScannedOnlyLinkCount:
          type: integer
          title: Botscannedonlylinkcount
        pageViewCount:
          type: integer
          title: Pageviewcount
        uniqueVisitorCount:
          type: integer
          title: Uniquevisitorcount
        sessionCount:
          type: integer
          title: Sessioncount
        startedSessionCount:
          type: integer
          title: Startedsessioncount
        engagedSessionCount:
          type: integer
          title: Engagedsessioncount
        firstOpenedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Firstopenedat
        lastOpenedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Lastopenedat
        lastActivityAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Lastactivityat
        meetingClickedLinkCount:
          type: integer
          title: Meetingclickedlinkcount
        loadCount:
          type: integer
          title: Loadcount
        persistentUniqueVisitorCount:
          type: integer
          title: Persistentuniquevisitorcount
        ephemeralPageViewCount:
          type: integer
          title: Ephemeralpageviewcount
        loadsPerUniqueVisitor:
          anyOf:
            - type: number
            - type: 'null'
          title: Loadsperuniquevisitor
        visitorCountMode:
          $ref: '#/components/schemas/VisitorCountMode'
      type: object
      required:
        - campaignId
        - generatedLinkCount
        - activeLinkCount
        - openedLinkCount
        - startedLinkCount
        - engagedLinkCount
        - leadSubmittedLinkCount
        - meetingClickedLinkCount
        - meetingBookedLinkCount
        - botScannedOnlyLinkCount
        - loadCount
        - pageViewCount
        - uniqueVisitorCount
        - persistentUniqueVisitorCount
        - ephemeralPageViewCount
        - loadsPerUniqueVisitor
        - visitorCountMode
        - sessionCount
        - startedSessionCount
        - engagedSessionCount
        - firstOpenedAt
        - lastOpenedAt
        - lastActivityAt
      title: CampaignEngagementResponse
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    VisitorCountMode:
      type: string
      enum:
        - identified
        - estimated
      title: VisitorCountMode
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: Hobbes API key with the `hb_live_` prefix.
    apiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: Alternative to the Bearer authorization header.

````