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

# Create, renew or regenerate an SDK licence

> Requires explicit sdk:{sdk}:write and confirmed paid entitlement. Production and staging share quota. One stable licence covers all installations. Repeated attribution returns the stored proof. Renewals allocate slots in request order. Cancellation preserves rights until paid expiry. Paid upgrades increase quota without resetting consumption.



## OpenAPI

````yaml /openapi.yaml post /v1/sdk-licenses/{sdk}
openapi: 3.1.0
info:
  title: CarHub API
  version: '2026-10-04'
  summary: >-
    Automotive AI as a service — 23 inference endpoints, one asynchronous
    contract.
  description: >
    CarHub exposes automotive computer-vision and pricing models as plain HTTP
    endpoints.

    Every model is priced and rate-limited on its own — nothing requires
    adopting the rest.


    ## Two API surfaces


    | Surface | Prefix | Authentication |

    |---|---|---|

    | Inference (the product) | `/v1/…` | API key — `Authorization: Bearer
    chk_live_…` / `chk_stg_…` / `chk_test_…` |

    | Management (the dashboard) | `/mgmt/v1/…` | Short-lived JWT —
    `Authorization: Bearer <jwt>` |


    ## Everything is a job


    Every inference endpoint is `POST` and **asynchronous by default**: it
    answers `202` with a

    [`Job`](#/components/schemas/Job) in status `queued`. Collect the result by
    polling

    `GET /v1/jobs/{id}` or by subscribing to `job.succeeded`, `job.partial`, and
    `job.failed` webhooks.


    Fast endpoints additionally accept `?wait=true`, which holds the connection
    until the job

    settles (30 s ceiling) and answers `200` with the same `Job` object in
    status `succeeded`.

    Video, 360 and bundle endpoints reject `wait` with `400 wait_not_supported`
    — their work

    outlives any reasonable request timeout.


    ## Inputs


    Every endpoint accepts two request encodings for the same operation:


    * `multipart/form-data` — the binary directly in the request (`image`,
    `audio`, `video` or
      `images[]` depending on the endpoint). Simplest path, capped at 10 MB per file.
    * `application/json` — `{"input_ref": "upl_…"}` (or `input_refs` for
    multi-asset endpoints)
      referencing an upload created through `POST /v1/uploads`. Required for videos and batches.

    Endpoint parameters are identical in both encodings.


    ## Idempotency


    Send `Idempotency-Key` on any `POST`. A replayed key returns the original
    response and never

    bills twice; reusing a key with a different payload is a `409
    idempotency_key_reuse`.


    ## Test mode


    Keys prefixed `chk_test_` run the entire pipeline — auth, rate limiting, job
    lifecycle,

    ledger, signed webhooks — against a fixture backend instead of a GPU. Test
    jobs carry

    `livemode: false` and draw on a separate, freely rechargeable test credit
    balance.

    Drive the fixture backend per request with `X-Carhub-Test-Scenario`.
  termsOfService: https://trycarhub.com/terms
  contact:
    name: CarHub API support
    url: https://docs.trycarhub.com
    email: api@trycarhub.com
  license:
    name: Proprietary
    identifier: LicenseRef-CarHub-Commercial
servers:
  - url: https://api.trycarhub.com
    description: Production (EU)
security:
  - ApiKeyAuth: []
tags:
  - name: A — Understand the vehicle
    description: >-
      Identity, attributes and a clean capture — everything downstream reads
      from here.
  - name: B — Damage & condition
    description: Find it, then grade it, so your own rules can act on the result.
  - name: C — Parts
    description: >-
      Turns "there is damage" into "there is damage on this component" — what
      makes every downstream estimate defensible.
  - name: D — Money
    description: Valuation and repair cost, computed from what was actually observed.
  - name: E — Image production
    description: >-
      Exposed as raw infrastructure, not a batch retouching service. Call it per
      asset, in your own pipeline.
  - name: Jobs
    description: Status, results and history of asynchronous work.
  - name: Uploads
    description: Presigned storage for videos and batches.
  - name: Management
    description: >-
      Organisation, API keys, usage, billing and outgoing webhooks. JWT
      authenticated.
  - name: Internal
    description: Inbound callbacks from the inference plane. Never called by customers.
externalDocs:
  description: CarHub developer documentation
  url: https://docs.trycarhub.com
paths:
  /v1/sdk-licenses/{sdk}:
    parameters:
      - name: sdk
        in: path
        required: true
        schema:
          type: string
          enum:
            - player
            - capture
            - review
            - report
    post:
      summary: Create, renew or regenerate an SDK licence
      description: >-
        Requires explicit sdk:{sdk}:write and confirmed paid entitlement.
        Production and staging share quota. One stable licence covers all
        installations. Repeated attribution returns the stored proof. Renewals
        allocate slots in request order. Cancellation preserves rights until
        paid expiry. Paid upgrades increase quota without resetting consumption.
      operationId: issueSDKLicense
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                regenerate:
                  type: boolean
                  default: false
                  description: >-
                    Sign a current paid-period licence again without extending
                    expiry or consuming a slot; otherwise returns
                    sdk_license_not_current
      responses:
        '200':
          description: Licence and derived quota; Cache-Control no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SDKLicenseView'
        '400':
          description: Unknown SDK or malformed request
        '401':
          description: Invalid API key
        '403':
          description: scope_not_granted or license_environment_forbidden
        '409':
          description: subscription_unpaid, sdk_quota_exceeded or sdk_license_not_current
        '503':
          description: license_signing_unconfigured
      security:
        - ApiKeyAuth: []
components:
  schemas:
    SDKLicenseView:
      type: object
      required:
        - sdk
        - state
        - max_sdks
        - consumed
        - available
        - license
      properties:
        sdk:
          type: string
          enum:
            - player
            - capture
            - review
            - report
        state:
          type: string
          enum:
            - unassigned
            - active
            - expired
        max_sdks:
          type: integer
          minimum: 0
        consumed:
          type: integer
          minimum: 0
        available:
          type: integer
          minimum: 0
        license:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/SDKLicense'
    SDKLicense:
      type: object
      required:
        - id
        - organization_id
        - sdk
        - created_at
        - issued_at
        - valid_from
        - expires_at
        - proof
      properties:
        id:
          type: string
          format: uuid
        organization_id:
          type: string
        sdk:
          type: string
          enum:
            - player
            - capture
            - review
            - report
        created_at:
          type: string
          format: date-time
        issued_at:
          type: string
          format: date-time
        valid_from:
          type: string
          format: date-time
        expires_at:
          type: string
          format: date-time
        proof:
          type: string
          description: >-
            EdDSA JWT for offline verification; never an API authentication
            credential
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: CarHub API key
      description: >
        Organisation API key, sent as `Authorization: Bearer chk_live_…`.


        * `chk_live_…` — production inference, live credits, `livemode: true`,
        `is_staging: false`.

        * `chk_stg_…` — real inference classified as staging, the same live
        credits, `livemode: true`, `is_staging: true`.

        * `chk_test_…` — identical pipeline against the fixture backend, test
        credits,
          `livemode: false`.

        Keys are stored hashed; only the prefix (`chk_live_a1b2…`) is ever
        displayed again. A key

        may be scoped to a subset of endpoint families — calling outside its
        scopes is a `403`.

````

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