openapi: 3.1.0
info:
  title: LumaTrack API
  version: '1.0'
  description: '

    Report automation run events and read portfolio value numbers.


    **Authentication.** Every request carries an organization-scoped bearer key

    (Settings, API keys in the app): `Authorization: Bearer lmt_...`. Keys are

    shown once at creation; only a hash is stored.


    **Held, not dropped.** Ingestion over your plan''s monthly event cap is

    accepted with `202` and stored with `held: true`. Held runs are excluded

    from value math until you upgrade or the month resets, and are never

    deleted. Past 3x the cap, requests are refused with `429` and a durable

    record is kept. Nothing is ever silently dropped.


    **Rate limits.** Requests are counted per organization, across all its keys

    and API surfaces: Free 60, Team & MSP 300, Business 1,000 requests/minute

    (custom ceilings on Enterprise). Over the limit, requests receive `429` with

    a `Retry-After` header giving seconds until the minute window resets. A

    rate-limit `429` always carries `Retry-After`; the monthly-cap `429` above

    never does.


    **Idempotency.** Pass `external_id` (your system''s run id) and replays

    return the original run with `deduplicated: true` instead of creating a

    duplicate.


    **JSON or XML.** The `Accept` header sets the response format

    (`application/json` or `application/xml`) and always wins. With no `Accept`

    (or `*/*`), the response mirrors your request `Content-Type`, so an XML body

    gets an XML reply. JSON is the default otherwise.

    '
