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

# List the interviews feed

> The admin interviews page as one pageable list: each campaign is a single
row carrying its progress aggregates, and campaign-less interviews are
plain rows. Rows interleave newest first, a campaign sorting at its own
creation date and a standalone interview at its own — the same order the
interviews list uses. Campaigns without interviews are not listed.

**Admin only.** Filters are not supported here: a filtered or searched
view is served by the interviews list.




## OpenAPI

````yaml /api-reference/openapi-full.yaml get /projects/{project_id}/interviews/feed/
openapi: 3.0.3
info:
  title: Clarifeye Platform API — Full API Documentation
  description: >
    Complete REST API reference for the Clarifeye Platform.


    Documents every endpoint exposed by the platform — the public surface plus

    the advanced surface: pipeline customization (extraction flows, pipeline

    runs, warehouse tables, document tag/metadata configuration), the pre-MCP

    AI surface (agent settings, playground conversations, conversation-scoped

    feedback views, notifications), and the impersonation header. New AI

    integrations should consume knowledge via MCP rather than the

    conversation/agent-settings endpoints documented here.


    ## Authentication

    All endpoints require authentication. Include the Authorization header in
    every request using either format:

    - `Authorization: Token <token_key>`

    - `Authorization: Bearer <token_key>`


    ## Service accounts and API keys

    Integrations authenticate with an **API key** of a **service account**:

    - `Authorization: Bearer <key>` (keys start with `cfk_`)


    A service account is an ordinary member (role `member`) of one organization
    that cannot log

    in. Organization admins create it and mint its keys on the organization's
    *Service

    accounts* page (`/organizations/{id}/service-accounts/`,
    `/organization-api-keys/`), and

    give it access to knowledge stores with ordinary store permissions. A key is
    valid on every

    endpoint and acts as its service account: it reaches exactly the stores,
    with exactly the

    rights, the account was given. An account can hold several keys (each with
    its own name,

    optional expiry and revocation), so a key can be rotated without changing
    identity.


    A refused key answers **403** with one of: `Invalid API key.`, `API key
    revoked.`,

    `API key expired.`, `API key disabled.` (the service account is disabled).


    Any valid key may also call `POST /organizations/{id}/provision-user/` and

    `POST /organizations/{id}/deprovision-user/` for its own organization (the
    `{id}` in the

    path must be the key's organization). The email domains these may pre-create
    accounts for

    are configured by Clarifeye on the organization
    (`allowed_provisioning_domains`).


    ## Impersonation


    Certain endpoints support user impersonation for creating or listing data on
    behalf of other users.

    This is useful for integrating external systems that need to attribute
    actions to specific users.


    **Header:** `X-Impersonate-Email`


    **Required Permission:** `CAN_IMPERSONATE_OTHER_USERS` (for a person,
    contact Clarifeye to enable it; org admins grant it to a service account on
    the organization's Service accounts page)


    **Behavior:**

    - If the header is provided and the impersonator has the required
    permission, the action is performed as the target user

    - If the target user is not found, the request proceeds as the original
    authenticated user

    - If the target user does not have access to the project, the request
    proceeds as the original authenticated user

    - If the impersonator lacks the `CAN_IMPERSONATE_OTHER_USERS` permission,
    the header is ignored


    **With an API key** the request fails instead (**403**) whenever
    impersonation cannot

    happen: missing permission, unknown target, target without access to the
    store, target that

    is itself a service account, or an endpoint outside a store. A key never
    silently acts as

    its own service account when impersonation was asked for.
  version: 1.0.0
  contact:
    name: Clarifeye Support
servers:
  - url: https://eu.app.clarifeye.ai/api/v1
    description: EU
  - url: https://us.app.clarifeye.ai/api/v1
    description: US
security:
  - BearerAuth: []
  - TokenAuth: []
tags:
  - name: Users
    description: Manage users within a project
  - name: Invitations
    description: Manage project invitations
  - name: Documents
    description: Manage documents within a project
  - name: Agent Settings
    description: Manage AI agent configurations
  - name: Conversations
    description: Create and interact with AI-powered conversations
  - name: Interviews
    description: Assign and review structured interview conversations
  - name: Meetings
    description: >-
      Meetings Clara attends as a bot (Recall.ai) — live transcript, live
      insights, recording, and calendar scheduling (CLA-1843). Store admins
      only.
  - name: Feedback
    description: >-
      Submit and review feedback — standalone (content-only), agent-submitted
      (MCP), or linked to a conversation message
  - name: Tools
    description: Execute configured AI tools with custom parameters
  - name: Tables
    description: Perform CRUD operations on warehouse tables
  - name: Notifications
    description: Manage project-scoped notifications for users
  - name: Extraction Flows
    description: >-
      Manage extraction flows (auto-sync DAGs) — list, run, inspect statistics,
      update, and publish
  - name: Object Extractors
    description: |
      Extract structured data (instances of a Pydantic model) from chunks or
      blocks of documents. Update auto-creates a new `ObjectExtractorVersion`
      when version-bearing fields change.
  - name: Tag Extractors
    description: |
      Apply hierarchical metadata tags to chunks or documents using an LLM.
      Update auto-creates a new `TagExtractorVersion` when version-bearing
      fields change.
  - name: Chunks Extractors
    description: |
      Segment parsed documents into chunks for downstream processing.
      Update auto-creates a new `ChunksExtractorVersion` when version-bearing
      fields change.
  - name: Parsing Extractors
    description: |
      Convert source documents to text blocks via the parsing pipeline.
      Update auto-creates a new `ParsingExtractorVersion` when version-bearing
      fields change.
  - name: Document Filter Extractors
    description: |
      Restrict a downstream pipeline branch to documents matching a filter.
      Update auto-creates a new version when the filter changes.
  - name: Chunk Tag Filter Extractors
    description: |
      Restrict a downstream pipeline branch to chunks carrying specific tags.
      Update auto-creates a new version when the filter changes.
  - name: Document Tag Extractors
    description: |
      Apply a flat set of metadata tags to each document. Update auto-creates
      a new version when version-bearing fields change.
  - name: Tag Alerts Extractors
    description: |
      Run LLM-based alerts over already-extracted tag rows. Update auto-creates
      a new version when version-bearing fields change.
  - name: Object Alerts Extractors
    description: >
      Run LLM-based alerts over already-extracted object rows. Update
      auto-creates

      a new version when version-bearing fields change.
  - name: Imported Object Extractors
    description: |
      Hold objects imported from an external system (rather than extracted by
      an LLM). Useful for hydrating the warehouse with data produced outside
      the platform.
  - name: Pipeline Runs
    description: >-
      Inspect pipeline runs queued by extraction flows or other pipeline
      triggers — list runs and fetch the details/status of a single run
  - name: User Provisioning
    description: >
      Pre-create and de-provision org users via an org-scoped API key

      (`Authorization: Bearer <key>`). The organization is resolved from the
      key.
  - name: Organization API Keys
    description: >
      Superuser management of org-scoped provisioning API keys. Minting and
      revoking

      are superuser-only; org admins can list/retrieve/reveal their own org's
      keys.
  - name: Design System Templates
    description: Reference/example files attached to a design template.
  - name: Artifacts
    description: |
      Knowledge-store artifact catalog — list artifacts, create/edit custom
      artifacts, manage scope membership, read and publish versions, configure
      the cohesion guide, and export/import the whole catalog. For type-aware
      reads and edits of artifact content, prefer the
      `read-write-*-artifact` tool endpoints.
paths:
  /projects/{project_id}/interviews/feed/:
    get:
      tags:
        - Interviews
      summary: List the interviews feed
      description: >
        The admin interviews page as one pageable list: each campaign is a
        single

        row carrying its progress aggregates, and campaign-less interviews are

        plain rows. Rows interleave newest first, a campaign sorting at its own

        creation date and a standalone interview at its own — the same order the

        interviews list uses. Campaigns without interviews are not listed.


        **Admin only.** Filters are not supported here: a filtered or searched

        view is served by the interviews list.
      operationId: listInterviewsFeed
      parameters:
        - $ref: '#/components/parameters/ProjectId'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Offset'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PaginatedResponse'
                  - type: object
                    properties:
                      results:
                        type: array
                        items:
                          $ref: '#/components/schemas/InterviewFeedItem'
                      status_counts:
                        type: object
                        description: >
                          Number of interviews per status across every interview
                          in the

                          project, campaign or not (not just the returned page).
                          Keys are

                          the status values; legacy conversations without a
                          status are

                          counted under "none". Absent keys mean zero.
                        additionalProperties:
                          type: integer
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    ProjectId:
      name: project_id
      in: path
      required: true
      description: UUID of the project
      schema:
        type: string
        format: uuid
    Limit:
      name: limit
      in: query
      description: Maximum number of results per page
      schema:
        type: integer
        default: 100
        minimum: 1
        maximum: 1000
    Offset:
      name: offset
      in: query
      description: Number of results to skip for pagination
      schema:
        type: integer
        default: 0
        minimum: 0
  schemas:
    PaginatedResponse:
      type: object
      properties:
        count:
          type: integer
          description: Total number of results
        next:
          type: string
          format: uri
          nullable: true
          description: URL to next page of results
        previous:
          type: string
          format: uri
          nullable: true
          description: URL to previous page of results
        results:
          type: array
          items: {}
    InterviewFeedItem:
      type: object
      description: One row of the interviews feed — a campaign or a standalone interview.
      required:
        - kind
      properties:
        kind:
          type: string
          enum:
            - campaign
            - interview
        campaign:
          $ref: '#/components/schemas/InterviewCampaign'
          description: Present when `kind` is `campaign`.
        interview:
          $ref: '#/components/schemas/InterviewListItem'
          description: Present when `kind` is `interview`.
    InterviewCampaign:
      type: object
      description: |
        A named group of interviews (a "wave"), with the progress aggregates the
        interviews page renders. Counts cover every interview in the campaign.
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          description: Unique within the project, case-insensitively.
        created_at:
          type: string
          format: date-time
          readOnly: true
        interview_count:
          type: integer
          readOnly: true
          description: >
            Total interviews in the campaign. May exceed the sum of the
            per-status

            counts: interviews created before statuses existed have none.
        completed_count:
          type: integer
          readOnly: true
        in_progress_count:
          type: integer
          readOnly: true
        pending_count:
          type: integer
          readOnly: true
          description: Assigned but not yet started.
        latest_activity:
          type: string
          format: date-time
          readOnly: true
          description: >
            Most recent update across the campaign's interviews, falling back to

            the campaign's own creation date when it has none. Interview

            timestamps also move on background writes (summaries, turn state),
            so

            treat this as approximate activity rather than message recency.
        assignees:
          type: array
          readOnly: true
          description: |
            Up to five recipient emails, for the avatar row. Self-assigned
            interviews contribute their creator.
          items:
            type: string
            format: email
        assignee_count:
          type: integer
          readOnly: true
          description: Total distinct recipients, which may exceed `assignees` length.
    InterviewListItem:
      type: object
      description: >-
        Lightweight interview representation used in list responses (omits the
        transcript).
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        name:
          type: string
          nullable: true
        created_by:
          type: string
          format: uuid
          readOnly: true
        created_by_email:
          type: string
          format: email
          nullable: true
          readOnly: true
        type:
          type: string
        assigned_to:
          type: string
          format: uuid
          nullable: true
          readOnly: true
        assigned_by:
          type: string
          format: uuid
          nullable: true
          readOnly: true
        assigned_to_email:
          type: string
          format: email
          nullable: true
          readOnly: true
        assigned_by_email:
          type: string
          format: email
          nullable: true
          readOnly: true
        is_pending_invite:
          type: boolean
          readOnly: true
        invite_config:
          allOf:
            - $ref: '#/components/schemas/InterviewInviteConfig'
          nullable: true
          readOnly: true
        import_info:
          allOf:
            - $ref: '#/components/schemas/ImportedInterviewInfo'
          nullable: true
          readOnly: true
        meeting_info:
          allOf:
            - $ref: '#/components/schemas/MeetingInfo'
          nullable: true
          readOnly: true
        status:
          type: string
          nullable: true
          readOnly: true
          enum:
            - pending
            - in_progress
            - completed
          description: Null for imported interviews until their transcript parse completes.
        campaign:
          allOf:
            - $ref: '#/components/schemas/InterviewCampaignRef'
          nullable: true
          readOnly: true
          description: Campaign this interview belongs to; null for ad hoc interviews.
        first_message_preview:
          type: string
          description: >
            Truncated preview of the first user message in the transcript. For
            imported

            transcripts this is the parse-generated summary when available (the
            literal

            first turn of a meeting export is usually greeting noise).
        message_count:
          type: integer
          description: Number of conversational messages in the transcript.
        topics_total:
          type: integer
          readOnly: true
          description: >
            Number of guided topics on the interview ("3/7 topics" progress on
            list

            rows). 0 for interviews without guided topics.
        topics_done:
          type: integer
          readOnly: true
          description: Guided topics no longer open (resolved or dismissed).
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
      example:
        error: User not found
    InterviewInviteConfig:
      type: object
      description: >
        Invitation-email customization and reminder schedule for an assigned
        interview.

        Null for self-assigned interviews, non-interview conversations, and
        interviews

        created before this feature existed.
      readOnly: true
      properties:
        custom_message:
          type: string
          description: >-
            The assigner's note; replaces the default invitation email copy when
            set.
        custom_focus:
          type: string
          nullable: true
          description: >
            The assigner's override of the email's "what it's about" focus
            block. Null

            means not customised (emails show the truncated topic); empty string
            means

            the block was removed; text is shown verbatim.
        scheduled_send_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the invitation email is (or was) due to be sent. Null means it
            was sent immediately.
        invitation_email_sent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the invitation email actually went out; null while a scheduled
            send is still pending.
        reminders_enabled:
          type: boolean
        reminder_start_after_days:
          type: integer
        reminder_interval_days:
          type: integer
        reminder_max_count:
          type: integer
        reminders_sent:
          type: integer
          description: Automatic reminders sent so far (manual reminders are not counted).
        next_reminder_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the next automatic reminder is due; null when none is
            scheduled.
        reminders_stopped:
          type: boolean
          description: True once an admin/assigner stopped the schedule via stop-reminders.
    ImportedInterviewInfo:
      type: object
      description: >
        Parse-pipeline state of an imported external transcript (interviews of
        type

        "imported-interview"). Null on every other interview type. The raw
        pasted

        transcript is never returned — the parsed `chat_history` is the
        transcript.
      properties:
        import_status:
          type: string
          enum:
            - parsing
            - ready
            - failed
          description: >
            "parsing" while the async parse runs (transcript not yet readable),

            "ready" once chat_history holds the speaker-labeled turns (status
            becomes

            "completed"), "failed" when parsing errored (use retry-import).
        participants:
          type: array
          description: >-
            Participant names (importer-supplied or inferred from the
            transcript).
          items:
            type: string
        interview_date:
          type: string
          format: date
          nullable: true
          description: Date the conversation happened (importer-supplied or inferred).
        error:
          type: string
          nullable: true
          description: Failure detail when import_status is "failed".
    MeetingInfo:
      type: object
      description: >
        Set on conversations of type `meeting` — the transcript of a call Clara
        attended

        as a bot (CLA-1843). The conversation is created post-call, so this
        block is always

        complete when present. Every turn of such a transcript is `role: user`
        with a

        `speaker` name and a `meeting_offset_ms`; attribute by speaker.
      properties:
        meeting_id:
          type: string
          format: uuid
        platform:
          type: string
          enum:
            - google_meet
            - zoom
            - microsoft_teams
        participants:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              is_host:
                type: boolean
        duration_ms:
          type: integer
          nullable: true
        started_at:
          type: string
          format: date-time
          nullable: true
        url:
          type: string
          nullable: true
          description: Relative in-app path of the meeting page (recording, insights).
    InterviewCampaignRef:
      type: object
      description: Nested campaign reference carried by interviews and drafts.
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
  responses:
    Unauthorized:
      description: Unauthorized - missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Authentication credentials were not provided.
    Forbidden:
      description: Forbidden - insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: You do not have permission to perform this action.
    NotFound:
      description: Not found - resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not found.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >
        Use `Authorization: Bearer <token>`. The token is either a user token /
        OAuth access

        token, or a service-account API key (`cfk_...`). A key is valid on every
        endpoint and

        acts as its service account, an organization member with per-store
        permissions.

        Refused keys answer 403 with `Invalid API key.`, `API key revoked.`,

        `API key expired.` or `API key disabled.`.
    TokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use Authorization: Token <token>'

````

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