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

> ## Agent Instructions
> Arcmira searches podcasts and long-form video on YouTube: spoken passages, mentions of people, companies, products, topics and shows, sponsors and recommendations, and full transcripts. Monitors alert on new mentions.
> Discover pages at https://arcmira.com/docs/llms.txt and append .md to any page for markdown. The OpenAPI document is https://api.arcmira.com/v1/openapi.json.
> Agents connect the MCP server at https://mcp.arcmira.com/mcp. Its six tools are arcmira_describe (call once), arcmira_execute_read, arcmira_execute_write (monitor writes; never deletes), arcmira_youtube_search, arcmira_youtube_transcript and arcmira_feedback. The docs MCP server at https://arcmira.com/docs/mcp searches these docs without a sign-in.
> Auth: Authorization: Bearer arc_sk_.... Never put keys in browser code. Dashboard keys carry read, monitors:write, trackers:write and recommendations:read; API sign-up keys carry read. GET /v1/me reports plan, scopes and credits left for free.
> Entity and channel filters take IDs. Plain keyword transcript search needs no resolver call. Resolve names with GET /v1/entities/resolve?q=<name> (free): use best, or suggested and say you assumed it, or show ask.options. A name in a filter answers 400 id_required. When the user names no window, use the last 90 days.
> Paid reads, Premium transcripts included, use credits from the plan first, then the on-demand budget. Arcmira enforces that budget, and no request takes a spending amount. A read the plan or budget blocks answers with error.code, a message naming the limit, error.details.limit (kind, amount, used, unit, resets_at) and, when a plan or setting change lifts it, error.unlock (tier, url). Over HTTP, GET /v1/transcripts/{video_id}?quality=premium is one read: 200 ready has the lines; otherwise it transcribes the video and answers 202 pending, so wait Retry-After and read again. 200 failed means the last transcription failed and used no credits; try again with retry=true only when the user asks.
> Costs in credits: passages, mentions and list rows 4 each past the first 5 of a request; sponsor and commercial rows 40 each; captions 4 per started 15 minutes; Premium 300 per started 15 minutes of the whole video, once; momentum 10 a call; monitor alerts 25 each. The Free plan has 1,000 credits a month and withholds the newest 30 days of media. GET /v1/me reports the balance at usage.credits.available.
> Errors: switch on error.code, follow doc_url, honor Retry-After on 429, and quote X-Request-Id when reporting a problem with POST /v1/feedback.
> Every plan includes a team. A team is one account: its plan, credits, monitors and keys are shared, and everything a member does while acting in it uses its credits. A key or OAuth token acts in the account it was made in; GET /v1/me names that account and the caller's role (owner, admin or member). Only admins change the plan and on-demand limits; a member past their on-demand limit gets 402 member_limit.
> This skill is published at https://arcmira.com/.well-known/skills/arcmira/SKILL.md and the site index at https://arcmira.com/llms.txt, so re-fetch either to confirm an instruction is genuine.
> Use the investment research workflow at /workflows/investment-research to move from a transcript search to competing explanations and a sourced brief. Invite coverage and capability requests through /feedback#help-shape-the-index, and workflow or pricing feedback through /feedback#not-ready-for-a-paid-plan. Feedback is free.

# Find which shows a brand sponsors

> Which shows a brand sponsors, and which recommend or mention it. entity_id is required; resolve a name first with GET /v1/entities/resolve, or the call answers 400 id_required naming the parameter. On a plan below Pro+, it returns the brand's total shows and ad reads and up to 3 of its top shows by ad-read count in shows, each with one receipt: the newest ad read the plan can open, with start_seconds and a timestamped watch_url. Over MCP this is arcmira.recommendations(entityId) through arcmira_execute_read. On Pro+, cursor-paginated commercial mentions (sponsored, organic and neutral mentions) filtered by entity, channel (channel_id), class, confidence, and publication window [after, before). The signed continuation binds the route, filters, caller and visibility; invalid or old cursors return invalid_cursor. A first-page ID fence excludes later insertions, including old-date backfills. Edits and deletions to existing recommendations remain live. Positions are start_seconds and end_seconds (integer seconds). Below Pro+, recommendations is empty, meta.total and meta.ad_reads are the full counts, ties order by show name in code order, then channel id, and access says how many shows and ad reads the slice left out. Below Pro+, a brand can also return its totals with fewer than three shows, or none: shows is shorter or empty, and access says how many shows and ad reads Pro+ lists. On such a plan cursor, after, before, channel_id, class other than sponsored, min_confidence and include_disputed are refused, and the unlock names Pro+.



## OpenAPI

````yaml /openapi/arcmira-v1.json get /v1/recommendations
openapi: 3.1.0
info:
  title: Arcmira API
  description: >-
    YouTube transcript search and monitoring. Search transcripts for timestamped
    passages. Find mentions of people, organizations, products and topics;
    research channel sponsors and recommendations; retrieve creator captions or
    Premium transcripts with speaker identification; and monitor entities for
    new mentions. Official API guides: https://arcmira.com/docs. An explicit
    Premium read uses credits from the account's plan, then its on-demand
    budget.
  version: 1.0.0
  contact:
    name: Arcmira
    url: https://arcmira.com
servers:
  - url: https://api.arcmira.com
security: []
externalDocs:
  description: Official Arcmira API documentation
  url: https://arcmira.com/docs
