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

# List Recorder Meetings

> Returns a cursor-paginated, deduplicated list of calendar meetings for the authenticated organization with the recording status of each meeting and each org participant. One row per calendar event.

Intended for bulk export to data warehouses and analytics pipelines. Requires an organization-level API key — user-scoped keys are rejected.

### Window
* `fromDateTime` and `toDateTime` are required and must define a window of at most **90 days**.
* When `upcoming=true`, results are ordered ascending by date; otherwise descending. UUID is used as a stable tiebreaker for same-date meetings.

### Pagination
* Cursor-based. The first page is requested with no `cursor`. The response's `nextCursor` is passed back unchanged on the next call.
* When the response has no `nextCursor`, the iteration has reached the end of the dataset.
* `size` is clamped to a server-side maximum of 200 (default 50).
* For periodic backfills, run a complete iteration per refresh (start each refresh with no `cursor`); rows inserted into the window after an iteration starts are picked up on the next refresh.

### Meeting `status` values
Attention's native status taxonomy is returned as-is. Values currently surfaced (non-exhaustive list, subject to additive evolution): `recorded`, `calendar_event_cancelled`, `empty_recording`, `user_override`, `event_not_accepted`, `not_join_internal_team_meetings`, `external_meetings_disabled`, `blacklisted_attendees`, `not_join_when_alone`, `bot_disabled`, `bot_removed`, `waiting_room`, `technical_error`, `no_meeting_link`, `bot_not_scheduled`, `scheduled_future`.

Clients should map these codes to their own reporting taxonomy on the consumer side (e.g. dbt models, BI views).

### Field semantics
* `uuid` — calendar event UUID (deduplication key).
* `conversationUuid` — populated only when a recording exists (`status=recorded`).
* `userUuid` / `userName` — the user attributed as the recorder; falls back to the first event participant when no recording exists.
* `participants[]` — every org user invited to the event with their per-user status (a user may be `recorded` while another is `not_join_when_alone` on the same meeting).
* `statusLabel` — human-readable label resolved server-side, suitable for direct display.



## OpenAPI

````yaml /api-reference/openapi.json get /recorder_metrics/all_meetings
openapi: 3.0.1
info:
  title: Attention Service V2
  description: Attention Service API V2
  termsOfService: https://www.attention.com/terms-of-use
  contact:
    name: Attention Team
    url: https://docs.attention.com/welcome
    email: support@attention.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  version: 1.8.0
servers:
  - url: https://api.attention.tech/v2
security:
  - APIKeyHeader: []
