OpenRelay Catalog API

Public catalog: GPU models, availability, pricing, templates, and locations.

OpenAPI Specification

openrelay-catalog-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  description: 'The OpenRelay control-plane REST API. Deploy GPU VMs and inference clusters, manage organizations and billing, and automate your infrastructure. All requests are authenticated with an API key (`vl_…`) unless noted otherwise.

    '
  title: OpenRelay Account Catalog API
  version: 0.1.0
servers:
- description: Production
  url: https://api.openrelay.inc
- description: Beta
  url: https://api.beta.openrelay.inc
- description: Local development
  url: http://localhost:8083
tags:
- description: 'Public catalog: GPU models, availability, pricing, templates, and locations.'
  name: Catalog
paths:
  /v1/gpu-availability:
    get:
      description: Live availability per GPU model. Responses are served from a short-lived cache.
      operationId: getGpuAvailability
      responses:
        '200':
          content:
            application/json:
              example:
              - cluster:
                  freeGpus: 8
                  maxPlaceableGpus: 8
                  totalGpus: 8
                gpuModelId: rtx-4090
                vm:
                  freeGpus: 5
                  maxPlaceableGpus: 4
                  totalGpus: 12
              schema:
                items:
                  $ref: '#/components/schemas/GpuAvailability'
                type: array
          description: Availability by gpu model
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      security:
      - apiKey: []
      summary: GPU availability by model
      tags:
      - Catalog
      x-openrelay-mcp:
        default: true
  /v1/gpu-models:
    get:
      operationId: listGpuModels
      responses:
        '200':
          content:
            application/json:
              example:
              - hidden: false
                id: rtx-4090
                manufacturer: NVIDIA
                name: RTX 4090
                vramGb: 24
              schema:
                items:
                  $ref: '#/components/schemas/GpuModel'
                type: array
          description: GPU models
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
      - apiKey: []
      summary: GPU model catalog
      tags:
      - Catalog
      x-openrelay-mcp:
        default: true
  /v1/locations:
    get:
      operationId: listLocations
      responses:
        '200':
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/Location'
                type: array
          description: Locations
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
      - apiKey: []
      summary: Locations / regions
      tags:
      - Catalog
  /v1/models:
    get:
      description: 'Returns the public model catalog. Free, not balance-gated. Models with status "available" can be used immediately in /v1/chat/completions; "request_access" models are listed for discovery but are not yet invocable.

        '
      operationId: listModels
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelList'
          description: The public model catalog
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
      - apiKey: []
      summary: List models in the OpenRelay catalog (OpenAI-compatible)
      tags:
      - Catalog
      x-openrelay-mcp:
        default: true
  /v1/pricing:
    get:
      operationId: getPricing
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pricing'
          description: Pricing
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
      - apiKey: []
      summary: GPU + CPU pricing
      tags:
      - Catalog
      x-openrelay-mcp:
        default: true
  /v1/vm-templates:
    get:
      operationId: listVmTemplates
      responses:
        '200':
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/VmTemplate'
                type: array
          description: Templates
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
      - apiKey: []
      summary: VM template catalog
      tags:
      - Catalog
      x-openrelay-mcp:
        default: true