paths:
  /api/v1/runs:
    post:
      operationId: core_api_ingest_run
      summary: Record one automation run
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunResult'
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunResult'
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'One HTTP call per execution, from any tool that can speak HTTP.
        Report failures too: they cost money and save nothing, and the ledger prices
        that honestly. 200 = replay deduplicated by external_id; 201 = recorded; 202
        = recorded but held over the plan cap.'
      security:
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - automation
              properties:
                automation:
                  type: string
                  description: Slug of the automation (see GET /api/v1/automations).
                  example: os-patching
                status:
                  type: string
                  enum:
                  - success
                  - failure
                  default: success
                executed_at:
                  type: string
                  format: date-time
                  description: ISO 8601. Defaults to now; naive datetimes are treated
                    as UTC.
                duration_seconds:
                  type: integer
                  minimum: 0
                source:
                  type: string
                  maxLength: 100
                  description: Reporting system, e.g. ansible, n8n, github-actions.
                failure_reason:
                  type: string
                  maxLength: 200
                  description: Root cause for a failed run, e.g. 'auth/credential'.
                    Powers the failure-reason Pareto on the automation page.
                external_id:
                  type: string
                  maxLength: 200
                  description: Your system's run id; makes ingestion idempotent.
                metadata:
                  type: object
                  description: Arbitrary JSON kept with the run.
                ai:
                  type: object
                  description: AI token usage; LumaTrack computes the dollar cost
                    server-side from its model price table (see the AI workloads guide).
                  properties:
                    model:
                      type: string
                      example: claude-sonnet-5
                    input_tokens:
                      type: integer
                      minimum: 0
                      description: Non-cached input tokens.
                    output_tokens:
                      type: integer
                      minimum: 0
                    cached_tokens:
                      type: integer
                      minimum: 0
                      description: Cache-read tokens.
                    cost:
                      type: string
                      description: Optional decimal override of the computed cost.
                usage:
                  type: object
                  description: 'Actual metered consumption per per-unit cost component,
                    by component name, e.g. {"tokens": 1840}. Overrides the component''s
                    units_per_run default for this run only.'
            examples:
              minimal:
                value:
                  automation: os-patching
              full:
                value:
                  automation: os-patching
                  status: success
                  executed_at: '2026-06-11T14:30:00Z'
                  duration_seconds: 142
                  source: ansible
                  external_id: tower-job-99412
                  metadata:
                    hosts: 240
    get:
      operationId: core_api_list_runs
      summary: List runs
      parameters:
      - in: query
        name: automation
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Automation
        required: false
      - in: query
        name: status
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Status
        required: false
      - in: query
        name: since
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Since
        required: false
      - in: query
        name: before
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Before
        required: false
      - in: query
        name: limit
        schema:
          default: 100
          title: Limit
          type: integer
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunList'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'Newest first. Filters: automation (slug), status, since (ISO 8601),
        limit (default 100, max 500). Cursor pagination: pass before=<id of the last
        run you received> (a run_... id) to fetch the next page. Held runs are included
        and flagged; metadata is returned.'
      security:
      - FullKeyAuth: []
  /api/v1/automations:
    get:
      operationId: core_api_list_automations
      summary: List your automations and their slugs
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutomationList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Slugs are the stable identifiers the ingest endpoint expects.
      security:
      - ApiKeyAuth: []
    post:
      operationId: core_api_create_automation
      summary: Create an automation
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutomationResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Defaults to candidate status (a manual task with a baseline, projecting
        ROI). Set status=active once it runs for real. Plan limits apply exactly as
        in the UI.
      security:
      - FullKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  type: string
                description:
                  type: string
                status:
                  type: string
                  enum:
                  - candidate
                  - active
                  - paused
                  - retired
                  default: candidate
                workspace_id:
                  type: integer
                role_id:
                  type: integer
                  nullable: true
                activated_at:
                  type: string
                  format: date
                manual_minutes:
                  type: number
                oversight_minutes:
                  type: number
                hourly_rate:
                  type: number
                  nullable: true
                expected_runs_per_month:
                  type: number
                build_cost:
                  type: number
                monthly_cost:
                  type: number
                run_cost:
                  type: number
  /api/v1/summary:
    get:
      operationId: core_api_summary
      summary: Portfolio value summary
      parameters:
      - in: query
        name: workspace
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Workspace
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SummaryOut'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: The organization's realized numbers, computed exactly as the dashboard
        computes them. Held runs are excluded.
      security:
      - FullKeyAuth: []
  /api/v1/workspaces:
    get:
      operationId: core_api_list_workspaces
      summary: List workspaces
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkspaceList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'Workspaces segment value inside one organization: teams, departments,
        projects. MSPs: client companies are separate managed organizations (see /msp/clients),
        each with its own workspaces.'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_workspace
      summary: Create a workspace
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkspaceOut'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkspaceIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}:
    get:
      operationId: core_api_automation_detail
      summary: Automation detail
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutomationResult'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    patch:
      operationId: core_api_automation_update
      summary: Update an automation
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutomationResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Partial update; send only the fields you are changing.
      security:
      - FullKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                description:
                  type: string
                status:
                  type: string
                  enum:
                  - candidate
                  - active
                  - paused
                  - retired
                savings_class:
                  type: string
                  enum:
                  - hard
                  - cost_avoidance
                  - productivity
                evidence_grade:
                  type: string
                  enum:
                  - measured
                  - sampled
                  - declared
                workspace_id:
                  type: integer
                role_id:
                  type: integer
                  nullable: true
                activated_at:
                  type: string
                  format: date
                manual_minutes:
                  type: number
                oversight_minutes:
                  type: number
                hourly_rate:
                  type: number
                  nullable: true
                expected_runs_per_month:
                  type: number
                build_cost:
                  type: number
                monthly_cost:
                  type: number
                run_cost:
                  type: number
  /api/v1/extracts/ledger:
    get:
      operationId: core_api_extract_ledger
      summary: Extract ledger rows (warehouse sync)
      parameters:
      - in: query
        name: after
        schema:
          default: ''
          title: After
          type: string
        required: false
      - in: query
        name: updated_since
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Updated Since
        required: false
      - in: query
        name: limit
        schema:
          default: 1000
          title: Limit
          type: integer
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                additionalProperties: true
                title: Response
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'Business+. Every ledger row for your organization, in stable order.
        Cursor: pass after=<the next_after token you received> until next_after is
        null; treat it as opaque. Incremental: updated_since (ISO 8601) returns only
        rows recomputed since that watermark. Amounts are decimal strings.'
      security:
      - FullKeyAuth: []
  /api/v1/extracts/adjustments:
    get:
      operationId: core_api_extract_adjustments
      summary: Extract closed-period adjustments (warehouse sync)
      parameters:
      - in: query
        name: after
        schema:
          default: ''
          title: After
          type: string
        required: false
      - in: query
        name: updated_since
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Updated Since
        required: false
      - in: query
        name: limit
        schema:
          default: 1000
          title: Limit
          type: integer
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                additionalProperties: true
                title: Response
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Business+. Every prior-period adjustment, in stable order, so a
        warehouse can rebuild as-restated = ledger + adjustments. Same cursor and
        updated_since semantics as /extracts/ledger.
      security:
      - FullKeyAuth: []
  /api/v1/msp/clients:
    get:
      operationId: core_api_msp_clients
      summary: List managed client organizations (MSP plan)
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_msp_client_create
      summary: Create a managed client organization (MSP plan)
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientOut'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkspaceIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/msp/clients/{client_id}/api-keys:
    post:
      operationId: core_api_msp_client_key
      summary: Mint an API key for a managed client (MSP plan)
      parameters:
      - in: path
        name: client_id
        schema:
          title: Client Id
          type: string
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientKeyResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'The recorded exception to the no-key-minting rule: MSPs onboarding
        many clients need scripted per-client keys, and the key minted here belongs
        to the CLIENT organization (default scope ingest-only). Shown once, like every
        key.'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClientKeyIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/msp/clients/{client_id}/summary:
    get:
      operationId: core_api_msp_client_summary
      summary: One managed client's value summary (MSP plan)
      parameters:
      - in: path
        name: client_id
        schema:
          title: Client Id
          type: string
        required: true
      - in: query
        name: since
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Since
        required: false
      - in: query
        name: until
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Until
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SummaryOut'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: The same numbers the client's own dashboard shows, readable with
        the MSP home key so cross-client rollups are scriptable.
      security:
      - FullKeyAuth: []
  /api/v1/report-links:
    get:
      operationId: core_api_list_report_links
      summary: List shareable report links
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportLinkList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_report_link
      summary: Create a shareable report link
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportLinkResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Scoped to one workspace (workspace_id) or the whole organization.
        The returned URL renders a standalone, print-ready value report with no login.
        Revoke it to kill the URL.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReportLinkIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/report-links/{link_id}/revoke:
    post:
      operationId: core_api_revoke_report_link
      summary: Revoke a report link
      parameters:
      - in: path
        name: link_id
        schema:
          title: Link Id
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportLinkResult'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: The URL returns 404 immediately. Revocation is the kill switch
        for shared reports, which is why it is exposed here despite the no-DELETE
        rule.
      security:
      - FullKeyAuth: []
  /api/v1/webhooks:
    get:
      operationId: core_api_list_webhooks
      summary: List webhook endpoints
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_webhook
      summary: Register a webhook endpoint
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: LumaTrack POSTs subscribed events to this URL, each signed with
        the returned secret (HMAC-SHA256, hex, in the X-LumaTrack-Signature header
        over the raw JSON body). Pass an empty 'events' list to receive every event
        type. The secret is returned here; store it to verify deliveries.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/webhooks/{webhook_id}:
    delete:
      operationId: core_api_delete_webhook
      summary: Delete a webhook endpoint
      parameters:
      - in: path
        name: webhook_id
        schema:
          title: Webhook Id
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookResult'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Stops all future deliveries to this endpoint. Exposed despite the
        no-DELETE rule because an integrator must be able to retire a stale or compromised
        endpoint.
      security:
      - FullKeyAuth: []
  /api/v1/periods:
    get:
      operationId: core_api_list_periods
      summary: List closed (frozen) months
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PeriodList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Months past the close lag freeze automatically; frozen months accept
        no new run events. Newest first.
      security:
      - FullKeyAuth: []
  /api/v1/analytics:
    get:
      operationId: core_api_analytics_series
      summary: Chart-ready analytics series
      parameters:
      - in: query
        name: chart
        schema:
          title: Chart
          type: string
        required: true
      - in: query
        name: months
        schema:
          default: 12
          title: Months
          type: integer
        required: false
      - in: query
        name: workspace
        schema:
          default: ''
          title: Workspace
          type: string
        required: false
      - in: query
        name: automation
        schema:
          default: ''
          title: Automation
          type: string
        required: false
      - in: query
        name: from
        schema:
          default: ''
          title: From
          type: string
        required: false
      - in: query
        name: to
        schema:
          default: ''
          title: To
          type: string
        required: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                additionalProperties: true
                title: Response
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'The same series the in-app analytics page draws. chart is one
        of: monthly_value, cumulative_value, projected_vs_realized, reliability, volume_by_workspace,
        workspace_totals, run_heatmap, value_by_class. Filters: workspace (id), automation
        (slug), from/to (ISO dates), months (1 to 36). Held and future-dated runs
        never count; months without runs are null in rate series.'
      security:
      - FullKeyAuth: []
  /api/v1/roles:
    get:
      operationId: core_api_list_roles
      summary: List job roles and their loaded rates
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoleList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Loaded rate = base wage x multiplier. Seeded defaults cite BLS
        OEWS medians; every value is overridable.
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_role
      summary: Create a job role
      parameters: []
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoleResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RoleIn'
        required: true
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}/cost-components:
    get:
      operationId: core_api_list_components
      summary: List an automation's cost components
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_component
      summary: Add a cost component
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'Kinds: one_time (full amount, cash view), recurring (amount per
        month), amortized (amount straight-lined over amortize_months), per_run (amount
        per run, failures included), per_unit (amount x units_per_run per run, e.g.
        token costs).'
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}/baseline-steps:
    get:
      operationId: core_api_list_baseline_steps
      summary: List an automation's baseline steps
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaselineStepList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_baseline_step
      summary: Add a baseline step
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BaselineStepResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Decompose the manual process into steps, each on its own role (by
        name) at its own rate, each with an occurrence_pct (0-100) for steps that
        do not happen every time. An automation with steps values off them instead
        of its single manual_minutes field.
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}/oversight-steps:
    get:
      operationId: core_api_list_oversight_steps
      summary: List an automation's oversight steps
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OversightStepList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_oversight_step
      summary: Add an oversight step
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OversightStepResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Human time still spent per automated run (review, approvals, exception
        handling), decomposed by role and occurrence exactly like a baseline step.
        With oversight steps the automation values oversight off them instead of its
        single oversight_minutes field.
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}/value-streams:
    get:
      operationId: core_api_list_value_streams
      summary: List an automation's value streams
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValueStreamList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - FullKeyAuth: []
    post:
      operationId: core_api_create_value_stream
      summary: Add a value stream
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValueStreamResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Value beyond labor (deflected tickets, avoided downtime, SLA penalties
        dodged, ...), reported in its own savings_class lane. Each type computes a
        monthly dollar value from typed params, discounted by realization_factor (0-1).
        See Concepts for the per-type params.
      security:
      - FullKeyAuth: []
  /api/v1/automations/{slug}/projection-versions:
    get:
      operationId: core_api_list_projection_versions
      summary: List an automation's frozen forecast history
      parameters:
      - in: path
        name: slug
        schema:
          title: Slug
          type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectionVersionList'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: Each ProjectionVersion is a frozen expected_runs_per_month forecast;
        changing the forecast supersedes it with a newer row. Variance is measured
        against the version in force when a period started, so projections never rewrite
        themselves.
      security:
      - FullKeyAuth: []
  /api/v1/runs/backfill:
    post:
      operationId: core_api_backfill_runs
      summary: Bulk-import historical runs (CSV or JSONL)
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BackfillResult'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      description: 'Rows carry backfilled provenance and require executed_at. Frozen
        months refuse rows like live ingest; rows beyond the plan''s retention window
        are refused; external_id replays dedupe; per-month plan caps hold overage
        (held, never dropped). Row errors never abort the rest of the file. Template:
        GET /automations/import/template.csv.'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BackfillIn'
        required: true
      security:
      - FullKeyAuth: []