paths:
  /recorder_metrics/all_meetings:
    get:
      tags:
        - RecorderMetrics
      summary: List Recorder Meetings
      description: >-
        Returns a cursor-paginated, deduplicated list of calendar meetings for
        the authenticated organization with the recording status of each meeting
        and each org participant. One row per calendar event.


        Intended for bulk export to data warehouses and analytics pipelines.
        Requires an organization-level API key — user-scoped keys are rejected.


        ### Window

        * `fromDateTime` and `toDateTime` are required and must define a window
        of at most **90 days**.

        * When `upcoming=true`, results are ordered ascending by date; otherwise
        descending. UUID is used as a stable tiebreaker for same-date meetings.


        ### Pagination

        * Cursor-based. The first page is requested with no `cursor`. The
        response's `nextCursor` is passed back unchanged on the next call.

        * When the response has no `nextCursor`, the iteration has reached the
        end of the dataset.

        * `size` is clamped to a server-side maximum of 200 (default 50).

        * For periodic backfills, run a complete iteration per refresh (start
        each refresh with no `cursor`); rows inserted into the window after an
        iteration starts are picked up on the next refresh.


        ### Meeting `status` values

        Attention's native status taxonomy is returned as-is. Values currently
        surfaced (non-exhaustive list, subject to additive evolution):
        `recorded`, `calendar_event_cancelled`, `empty_recording`,
        `user_override`, `event_not_accepted`,
        `not_join_internal_team_meetings`, `external_meetings_disabled`,
        `blacklisted_attendees`, `not_join_when_alone`, `bot_disabled`,
        `bot_removed`, `waiting_room`, `technical_error`, `no_meeting_link`,
        `bot_not_scheduled`, `scheduled_future`.


        Clients should map these codes to their own reporting taxonomy on the
        consumer side (e.g. dbt models, BI views).


        ### Field semantics

        * `uuid` — calendar event UUID (deduplication key).

        * `conversationUuid` — populated only when a recording exists
        (`status=recorded`).

        * `userUuid` / `userName` — the user attributed as the recorder; falls
        back to the first event participant when no recording exists.

        * `participants[]` — every org user invited to the event with their
        per-user status (a user may be `recorded` while another is
        `not_join_when_alone` on the same meeting).

        * `statusLabel` — human-readable label resolved server-side, suitable
        for direct display.
      operationId: listRecorderMeetings
      parameters:
        - name: fromDateTime
          in: query
          description: >-
            Window start (inclusive), ISO 8601 date-time, e.g.
            `2026-04-01T00:00:00Z`.
          required: true
          schema:
            type: string
            format: date-time
        - name: toDateTime
          in: query
          description: >-
            Window end (inclusive), ISO 8601 date-time. Must be after
            `fromDateTime` and within 90 days of it.
          required: true
          schema:
            type: string
            format: date-time
        - name: cursor
          in: query
          description: Opaque cursor returned by a previous call. Omit on the first page.
          schema:
            type: string
        - name: size
          in: query
          description: >-
            Items per page. Defaults to 50. Server-side maximum is 200; values
            above are clamped.
          schema:
            type: integer
        - name: upcoming
          in: query
          description: >-
            When `true`, returns meetings whose start time is in the future
            (ascending order). Defaults to `false` (past meetings, descending
            order).
          schema:
            type: boolean
        - name: filter[user_id]
          in: query
          description: >-
            Restrict the dedup pass to meetings involving any of the given user
            UUIDs. UUIDs not belonging to the authenticated organization are
            silently dropped; if none survive, an empty page is returned to
            avoid cross-tenant membership probing.
          schema:
            type: array
            items:
              type: string
        - name: filter[meeting_type]
          in: query
          description: >-
            Restrict results to internal (all org participants) or external
            meetings.
          schema:
            type: string
            enum:
              - internal
              - external
      responses:
        '200':
          description: Cursor-paginated list of meetings with recording status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecorderMetricsMeetingsPage'
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/RecorderMetricsMeetingsPage'
        '400':
          description: >-
            Invalid request parameters (missing dates, invalid cursor, window
            over 90 days)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication failed or non-organization API key supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    RecorderMetricsMeetingsPage:
      type: object
      required:
        - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/RecorderMetricsMeeting'
          description: >-
            Page of meetings ordered by date (ascending when upcoming=true,
            descending otherwise) with UUID as tiebreaker.
        nextCursor:
          type: string
          description: >-
            Opaque cursor for the next page. Absent (or empty) when the
            iteration has reached the end of the dataset.
    Error:
      type: object
      properties:
        id:
          type: string
          description: A unique identifier for the error.
        status:
          type: string
          description: >-
            The HTTP status code applicable to this problem, expressed as a
            string value.
        code:
          type: string
          description: An application-specific error code, expressed as a string value.
        title:
          type: string
          description: A short, human-readable summary of the problem.
        detail:
          type: string
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
        source:
          type: object
          properties:
            pointer:
              type: string
            parameter:
              type: string
        meta:
          type: object
          properties: {}
      example:
        id: not_found_error
        status: '404'
        code: '404'
        title: Not Found Error
        detail: The requested resource was not found
        source:
          pointer: /data/attributes/id
    RecorderMetricsMeeting:
      type: object
      required:
        - uuid
        - summary
        - date
        - userUuid
        - userName
        - status
        - statusLabel
        - participants
      properties:
        uuid:
          type: string
          description: Calendar event UUID. Acts as the deduplication key.
        conversationUuid:
          type: string
          description: >-
            Conversation UUID. Populated only when a recording exists
            (status=recorded).
        summary:
          type: string
          description: Meeting title.
        date:
          type: string
          format: date-time
          description: Meeting start time, ISO 8601.
        userUuid:
          type: string
          description: >-
            UUID of the user attributed as the recorder. Falls back to the first
            event participant when no recording exists.
        userName:
          type: string
          description: Display name for userUuid.
        status:
          type: string
          description: >-
            Attention's native status code. Clients map this to their own
            taxonomy. See the endpoint description for the current set of
            values.
        statusLabel:
          type: string
          description: Human-readable label for the status, resolved server-side.
        participants:
          type: array
          items:
            $ref: '#/components/schemas/RecorderMetricsMeetingParticipant'
          description: >-
            Every org user invited to the event with their per-user recording
            status.
        consentLinkUsed:
          type: boolean
          description: Whether the meeting used an Attention consent link.
        consentStatus:
          type: string
          description: >-
            consented | declined | no_response, when consentLinkUsed is true
            (no_response = a consent link was used but no attendee acted). Null
            when consentLinkUsed is false (no consent link).
    RecorderMetricsMeetingParticipant:
      type: object
      required:
        - userUuid
        - userName
        - status
        - statusLabel
      properties:
        userUuid:
          type: string
        userName:
          type: string
        status:
          type: string
          description: >-
            Per-user status. Same code space as the meeting-level status; can
            differ from it (e.g. a meeting may be `recorded` while a particular
            user is `not_join_when_alone`).
        statusLabel:
          type: string
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      name: Authorization
      in: header

````