CueFrame Billing API

The billing API from CueFrame — 3 operation(s) for billing.

GitHub OpenAPI

Operations 3

GET /v1/usage List metered usage events (the A2 usage ledger) #
GET /v1/billing/plans List the plan catalog: tiers, intervals, product ids, prices #
POST /v1/billing/checkout Start a hosted Stripe checkout for a plan/interval #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cueframe-ai:cueframe-ai-billing-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cueframe-ai-billing-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Cueframe Ai Billing API
  version: v1
  contact:
    name: CueFrame
    url: https://cueframe.ai
    email: support@cueframe.ai
  license:
    name: Apache-2.0
    identifier: Apache-2.0
  description: 'Operations tagged billing across 2 of this provider''s published API definitions: cueframe-ai-openapi.json, cueframe-ai-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.cueframe.ai
  description: Production
tags:
- name: Billing
paths:
  /v1/usage:
    get:
      operationId: getUsage
      tags:
      - Billing
      summary: List metered usage events (the A2 usage ledger)
      description: 'Every metered billing event, newest-first, with attribution: featureId, amount, the project/job that produced it, and the event''s LIST price in USD (the invoice may zero it inside a plan allowance). Filter by projectId, jobId, and/or a [from, to) epoch-ms period. Events appear moments after the job''s success terminal (the meter is scheduler-dispatched).'
      security:
      - bearerAuth: []
      - oauth2:
        - billing:read
      - x402: []
      x-permissions:
        billing:
        - read
      parameters:
      - name: limit
        in: query
        required: false
        description: Page size (1..100), default 20. Out-of-range or unparseable clamps into the range.
        schema:
          type: integer
          minimum: 1
          maximum: 100
      - name: after
        in: query
        required: false
        description: Opaque cursor from the previous page's `pagination.nextCursor`. Forward-only.
        schema:
          type: string
      - name: projectId
        in: query
        required: false
        description: Only events attributed to this project.
        schema:
          type: string
      - name: jobId
        in: query
        required: false
        description: Only events produced by this job — how to answer "did my failed render post a charge?" for one run.
        schema:
          type: string
      - name: from
        in: query
        required: false
        description: Period start, epoch milliseconds, INCLUSIVE.
        schema:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      - name: to
        in: query
        required: false
        description: Period end, epoch milliseconds, EXCLUSIVE.
        schema:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      responses:
        '200':
          description: Paginated usage events.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsageListResponse'
        '400':
          description: Bad request — validation_error / invalid_cursor / invalid_query.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid Authorization header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: 'Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).'
          headers:
            Payment-Required:
              description: Base64 x402 v2 PaymentRequired envelope — the same challenge as the body, for clients that read it off the header.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/X402PaymentRequired'
        '403':
          description: Forbidden — permission insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limited. Retry-After header present.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '500':
          description: Internal error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      x-payment-info:
        price:
          mode: fixed
          currency: USD
          amount: '0.01'
        protocols:
        - x402: {}
    servers:
    - url: https://api.cueframe.ai
      description: Production
  /v1/billing/plans:
    get:
      operationId: getBillingPlans
      tags:
      - Billing
      summary: 'List the plan catalog: tiers, intervals, product ids, prices'
      description: Returns every purchasable {tier, interval} and its billing catalog product id — discovery to read BEFORE POST /v1/billing/checkout so an agent requests a real plan/interval instead of guessing. `priceUsd` is best-effort (null if unavailable); `billingConfigured:false` flags an env without billing.
      security:
      - bearerAuth: []
      - oauth2: []
      - x402: []
      x-permissions: {}
      responses:
        '200':
          description: Plan catalog.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingPlansResponse'
        '401':
          description: Missing or invalid Authorization header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: 'Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).'
          headers:
            Payment-Required:
              description: Base64 x402 v2 PaymentRequired envelope — the same challenge as the body, for clients that read it off the header.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/X402PaymentRequired'
        '403':
          description: Forbidden — permission insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limited. Retry-After header present.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '500':
          description: Internal error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '503':
          description: Service unavailable — billing_unavailable / honest-503 for runtime deps.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      x-payment-info:
        price:
          mode: fixed
          currency: USD
          amount: '0.01'
        protocols:
        - x402: {}
    servers:
    - url: https://api.cueframe.ai
      description: Production
  /v1/billing/checkout:
    post:
      operationId: createCheckout
      tags:
      - Billing
      summary: Start a hosted Stripe checkout for a plan/interval
      description: Body `{ plan, interval }` → returns a hosted Stripe checkout `url` to open in a browser to complete payment. Upgrades the CURRENT org (server-resolved from your key/identity, NEVER the body). Always a hosted URL — an existing saved card is NEVER charged without the human confirming on Stripe. `interval:"year"` selects the annual plan. Discover valid combos with GET /v1/billing/plans. Requires `billing:write`.
      security:
      - bearerAuth: []
      - oauth2:
        - billing:write
      - x402: []
      x-permissions:
        billing:
        - write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CheckoutRequest'
      responses:
        '200':
          description: Hosted Stripe checkout URL to open in a browser.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckoutResponse'
        '400':
          description: Bad request — validation_error / invalid_cursor / invalid_query.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Missing or invalid Authorization header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: 'Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).'
          headers:
            Payment-Required:
              description: Base64 x402 v2 PaymentRequired envelope — the same challenge as the body, for clients that read it off the header.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/X402PaymentRequired'
        '403':
          description: Forbidden — permission insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limited. Retry-After header present.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '500':
          description: Internal error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '503':
          description: Service unavailable — billing_unavailable / honest-503 for runtime deps.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      x-payment-info:
        price:
          mode: fixed
          currency: USD
          amount: '0.01'
        protocols:
        - x402: {}
    servers:
    - url: https://api.cueframe.ai
      description: Production