components:
  schemas:
    AICostOut:
      properties:
        model:
          title: Model
          type: string
        input_tokens:
          title: Input Tokens
          type: integer
        output_tokens:
          title: Output Tokens
          type: integer
        cached_tokens:
          title: Cached Tokens
          type: integer
        cost:
          title: Cost
          type: string
        list_cost:
          title: List Cost
          type: string
        billing:
          title: Billing
          type: string
        priced:
          title: Priced
          type: boolean
        price_version:
          title: Price Version
          type: string
      required:
      - model
      - input_tokens
      - output_tokens
      - cached_tokens
      - cost
      - list_cost
      - billing
      - priced
      - price_version
      title: AICostOut
      type: object
    RunOut:
      properties:
        id:
          title: Id
          type: string
        ai:
          anyOf:
          - $ref: '#/components/schemas/AICostOut'
          - type: 'null'
        automation:
          title: Automation
          type: string
        status:
          title: Status
          type: string
        held:
          title: Held
          type: boolean
        executed_at:
          title: Executed At
          type: string
        duration_seconds:
          anyOf:
          - type: integer
          - type: 'null'
          title: Duration Seconds
        source:
          title: Source
          type: string
        failure_reason:
          default: ''
          title: Failure Reason
          type: string
        external_id:
          anyOf:
          - type: string
          - type: 'null'
          title: External Id
        metadata:
          additionalProperties: true
          default: {}
          title: Metadata
          type: object
      required:
      - id
      - automation
      - status
      - held
      - executed_at
      - source
      title: RunOut
      type: object
    RunResult:
      properties:
        run:
          $ref: '#/components/schemas/RunOut'
        deduplicated:
          title: Deduplicated
          type: boolean
        warning:
          anyOf:
          - type: string
          - type: 'null'
          title: Warning
      required:
      - run
      - deduplicated
      title: RunResult
      type: object
    Error:
      properties:
        error:
          title: Error
          type: string
      required:
      - error
      title: Error
      type: object
    RunList:
      properties:
        runs:
          items:
            $ref: '#/components/schemas/RunOut'
          title: Runs
          type: array
        has_more:
          default: false
          title: Has More
          type: boolean
      required:
      - runs
      title: RunList
      type: object
    AutomationList:
      properties:
        automations:
          items:
            $ref: '#/components/schemas/AutomationOut'
          title: Automations
          type: array
      required:
      - automations
      title: AutomationList
      type: object
    AutomationOut:
      properties:
        slug:
          title: Slug
          type: string
        name:
          title: Name
          type: string
        status:
          title: Status
          type: string
        category:
          anyOf:
          - type: string
          - type: 'null'
          title: Category
      required:
      - slug
      - name
      - status
      title: AutomationOut
      type: object
    AutomationDetail:
      properties:
        slug:
          title: Slug
          type: string
        name:
          title: Name
          type: string
        status:
          title: Status
          type: string
        savings_class:
          title: Savings Class
          type: string
        evidence_grade:
          title: Evidence Grade
          type: string
        workspace_id:
          title: Workspace Id
          type: string
        description:
          title: Description
          type: string
        manual_minutes:
          title: Manual Minutes
          type: number
        oversight_minutes:
          title: Oversight Minutes
          type: number
        hourly_rate:
          anyOf:
          - type: number
          - type: 'null'
          title: Hourly Rate
        expected_runs_per_month:
          title: Expected Runs Per Month
          type: number
        build_cost:
          title: Build Cost
          type: number
        monthly_cost:
          title: Monthly Cost
          type: number
        run_cost:
          title: Run Cost
          type: number
        activated_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Activated At
      required:
      - slug
      - name
      - status
      - savings_class
      - evidence_grade
      - workspace_id
      - description
      - manual_minutes
      - oversight_minutes
      - expected_runs_per_month
      - build_cost
      - monthly_cost
      - run_cost
      title: AutomationDetail
      type: object
    AutomationResult:
      properties:
        automation:
          $ref: '#/components/schemas/AutomationDetail'
      required:
      - automation
      title: AutomationResult
      type: object
    SummaryOut:
      properties:
        organization:
          title: Organization
          type: string
        hours_saved:
          title: Hours Saved
          type: number
        gross_savings:
          title: Gross Savings
          type: number
        total_cost:
          title: Total Cost
          type: number
        net_savings:
          title: Net Savings
          type: number
        roi_pct:
          anyOf:
          - type: number
          - type: 'null'
          title: Roi Pct
        total_runs:
          title: Total Runs
          type: integer
        runs_last_30d:
          title: Runs Last 30D
          type: integer
        active_automations:
          title: Active Automations
          type: integer
        candidates:
          title: Candidates
          type: integer
        candidate_projected_annual_net:
          title: Candidate Projected Annual Net
          type: number
        fte_years:
          title: Fte Years
          type: number
        cost_per_completed_run:
          anyOf:
          - type: number
          - type: 'null'
          title: Cost Per Completed Run
        productivity_conservatism:
          title: Productivity Conservatism
          type: number
      required:
      - organization
      - hours_saved
      - gross_savings
      - total_cost
      - net_savings
      - total_runs
      - runs_last_30d
      - active_automations
      - candidates
      - candidate_projected_annual_net
      - fte_years
      - productivity_conservatism
      title: SummaryOut
      type: object
    WorkspaceList:
      properties:
        workspaces:
          items:
            $ref: '#/components/schemas/WorkspaceOut'
          title: Workspaces
          type: array
      required:
      - workspaces
      title: WorkspaceList
      type: object
    WorkspaceOut:
      properties:
        id:
          title: Id
          type: string
        name:
          title: Name
          type: string
        is_default:
          title: Is Default
          type: boolean
      required:
      - id
      - name
      - is_default
      title: WorkspaceOut
      type: object
    WorkspaceIn:
      properties:
        name:
          title: Name
          type: string
      required:
      - name
      title: WorkspaceIn
      type: object
    ClientList:
      properties:
        clients:
          items:
            $ref: '#/components/schemas/ClientOut'
          title: Clients
          type: array
      required:
      - clients
      title: ClientList
      type: object
    ClientOut:
      properties:
        id:
          title: Id
          type: string
        name:
          title: Name
          type: string
        plan:
          title: Plan
          type: string
      required:
      - id
      - name
      - plan
      title: ClientOut
      type: object
    ClientKeyOut:
      properties:
        key:
          title: Key
          type: string
        prefix:
          title: Prefix
          type: string
        name:
          title: Name
          type: string
        scope:
          title: Scope
          type: string
        organization_id:
          title: Organization Id
          type: string
      required:
      - key
      - prefix
      - name
      - scope
      - organization_id
      title: ClientKeyOut
      type: object
    ClientKeyResult:
      properties:
        api_key:
          $ref: '#/components/schemas/ClientKeyOut'
      required:
      - api_key
      title: ClientKeyResult
      type: object
    ClientKeyIn:
      properties:
        name:
          title: Name
          type: string
        scope:
          default: ingest
          title: Scope
          type: string
      required:
      - name
      title: ClientKeyIn
      type: object
    ReportLinkList:
      properties:
        report_links:
          items:
            $ref: '#/components/schemas/ReportLinkOut'
          title: Report Links
          type: array
      required:
      - report_links
      title: ReportLinkList
      type: object
    ReportLinkOut:
      properties:
        id:
          title: Id
          type: string
        token:
          title: Token
          type: string
        url:
          title: Url
          type: string
        workspace_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Workspace Id
        active:
          title: Active
          type: boolean
        expires_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Expires At
        last_viewed_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Last Viewed At
        view_count:
          title: View Count
          type: integer
      required:
      - id
      - token
      - url
      - active
      - view_count
      title: ReportLinkOut
      type: object
    ReportLinkResult:
      properties:
        report_link:
          $ref: '#/components/schemas/ReportLinkOut'
      required:
      - report_link
      title: ReportLinkResult
      type: object
    ReportLinkIn:
      properties:
        workspace_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Workspace Id
        expires_in_days:
          anyOf:
          - type: integer
          - type: 'null'
          title: Expires In Days
      title: ReportLinkIn
      type: object
    WebhookList:
      properties:
        webhooks:
          items:
            $ref: '#/components/schemas/WebhookOut'
          title: Webhooks
          type: array
      required:
      - webhooks
      title: WebhookList
      type: object
    WebhookOut:
      properties:
        id:
          title: Id
          type: string
        url:
          title: Url
          type: string
        events:
          items:
            type: string
          title: Events
          type: array
        content_type:
          title: Content Type
          type: string
        is_active:
          title: Is Active
          type: boolean
        secret:
          title: Secret
          type: string
      required:
      - id
      - url
      - events
      - content_type
      - is_active
      - secret
      title: WebhookOut
      type: object
    WebhookResult:
      properties:
        webhook:
          $ref: '#/components/schemas/WebhookOut'
      required:
      - webhook
      title: WebhookResult
      type: object
    WebhookIn:
      properties:
        url:
          title: Url
          type: string
        events:
          default: []
          items:
            type: string
          title: Events
          type: array
        content_type:
          default: json
          title: Content Type
          type: string
      required:
      - url
      title: WebhookIn
      type: object
    PeriodList:
      properties:
        periods:
          items:
            $ref: '#/components/schemas/PeriodOut'
          title: Periods
          type: array
      required:
      - periods
      title: PeriodList
      type: object
    PeriodOut:
      properties:
        period:
          title: Period
          type: string
        closed_at:
          title: Closed At
          type: string
      required:
      - period
      - closed_at
      title: PeriodOut
      type: object
    RoleList:
      properties:
        roles:
          items:
            $ref: '#/components/schemas/RoleOut'
          title: Roles
          type: array
      required:
      - roles
      title: RoleList
      type: object
    RoleOut:
      properties:
        id:
          title: Id
          type: string
        name:
          title: Name
          type: string
        base_hourly:
          title: Base Hourly
          type: number
        loaded_multiplier:
          title: Loaded Multiplier
          type: number
        loaded_hourly:
          title: Loaded Hourly
          type: number
        source:
          title: Source
          type: string
      required:
      - id
      - name
      - base_hourly
      - loaded_multiplier
      - loaded_hourly
      - source
      title: RoleOut
      type: object
    RoleResult:
      properties:
        role:
          $ref: '#/components/schemas/RoleOut'
      required:
      - role
      title: RoleResult
      type: object
    RoleIn:
      properties:
        name:
          title: Name
          type: string
        base_hourly:
          title: Base Hourly
          type: number
        loaded_multiplier:
          default: 1.43
          title: Loaded Multiplier
          type: number
      required:
      - name
      - base_hourly
      title: RoleIn
      type: object
    ComponentList:
      properties:
        cost_components:
          items:
            $ref: '#/components/schemas/ComponentOut'
          title: Cost Components
          type: array
      required:
      - cost_components
      title: ComponentList
      type: object
    ComponentOut:
      properties:
        id:
          title: Id
          type: string
        name:
          title: Name
          type: string
        kind:
          title: Kind
          type: string
        amount:
          title: Amount
          type: number
        amortize_months:
          anyOf:
          - type: integer
          - type: 'null'
          title: Amortize Months
        units_per_run:
          title: Units Per Run
          type: number
      required:
      - id
      - name
      - kind
      - amount
      - units_per_run
      title: ComponentOut
      type: object
    ComponentResult:
      properties:
        cost_component:
          $ref: '#/components/schemas/ComponentOut'
      required:
      - cost_component
      title: ComponentResult
      type: object
    BaselineStepList:
      properties:
        baseline_steps:
          items:
            $ref: '#/components/schemas/BaselineStepOut'
          title: Baseline Steps
          type: array
      required:
      - baseline_steps
      title: BaselineStepList
      type: object
    BaselineStepOut:
      properties:
        id:
          title: Id
          type: string
        order:
          title: Order
          type: integer
        label:
          title: Label
          type: string
        minutes:
          title: Minutes
          type: number
        occurrence_pct:
          title: Occurrence Pct
          type: number
        role:
          anyOf:
          - type: string
          - type: 'null'
          title: Role
      required:
      - id
      - order
      - label
      - minutes
      - occurrence_pct
      title: BaselineStepOut
      type: object
    BaselineStepResult:
      properties:
        baseline_step:
          $ref: '#/components/schemas/BaselineStepOut'
      required:
      - baseline_step
      title: BaselineStepResult
      type: object
    OversightStepList:
      properties:
        oversight_steps:
          items:
            $ref: '#/components/schemas/BaselineStepOut'
          title: Oversight Steps
          type: array
      required:
      - oversight_steps
      title: OversightStepList
      type: object
    OversightStepResult:
      properties:
        oversight_step:
          $ref: '#/components/schemas/BaselineStepOut'
      required:
      - oversight_step
      title: OversightStepResult
      type: object
    ValueStreamList:
      properties:
        value_streams:
          items:
            $ref: '#/components/schemas/ValueStreamOut'
          title: Value Streams
          type: array
      required:
      - value_streams
      title: ValueStreamList
      type: object
    ValueStreamOut:
      properties:
        id:
          title: Id
          type: string
        type:
          title: Type
          type: string
        savings_class:
          title: Savings Class
          type: string
        realization_factor:
          title: Realization Factor
          type: number
        monthly_value:
          title: Monthly Value
          type: number
        params:
          additionalProperties: true
          title: Params
          type: object
      required:
      - id
      - type
      - savings_class
      - realization_factor
      - monthly_value
      - params
      title: ValueStreamOut
      type: object
    ValueStreamResult:
      properties:
        value_stream:
          $ref: '#/components/schemas/ValueStreamOut'
      required:
      - value_stream
      title: ValueStreamResult
      type: object
    ProjectionVersionList:
      properties:
        projection_versions:
          items:
            $ref: '#/components/schemas/ProjectionVersionOut'
          title: Projection Versions
          type: array
      required:
      - projection_versions
      title: ProjectionVersionList
      type: object
    ProjectionVersionOut:
      properties:
        id:
          title: Id
          type: string
        expected_runs_per_month:
          title: Expected Runs Per Month
          type: number
        assumption_fingerprint:
          title: Assumption Fingerprint
          type: string
        effective_from:
          title: Effective From
          type: string
        created_at:
          title: Created At
          type: string
      required:
      - id
      - expected_runs_per_month
      - assumption_fingerprint
      - effective_from
      - created_at
      title: ProjectionVersionOut
      type: object
    BackfillResult:
      properties:
        processed:
          title: Processed
          type: integer
        created:
          title: Created
          type: integer
        deduplicated:
          title: Deduplicated
          type: integer
        held:
          title: Held
          type: integer
        errors:
          items:
            $ref: '#/components/schemas/BackfillRowError'
          title: Errors
          type: array
      required:
      - processed
      - created
      - deduplicated
      - held
      - errors
      title: BackfillResult
      type: object
    BackfillRowError:
      properties:
        line:
          title: Line
          type: integer
        error:
          title: Error
          type: string
      required:
      - line
      - error
      title: BackfillRowError
      type: object
    BackfillIn:
      properties:
        format:
          default: csv
          title: Format
          type: string
        data:
          title: Data
          type: string
      required:
      - data
      title: BackfillIn
      type: object
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
    FullKeyAuth:
      type: http
      scheme: bearer
servers: []
