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

# List content

> Lists LinkedIn posts and comments



## OpenAPI

````yaml /developers/openapi.yaml get /v1/content
openapi: 3.0.3
info:
  title: TalkToHumans Public API
  version: 1.0.0
  license:
    name: Proprietary
  description: >
    Read and organize the LinkedIn organization data your team already manages
    in TalkToHumans: accounts, contacts, signals, content, tags, notes, custom
    fields, sequence state, conversations, templates, and views.
servers:
  - url: https://api.talktohumans.app
    description: TalkToHumans API
security:
  - bearerAuth: []
tags:
  - name: Organization
    description: Organization details for the current API key.
  - name: LinkedIn
    description: LinkedIn accounts, contacts, companies, and conversations.
  - name: Activity
    description: Activity for organization reporting.
  - name: Enrich
    description: Profile enrichment for LinkedIn contacts and companies.
  - name: Views
    description: Saved TalkToHumans views.
  - name: Sequences
    description: Sequences of contacts and conversations.
  - name: Templates
    description: Message and sequence templates.
  - name: Custom fields
    description: Custom fields for contacts and companies.
  - name: Tags
    description: Tags for contacts and companies.
  - name: Content
    description: LinkedIn posts and comments, and the people who engage with them.
  - name: Agents
    description: Playbooks and feedback for AI agents, shared with the MCP.