components:
  schemas:
    GpuModel:
      properties:
        architecture:
          type: string
        createdAt:
          type: string
        hidden:
          type: boolean
        id:
          type: string
        manufacturer:
          type: string
        name:
          type: string
        vramGb:
          type: integer
      required:
      - id
      - name
      - manufacturer
      - vramGb
      - hidden
      type: object
    VmTemplate:
      properties:
        compatibleGpuModelIds:
          description: GPU model ids this template supports; null = all GPUs allowed
          items:
            type: string
          nullable: true
          type: array
        description:
          type: string
        driverVersion:
          type: string
        filename:
          type: string
        id:
          type: string
        isDefault:
          type: boolean
        name:
          type: string
        osType:
          type: string
        osVersion:
          type: string
        requiresGpu:
          type: boolean
        slug:
          type: string
        sortOrder:
          type: integer
      required:
      - id
      - name
      - slug
      - filename
      - requiresGpu
      - osType
      type: object
    Location:
      properties:
        city:
          type: string
        country:
          type: string
        id:
          type: string
        latitude:
          type: number
        longitude:
          type: number
        name:
          type: string
        region:
          type: string
      required:
      - id
      - name
      - city
      - country
      - region
      type: object
    ModelList:
      properties:
        data:
          items:
            $ref: '#/components/schemas/Model'
          type: array
        object:
          enum:
          - list
          type: string
      required:
      - object
      - data
      type: object
    NodeClassCap:
      properties:
        freeGpus:
          type: integer
        freeUnits:
          type: integer
        nodeId:
          type: string
        unitSizes:
          description: Free unit sizes on this node (for display/tiling).
          items:
            type: integer
          type: array
      required:
      - nodeId
      - freeUnits
      - freeGpus
      type: object
    Error:
      properties:
        code:
          type: string
        error:
          type: string
      required:
      - error
      type: object
    Modalities:
      description: 'Input and output modalities the model accepts and produces. Values are free-form strings (text, image, audio, video, and novel ones such as a world model''s state/actions) so new modalities need no schema change. This is what distinguishes text→text, vision (image→text), text→image, image→image, TTS/STT, and video/world models.

        '
      properties:
        input:
          description: What the model accepts, e.g. [text], [text, image].
          items:
            type: string
          type: array
        output:
          description: What the model produces, e.g. [text], [image], [video].
          items:
            type: string
          type: array
      required:
      - input
      - output
      type: object
    CpuPrice:
      properties:
        pricePerHourCents:
          type: integer
        resourceSize:
          type: string
      required:
      - resourceSize
      - pricePerHourCents
      type: object
    ClassAvailability:
      description: 'Availability for one consumption mode of a model: "vm" = VFIO passthrough (exact, from per-node unit state); "cluster" = container device-request (capacity minus cluster commitment).'
      properties:
        freeGpus:
          type: integer
        maxPlaceableGpus:
          description: Largest single allocation possible right now — for a VM the biggest tiling on any one node, for a cluster the largest per-replica device count on any one node. A workload can never exceed this even if freeGpus is larger (it lands on a single node).
          type: integer
        nodes:
          items:
            $ref: '#/components/schemas/NodeClassCap'
          type: array
        placeableGpuCounts:
          description: GPU counts actually placeable on >=1 node right now. Frontends drive the count picker from this so offered counts can't 409/deploy-timeout.
          items:
            type: integer
          type: array
        tileLattice:
          description: Structural set of counts this model's units can ever tile to (free or not) — the hardware shape. vm view only; clusters are step-1.
          items:
            type: integer
          type: array
        totalGpus:
          description: free + claimed
          type: integer
      required:
      - totalGpus
      - freeGpus
      - maxPlaceableGpus
      type: object
    GpuPrice:
      properties:
        gpuModelId:
          type: string
        gpuModelName:
          type: string
        pricePerHourCents:
          type: integer
        tier:
          type: string
        vramGb:
          type: integer
      required:
      - gpuModelId
      - tier
      - pricePerHourCents
      type: object
    Model:
      description: A public model in the OpenRelay catalog (OpenAI-compatible).
      properties:
        batch_eligible:
          description: 'Whether this model can be run through the Batch API (POST /v1/batches). Omitted/false = online only. Batch pricing is ~50% of the online rate.

            '
          type: boolean
        created:
          description: Unix timestamp (seconds) the model was added to the catalog.
          format: int64
          type: integer
        id:
          description: Public model id, send this in the `model` field of a request.
          type: string
        modalities:
          $ref: '#/components/schemas/Modalities'
        object:
          enum:
          - model
          type: string
        owned_by:
          description: Always "openrelay".
          type: string
        status:
          description: 'available = usable now. request_access = listed for discovery but not yet invocable for your organization; request access to enable it.

            '
          enum:
          - available
          - request_access
          type: string
        supported_apis:
          description: API families this model serves, e.g. chat_completions, images, embeddings.
          items:
            type: string
          type: array
      required:
      - id
      - object
      - created
      - owned_by
      - supported_apis
      - modalities
      - status
      type: object
    GpuAvailability:
      description: 'Per-model GPU availability, answered separately for the two consumption modes because a physical GPU belongs to exactly one alloc-class (its driver binding): "vm" (vfio-group passthrough) and "cluster" (device-request).'
      properties:
        cluster:
          $ref: '#/components/schemas/ClassAvailability'
        gpuModelId:
          type: string
        vm:
          $ref: '#/components/schemas/ClassAvailability'
      required:
      - gpuModelId
      - vm
      - cluster
      type: object
    Pricing:
      properties:
        cpu:
          items:
            $ref: '#/components/schemas/CpuPrice'
          type: array
        gpu:
          items:
            $ref: '#/components/schemas/GpuPrice'
          type: array
      required:
      - gpu
      - cpu
      type: object
  responses:
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: API key lacks the required scope
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Missing or invalid API key
  securitySchemes:
    apiKey:
      description: 'OpenRelay API key. Send it as `Authorization: Bearer vl_…`.'
      scheme: bearer
      type: http