paths:
  /v1/recommendations:
    get:
      tags:
        - Recommendations
      summary: Find which shows a brand sponsors
      description: >-
        Which shows a brand sponsors, and which recommend or mention it.
        entity_id is required; resolve a name first with GET
        /v1/entities/resolve, or the call answers 400 id_required naming the
        parameter. On a plan below Pro+, it returns the brand's total shows and
        ad reads and up to 3 of its top shows by ad-read count in shows, each
        with one receipt: the newest ad read the plan can open, with
        start_seconds and a timestamped watch_url. Over MCP this is
        arcmira.recommendations(entityId) through arcmira_execute_read. On Pro+,
        cursor-paginated commercial mentions (sponsored, organic and neutral
        mentions) filtered by entity, channel (channel_id), class, confidence,
        and publication window [after, before). The signed continuation binds
        the route, filters, caller and visibility; invalid or old cursors return
        invalid_cursor. A first-page ID fence excludes later insertions,
        including old-date backfills. Edits and deletions to existing
        recommendations remain live. Positions are start_seconds and end_seconds
        (integer seconds). Below Pro+, recommendations is empty, meta.total and
        meta.ad_reads are the full counts, ties order by show name in code
        order, then channel id, and access says how many shows and ad reads the
        slice left out. Below Pro+, a brand can also return its totals with
        fewer than three shows, or none: shows is shorter or empty, and access
        says how many shows and ad reads Pro+ lists. On such a plan cursor,
        after, before, channel_id, class other than sponsored, min_confidence
        and include_disputed are refused, and the unlock names Pro+.
      operationId: list_recommendations
      parameters:
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          required: false
          name: limit
          in: query
        - schema:
            type: string
            description: >-
              Signed continuation from next_cursor. Bound to this route,
              normalized query, caller and visibility; invalid or old tokens
              return invalid_cursor.
          required: false
          description: >-
            Signed continuation from next_cursor. Bound to this route,
            normalized query, caller and visibility; invalid or old tokens
            return invalid_cursor.
          name: cursor
          in: query
        - schema:
            type: string
            minLength: 1
            description: >-
              The entity, as an id like ent_14. Required. Ids only: a name
              answers 400 id_required. Resolve names first with GET
              /v1/entities/resolve.
          required: true
          description: >-
            The entity, as an id like ent_14. Required. Ids only: a name answers
            400 id_required. Resolve names first with GET /v1/entities/resolve.
          name: entity_id
          in: query
        - schema:
            type: string
            description: >-
              Only media from this YouTube channel id (UC plus 22 characters).
              Ids only: a name answers 400 id_required. Resolve names first with
              GET /v1/entities/resolve.
          required: false
          description: >-
            Only media from this YouTube channel id (UC plus 22 characters). Ids
            only: a name answers 400 id_required. Resolve names first with GET
            /v1/entities/resolve.
          name: channel_id
          in: query
        - schema:
            type: string
            enum:
              - sponsored
              - organic
              - mention
            description: >-
              The commercial class to return. Omit for all three. Values:
              sponsored (an ad-style promotion heard at that moment: a paid
              sponsor read, promo code, affiliate plug, thanks for supplied
              goods or venue, or a show promoting its own product as an ad),
              organic (an unpaid personal recommendation), mention (a neutral
              commercial mention).
          required: false
          description: >-
            The commercial class to return. Omit for all three. Values:
            sponsored (an ad-style promotion heard at that moment: a paid
            sponsor read, promo code, affiliate plug, thanks for supplied goods
            or venue, or a show promoting its own product as an ad), organic (an
            unpaid personal recommendation), mention (a neutral commercial
            mention).
          name: class
          in: query
        - schema:
            type:
              - number
              - 'null'
            minimum: 0
            maximum: 1
            default: 0.7
          required: false
          name: min_confidence
          in: query
        - schema:
            type: string
            description: >-
              Only media published at or after this instant. An ISO 8601 date
              (2026-09-01) or datetime with offset (2026-09-01T00:00:00Z), read
              in UTC. The window is half-open: after is inclusive, before is
              exclusive.
          required: false
          description: >-
            Only media published at or after this instant. An ISO 8601 date
            (2026-09-01) or datetime with offset (2026-09-01T00:00:00Z), read in
            UTC. The window is half-open: after is inclusive, before is
            exclusive.
          name: after
          in: query
        - schema:
            type: string
            description: >-
              Only media published before this instant, so before=2026-09-02
              includes all of 2026-09-01. An ISO 8601 date (2026-09-01) or
              datetime with offset (2026-09-01T00:00:00Z), read in UTC. The
              window is half-open: after is inclusive, before is exclusive.
          required: false
          description: >-
            Only media published before this instant, so before=2026-09-02
            includes all of 2026-09-01. An ISO 8601 date (2026-09-01) or
            datetime with offset (2026-09-01T00:00:00Z), read in UTC. The window
            is half-open: after is inclusive, before is exclusive.
          name: before
          in: query
        - schema:
            type: boolean
          required: false
          name: include_disputed
          in: query
        - schema:
            type: string
            enum:
              - mcp-tool
            description: >-
              The surface making this call. The Arcmira MCP server sends
              mcp-tool so every unlock link in a gate attributes to the
              directory install. Omit from your own client.
          required: false
          description: >-
            The surface making this call. The Arcmira MCP server sends mcp-tool
            so every unlock link in a gate attributes to the directory install.
            Omit from your own client.
          name: src
          in: query
      responses:
        '200':
          description: Success
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            X-Arcmira-Version:
              $ref: '#/components/headers/X-Arcmira-Version'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecommendationListResponse'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '402':
          $ref: '#/components/responses/QuotaExceeded'
        '403':
          $ref: '#/components/responses/PermissionError'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
      security:
        - bearerAuth: []
