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

# List channel commentary across people

> [OpenAPI JSON Spec](/docs/output/v1_persons_channel-commentary_get.json)
Same rows as /v1/persons/{person_id}/channel-commentary without fixing the person. Browse by said_on day with start_time and end_time, which returns the rows that are served now. Or poll changes with updated_after and updated_before (unix seconds, [after, before), ordered by updated_at then id, paged by pagination.cursor; see docs/api/update-polling.md and docs/api/person-channel-commentary-updates.md). An update window returns every row whose latest change falls in it, and served says which kind it is. A served row has served=true. A duplicate, which reports a remark another page holds in full, has served=false and rejected_as="duplicate", with cluster_id the original's url. A tombstone has served=false, any other rejected_as, and only the identity fields filled. A consumer deletes a row it holds when it comes back with served=false and rejected_as other than "duplicate". Poll by updated_at, never by said_on: rows arrive with old said_on days. person_id is an optional filter. No row for a person and day does not mean they said nothing: a remark is stored only when its page can be read and the sentence checked against it.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/persons/channel-commentary
openapi: 3.0.0
info:
  contact: {}
  description: >-
    Welcome to Arrays!


    Arrays is a unified financial data layer for both financial institutions and
    retail users, delivering comprehensive market data across crypto and equity
    markets. Our datasets cover fundamentals, ETFs, options, crypto, and more.


    Visit [arrays.org](https://arrays.org) to request an API key and start your
    free trial. You can explore our full API offerings in the documentation
    below.


    For any questions regarding APIs or pricing, please contact
    support@arrays.org.
  title: Arrays API
  version: '1.0'
servers:
  - url: https://data-tools.prd.arrays.org/api
security: []
paths:
  /v1/persons/channel-commentary:
    get:
      tags:
        - Persons
      summary: List channel commentary across people
      description: >-
        [OpenAPI JSON Spec](/docs/output/v1_persons_channel-commentary_get.json)

        Same rows as /v1/persons/{person_id}/channel-commentary without fixing
        the person. Browse by said_on day with start_time and end_time, which
        returns the rows that are served now. Or poll changes with updated_after
        and updated_before (unix seconds, [after, before), ordered by updated_at
        then id, paged by pagination.cursor; see docs/api/update-polling.md and
        docs/api/person-channel-commentary-updates.md). An update window returns
        every row whose latest change falls in it, and served says which kind it
        is. A served row has served=true. A duplicate, which reports a remark
        another page holds in full, has served=false and
        rejected_as="duplicate", with cluster_id the original's url. A tombstone
        has served=false, any other rejected_as, and only the identity fields
        filled. A consumer deletes a row it holds when it comes back with
        served=false and rejected_as other than "duplicate". Poll by updated_at,
        never by said_on: rows arrive with old said_on days. person_id is an
        optional filter. No row for a person and day does not mean they said
        nothing: a remark is stored only when its page can be read and the
        sentence checked against it.
      parameters:
        - description: Person registry id (uuid) to narrow to one person
          in: query
          name: person_id
          schema:
            type: string
        - description: >-
            Browse range start, unix seconds; required unless updated_after is
            given
          in: query
          name: start_time
          schema:
            type: integer
        - description: >-
            Browse range end, unix seconds; required unless updated_after is
            given
          in: query
          name: end_time
          schema:
            type: integer
        - description: Update window start, unix seconds, inclusive
          in: query
          name: updated_after
          schema:
            type: integer
        - description: Update window end, unix seconds, exclusive
          in: query
          name: updated_before
          schema:
            type: integer
        - description: Opaque continuation of an update window
          in: query
          name: cursor
          schema:
            type: string
        - description: >-
            default 100, or 50 with include_body; 1 to 500, at most 50 with
            include_body
          in: query
          name: limit
          schema:
            type: integer
        - description: Rows to skip; browse only
          in: query
          name: offset
          schema:
            type: integer
        - description: Return each row's full body
          in: query
          name: include_body
          schema:
            type: boolean
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/model.APIResponse'
                  - properties:
                      data:
                        items:
                          $ref: '#/components/schemas/model.PersonChannelCommentary'
                        type: array
                    type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/model.APIResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/model.APIResponse'
components:
  schemas:
    model.APIResponse:
      properties:
        data: {}
        error:
          $ref: '#/components/schemas/model.APIError'
        metadata: {}
        pagination: {}
        request_id:
          type: string
        success:
          type: boolean
      type: object
    model.PersonChannelCommentary:
      properties:
        author:
          description: >-
            Author is what the page said about who wrote it, empty when it said
            nothing.
          type: string
        body:
          description: >-
            Body is the page's text as read, kept as read. It is returned only
            when the request

            sets include_body=true, and limit is then at most 50 because rows
            that carry a page of

            text are large. Never returned on a tombstone. It can hold words
            that are not the

            person's, so Quote stays the sentence attributed to them.
          type: string
        body_scope:
          description: >-
            BodyScope says how complete the page text is: "full", "preview" when
            a paywall cut

            it, "truncated" when the platform or the page gave only part,
            "unknown" when the page

            does not say, "unavailable" when a re-read found the page gone. It
            is set whether or

            not Body is returned. Empty on a tombstone.
          type: string
        channel:
          description: >-
            Channel is the channel the page came from, such as "gnews",
            "cnbc_news" or "x_own".

            Empty on a tombstone.
          type: string
        cluster_id:
          description: >-
            ClusterID is the row's own url on a served row, and the url of the
            original on a

            duplicate row, which is how a report is found under its original.
            Empty on a

            tombstone.
          type: string
        context:
          description: >-
            Context holds the posts this one answers, quotes or forwards, each
            with its own

            author. It is other people's words and never part of Quote or Body.
            An empty array,

            never null, when there are none, and on a tombstone.
          items:
            $ref: '#/components/schemas/model.PersonCommentaryContext'
          type: array
        fetched_at:
          description: >-
            FetchedAt is when the page was retrieved, unix seconds. 0 on a
            tombstone.
          type: integer
        id:
          description: >-
            ID is the row's fixed identity, derived from person_id, said_on and
            url, so it stays

            the same when the row is rewritten. It is the same derivation as the
            id of

            /api/v1/persons/commentary, and an update window is ordered by
            updated_at, then id.
          type: string
        lang:
          type: string
        original_at:
          description: >-
            OriginalAt is set only on a duplicate row: the "[mm:ss]" position of
            the quote in the

            original's captions or transcript. Absent when the position is
            unknown.
          type: string
        own_channel_verified:
          description: >-
            OwnChannelVerified is set only for "own": "author" when the page
            named this person;

            "channel" when the page is theirs to publish but is not shown to be
            written by them;

            "unverified" when neither could answer.
          type: string
        page_title:
          description: >-
            PageTitle and Venue describe where it was said. Venue is the
            program, publication or

            platform.
          type: string
        person_id:
          description: >-
            PersonID is the person registry's id, the same one /api/v1/persons
            answers with.

            Resolve a name to one with /api/v1/persons?name=... first.
          type: string
        published_at:
          description: >-
            PublishedAt is unix seconds, from the page itself unless
            PublishedAtSource says

            otherwise. 0 on a tombstone.
          type: integer
        published_at_source:
          description: >-
            PublishedAtSource is "page" when the page stated the time and
            "fetch" when it stated

            none and the retrieval time stands in. Empty on a tombstone.
          type: string
        quote:
          description: >-
            Quote is one sentence, character for character as the page prints
            it. Empty on a

            tombstone.
          type: string
        rejected_as:
          description: >-
            RejectedAs is absent on a served row. It is "duplicate" on a row
            that reports another

            page's remark. On a tombstone it is the code of why the row is not
            served: the

            code of a refusal, or "firsthand_report" for a report still waiting
            for its original

            to be found.
          type: string
        reply_status:
          description: >-
            ReplyStatus is "not_reply" when the row does not answer another
            post,

            "context_complete" when it does and every post it answers is in
            Context,

            "context_incomplete" when one of those could not be read (its status
            says why), and

            "unknown" for a page of a kind whose replies are not read. Empty on
            a tombstone.
          type: string
        said_at:
          description: >-
            SaidAt is when the remark was said, unix seconds. Absent when
            SaidAtSource is

            "unknown", and on a tombstone.
          type: integer
        said_at_source:
          description: >-
            SaidAtSource is where SaidAt came from: "post" for the post's own
            timestamp,

            "page_stated" for a date the page prints, which names a day and not
            a time, and

            "unknown" when neither could be established. Empty on a tombstone.
          type: string
        said_on:
          description: >-
            SaidOn is the UTC day this row is filed under, the day the remark
            was said; see

            said_at for when it was said.
          type: string
        served:
          description: >-
            Served is true when the row is output, a row to keep. A consumer
            that holds a row whose

            served is false and whose rejected_as is not "duplicate" should
            delete it.
          type: boolean
        source_kind:
          description: >-
            SourceKind is "own", "transcript", "third_party_transcript" or
            "interview".

            "transcript" is the venue's own transcript; "third_party_transcript"
            is one another

            site published with the person's name on it. Empty on a tombstone.
          type: string
        speaker_label:
          description: >-
            SpeakerLabel is the transcript's own label on the passage the quote
            is in, such as

            "CRAMER". Empty when the page names no speaker.
          type: string
        statement_level:
          description: >-
            StatementLevel is "original" when the page is where they said or
            published it,

            "firsthand_report" when a reporter heard them directly and the
            report is the fullest

            text of it, "unknown" when it has not been judged. Empty on a
            tombstone.
          type: string
        text_origin:
          description: >-
            TextOrigin is what Body was made from: "page" for the page's own
            text,

            "captions_manual" for captions a person wrote, "captions_asr" for
            speech recognition.

            Machine transcripts can mishear words. Empty on a tombstone.
          type: string
        updated_at:
          description: >-
            UpdatedAt is when this row last changed, as RFC3339 UTC with
            fractional seconds. A

            change of state is a change: updated_after and updated_before on

            /api/v1/persons/channel-commentary filter on it.
          type: string
        url:
          description: >-
            URL is the address the text was read from, after the fetcher
            resolved it.
          type: string
        venue:
          type: string
      type: object
    model.APIError:
      properties:
        code:
          example: RESOURCE_NOT_FOUND
          type: string
        details:
          items:
            $ref: '#/components/schemas/model.APIErrorDetail'
          type: array
        docs_url:
          type: string
        examples:
          items:
            type: string
          type: array
        hint:
          type: string
        message:
          example: The requested resource was not found.
          type: string
        suggestions:
          items:
            type: string
          type: array
      type: object
    model.PersonCommentaryContext:
      properties:
        author_handle:
          type: string
        author_id:
          description: >-
            AuthorID, AuthorHandle and AuthorName are what the platform gave for
            the

            post's author, each left out when it gave none.
          type: string
        author_name:
          type: string
        depth:
          description: >-
            Depth is 1 for the post the row answers directly, then 2 and 3 for
            the

            posts above it.
          type: integer
        published_at:
          description: PublishedAt is unix seconds, 0 when the platform gave no time.
          type: integer
        relation:
          description: >-
            Relation is "reply_to", "quoted", "forwarded", "reshared" or
            "thread_root".
          type: string
        status:
          description: >-
            Status is "ok", "deleted" or "unavailable". Anything but "ok" means
            the

            post could not be read in full, and the row's ReplyStatus says so.
          type: string
        text:
          description: Text is the post's text as the platform gave it.
          type: string
        url:
          description: URL is the address of this post.
          type: string
      type: object
    model.APIErrorDetail:
      properties:
        field:
          type: string
        got:
          type: string
        reason:
          type: string
      type: object

````

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