> ## 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 has three API capabilities: Search (entities, mentions, appearances, commercial intelligence), Monitors (trackers plus alert delivery), and Transcripts (read, generate, correct). Community Review is the cross-surface correction layer.
> Discover pages at https://arcmira.com/docs/llms.txt, then fetch the matching page's .md export. Each capability has a self-contained '<capability> for coding agents' page; prefer it.
> Auth: Authorization: Bearer arc_sk_... or x-api-key: arc_sk_... (x-api-key wins if both are sent). Never put keys in browser code. Check GET /v1/me for tier, scopes, and remaining rows before metered pulls.
> Search: resolve names with GET /v1/entities/lookup and pin ent_* IDs before pulling metered rows. Only person entities have appearances. Mention and recommendation rows carry canonical numeric timestamps in start_seconds/end_seconds (integer seconds; 0 means full episode); the MM:SS string fields are deprecated. Commercial routes need Pro+ tier AND the recommendations:read scope and bill 10 rows per row.
> Monitors: a tracker watches one entity; a monitor groups trackers with shared delivery (email, Slack, HMAC-signed webhooks). Create trackers with POST /v1/trackers, then attach by id: POST /v1/monitors/{id}/trackers { trackerIds: [...] }. Each fired alert occurrence debits 100 rows. Poll GET /v1/monitors/{id}/alerts?n= for recent deliveries. Send Idempotency-Key on every POST/PATCH.
> Transcripts: switch on the access field (unlocked, locked, premium_pending, not_transcribed, unauthenticated). Honor Retry-After when polling POST /v1/transcriptions jobs. Corrections (POST /v1/videos/{video_id}/corrections; kinds line_edit, speaker_reassign, speaker_identify, add_person, entity_tag, segment_rewrite) cost 0 rows; anchored kinds need revision + anchor.contentHash (djb2 base-36); handle 409 (re-anchor) and 412 (expectedSeq). segment_rewrite replaces an inclusive segment range with new segments (empty replacements array deletes; timestamps repaired server-side).
> Community Review is free (0 rows) and surface-typed: POST /v1/feedback with a type matching the surface you called, the reproducing query, and corrections targeting public IDs (ent_*, men_*, com_*). Nothing auto-applies. Do not send untyped notes.
> Errors: switch on error.code, follow doc_url, quote X-Request-Id to support. Honor Retry-After on 429. Retries of POST/PATCH must reuse the same Idempotency-Key; replays return Idempotency-Replayed: true.
> Teams Admin API: GET /v1/team/members, /v1/team/spend, /v1/team/usage-events (cursor-paginated, 90-day bound) are read-only and require a team-scoped API key created by a team admin; personal keys get 403 team_key_required.

# Submit a YouTube video for transcription

> Paid tiers only. Rows are debited up front (75 rows per 15-minute block, minimum one) and the permanent per-video unlock is granted at submit time, so the transcript GET auto-unlocks when the pipeline finishes. If a PREMIUM transcript already exists the request short-circuits to `complete`; a video with only a preliminary analysis does NOT short-circuit — the premium generation actually runs. An unlock purchased earlier makes this request free (rows_charged 0). An in-flight request for the same video is returned as-is (`existing: true`). Supports the Idempotency-Key header. Responses include `etaSeconds` + `nextPollSeconds` and a Retry-After header while in flight — poll GET /v1/transcriptions/{id} on that cadence. User requests ride a reserved pipeline fast lane. Terminal pipeline failure auto-refunds the rows and revokes the unlock.



## OpenAPI

````yaml /openapi/arcmira-v1.json post /v1/transcriptions
openapi: 3.1.0
info:
  title: Arcmira API
  version: 1.0.0
  contact:
    name: Arcmira
    url: https://arcmira.com
servers:
  - url: https://api.arcmira.com
