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

# List content signal events

> The people who liked or commented on posts the AI judged relevant for your signals.

**To poll:** call with no cursor, process the events, save `next_cursor`, and pass it back next time to get whatever has arrived since. `next_cursor` comes back on every non-empty page, including the last one; `has_more: false` means you are caught up, not that the feed has ended.

**Delivery is at-least-once.** Each event carries a stable `id`; store the ids you have processed and skip repeats rather than assuming an event arrives exactly once.

Each event carries `matched_use_cases`: the names of the use-cases the post fell into when it was judged, so you can route a lead by what they engaged with. Commenters also carry `comment_text`, the evidence to open with.

**Identify people by `contact_id`, not by `profile_url`.** Collecting a person upserts them as a contact in your account, so `contact_id` is present on nearly every event and is the id every other Tamtam surface takes. It is nullable, and the feed does not filter on it: a person whose profile could not be resolved stays in the feed unlinked. `profile_url` is for display, about half carrying LinkedIn's encoded member id (`/in/ACoAA…`) rather than a readable name, so treat a null `contact_id` as not-linked-yet rather than as a person to re-identify from the URL or by name. `linkedin_profile_id` is the account-independent identity, for recognising the same person across signals or accounts.



## OpenAPI

````yaml /reference/openapi.yaml get /v2/linkedin-content-signal-events
openapi: 3.1.0
info:
  title: Tamtam Public API
  version: 2.0.0
servers:
  - url: https://api.tamtam.ai/api
security: []
paths:
  /v2/linkedin-content-signal-events:
    get:
      tags:
        - LinkedIn Content Signals
      summary: List content signal events
      description: >-
        The people who liked or commented on posts the AI judged relevant for
        your signals.


        **To poll:** call with no cursor, process the events, save
        `next_cursor`, and pass it back next time to get whatever has arrived
        since. `next_cursor` comes back on every non-empty page, including the
        last one; `has_more: false` means you are caught up, not that the feed
        has ended.


        **Delivery is at-least-once.** Each event carries a stable `id`; store
        the ids you have processed and skip repeats rather than assuming an
        event arrives exactly once.


        Each event carries `matched_use_cases`: the names of the use-cases the
        post fell into when it was judged, so you can route a lead by what they
        engaged with. Commenters also carry `comment_text`, the evidence to open
        with.


        **Identify people by `contact_id`, not by `profile_url`.** Collecting a
        person upserts them as a contact in your account, so `contact_id` is
        present on nearly every event and is the id every other Tamtam surface
        takes. It is nullable, and the feed does not filter on it: a person
        whose profile could not be resolved stays in the feed unlinked.
        `profile_url` is for display, about half carrying LinkedIn's encoded
        member id (`/in/ACoAA…`) rather than a readable name, so treat a null
        `contact_id` as not-linked-yet rather than as a person to re-identify
        from the URL or by name. `linkedin_profile_id` is the
        account-independent identity, for recognising the same person across
        signals or accounts.
      operationId: list-linkedin-content-signal-events
      parameters:
        - description: >-
            Target account UUID. Required for staff callers; ignored for
            customer API keys.
          explode: false
          in: query
          name: account_id
          schema:
            description: >-
              Target account UUID. Required for staff callers; ignored for
              customer API keys.
            type: string
        - description: >-
            Only return engagers surfaced by this signal. Omit for every signal
            on the account.
          explode: false
          in: query
          name: signal_id
          schema:
            description: >-
              Only return engagers surfaced by this signal. Omit for every
              signal on the account.
            type: string
        - description: >-
            Only return events detected at or after this RFC3339 timestamp.
            Prefer the cursor for sequential polling.
          explode: false
          in: query
          name: since
          schema:
            description: >-
              Only return events detected at or after this RFC3339 timestamp.
              Prefer the cursor for sequential polling.
            examples:
              - '2026-09-01T00:00:00Z'
            format: date-time
            type: string
        - description: >-
            Pagination cursor from a previous call. Save next_cursor and pass it
            back unchanged to fetch what has arrived since.
          explode: false
          in: query
          name: cursor
          schema:
            description: >-
              Pagination cursor from a previous call. Save next_cursor and pass
              it back unchanged to fetch what has arrived since.
            type: string
        - description: Maximum events to return.
          explode: false
          in: query
          name: limit
          schema:
            default: 100
            description: Maximum events to return.
            format: int32
            maximum: 500
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ListLinkedinContentSignalEventsResponseDto
          description: OK
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ErrorModel'
          description: Error
      security:
        - apikeyAuth: []
        - bearerAuth: []