paths:
  /v1/content:
    get:
      tags:
        - Content
      summary: List content
      description: Lists LinkedIn posts and comments
      operationId: listContent
      parameters:
        - $ref: '#/components/parameters/AccountId'
        - name: content_id
          in: query
          description: Filter by content ID, to read one post or comment.
          schema:
            type: string
        - name: contact_id
          in: query
          description: >-
            Filter by the author's contact ID, to read a contact's posts and
            comments found with `POST /v1/contacts/{contact_id}/find-content`.
          schema:
            type: string
            pattern: ^[1-9][0-9]*$
        - name: view_id
          in: query
          description: >
            Filter by a saved content view. Accepts the view `id` or an
            unambiguous `public_id` from `GET /v1/views`.

            Uses the view's account and filters. An explicit `account_id` scope
            must include that account.
          schema:
            type: string
        - name: filters
          in: query
          description: >
            JSON array of filters content must all match, in the same shape as a
            content view's `filters`.

            Content fields (`content.`): `content_type`, `media_type`, `text`,
            `author`, `posted_at`, `reaction_count`, `comment_count`,
            `repost_count`, `source`, `tags`.

            Requires exactly one account: pass one `account_id` when several are
            accessible.
          schema:
            type: string
          example: >-
            [{"field":"content.content_type","operator":"=","value":"post"},{"field":"content.media_type","operator":"=","value":"document"}]
        - name: sorts
          in: query
          description: >
            JSON array of sorts, first entry first, in the same shape as a
            content view's `sorts`. Newest first by default.

            Requires exactly one account.
          schema:
            type: string
          example: '[{"field":"content.comment_count","direction":"desc"}]'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Cursor'
      responses:
        '200':
          description: Posts and comments matching the filters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListContentEnvelope'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/AccountScopedForbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/LinkedInNotConnected'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    AccountId:
      name: account_id
      in: query
      description: >
        LinkedIn account IDs returned by `GET /v1/accounts`.


        Repeat the query parameter for multiple accounts. The backend also
        accepts comma-separated values.

        If an explicit account target is not accessible to this credential, the
        API returns `403 account_shared_access_required`.
      schema:
        type: array
        items:
          type: string
          pattern: ^[1-9][0-9]*$
      style: form
      explode: true
    Limit:
      name: limit
      in: query
      description: Page size. Defaults to 10. Values above 25 are clamped to 25.
      schema:
        type: integer
        minimum: 1
        default: 10
        maximum: 25
    Cursor:
      name: cursor
      in: query
      description: Opaque cursor from the previous response's `pagination.next_cursor`.
      schema:
        type: string
  schemas:
    ListContentEnvelope:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ListContentResponse'
    ListContentResponse:
      type: object
      additionalProperties: false
      required:
        - content
        - pagination
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/Content'
        pagination:
          $ref: '#/components/schemas/Pagination'
    Error:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Machine-readable error code.
          enum:
            - unauthorized
            - forbidden
            - not_found
            - bad_request
            - internal_error
            - conflict
            - rate_limit_exceeded
            - account_shared_access_required
            - linkedin_not_connected
            - workspace_setup_required
            - billing_payment_failed
            - billing_subscription_incomplete
            - billing_subscription_expired
            - billing_grace_period
            - billing_feature_not_available
            - billing_insufficient_credits
            - billing_invalid
            - enrichment_failed
            - enrichment_in_progress
            - linkedin_profile_not_found
        message:
          type: string
          description: Human-readable error message.
        debug:
          type: string
          description: Development-only debug details.
    Content:
      type: object
      additionalProperties: false
      description: >
        A LinkedIn post or comment of one account. `linkedin_url` opens it on
        LinkedIn. Its engagers are contacts: list them with `GET
        /v1/contacts?view_id={engagers_view_id}`.
      required:
        - content_id
        - account
        - content_type
        - author
        - linkedin_url
        - posted_at
        - reaction_count
        - comment_count
        - repost_count
        - media_type
        - media
        - source
        - tags
        - engagers_view_id
        - engagers_extracted_at
        - new_comments_since_extraction
        - results
      properties:
        content_id:
          type: string
          example: cnt_0f8fad5bd9cb469fa16570867728950e
        account:
          $ref: '#/components/schemas/AccountSummary'
        content_type:
          type: string
          enum:
            - post
            - comment
        author:
          $ref: '#/components/schemas/ContentAuthor'
        parent:
          $ref: '#/components/schemas/ContentParent'
        text:
          type: string
        linkedin_url:
          type: string
          format: uri
        posted_at:
          type: string
          format: date-time
        reaction_count:
          type: integer
          nullable: true
        comment_count:
          type: integer
          nullable: true
          description: Comments and their replies.
        repost_count:
          type: integer
          nullable: true
        media_type:
          type: string
          enum:
            - none
            - image
            - video
            - document
            - link
        media:
          $ref: '#/components/schemas/ContentMedia'
        source:
          type: string
          description: >-
            `mine` for the account's own posts and comments, `imported` for
            posts imported with `POST /v1/content/import`, `contact` for content
            found with `POST /v1/contacts/{contact_id}/find-content`.
          enum:
            - mine
            - imported
            - contact
        tags:
          type: array
          description: Content tags, a pool apart from contact tags.
          items:
            $ref: '#/components/schemas/APITag'
        engagers_view_id:
          type: string
          nullable: true
          description: >-
            Contact view of the post's engagers. Null until its engagers were
            imported.
        engagers_extracted_at:
          type: string
          format: date-time
          nullable: true
          description: When engagers were last imported.
        new_comments_since_extraction:
          type: integer
          nullable: true
          description: >-
            Comments added since engagers were last imported, from the last
            known count.
        results:
          $ref: '#/components/schemas/ContentResults'
    Pagination:
      type: object
      additionalProperties: false
      required:
        - limit
        - has_more
      properties:
        limit:
          type: integer
          format: int32
          example: 10
        has_more:
          type: boolean
        next_cursor:
          type: string
          description: Cursor for the next page. Omitted when there are no more results.
    AccountSummary:
      type: object
      additionalProperties: false
      required:
        - account_id
        - display_name
        - provider_account_id
        - owner_user_id
      properties:
        account_id:
          type: string
          description: TalkToHumans account ID.
        display_name:
          type: string
        provider_account_id:
          type: string
          description: LinkedIn provider account ID.
        owner_user_id:
          type: string
          description: TalkToHumans user ID that owns the account.
    ContentAuthor:
      type: object
      additionalProperties: false
      required:
        - provider_participant_id
        - name
      properties:
        contact_id:
          type: string
          description: Present when the author is a contact of the account.
        provider_participant_id:
          type: string
        name:
          type: string
        headline:
          type: string
        linkedin_url:
          type: string
          format: uri
    ContentParent:
      type: object
      additionalProperties: false
      description: The post a comment is on. Comments only.
      required:
        - linkedin_url
        - author
      properties:
        linkedin_url:
          type: string
          format: uri
        text:
          type: string
        author:
          $ref: '#/components/schemas/ContentAuthor'
    ContentMedia:
      type: object
      additionalProperties: false
      nullable: true
      description: >-
        Images, a video's thumbnail, a document's first pages and PDF, or a link
        preview. Null when `media_type` is `none`.
      required:
        - images
      properties:
        images:
          type: array
          items:
            $ref: '#/components/schemas/ContentMediaImage'
        title:
          type: string
          description: Documents and links.
        subtitle:
          type: string
          description: Links only.
        link_url:
          type: string
          format: uri
          description: Links only.
        page_count:
          type: integer
          description: Documents only.
        document_url:
          type: string
          format: uri
          description: Documents only. The PDF.
    APITag:
      type: object
      additionalProperties: false
      required:
        - name
        - color
      properties:
        name:
          type: string
        color:
          type: string
          enum:
            - green
            - orange
            - blue
            - red
            - purple
            - yellow
            - pink
            - grey
    ContentResults:
      type: object
      additionalProperties: false
      description: What happened after each engager engaged.
      required:
        - engagers
        - contacted
        - connected
        - replied
      properties:
        engagers:
          type: integer
          description: Contacts with a signal on this content.
        contacted:
          type: integer
          description: Engagers sent a message or connection request afterwards.
        connected:
          type: integer
          description: Engagers connected afterwards.
        replied:
          type: integer
          description: Engagers who replied afterwards.
    ContentMediaImage:
      type: object
      additionalProperties: false
      required:
        - url
      properties:
        url:
          type: string
          format: uri
        width:
          type: integer
        height:
          type: integer
  responses:
    BadRequest:
      description: Invalid request. `message` explains what to fix.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: bad_request
            message: >-
              field "account_id" must be a string, got number; IDs are strings,
              e.g. "42"
    Unauthorized:
      description: >-
        Missing, malformed, invalid, or retired API key, or an invalid or
        expired login access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missingAuthorization:
              value:
                code: unauthorized
                message: Authorization header is required
            invalidAuthorizationFormat:
              value:
                code: unauthorized
                message: Authorization header must use Bearer scheme
            invalidAPIKey:
              value:
                code: unauthorized
                message: Invalid API key
            invalidAccessToken:
              value:
                code: unauthorized
                message: Invalid or expired access token
    AccountScopedForbidden:
      description: >-
        API access is not enabled for the organization, the API key cannot
        resolve to an active organization user, the login has no workspace yet,
        or the credential cannot access the requested LinkedIn account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            accountSharedAccessRequired:
              summary: Requested account is not accessible to this credential
              value:
                code: account_shared_access_required
                message: >-
                  This account is not shared-access enabled for API or MCP. Ask
                  an admin to enable shared access before using this account
                  from this credential.
            forbidden:
              value:
                code: forbidden
                message: you don't have access to this organization
            featureUnavailable:
              value:
                code: billing_feature_not_available
                message: >-
                  Feature 'TalkToHumansAPI' is not available in your current
                  plan
            insufficientCredits:
              value:
                code: billing_insufficient_credits
                message: Insufficient credits
            apiKeyPrincipalInvalid:
              value:
                code: forbidden
                message: >-
                  This API key is no longer linked to an active organization
                  user. Ask an organization admin to regenerate it
            workspaceSetupRequired:
              value:
                code: workspace_setup_required
                message: >-
                  This TalkToHumans sign-in has no workspace yet. Open
                  https://app.talktohumans.app, sign in with the same email to
                  finish setting up TalkToHumans, then try again.
    NotFound:
      description: Requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: not_found
            message: participant not found
    LinkedInNotConnected:
      description: >-
        The workspace has no LinkedIn account yet because the TalkToHumans
        extension was never set up, so there is no data to return. The message
        links the web app, which walks the user through connecting LinkedIn.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: linkedin_not_connected
            message: >-
              No LinkedIn account is connected to this workspace yet, so there
              is no data to return. Open https://app.talktohumans.app and follow
              the steps to connect LinkedIn; data then syncs while that browser
              is open.
    RateLimited:
      description: >-
        Rate limit exceeded. Public routes allow 50 requests per 10 seconds per
        IP and endpoint.
      headers:
        Retry-After:
          description: Seconds to wait before retrying the request.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limit_exceeded
            message: Rate limit exceeded
    InternalServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: internal_error
            message: An internal error occurred
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Pass `Authorization: Bearer <credential>`, where the credential is
        either:

        - an API key (`sk_…`), generated by an organization admin in Settings,
        for scripts and automation;

        - an access token from `tth auth login` (the TalkToHumans CLI), which
        any member of the workspace can use.


        Both resolve to the same organization and user. A login token acts in
        the user's workspace: one with no workspace yet returns `403
        workspace_setup_required`, and one in several workspaces returns `403
        forbidden` (use an API key instead).

````

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