{
  "openapi": "3.1.0",
  "info": {
    "title": "ComputeRadar Public Catalog API",
    "version": "3.1.0",
    "description": "Read-only normalized compute rental catalog backed by a locally synchronized SQLite index. Catalog reads never call upstream provider APIs."
  },
  "servers": [
    {
      "url": "https://getcomputeradar.com/"
    }
  ],
  "paths": {
    "/api/catalog": {
      "get": {
        "summary": "Search normalized server offers",
        "description": "Server-side full-text search, filtering, sorting and pagination. CSV is accepted for selected categorical filters.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "provider",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "gpu",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cpu",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "location",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "storageType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "variant",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pricingBasis",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "available",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hasGpu",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "gpuOptional",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hasPrice",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minHourly",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxHourly",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minMonthly",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxMonthly",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minRam",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxRam",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minCores",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxCores",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minThreads",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxThreads",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minVram",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxVram",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minTotalVram",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxTotalVram",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minGpus",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxGpus",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minStorage",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxStorage",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minBandwidth",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxBandwidth",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minUpload",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxUpload",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minTraffic",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxTraffic",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minReliability",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxReliability",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minQuantity",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxQuantity",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxAgeMinutes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "price-hour-asc",
                "price-hour-desc",
                "price-month-asc",
                "price-month-desc",
                "ram-asc",
                "ram-desc",
                "cores-asc",
                "cores-desc",
                "threads-asc",
                "threads-desc",
                "vram-asc",
                "vram-desc",
                "total-vram-asc",
                "total-vram-desc",
                "gpu-count-asc",
                "gpu-count-desc",
                "storage-asc",
                "storage-desc",
                "bandwidth-asc",
                "bandwidth-desc",
                "upload-asc",
                "upload-desc",
                "traffic-asc",
                "traffic-desc",
                "reliability-asc",
                "reliability-desc",
                "quantity-asc",
                "quantity-desc",
                "updated-asc",
                "updated-desc",
                "provider-asc",
                "provider-desc",
                "gpu-model-asc",
                "gpu-model-desc",
                "cpu-model-asc",
                "cpu-model-desc",
                "location-asc",
                "location-desc",
                "title-asc",
                "title-desc"
              ],
              "default": "price-hour-asc"
            }
          },
          {
            "name": "facets",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "description": "Set to 1 to include filter facets."
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated catalog response"
          }
        }
      }
    },
    "/api/providers": {
      "get": {
        "summary": "Provider-source status",
        "responses": {
          "200": {
            "description": "Provider list and last successful synchronization state"
          }
        }
      }
    },
    "/api/stats": {
      "get": {
        "summary": "Catalog summary statistics",
        "responses": {
          "200": {
            "description": "Statistics"
          }
        }
      }
    },
    "/api/health": {
      "get": {
        "summary": "Public catalog health",
        "responses": {
          "200": {
            "description": "Health summary without credentials or internal paths"
          }
        }
      }
    },
    "/api/offers/{provider}/{offer}/history": {
      "get": {
        "summary": "Price history for one normalized offer",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offer",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Recent price observations"
          }
        }
      }
    }
  }
}