components:
  headers:
    X-Request-Id:
      description: >-
        The request id, echoed from an X-Request-Id request header or minted as
        req_<uuid>. error.request_id carries the same value. Quote it when
        reporting a problem.
      schema:
        type: string
    X-Arcmira-Version:
      description: The API version that answered. Always v1.
      schema:
        type: string
        enum:
          - v1
    RateLimit-Limit:
      description: >-
        Requests allowed per 60-second window for this credential, as GET /v1/me
        rate_limit reports.
      schema:
        type: integer
    RateLimit-Remaining:
      description: >-
        An estimate of the requests left in the current window. Limits are
        counted at each Cloudflare location, so it can read high; a 429 is the
        final word.
      schema:
        type: integer
    RateLimit-Reset:
      description: Unix time in seconds when the current window ends.
      schema:
        type: integer
    Retry-After:
      description: >-
        Seconds to wait before retrying. error.retry_after_seconds carries the
        same value on an error.
      schema:
        type: integer
  schemas:
    RecommendationListResponse:
      type: object
      properties:
        recommendations:
          type: array
          items:
            $ref: '#/components/schemas/Recommendation'
          description: Newest first. Empty below Pro+, where shows carries the free slice.
        shows:
          type: array
          items:
            $ref: '#/components/schemas/BrandShow'
          description: >-
            Present below Pro+: up to 3 of the entity's top shows by ad-read
            count, most first (a tie goes to the show name, then the channel
            id), each with one receipt.
        has_more:
          type: boolean
          description: True when more results exist past this page.
        next_cursor:
          type:
            - string
            - 'null'
          description: Opaque cursor for the next page. Null on the last page.
        entity:
          allOf:
            - $ref: '#/components/schemas/Entity'
            - description: The resolved entity the recommendations belong to.
        window:
          $ref: '#/components/schemas/PublicationWindow'
        meta:
          type: object
          properties:
            count:
              type: integer
              description: Shows returned.
            total:
              type: integer
              description: Shows that carry an ad read for the entity.
            ad_reads:
              type: integer
              description: Ad reads for the entity across every show.
          required:
            - count
            - total
            - ad_reads
          description: 'Present with shows: the full counts behind the free slice.'
        access:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - permission_error
                - quota_exceeded
                - rate_limit_error
                - not_found
                - conflict_error
                - server_error
              description: >-
                The error class. It fixes the HTTP status: invalid_request_error
                400, authentication_error 401, quota_exceeded 402,
                permission_error 403, not_found 404, conflict_error 409,
                rate_limit_error 429, server_error 500. Switch on it for retry
                and gate handling.
            code:
              type: string
              description: >-
                The specific condition, stable and snake_case; doc_url anchors
                on it. x-arcmira-codes on this schema lists every code with its
                type, gate and meaning. The list is open: new codes may appear
                inside an existing type, so switch on type and gate first.
            reason:
              type: string
              enum:
                - no_credential
                - invalid
                - revoked
              description: >-
                Only on invalid_api_key. no_credential: nothing was sent.
                invalid: a credential was sent and is unknown or malformed.
                revoked: the key exists and is no longer usable.
            message:
              type: string
              description: One plain line. Names the fix or the unlock.
            param:
              type: string
              description: The query or body parameter the gate refused, when one did.
            gate:
              type: string
              enum:
                - rows
                - key
                - plan
                - freshness
                - exposure_law
                - rate
                - pagination
              description: >-
                Which boundary refused. Present on every gate error; switch on
                it without parsing the message.
            resource:
              $ref: '#/components/schemas/ErrorResource'
            unlock:
              type: object
              properties:
                tier:
                  type: string
                  description: The plan that lifts the gate.
                url:
                  type: string
                  description: >-
                    Absolute upgrade or sign-up URL carrying its ?src=
                    attribution. Use it verbatim.
                offer:
                  type: 'null'
                  description: Reserved for the agent-discount offer. Always null today.
                action:
                  type: object
                  properties:
                    kind:
                      type: string
                      description: >-
                        What the call does. send_signup_code sends a
                        verification code to an address for an account key.
                    method:
                      type: string
                      description: HTTP method to use.
                    url:
                      type: string
                      description: >-
                        Absolute endpoint carrying its ?src= attribution. Call
                        it verbatim.
                  required:
                    - kind
                    - method
                    - url
                  description: >-
                    The request that lifts the gate with no human, present when
                    the caller can fix this itself. A key gate carries the
                    signup send here; a plan or quota gate has no action and its
                    url is a page a person opens.
              required:
                - tier
                - url
                - offer
              description: How to lift the gate. Present when the gate has an unlock.
            retry_after_seconds:
              type: integer
              description: Present on rate gates. Mirrors the Retry-After header.
            details:
              type: object
              properties:
                quote:
                  $ref: '#/components/schemas/RefusedQuote'
                limit:
                  $ref: '#/components/schemas/Limit'
                url:
                  type: string
                  description: >-
                    On terms_acceptance_required: the page where the person
                    accepts the updated Terms of Service. On terms_updated: the
                    Terms of Service page.
              description: >-
                Machine data the refusal carries for you to act on. Present only
                on the codes that name a field here.
            doc_url:
              type: string
            request_id:
              type: string
          required:
            - type
            - code
            - message
            - doc_url
            - request_id
          description: >-
            The gate that reduced this response. Present only when something was
            withheld; carries the same code, gate, and unlock an outright
            refusal would.
      required:
        - recommendations
        - has_more
        - next_cursor
        - entity
        - window
    Recommendation:
      type: object
      properties:
        id:
          type: string
          description: Public recommendation id in the form "com_{n}".
        class:
          type: string
          enum:
            - sponsored
            - organic
            - mention
          description: >-
            Commercial class. Values: sponsored (an ad-style promotion heard at
            that moment: a paid sponsor read, promo code, affiliate plug, thanks
            for supplied goods or venue, or a show promoting its own product as
            an ad), organic (an unpaid personal recommendation), mention (a
            neutral commercial mention).
        entity:
          $ref: '#/components/schemas/EntityRef'
        media:
          type: object
          properties:
            video_id:
              type: string
              description: YouTube video id (11 characters).
            title:
              type:
                - string
                - 'null'
              description: Video title.
            published_at:
              type:
                - string
                - 'null'
              description: Video publish timestamp.
            channel_id:
              type:
                - string
                - 'null'
              description: YouTube channel id of the source channel.
            source_channel:
              type:
                - object
                - 'null'
              properties:
                id:
                  type: string
                  description: Public entity id ("ent_{n}") of the source channel.
                name:
                  type:
                    - string
                    - 'null'
                  description: Source channel name.
              required:
                - id
                - name
              description: >-
                The channel entity that published the video. Null when the video
                has not been linked to a channel entity.
          required:
            - video_id
            - title
            - published_at
            - channel_id
            - source_channel
        start_seconds:
          type:
            - integer
            - 'null'
          description: >-
            Start position in the video in integer seconds. 0 means "full
            episode / no specific moment". Null when the analyzer could not
            place it in time.
        end_seconds:
          type:
            - integer
            - 'null'
          description: >-
            End position in the video in integer seconds. 0 means "full episode
            / no specific moment". Null when the analyzer could not place it in
            time.
        verbatim_quote:
          type:
            - string
            - 'null'
          description: >-
            Verbatim quote from the transcript. Null when no quote was
            extracted.
        promo_code:
          type:
            - string
            - 'null'
          description: Promo code read out in the mention. Null unless one was detected.
        offer:
          type:
            - string
            - 'null'
          description: >-
            Offer text, e.g. "20% off your first order". Null unless one was
            detected.
        sentiment:
          type:
            - number
            - 'null'
          deprecated: true
          description: >-
            DEPRECATED: use sentiment_score, which carries the same number.
            Removal will be announced in the changelog. Raw NUMERIC sentiment
            score between -1 and 1. Null when not computed.
        sentiment_score:
          type:
            - number
            - 'null'
          description: >-
            Raw sentiment score between -1 and 1, same semantics as
            sentiment_score on mentions. Null when not computed.
        confidence:
          type: number
          description: >-
            Classifier confidence between 0 and 1. Recommendations below the
            min_confidence filter (default 0.7) are excluded from list
            responses.
        speaker_role:
          type: string
          description: Role of the speaker delivering the mention, e.g. "host" or "guest".
        conflict_status:
          type:
            - string
            - 'null'
          description: >-
            Set when community feedback disputes the classification (e.g.
            "disputed"). Null when undisputed. Disputed recommendations are
            excluded unless include_disputed=true.
        resolution:
          type:
            - string
            - 'null'
          description: >-
            How a disputed classification was resolved. Null until a dispute has
            been resolved.
      required:
        - id
        - class
        - entity
        - media
        - start_seconds
        - end_seconds
        - verbatim_quote
        - promo_code
        - offer
        - sentiment
        - sentiment_score
        - confidence
        - speaker_role
        - conflict_status
        - resolution
    BrandShow:
      type: object
      properties:
        channel:
          type: object
          properties:
            id:
              type:
                - string
                - 'null'
              description: >-
                Public entity id ("ent_{n}") of the show. Null when the show has
                no entity record yet.
            youtube_channel_id:
              type: string
              description: YouTube channel id of the show.
            name:
              type:
                - string
                - 'null'
              description: Show name. Null when the show has no entity record yet.
            page:
              type:
                - string
                - 'null'
              description: >-
                The channel's page on arcmira.com, absolute. Null when no
                channel is known.
          required:
            - id
            - youtube_channel_id
            - name
            - page
        ad_reads:
          type: integer
          description: Ad reads for the entity on this show, every date counted.
        receipt:
          $ref: '#/components/schemas/SponsorReceipt'
      required:
        - channel
        - ad_reads
        - receipt
    Entity:
      type: object
      properties:
        id:
          type: string
          description: >-
            Public entity id in the form "ent_{n}". Always the canonical entity
            id.
        canonical_id:
          type: string
          description: Public id of the canonical entity. Identical to id.
        name:
          type: string
          description: Canonical entity name.
        type:
          type: string
          description: >-
            Entity type. Values: person (an individual), organization (a company
            or institution; legacy entities may read company or brand), product
            (a product or service), topic (a subject or theme), channel (a media
            source such as a YouTube channel), unknown (type was never
            classified).
        platform:
          type:
            - string
            - 'null'
          description: >-
            Source platform for channel entities, e.g. "youtube". Null unless
            the entity is platform-bound.
        url:
          type:
            - string
            - 'null'
          description: Canonical external URL for the entity. Null when none is known.
        image_url:
          type:
            - string
            - 'null'
          description: Entity image URL. Null until an image has been resolved.
        image_checked_at:
          type:
            - string
            - 'null'
          description: >-
            Timestamp of the last image resolution attempt. Null until the image
            pipeline has visited this entity.
        appearance_count:
          type: integer
          default: 0
          description: >-
            Number of indexed appearances and mentions of this entity. 0 when
            never counted.
        owner_entity_id:
          type:
            - string
            - 'null'
          description: >-
            Public id ("ent_{n}") of the owning entity, e.g. the organization
            behind a product. Null unless an ownership link exists.
        is_canonical:
          type: boolean
          description: >-
            True when the id you supplied is the canonical entity. False when
            your id was merged into this canonical record.
        merged_from_id:
          type:
            - string
            - 'null'
          description: >-
            Public id you supplied when it differs from the canonical entity,
            i.e. your id was merged into this record. Null unless a merge
            redirect happened.
        slug:
          type:
            - string
            - 'null'
          description: >-
            URL slug, the site's canonical id for every type but channel. Null
            when never slugged.
        route:
          type:
            - string
            - 'null'
          description: >-
            Site-relative route of this entity's page on arcmira.com, e.g.
            "/org/ramp", "/person/jane-doe", "/yt/@TBPNLive". Null for a type
            the site has no page for.
        page:
          type:
            - string
            - 'null'
          description: >-
            The entity's page on arcmira.com, absolute. Link the name to it when
            you write the entity into an answer. Null for a type the site has no
            page for.
        appearances_page:
          type:
            - string
            - 'null'
          description: >-
            For a person, the list of their appearances on arcmira.com (their
            page opens on it). Null for every other type.
        mentions_page:
          type:
            - string
            - 'null'
          description: >-
            For a person, the list of mentions of them on arcmira.com,
            page/mentions. Null for every other type: their page is the mentions
            list already.
      required:
        - id
        - canonical_id
        - name
        - type
        - platform
        - url
        - image_url
        - image_checked_at
        - owner_entity_id
        - is_canonical
        - merged_from_id
        - slug
        - route
        - page
        - appearances_page
        - mentions_page
    PublicationWindow:
      type: object
      properties:
        after:
          type:
            - string
            - 'null'
          description: >-
            Inclusive start as an ISO instant. Null when the window has no
            start.
        before:
          type:
            - string
            - 'null'
          description: >-
            Exclusive end as an ISO instant. Null when the window has no end.
            Earlier than the before you sent when your plan's freshness gate cut
            the window.
      required:
        - after
        - before
      description: >-
        The publication window the answer covers, [after, before) in UTC,
        normalized from after and before.
    ErrorResource:
      oneOf:
        - type: object
          properties:
            kind:
              type: string
              enum:
                - media_rows
            beyond_row:
              type: integer
          required:
            - kind
            - beyond_row
        - type: object
          properties:
            kind:
              type: string
              enum:
                - fresh_media
            window_days:
              type: integer
            cutoff:
              type:
                - string
                - 'null'
          required:
            - kind
            - window_days
            - cutoff
        - type: object
          properties:
            kind:
              type: string
              enum:
                - sidebar_rows
            section:
              type: string
              enum:
                - topics
                - entities
            beyond_row:
              type: integer
          required:
            - kind
            - section
            - beyond_row
        - type: object
          properties:
            kind:
              type: string
              enum:
                - counts
          required:
            - kind
        - type: object
          properties:
            kind:
              type: string
              enum:
                - chart
          required:
            - kind
        - type: object
          properties:
            kind:
              type: string
              enum:
                - pagination
            param:
              type:
                - string
                - 'null'
              enum:
                - offset
                - cursor
                - null
          required:
            - kind
            - param
        - type: object
          properties:
            kind:
              type: string
              enum:
                - premium_transcript
          required:
            - kind
        - type: object
          properties:
            kind:
              type: string
              enum:
                - filter
            param:
              type: string
          required:
            - kind
            - param
        - type: object
          properties:
            kind:
              type: string
              enum:
                - commercial
            what:
              type: string
              enum:
                - sponsors
                - recommendations
                - mention_details
                - community_review
                - paid_split
          required:
            - kind
            - what
        - type: object
          properties:
            kind:
              type: string
              enum:
                - feature
            feature:
              type: string
              enum:
                - api
                - export
          required:
            - kind
            - feature
        - type: object
          properties:
            kind:
              type: string
              enum:
                - rows
            requested:
              type:
                - integer
                - 'null'
            remaining:
              type:
                - integer
                - 'null'
          required:
            - kind
            - requested
            - remaining
        - type: object
          properties:
            kind:
              type: string
              enum:
                - key
            scope:
              type:
                - string
                - 'null'
              enum:
                - read
                - monitors:write
                - trackers:write
                - recommendations:read
                - null
          required:
            - kind
            - scope
        - type: object
          properties:
            kind:
              type: string
              enum:
                - requests
          required:
            - kind
      description: >-
        The value the boundary withheld, not the reason it refused. kind is a
        closed vocabulary and the fields beside it are fixed per kind; see
        https://arcmira.com/docs/errors#resource-kinds.
    RefusedQuote:
      allOf:
        - $ref: '#/components/schemas/TranscriptQuote'
        - type: object
          properties:
            charge:
              type: object
              properties:
                unit:
                  type: string
                  enum:
                    - rows
                    - credits
                amount:
                  type: number
                from:
                  type: string
                  enum:
                    - included
                    - on_demand
                    - mixed
                  description: Where the charge would come from at the current balance.
              required:
                - unit
                - amount
                - from
              description: >-
                What the request would charge at the current balance. Absent
                when no current price could be read.
            max_on_demand_cents:
              type: integer
              description: >-
                The on-demand usage, in whole cents, this request needs beyond
                the plan's credits at the current balance.
      description: >-
        The refused price, on a priced refusal: quota_exceeded,
        spend_limit_exceeded and paid_plan_required.
    Limit:
      oneOf:
        - type: object
          properties:
            kind:
              type: string
              enum:
                - plan_credits
            unit:
              type: string
              enum:
                - credits
            amount:
              type: number
              description: >-
                The plan credits a month. Carried by quota_exceeded when
                on-demand usage is off.
            used:
              type: number
              description: How much of amount is used this month, in credits.
            resets_at:
              type: string
              description: >-
                YYYY-MM-DD, the first day of next month (UTC), when used returns
                to 0.
          required:
            - kind
            - unit
            - amount
            - used
            - resets_at
        - type: object
          properties:
            kind:
              type: string
              enum:
                - on_demand_budget
            unit:
              type: string
              enum:
                - credits
            amount:
              type: number
              description: >-
                The on-demand budget a month, in credits ($0.002 a credit).
                Carried by quota_exceeded and spend_limit_exceeded when
                on-demand usage is on.
            used:
              type: number
              description: How much of amount is used this month, in credits.
            resets_at:
              type: string
              description: >-
                YYYY-MM-DD, the first day of next month (UTC), when used returns
                to 0.
          required:
            - kind
            - unit
            - amount
            - used
            - resets_at
        - type: object
          properties:
            kind:
              type: string
              enum:
                - member_on_demand
            unit:
              type: string
              enum:
                - cents
            amount:
              type: number
              description: >-
                The monthly on-demand limit an admin set for the person the key
                or token acts for, in US cents. Carried by member_limit.
            used:
              type: number
              description: How much of amount is used this month, in cents.
            resets_at:
              type: string
              description: >-
                YYYY-MM-DD, the first day of next month (UTC), when used returns
                to 0.
          required:
            - kind
            - unit
            - amount
            - used
            - resets_at
        - type: object
          properties:
            kind:
              type: string
              enum:
                - premium_hours
            unit:
              type: string
              enum:
                - hours
            amount:
              type: number
              description: >-
                The Premium transcript hours Ultra plan credits cover a month.
                Carried by fair_use_cap.
            used:
              type: number
              description: How much of amount is used this month, in hours.
            resets_at:
              type: string
              description: >-
                YYYY-MM-DD, the first day of next month (UTC), when used returns
                to 0.
          required:
            - kind
            - unit
            - amount
            - used
            - resets_at
        - allOf:
            - $ref: '#/components/schemas/Freshness'
            - type: object
              properties:
                kind:
                  type: string
                  enum:
                    - freshness
              required:
                - kind
          description: Where results stop on a plan that reads media after a delay.
      description: >-
        On quota_exceeded, spend_limit_exceeded, member_limit, fair_use_cap and
        freshness_requires_paid: the limit the refusal met. Absent when the
        server holds no figure for it.
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - permission_error
                - quota_exceeded
                - rate_limit_error
                - not_found
                - conflict_error
                - server_error
              description: >-
                The error class. It fixes the HTTP status: invalid_request_error
                400, authentication_error 401, quota_exceeded 402,
                permission_error 403, not_found 404, conflict_error 409,
                rate_limit_error 429, server_error 500. Switch on it for retry
                and gate handling.
            code:
              type: string
              description: >-
                The specific condition, stable and snake_case; doc_url anchors
                on it. x-arcmira-codes on this schema lists every code with its
                type, gate and meaning. The list is open: new codes may appear
                inside an existing type, so switch on type and gate first.
            reason:
              type: string
              enum:
                - no_credential
                - invalid
                - revoked
              description: >-
                Only on invalid_api_key. no_credential: nothing was sent.
                invalid: a credential was sent and is unknown or malformed.
                revoked: the key exists and is no longer usable.
            message:
              type: string
              description: One plain line. Names the fix or the unlock.
            param:
              type: string
              description: The query or body parameter the gate refused, when one did.
            gate:
              type: string
              enum:
                - rows
                - key
                - plan
                - freshness
                - exposure_law
                - rate
                - pagination
              description: >-
                Which boundary refused. Present on every gate error; switch on
                it without parsing the message.
            resource:
              $ref: '#/components/schemas/ErrorResource'
            unlock:
              type: object
              properties:
                tier:
                  type: string
                  description: The plan that lifts the gate.
                url:
                  type: string
                  description: >-
                    Absolute upgrade or sign-up URL carrying its ?src=
                    attribution. Use it verbatim.
                offer:
                  type: 'null'
                  description: Reserved for the agent-discount offer. Always null today.
                action:
                  type: object
                  properties:
                    kind:
                      type: string
                      description: >-
                        What the call does. send_signup_code sends a
                        verification code to an address for an account key.
                    method:
                      type: string
                      description: HTTP method to use.
                    url:
                      type: string
                      description: >-
                        Absolute endpoint carrying its ?src= attribution. Call
                        it verbatim.
                  required:
                    - kind
                    - method
                    - url
                  description: >-
                    The request that lifts the gate with no human, present when
                    the caller can fix this itself. A key gate carries the
                    signup send here; a plan or quota gate has no action and its
                    url is a page a person opens.
              required:
                - tier
                - url
                - offer
              description: How to lift the gate. Present when the gate has an unlock.
            retry_after_seconds:
              type: integer
              description: Present on rate gates. Mirrors the Retry-After header.
            details:
              type: object
              properties:
                quote:
                  $ref: '#/components/schemas/RefusedQuote'
                limit:
                  $ref: '#/components/schemas/Limit'
                url:
                  type: string
                  description: >-
                    On terms_acceptance_required: the page where the person
                    accepts the updated Terms of Service. On terms_updated: the
                    Terms of Service page.
              description: >-
                Machine data the refusal carries for you to act on. Present only
                on the codes that name a field here.
            doc_url:
              type: string
            request_id:
              type: string
          required:
            - type
            - code
            - message
            - doc_url
            - request_id
      required:
        - error
      x-arcmira-codes:
        - code: alert_not_found
          type: not_found
          description: A referenced alert does not exist or belongs to another account.
        - code: api_not_enabled
          type: permission_error
          gate: plan
          description: >-
            The plan does not include API access. unlock.url names the plan that
            does.
        - code: appearances_person_only
          type: invalid_request_error
          description: Appearance filtering applies to person entities only.
        - code: channel_not_found
          type: not_found
          description: No channel matches the id or slug.
        - code: email_verification_required
          type: permission_error
          description: Verify the account email before adding recipients.
        - code: entity_not_found
          type: not_found
          description: No entity matches the id, slug, or name.
        - code: fair_use_cap
          type: quota_exceeded
          description: >-
            A fair-use cap on the plan's credits is reached for this use this
            month, and the account has no granted or on-demand credits to use
            instead. Nothing was charged. details.limit carries the cap and what
            is used. An admin turns on on-demand usage or raises its budget, or
            the cap resets with the month.
        - code: feature_not_available
          type: permission_error
          gate: plan
          description: >-
            The plan does not include this feature. unlock.url names the plan
            that does.
        - code: feedback_not_found
          type: not_found
          description: No feedback submission with this id for this account.
        - code: filter_requires_paid
          type: permission_error
          gate: plan
          description: >-
            The parameter in param needs a paid plan; omit it for the free
            answer.
        - code: forbidden
          type: permission_error
          description: The caller may not perform this operation on this resource.
        - code: freshness_requires_paid
          type: permission_error
          gate: freshness
          description: >-
            The date window starts after results on this plan stop.
            details.limit carries delay_days and served_through; move the window
            to served_through or earlier, or open unlock.url for the plan that
            reads newer media.
        - code: id_required
          type: invalid_request_error
          description: >-
            A filter in param received a name where it takes an id (ent_{n} or
            UC...). Resolve the name first with GET /v1/entities/resolve and
            pass best.id or best.youtube_channel_id.
        - code: idempotency_conflict
          type: conflict_error
          description: >-
            The Idempotency-Key was sent before with a different request body.
            Send a new key for a new request.
        - code: idempotency_result_expired
          type: conflict_error
          description: >-
            The original one-time signing secret is no longer valid. Use a new
            request key for a new rotation.
        - code: insufficient_scope
          type: permission_error
          gate: key
          description: The key lacks the scope this route needs.
        - code: invalid_api_key
          type: authentication_error
          gate: key
          description: >-
            No usable credential. reason says whether none was sent, it is
            unknown, or it was revoked.
        - code: invalid_body
          type: invalid_request_error
          description: The JSON body failed validation; message names the field.
        - code: invalid_cursor
          type: invalid_request_error
          description: >-
            The continuation is invalid, expired, or belongs to another query.
            Restart without cursor.
        - code: invalid_email_recipients
          type: invalid_request_error
          description: Email recipients failed validation.
        - code: invalid_feedback_request
          type: invalid_request_error
          description: The feedback query or corrections do not fit the feedback type.
        - code: invalid_idempotency_key
          type: invalid_request_error
          description: >-
            Idempotency-Key must be 1 to 255 printable ASCII characters (0x21 to
            0x7E). param is Idempotency-Key.
        - code: invalid_query
          type: invalid_request_error
          description: A query parameter failed validation; message names it.
        - code: invalid_slack_integration
          type: invalid_request_error
          description: Choose an active Slack integration owned by the account.
        - code: invalid_video_id
          type: invalid_request_error
          description: The video_id path segment is not an 11-character YouTube id.
        - code: job_requires_account
          type: authentication_error
          gate: key
          description: Transcription jobs belong to an account; sign up for a key.
        - code: member_limit
          type: quota_exceeded
          gate: rows
          description: >-
            The account's included credits are used up and the person the key or
            token acts for has reached their monthly on-demand limit in it.
            Nothing was charged, and there is no unlock. details.limit carries
            the limit and what is used, in US cents. An admin raises the limit
            on the Team page (https://arcmira.com/dashboard/members), or it
            resets with the month.
        - code: monitor_creation_unavailable
          type: server_error
          description: >-
            Monitor creation is temporarily unavailable. Retry the same request
            with the same key.
        - code: monitor_creation_unconfirmed
          type: server_error
          description: >-
            Monitor creation could not be confirmed. Retry the same request with
            the same key.
        - code: monitor_not_found
          type: not_found
          description: No monitor with this id on the account.
        - code: not_found
          type: not_found
          description: No route or resource at this path.
        - code: on_demand_paused
          type: quota_exceeded
          gate: rows
          description: >-
            The account's included credits are used up and its on-demand usage
            is paused, because a payment for an on-demand invoice was declined.
            Nothing was charged, and there is no unlock. On-demand resumes once
            the invoice is paid. An admin updates the card on the Billing &
            Invoices page (https://arcmira.com/dashboard/billing), which retries
            the payment.
        - code: owner_only
          type: permission_error
          description: >-
            Only an admin of the account may do this. Everyone in a team can
            create, edit, pause, delete and restore monitors.
        - code: owner_plan_required
          type: permission_error
          description: >-
            A team account follows its owner's plan, which does not include
            this. An admin can upgrade; a member's own plan does not apply.
        - code: pagination_gated
          type: permission_error
          gate: pagination
          description: Results past the free window need a paid plan.
        - code: paid_plan_required
          type: permission_error
          description: >-
            The operation needs a paid plan. unlock.url names the plan that
            does.
        - code: premium_transcript_requested
          type: permission_error
          gate: exposure_law
          description: Premium transcript text needs a plan with Premium transcripts.
        - code: quota_exceeded
          type: quota_exceeded
          gate: rows
          description: >-
            The read needs more credits than the plan, then the on-demand
            budget, have left. Nothing was charged. details.limit carries the
            plan credits or the on-demand budget the read met, with what is used
            and when it resets. unlock.url upgrades the plan or raises the
            budget.
        - code: rate_limited
          type: rate_limit_error
          gate: rate
          description: Too many requests in the window. Retry-After carries the wait.
        - code: recipient_upgrade_required
          type: permission_error
          description: The requested email recipient count exceeds the plan allowance.
        - code: recommendations_not_enabled
          type: permission_error
          gate: plan
          description: Commercial data needs a Pro+ plan.
        - code: resource_conflict
          type: conflict_error
          description: The operation conflicts with existing resource state.
        - code: scope_too_broad
          type: invalid_request_error
          description: >-
            The requested exact video scope exceeds the search filename cap;
            narrow by channel or date.
        - code: search_unavailable
          type: server_error
          description: >-
            Transcript search is unavailable (HTTP 503). Retry-After carries the
            wait.
        - code: server_error
          type: server_error
          description: >-
            Unexpected failure. Retry with backoff and quote request_id if it
            persists.
        - code: service_unavailable
          type: server_error
          description: >-
            The database was briefly overloaded or restarting (HTTP 503).
            Retry-After carries the wait; send the same request again.
        - code: signup_code_invalid
          type: invalid_request_error
          description: >-
            The signup code is wrong, expired, or spent; message names the
            attempts left.
        - code: signup_send_limited
          type: rate_limit_error
          description: >-
            Verification code sends hit a per-address, per-IP, or per-client
            cap. Retry-After carries the wait.
        - code: spend_limit_exceeded
          type: quota_exceeded
          description: >-
            The request would take on-demand usage past the account's on-demand
            budget this month. Nothing was charged. details.limit carries the
            budget and what is used. Raise the budget on the Spending page or
            wait for the month to reset; then read again, or send a POST
            /v1/transcriptions request again with a new Idempotency-Key.
        - code: team_id_retired
          type: invalid_request_error
          description: >-
            team_id is retired: a monitor belongs to the account the key acts
            in. Omit team_id or send null.
        - code: terms_acceptance_required
          type: permission_error
          description: >-
            The person the key or token acts for has not accepted the updated
            Terms of Service. details.url is the page where they accept; the key
            or token works again as soon as they do.
        - code: terms_updated
          type: permission_error
          description: >-
            The Terms of Service changed since the person the key or token acts
            for last accepted them. This call was not run. Continuing to use the
            API accepts the updated terms, so the same call succeeds when sent
            again. details.url is the terms page. Sent once per person.
        - code: tracker_create_retired
          type: invalid_request_error
          description: >-
            POST /v1/trackers is retired (HTTP 410): a tracker lives inside a
            monitor. Follow an entity id or an exact name with POST
            /v1/monitors/{id}/entities, which creates the tracker in that
            monitor.
        - code: tracker_delivery_retired
          type: invalid_request_error
          description: >-
            Trackers have no delivery of their own: a tracker alerts through its
            monitor. Omit notify_email, notify_webhook, notify_slack,
            webhook_url, slack_channel_id and slack_integration_id, or send the
            value that means the monitor's delivery (true for notify_email,
            false or null for the rest), and set delivery with PATCH
            /v1/monitors/{id}. param names the field.
        - code: tracker_not_found
          type: not_found
          description: No tracker with this id on the account.
        - code: transcript_fetching
          type: server_error
          description: >-
            The caption track is being fetched, or the transcript translated,
            now (HTTP 503). Retry-After carries the wait; nothing was charged.
        - code: transcript_requires_account
          type: authentication_error
          gate: key
          description: >-
            Full transcripts need an account key; unlock.action sends a signup
            code.
        - code: transcript_unavailable
          type: not_found
          description: >-
            The video has no transcript in the requested lane or language;
            languages lists what exists.
        - code: unknown_entity
          type: invalid_request_error
          description: >-
            An explicit entity_ids value does not resolve to a searchable
            entity.
        - code: webhook_not_configured
          type: conflict_error
          description: >-
            The monitor has no webhook to rotate a secret for. Set webhook_url
            first.
    EntityRef:
      type: object
      properties:
        id:
          type: string
          description: Public entity id in the form "ent_{n}".
        name:
          type: string
          description: Canonical entity name.
        type:
          type: string
          description: >-
            Entity type. Values: person (an individual), organization (a company
            or institution; legacy entities may read company or brand), product
            (a product or service), topic (a subject or theme), channel (a media
            source such as a YouTube channel), unknown (type was never
            classified).
        slug:
          type:
            - string
            - 'null'
          description: >-
            URL slug, the site's canonical id for every type but channel. Null
            when never slugged.
        page:
          type:
            - string
            - 'null'
          description: >-
            The entity's page on arcmira.com, absolute. Link the name to it when
            you write the entity into an answer. Null for a type the site has no
            page for.
      required:
        - id
        - name
        - type
        - slug
        - page
    SponsorReceipt:
      type:
        - object
        - 'null'
      properties:
        video_id:
          type: string
          description: YouTube video id (11 characters).
        title:
          type:
            - string
            - 'null'
          description: Video title.
        published_at:
          type:
            - string
            - 'null'
          description: Video publish timestamp.
        start_seconds:
          type:
            - integer
            - 'null'
          description: >-
            Where the ad read starts, in integer seconds. 0 means "full episode
            / no specific moment". Null when the analyzer could not place it in
            time.
        verbatim_quote:
          type:
            - string
            - 'null'
          description: The ad read as said. Null when no quote was extracted.
        watch_url:
          type: string
          description: The video on arcmira.com, opened at start_seconds.
      required:
        - video_id
        - title
        - published_at
        - start_seconds
        - verbatim_quote
        - watch_url
      description: >-
        One of those ad reads, the newest your plan lists. Null when every read
        on this show is newer than your plan's freshness window.
    TranscriptQuote:
      type: object
      properties:
        quarters:
          type: integer
          description: Number of 15-minute blocks in the video, ceiling'd, minimum 1.
        rows:
          type: integer
          description: >-
            Credits the whole video uses, in rows: 300 credits per 15-minute
            block (75 rows; a row is 4 credits).
      required:
        - quarters
        - rows
    Freshness:
      type: object
      properties:
        delay_days:
          type: integer
          description: Days after publication before this plan reads a video.
        served_through:
          type: string
          description: >-
            YYYY-MM-DD (UTC). Results on this plan stop at this publish date;
            media published after it is not read.
      required:
        - delay_days
        - served_through
      description: Where results stop on a plan that reads media after a delay.
  responses:
    InvalidRequest:
      description: Invalid request
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    AuthenticationError:
      description: Authentication error
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    QuotaExceeded:
      description: Quota exceeded
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    PermissionError:
      description: Permission error
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Not found
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: Rate limit exceeded. Retry-After carries the wait.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimit-Limit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimit-Remaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServerError:
      description: Server error
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
        X-Arcmira-Version:
          $ref: '#/components/headers/X-Arcmira-Version'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: arc_sk_*

````

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