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

# Upgrade Individual to Pro

> Moves an Individual subscription to Pro, effective immediately.

- You are charged for Pro straight away.
- The billing period **restarts on the upgrade date** and the renewal date
  moves with it. Upgrading on the 14th means the next charge is the 14th of
  the following month.
- Unused Individual credits carry into the first Pro period. `GET /usage`
  reports the parts separately as `baseCredits` and `carriedCredits`.

Downgrading from Pro to Individual is not supported.

**Retries.** `Idempotency-Key` is required, and a retry after a timeout must
reuse the same key. A retry with a new key can charge twice.




## OpenAPI

````yaml /openapi/zebratruth-v1.yaml post /billing/upgrade
openapi: 3.1.0
info:
  title: ZebraTruth Compliance API
  version: 1.0.0
  description: >
    AI-powered compliance checking for advertising content. Check text and
    images against

    jurisdiction laws, platform policies, and rights clearance requirements.
    Results include

    embeddable annotations mapped to content locations (text spans, video
    timestamps, image regions).
  contact:
    name: ZebraTruth Support
    email: support@zebratruth.ai
    url: https://developers.zebratruth.ai
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://api.zebratruth.ai/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Video Compliance
    description: >
      **Primary endpoint.** Async compliance analysis for video ads. 3-step
      flow:

      get an upload URL, upload the video bytes, submit for analysis. Poll or

      receive an HMAC-signed webhook with the report. Returns timestamped

      findings citing stable evidence IDs (`audio_NNN`, `frame_NNN`, `ocr_NNN`,

      `signal_NNN`). 3-180 second videos. mp4 / webm /

      quicktime. Built for ad agencies and creators.
  - name: Authentication
    description: Validate API keys and check account status
  - name: Compliance
    description: >-
      Run compliance checks on text + image content (sync). For video, use the
      Video Compliance endpoints above.
  - name: Agents
    description: Discover and invoke individual compliance agents
  - name: Jobs
    description: Poll async job status and view execution traces
  - name: Reports
    description: Retrieve and replay compliance reports
  - name: Observability
    description: Request logs and webhook delivery status
  - name: Billing
    description: Subscriptions, plan changes, and credit balance
  - name: Documents
    description: Extract text from PDF and Word documents before or as part of a check
  - name: Check History
    description: List and retrieve past compliance checks for the workspace
  - name: Provenance
    description: Inspect and sign Content Credentials (C2PA) on images and video
  - name: Corpus
    description: >-
      Review queue for proposed changes to the governed legal corpus (dashboard
      session)
  - name: Webhooks
    description: Saved webhook endpoints (dashboard session) and delivery logs
paths:
  /billing/upgrade:
    post:
      tags:
        - Billing
      summary: Upgrade Individual to Pro
      description: >
        Moves an Individual subscription to Pro, effective immediately.


        - You are charged for Pro straight away.

        - The billing period **restarts on the upgrade date** and the renewal
        date
          moves with it. Upgrading on the 14th means the next charge is the 14th of
          the following month.
        - Unused Individual credits carry into the first Pro period. `GET
        /usage`
          reports the parts separately as `baseCredits` and `carriedCredits`.

        Downgrading from Pro to Individual is not supported.


        **Retries.** `Idempotency-Key` is required, and a retry after a timeout
        must

        reuse the same key. A retry with a new key can charge twice.
      operationId: upgradeToPro
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      responses:
        '200':
          description: Upgrade applied
          content:
            application/json:
              schema:
                type: object
                properties:
                  tier:
                    type: string
                    enum:
                      - pro
                  periodKey:
                    type: string
                  currentPeriodStart:
                    type: string
                    format: date-time
                  currentPeriodEnd:
                    type: string
                    format: date-time
                  baseCredits:
                    type: number
                    example: 83250
                  carriedCredits:
                    type: number
                    example: 1200
                  creditsCap:
                    type: number
                    example: 84450
                  creditsRemaining:
                    type: number
        '400':
          description: >-
            `idempotency_key_required` — the `Idempotency-Key` header is
            missing.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '409':
          description: >
            Not upgradeable. `already_pro` when the account is on Pro,

            `not_upgradeable` when it is not on Individual, or

            `subscription_not_upgradeable` when the subscription is canceled or
            locked.
        '500':
          description: >
            `carry_credit_failed` — the plan change succeeded with the payment
            provider but the carried

            credits could not be applied. Retry with the **same**
            `Idempotency-Key`;

            the grant is applied at most once.
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      schema:
        type: string
        format: uuid
      description: >
        Unique request identifier to prevent duplicate execution and
        double-charging.

        Generate a new UUID for each distinct request. Reuse the same key to
        safely retry.
  responses:
    Unauthorized:
      description: |
        Invalid, missing, or expired API key. Standard error envelope —
        read `message` for the human-readable reason.
      content:
        application/json:
          schema:
            type: object
            description: Standard error envelope.
            required:
              - statusCode
              - message
            properties:
              error:
                type: boolean
                example: true
              url:
                type: string
                format: uri
                example: https://api.zebratruth.ai/v1/whoami
              statusCode:
                type: integer
                example: 401
              statusMessage:
                type: string
                example: Invalid API key
              message:
                type: string
                description: Canonical human-readable reason — pattern-match on this field.
                example: Invalid API key
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        API key starting with `zt_live_` (production) or `zt_test_` (sandbox).
        Get your key at https://developers.zebratruth.ai

````

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