security: []
paths:
  /v1/transcriptions:
    post:
      tags:
        - Transcriptions
      summary: Submit a YouTube video for transcription
      description: >-
        Paid tiers only. Rows are debited up front (75 rows per 15-minute block,
        minimum one) and the permanent per-video unlock is granted at submit
        time, so the transcript GET auto-unlocks when the pipeline finishes. If
        a PREMIUM transcript already exists the request short-circuits to
        `complete`; a video with only a preliminary analysis does NOT
        short-circuit — the premium generation actually runs. An unlock
        purchased earlier makes this request free (rows_charged 0). An in-flight
        request for the same video is returned as-is (`existing: true`).
        Supports the Idempotency-Key header. Responses include `etaSeconds` +
        `nextPollSeconds` and a Retry-After header while in flight — poll GET
        /v1/transcriptions/{id} on that cadence. User requests ride a reserved
        pipeline fast lane. Terminal pipeline failure auto-refunds the rows and
        revokes the unlock.
      operationId: submit_transcription
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                videoId:
                  type: string
                  pattern: ^[A-Za-z0-9_-]{11}$
                  description: >-
                    YouTube video id (11 characters). Either videoId or url is
                    required.
                url:
                  type: string
                  format: uri
                  description: >-
                    A YouTube watch/short/live URL. Either videoId or url is
                    required.
      responses:
        '200':
          description: >-
            An existing in-flight or already-satisfied request was returned
            (existing: true)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TranscriptionSubmitResponse'
        '201':
          description: Request created; Retry-After header set while in flight
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TranscriptionSubmitResponse'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '401':
          description: Authentication error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '402':
          description: Quota exceeded
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '403':
          description: Permission error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '404':
          description: Not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '422':
          description: Duration unavailable or video too long (12h cap)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
        '500':
          description: Server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      type:
                        type: string
                      code:
                        type: string
                      message:
                        type: string
                      param:
                        type: string
                      doc_url:
                        type: string
                      request_id:
                        type: string
                    required:
                      - type
                      - code
                      - message
                      - doc_url
                      - request_id
                required:
                  - error
      security:
        - bearerAuth: []
        - apiKeyAuth: []
components:
  schemas:
    TranscriptionSubmitResponse:
      type: object
      properties:
        request:
          $ref: '#/components/schemas/TranscriptionRequest'
        existing:
          type: boolean
          description: >-
            True when an in-flight (or already-satisfied) request for the same
            video was returned instead of creating a new one.
        overLimit:
          type: boolean
          description: >-
            Only present (true) when this purchase consumed the rest of the
            included row allocation.
      required:
        - request
    TranscriptionRequest:
      type: object
      properties:
        id:
          type:
            - string
            - 'null'
          description: >-
            Transcription request id (UUID). Null only in the degenerate submit
            response for a video you already own that has no request history.
        videoId:
          type: string
          description: YouTube video id (11 characters).
        status:
          type: string
          enum:
            - queued
            - downloading
            - transcribing
            - analyzing
            - complete
            - failed
            - refunded
          description: >-
            Request status. Values: queued (accepted; audio download not
            started), downloading (fetching the video audio), transcribing
            (premium speech-to-text is running), analyzing (entity/commercial
            analysis is running), complete (premium transcript is servable via
            GET /v1/transcripts/{video_id}), failed (reserved terminal failure
            value; failures currently surface as refunded), refunded (terminal
            failure; the charged rows were returned and the unlock this
            submission bought was revoked).
        stage:
          type:
            - string
            - 'null'
          enum:
            - queued
            - transcribing
            - analyzing
            - null
          description: >-
            User-facing stage: downloading folds into transcribing. Values:
            queued (waiting to start), transcribing (downloading or
            transcribing), analyzing (analysis running). Null for terminal
            statuses.
        quote:
          allOf:
            - $ref: '#/components/schemas/TranscriptQuote'
            - description: >-
                What this request charged: rows and 15-minute blocks. rows is 0
                when a prior unlock made the submission free.
        etaSeconds:
          type: integer
          description: >-
            Estimated SECONDS until completion, re-derived from live pipeline
            telemetry on every poll. Only present while the request is in
            flight.
        nextPollSeconds:
          type: integer
          description: >-
            Recommended SECONDS to sleep before the next poll (also sent as the
            Retry-After header). Only present while the request is in flight.
        error:
          type: string
          description: Failure reason. Only present when status is failed or refunded.
        refunded:
          type: boolean
          description: >-
            True when the charged rows were returned. Only present when status
            is failed or refunded.
        createdAt:
          type: string
          description: When the request was submitted.
        completedAt:
          type: string
          description: When the request reached a terminal status. Absent while in flight.
      required:
        - id
        - videoId
        - status
        - stage
        - quote
        - createdAt
    TranscriptQuote:
      type:
        - object
        - 'null'
      properties:
        quarters:
          type: integer
          description: Number of 15-minute blocks in the video, ceiling'd, minimum 1.
        rows:
          type: integer
          description: 'Total unlock cost in rows: 75 rows per 15-minute block.'
      required:
        - quarters
        - rows
      description: >-
        Unlock cost quote in rows and 15-minute blocks. Null when the video
        duration could not be determined.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: arc_sk_*
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````