components:
  schemas:
    UsageEventResponse:
      type: object
      properties:
        featureId:
          type: string
          description: The metered plan feature (exports, compose, compose_verify, …).
        value:
          description: Metered amount, in the feature's own unit (exports = render-minutes, storage = GB). Absent for a discrete single use, AND deliberately absent on the cost-plus lines (compose, generate, ai_tokens, compose_verify) whose internal metered unit is not a quantity — read `listUsd` for what those events cost you.
          type: number
        projectId:
          type: string
        jobId:
          description: 'The job that produced the meter: a render/compose/preview job id, a media id (transcription, generate), or a clip-suggestion run id (jobKind `suggestions` — see `mediaItemId` for the media it analyzed).'
          type: string
        jobKind:
          description: render | compose | consult_* | verify | preview | generate | suggestions | session_uptime | …
          type: string
        mediaItemId:
          description: The media item the job ran over, when it ran over one (suggestions, transcription). Resolve it with GET /v1/media/{id}.
          type: string
        listUsd:
          description: 'LIST price of this metered event, USD. Honest naming: the invoice may zero it inside a plan allowance — this is the event''s list price, not a Stripe line item.'
          type: number
        createdAt:
          type: number
          description: Epoch-ms when the meter landed.
      required:
      - featureId
      - createdAt
      additionalProperties: false
    PaginationMeta:
      type: object
      properties:
        hasMore:
          type: boolean
        nextCursor:
          type:
          - string
          - 'null'
        prevCursor:
          type:
          - string
          - 'null'
      required:
      - hasMore
      - nextCursor
      - prevCursor
      additionalProperties: false
      description: Cursor pagination metadata.
    CheckoutResponse:
      type: object
      properties:
        url:
          type: string
          description: Hosted Stripe checkout URL to open in a browser to complete payment. Always present on success — an existing saved card is never charged without confirming here.
        plan:
          type: string
        interval:
          type: string
        productId:
          type: string
          description: Resolved billing catalog product id.
      required:
      - url
      - plan
      - interval
      - productId
      additionalProperties: false
    BillingPlansResponse:
      type: object
      properties:
        plans:
          type: array
          items:
            $ref: '#/components/schemas/BillingPlanEntry'
          description: Every purchasable {tier, interval} and its product id.
        billingConfigured:
          type: boolean
      required:
      - plans
      - billingConfigured
      additionalProperties: false
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable error code per §Error Model.
            message:
              type: string
              description: Human-readable message.
            contract:
              type: string
              description: Contract version that produced this verdict. If it differs between two calls, the rules changed underneath you, not your request.
            contractVersion:
              type: string
              description: 'Version of the published `@cueframe/api-contract` this server implements. Compare it with the `contractVersion` of the package your client was generated from: a higher value here means the server has moved ahead of your document.'
            details:
              description: Optional context (currentEtag, projectIds, retryAfter, …).
              type: object
              propertyNames:
                type: string
              additionalProperties: {}
          required:
          - code
          - message
          - contract
          - contractVersion
          description: Standard API error envelope.
      required:
      - error
      description: Error envelope used by every non-2xx response.
    CheckoutRequest:
      type: object
      properties:
        plan:
          type: string
          enum:
          - credit_pack_10
          - credit_pack_30
          - credit_pack_100
          description: Plan tier to subscribe to.
        interval:
          default: month
          description: 'Billing interval: ''month'' (monthly) or ''year'' (annual, ~2 months free).'
          type: string
          enum:
          - month
          - year
      required:
      - plan
      - interval
      additionalProperties: false
    X402PaymentRequired:
      type: object
      title: X402PaymentRequired
      description: x402 v2 PaymentRequired challenge — the body of a 402 on a priced operation.
      properties:
        x402Version:
          type: integer
          const: 2
        accepts:
          type: array
          description: Accepted payment requirements. Read `accepts[0]` for scheme (`exact` for a fixed price, `upto` for a measured one), network (CAIP-2), asset, amount and payTo.
          items:
            type: object
        error:
          type: string
          description: Human-readable reason.
      required:
      - x402Version
      - accepts
    BillingPlanEntry:
      type: object
      properties:
        id:
          type: string
          description: Billing catalog product id (e.g. pro, pro_yearly).
        tier:
          type: string
          description: 'Plan tier: pro | business | studio.'
        name:
          type: string
        interval:
          type: string
          description: month | year.
        priceUsd:
          type: number
          description: Price in USD for the interval.
      required:
      - id
      - tier
      - name
      - interval
      - priceUsd
      additionalProperties: false
    UsageListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/UsageEventResponse'
        pagination:
          $ref: '#/components/schemas/PaginationMeta'
      required:
      - data
      - pagination
      additionalProperties: false
  securitySchemes:
    oauth2:
      type: oauth2
      description: Authorization code with PKCE (S256). Request explicit resource scopes for least privilege; identity-only grants retain account-level access.
      flows:
        authorizationCode:
          authorizationUrl: https://api.cueframe.ai/api/auth/mcp/authorize
          tokenUrl: https://api.cueframe.ai/api/auth/mcp/token
          scopes:
            media:read: Read media
            media:write: Modify media
            sessions:read: Read sessions
            sessions:write: Modify sessions
            projects:read: Read projects
            projects:write: Modify projects
            renders:read: Read renders
            renders:write: Modify renders
            webhooks:read: Read webhooks
            webhooks:write: Modify webhooks
            billing:read: Read billing
            billing:write: Modify billing
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: cf_live_* or cf_test_*
      description: API key auth. Prefix `cf_live_` for production orgs, `cf_test_` for sandbox.
    x402:
      type: apiKey
      in: header
      name: PAYMENT-SIGNATURE
      description: x402 v2 payment header (EIP-3009 USDC on Base; base64 PaymentPayload). Returned 402 Payment-Required if absent on priced endpoints.
x-refined-from:
- cueframe-ai-openapi.json
- cueframe-ai-openapi.yml