components:
  schemas:
    ListLinkedinContentSignalEventsResponseDto:
      additionalProperties: false
      properties:
        events:
          description: Events in detection order, oldest first.
          items:
            $ref: '#/components/schemas/LinkedinContentSignalEventDto'
          type:
            - array
            - 'null'
        has_more:
          description: >-
            True when more events are already waiting. False means you are
            caught up, not that the feed has ended.
          type: boolean
        next_cursor:
          description: >-
            Pass back unchanged to fetch events detected after this page.
            Returned on every non-empty page, including the last.
          type: string
      required:
        - events
        - has_more
      type: object
    ErrorModel:
      additionalProperties: false
      properties:
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
      type: object
    LinkedinContentSignalEventDto:
      additionalProperties: false
      properties:
        comment_text:
          description: 'Commenters only: what they wrote. The evidence a seller opens with.'
          type: string
        contact_id:
          description: >-
            The contact this person is in your account, and the id to use
            anywhere Tamtam takes a contact. Prefer it over profile_url as an
            identity: the URL is a display value and often carries LinkedIn's
            encoded member id rather than a readable slug. Present on nearly
            every event, since collecting a person upserts them as a contact,
            but nullable: a person whose profile could not be resolved stays in
            the feed without one, as do events collected before the field
            existed. Treat its absence as not-linked-yet, never as a person to
            re-identify by name.
          type: string
        detected_at:
          description: When we recorded it. This is the order the feed is paginated in.
          format: date-time
          type: string
        headline:
          description: >-
            Their LinkedIn headline: the top line under their name. Free text,
            not a resolved job title.
          type: string
        id:
          description: >-
            Stable event id. This feed is at-least-once: store processed ids and
            skip repeats rather than assuming each event arrives exactly once.
          type: string
        interaction_type:
          description: >-
            How they relate to the post: Liker or Commenter for an engagers
            collection, Author for a post_authors one (they wrote it).
          examples:
            - Commenter
          type: string
        linkedin_post_id:
          format: int64
          type: integer
        linkedin_profile_id:
          description: >-
            The stored LinkedIn profile behind the contact, shared across
            accounts. Use it to recognise the same person seen through another
            account or another signal.
          type: string
        matched_use_cases:
          description: >-
            The use-cases the post fell into when it was judged, stamped on the
            engager at collection time. Empty when none.
          items:
            type: string
          type:
            - array
            - 'null'
        name:
          type: string
        occurred_at:
          description: >-
            When the engagement happened: the comment time when LinkedIn
            reported one, otherwise when the sweep saw it.
          format: date-time
          type: string
        post_url:
          description: The relevant post they engaged with.
          type: string
        profile_url:
          description: LinkedIn profile URL of the person who engaged.
          type: string
        signal_id:
          description: The content signal that surfaced this person.
          type: string
      required:
        - id
        - signal_id
        - interaction_type
        - profile_url
        - linkedin_post_id
        - matched_use_cases
        - occurred_at
        - detected_at
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
  securitySchemes:
    apikeyAuth:
      description: Account API key passed in the Authorization header
      in: header
      name: Authorization
      type: apiKey
    bearerAuth:
      description: Bearer JWT obtained via the OAuth 2.1 authorization flow
      scheme: bearer
      type: http

````