{
  "openapi": "3.1.0",
  "info": {
    "title": "Compute Check API",
    "version": "1.0",
    "description": "Free compute plans for startups, by Ashiba Research. The same engine as https://check.ashibaresearch.com. No key needed."
  },
  "servers": [
    {
      "url": "https://check.ashibaresearch.com"
    }
  ],
  "paths": {
    "/api/plan": {
      "get": {
        "operationId": "getPlan",
        "summary": "Get a compute plan from the quiz answers",
        "parameters": [
          {
            "name": "scenario",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "credits",
                "bill",
                "renewal",
                "buy",
                "api",
                "lender",
                "idle"
              ],
              "description": "The situation. Default credits."
            }
          },
          {
            "name": "credits",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Credits left, $. Required for credits."
            }
          },
          {
            "name": "bill",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Monthly cloud and GPU bill, $. Required except for api and renewal."
            }
          },
          {
            "name": "expiry_months",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Months until the credits expire."
            }
          },
          {
            "name": "busy",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Share of GPU time doing work: 0.01 to 1 (1 = always busy), a percent such as '50%', or 'unknown'. Default unknown."
            }
          },
          {
            "name": "shape",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "steady",
                "workday",
                "spiky",
                "agents",
                "training",
                "batch"
              ],
              "description": "Shape of the GPU load."
            }
          },
          {
            "name": "mostly_api",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Most AI cost is model APIs, not GPUs."
            }
          },
          {
            "name": "api_spend",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Model API spend, $ per month. Required for api."
            }
          },
          {
            "name": "open_models",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "maybe",
                "no"
              ],
              "description": "Could open models do the API work?"
            }
          },
          {
            "name": "contract_gpus",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "GPUs under contract (renewal)."
            }
          },
          {
            "name": "contract_end_months",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Months until the contract ends (renewal)."
            }
          },
          {
            "name": "contract_rate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Contract price, $ per GPU-hour (renewal)."
            }
          },
          {
            "name": "cash",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Cash in bank, $."
            }
          },
          {
            "name": "burn",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Net burn, $ per month."
            }
          },
          {
            "name": "revenue",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Revenue, $ per month."
            }
          },
          {
            "name": "growth_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Monthly growth of the compute bill, %."
            }
          },
          {
            "name": "gpu_share_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "GPU share of the bill, %."
            }
          },
          {
            "name": "gpus_avg",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Average GPUs running (H100-equivalent)."
            }
          },
          {
            "name": "gpus_peak",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Peak GPUs running (H100-equivalent)."
            }
          },
          {
            "name": "team_can_run_servers",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cloud",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "AWS",
                "GCP",
                "Azure",
                "Neocloud"
              ]
            }
          },
          {
            "name": "readiness",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "explore",
                "evidence",
                "ready"
              ]
            }
          },
          {
            "name": "rOd",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "On-demand $ per GPU-hour. Default: RunPod live H100 SXM."
            }
          },
          {
            "name": "rRes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Reserved $ per GPU-hour. Default: 79% of on-demand."
            }
          },
          {
            "name": "srvPrice",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "8-GPU server price, $."
            }
          },
          {
            "name": "loanRate",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Loan or lease rate, % per year."
            }
          },
          {
            "name": "loanTerm",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Loan term, months."
            }
          },
          {
            "name": "loanDown",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Deposit, %."
            }
          },
          {
            "name": "gpu_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "H100",
                "H200",
                "A100",
                "L40S",
                "RTX 5090",
                "RTX 4090",
                "RTX 3090"
              ],
              "description": "Idle GPUs type (idle). Case and spaces do not matter."
            }
          },
          {
            "name": "gpus",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Number of GPUs (idle)."
            }
          },
          {
            "name": "ownership",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "owned",
                "contract",
                "cloud"
              ],
              "description": "Who owns the idle GPUs (idle). Default owned."
            }
          },
          {
            "name": "host_fee_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Marketplace fee, % (idle). Default 20."
            }
          },
          {
            "name": "power_kwh",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Power, $ per kWh (idle). Default 0.12."
            }
          },
          {
            "name": "rHyper",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Hyperscaler $ per GPU-hour. Default 4.00."
            }
          },
          {
            "name": "colo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Colo and power, $ per server per month."
            }
          },
          {
            "name": "opsCost",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Ops labor, $ per month."
            }
          },
          {
            "name": "life",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Server life, months."
            }
          },
          {
            "name": "resale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Resale value at end, %."
            }
          },
          {
            "name": "minRun",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "description": "Runway to keep after buying, months."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The plan: headline, rows, cliff, plan, savings, buy verdict, next steps, math, assumptions, human_url. Idle plans: earnings or idle cost."
          },
          "400": {
            "description": "Missing, invalid, or out-of-range fields, listed in errors."
          }
        }
      },
      "post": {
        "operationId": "postPlan",
        "summary": "Get a compute plan (JSON body)",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "scenario": {
                    "type": "string",
                    "enum": [
                      "credits",
                      "bill",
                      "renewal",
                      "buy",
                      "api",
                      "lender",
                      "idle"
                    ],
                    "description": "The situation. Default credits."
                  },
                  "credits": {
                    "type": "number",
                    "description": "Credits left, $. Required for credits."
                  },
                  "bill": {
                    "type": "number",
                    "description": "Monthly cloud and GPU bill, $. Required except for api and renewal."
                  },
                  "expiry_months": {
                    "type": "number",
                    "description": "Months until the credits expire."
                  },
                  "busy": {
                    "type": "string",
                    "description": "Share of GPU time doing work: 0.01 to 1 (1 = always busy), a percent such as '50%', or 'unknown'. Default unknown."
                  },
                  "shape": {
                    "type": "string",
                    "enum": [
                      "steady",
                      "workday",
                      "spiky",
                      "agents",
                      "training",
                      "batch"
                    ],
                    "description": "Shape of the GPU load."
                  },
                  "mostly_api": {
                    "type": "boolean",
                    "description": "Most AI cost is model APIs, not GPUs."
                  },
                  "api_spend": {
                    "type": "number",
                    "description": "Model API spend, $ per month. Required for api."
                  },
                  "open_models": {
                    "type": "string",
                    "enum": [
                      "maybe",
                      "no"
                    ],
                    "description": "Could open models do the API work?"
                  },
                  "contract_gpus": {
                    "type": "number",
                    "description": "GPUs under contract (renewal)."
                  },
                  "contract_end_months": {
                    "type": "number",
                    "description": "Months until the contract ends (renewal)."
                  },
                  "contract_rate": {
                    "type": "number",
                    "description": "Contract price, $ per GPU-hour (renewal)."
                  },
                  "cash": {
                    "type": "number",
                    "description": "Cash in bank, $."
                  },
                  "burn": {
                    "type": "number",
                    "description": "Net burn, $ per month."
                  },
                  "revenue": {
                    "type": "number",
                    "description": "Revenue, $ per month."
                  },
                  "growth_pct": {
                    "type": "number",
                    "description": "Monthly growth of the compute bill, %."
                  },
                  "gpu_share_pct": {
                    "type": "number",
                    "description": "GPU share of the bill, %."
                  },
                  "gpus_avg": {
                    "type": "number",
                    "description": "Average GPUs running (H100-equivalent)."
                  },
                  "gpus_peak": {
                    "type": "number",
                    "description": "Peak GPUs running (H100-equivalent)."
                  },
                  "team_can_run_servers": {
                    "type": "boolean"
                  },
                  "cloud": {
                    "type": "string",
                    "enum": [
                      "AWS",
                      "GCP",
                      "Azure",
                      "Neocloud"
                    ]
                  },
                  "readiness": {
                    "type": "string",
                    "enum": [
                      "explore",
                      "evidence",
                      "ready"
                    ]
                  },
                  "rOd": {
                    "type": "number",
                    "description": "On-demand $ per GPU-hour. Default: RunPod live H100 SXM."
                  },
                  "rRes": {
                    "type": "number",
                    "description": "Reserved $ per GPU-hour. Default: 79% of on-demand."
                  },
                  "srvPrice": {
                    "type": "number",
                    "description": "8-GPU server price, $."
                  },
                  "loanRate": {
                    "type": "number",
                    "description": "Loan or lease rate, % per year."
                  },
                  "loanTerm": {
                    "type": "number",
                    "description": "Loan term, months."
                  },
                  "loanDown": {
                    "type": "number",
                    "description": "Deposit, %."
                  },
                  "gpu_type": {
                    "type": "string",
                    "enum": [
                      "H100",
                      "H200",
                      "A100",
                      "L40S",
                      "RTX 5090",
                      "RTX 4090",
                      "RTX 3090"
                    ],
                    "description": "Idle GPUs type (idle). Case and spaces do not matter."
                  },
                  "gpus": {
                    "type": "number",
                    "description": "Number of GPUs (idle)."
                  },
                  "ownership": {
                    "type": "string",
                    "enum": [
                      "owned",
                      "contract",
                      "cloud"
                    ],
                    "description": "Who owns the idle GPUs (idle). Default owned."
                  },
                  "host_fee_pct": {
                    "type": "number",
                    "description": "Marketplace fee, % (idle). Default 20."
                  },
                  "power_kwh": {
                    "type": "number",
                    "description": "Power, $ per kWh (idle). Default 0.12."
                  },
                  "rHyper": {
                    "type": "number",
                    "description": "Hyperscaler $ per GPU-hour. Default 4.00."
                  },
                  "colo": {
                    "type": "number",
                    "description": "Colo and power, $ per server per month."
                  },
                  "opsCost": {
                    "type": "number",
                    "description": "Ops labor, $ per month."
                  },
                  "life": {
                    "type": "number",
                    "description": "Server life, months."
                  },
                  "resale": {
                    "type": "number",
                    "description": "Resale value at end, %."
                  },
                  "minRun": {
                    "type": "number",
                    "description": "Runway to keep after buying, months."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The plan."
          },
          "400": {
            "description": "Missing or invalid fields."
          }
        }
      }
    },
    "/api/prices": {
      "get": {
        "operationId": "getPrices",
        "summary": "Live GPU rental (RunPod), rented (QuickPod), and model API (OpenRouter) prices",
        "responses": {
          "200": {
            "description": "Prices, cached 10 minutes."
          }
        }
      }
    },
    "/api/capacity-request": {
      "post": {
        "operationId": "submitCapacityRequest",
        "summary": "Save buyer requirements and check public candidate sources for Ashiba sourcing. Does not reserve capacity.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "email",
                  "request"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 200
                  },
                  "company": {
                    "type": "string",
                    "maxLength": 160
                  },
                  "request": {
                    "type": "object",
                    "required": [
                      "gpu",
                      "count",
                      "region",
                      "start",
                      "days",
                      "substitution",
                      "interruption"
                    ],
                    "properties": {
                      "gpu": {
                        "type": "string",
                        "maxLength": 100
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 4096
                      },
                      "region": {
                        "type": "string",
                        "maxLength": 100
                      },
                      "start": {
                        "type": "string",
                        "format": "date"
                      },
                      "days": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 365
                      },
                      "substitution": {
                        "type": "string",
                        "enum": [
                          "exact",
                          "approval",
                          "allowed"
                        ]
                      },
                      "allowed": {
                        "type": "string",
                        "maxLength": 300
                      },
                      "interruption": {
                        "type": "string",
                        "enum": [
                          "yes",
                          "no"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Request saved. Returns reference id and received status."
          },
          "400": {
            "description": "Invalid request."
          },
          "503": {
            "description": "Request could not be saved."
          }
        }
      }
    },
    "/api/capacity-status": {
      "post": {
        "summary": "View a private buyer request and returned Ashiba offer, or ask Ashiba to arrange the current offer. Does not sign a contract or charge money.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "email"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "action": {
                    "type": "string",
                    "enum": [
                      "check",
                      "proceed"
                    ]
                  },
                  "offerId": {
                    "type": "string",
                    "format": "uuid"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Buyer request state and current offer. Internal confirmation evidence and buyer contact details are excluded."
          },
          "404": {
            "description": "Reference and email do not identify a request."
          },
          "409": {
            "description": "The offer is expired, superseded, or test-only."
          }
        }
      }
    }
  }
}
