{"components":{"parameters":{"CursorParam":{"in":"query","name":"cursor","schema":{"type":"string"}},"IdempotencyKeyHeader":{"in":"header","name":"Idempotency-Key","schema":{"maxLength":255,"type":"string"}},"LimitParam":{"in":"query","name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}}},"requestBodies":{"CreateInstance":{"content":{"application/json":{"schema":{"properties":{"auto_terminate_hours":{"description":"Terminate this instance automatically after this many hours of runtime. Omit for no limit (the default). The countdown starts when the instance reaches `running`, not when you call this — provisioning is neither billed nor counted against the limit — and the resolved deadline is returned as `auto_terminate_at` on every read. Enforcement is server-side and survives your process: this is the safety net for an unattended run whose client dies without cleaning up. When it fires the instance is terminated exactly as a DELETE would terminate it (billing stops, the `instance.terminated` webhook fires) and `status_reason` records that the limit was reached. Bounds: at least 1, at most 720 (30 days) — outside them returns 422 `validation_failed`. An explicit `0` is rejected rather than read as \"no limit\"; omit the field for that.","example":8,"maximum":720,"minimum":1,"type":"integer"},"cmd":{"description":"Override the image's CMD. Omit to use the image's own (or none, when `entrypoint` is overridden with a non-empty argv; an empty-array entrypoint clear keeps the image CMD). An explicit empty array clears the CMD. Empty strings inside a non-empty argv are rejected (422). Requires `image`.","items":{"type":"string"},"type":"array"},"disk_gb":{"description":"Requested instance filesystem size in GB. Omit for the platform default (100 GB), which never narrows placement. Setting it is a hard requirement: placement narrows to capacity that can honor it (see `disk_configurable` on GET /v1/pricing), and a request no offering of the gpu_type can honor returns 422 `disk_unavailable` rather than launching with a different size. When the launch also pins an exact `offering_id`, a disk_gb larger than that offering's displayed `storage_gb` returns 422 `disk_exceeds_offering` rather than launching with a clamped filesystem. Disk beyond the included allowance (100 GB) is billed at the offering's `disk_price_per_gb_hour` (GET /v1/pricing), folded into the instance's single hourly rate. Bounds: at least 10, at most the platform ceiling (currently 1000) — outside them returns 422 `validation_failed`.","example":200,"minimum":10,"type":"integer"},"entrypoint":{"description":"Override the image's ENTRYPOINT (docker semantics — also drops the image CMD unless `cmd` is given). Omit to use the image's own; an explicit empty array clears it while keeping the image CMD (docker `--entrypoint \"\"` semantics). Empty strings inside a non-empty argv are rejected (422). At most 32 arguments / 4KB. Requires `image`.","items":{"type":"string"},"type":"array"},"env":{"additionalProperties":{"type":"string"},"description":"Environment variables. With `template_id`: per-deploy overrides — only keys the template marks user_overridable are accepted (others 422), and secret values are redacted from operation metadata. With `image`: plain container env vars — keys must be POSIX names and the platform's reserved namespace (`PUBLIC_KEY`, `GPUAI_*`) is refused (422).","type":"object"},"environment":{"description":"Launch environment. Omit for the provider default (the GPU.ai Certified Image where supported). Accepted values: `certified` (the GPU.ai Certified base image), `certified:\u003cframework\u003e` (a framework layer — see GET /v1/environments for the roster, e.g. `certified:pytorch`), `certified:\u003cframework\u003e@\u003cversion\u003e` (a specific framework version, e.g. `certified:pytorch@2.13`), `raw_vm` (root VM, provider default OS), `raw_vm:\u003cos\u003e` (root VM with a chosen OS, e.g. `raw_vm:ubuntu-24.04`), or `provider_template` (the provider's own image). A well-formed value the placed machine can't serve returns 422 `environment_unavailable`.","example":"certified:pytorch@2.13","type":"string"},"gpu_count":{"maximum":8,"minimum":1,"type":"integer"},"gpu_type":{"type":"string"},"image":{"description":"Launch from your own container image, e.g. `pytorch/pytorch:2.4.1-cuda12.4-cudnn9-devel` or `ghcr.io/acme/trainer:v1`. The image must be publicly pullable (private registries are not yet supported) and provide linux/amd64 — both are verified synchronously before anything is provisioned: an unknown image returns 422 `image_unavailable` and a registry outage 502 `registry_unreachable`, with no operation created and nothing billed. The launch is pinned to the exact manifest digest verified, so a tag re-push cannot change what boots. After SSH/tunnel setup the image's own ENTRYPOINT/CMD is started (its output is in /var/log/gpuai-entrypoint.log on the instance); an image with neither is a plain SSH environment. Placement prefers container-native capacity (the image runs natively; SSH lands inside it) and falls back to VM capacity (the image runs as a container beside the host's SSH — inspect with `docker logs gpuai-workload`); private images stay container-native. A gpu_type with no capable capacity returns 422 `image_unavailable`. Mutually exclusive with `template_id` and `environment` (422). A malformed reference (bad charset, localhost/private-IP registry) returns 400. On-demand only for now: `tier: spot` with `image` is refused (422 `validation_failed`) because a preemption re-route cannot yet carry a custom image.","example":"ghcr.io/acme/trainer:v1","type":"string"},"max_price_per_hour":{"description":"maximum acceptable whole-instance hourly price (catalog price)","format":"double","type":"number"},"name":{"type":"string"},"offering_id":{"description":"Pin the launch to one exact offering (from GET /v1/pricing) so the engine never substitutes a pricier one. If that offering is gone, the launch fails explicitly rather than silently placing elsewhere.","type":"string"},"ports":{"description":"Container ports to expose on a custom-image launch (at most 10; port 22 is reserved). At most one entry may be `primary` — it must be http and is served at the instance's app URL (`https://\u003cid\u003e.apps.gpu.ai`) behind the per-instance basic-auth login. Requires `image`.","items":{"properties":{"port":{"maximum":65535,"minimum":1,"type":"integer"},"primary":{"type":"boolean"},"protocol":{"enum":["http","tcp"],"type":"string"}},"required":["port","protocol"],"type":"object"},"type":"array"},"region":{"type":"string"},"registry_credential_id":{"description":"Stored registry-credential id (POST /v1/registry-credentials) for pulling a PRIVATE `image`. The credential's registry must match the image's registry (422 otherwise); wrong logins fail the pre-flight with 422 `image_unavailable` before anything is provisioned. Requires `image`.","type":"string"},"ssh_key_ids":{"items":{"type":"string"},"type":"array"},"template_id":{"description":"Deploy a curated application template (e.g. comfyui, vllm). When set, gpu_type may be omitted — the cheapest eligible GPU is auto-selected. For templates serving a Hugging Face model via env.MODEL (vllm, sglang), the model's published weights size is checked against the GPU's VRAM at submit time: an oversized model on an explicit gpu_type returns 422 `model_too_large` (auto-select instead raises its VRAM floor to the estimate, and 422s only when no available GPU fits). Gated/private/unknown repos are never blocked — the deploy proceeds and the 202 carries a `warnings` entry. Separately, an explicit gpu_type whose VRAM is below the template's own `min_vram_gb` returns 422 `gpu_vram_too_small`, naming the floor, the type's VRAM and the compatible GPU types. Auto-select is unaffected — it already filters by the floor.","type":"string"},"tier":{"description":"`spot` is soft-deprecated: spot capacity is currently unavailable sitewide (requests with tier=spot return no offerings); use on_demand.","enum":["spot","on_demand"],"type":"string","x-gpuai-deprecated-enum-values":["spot"]},"viewed_price_per_hour":{"description":"The retail $/hr the caller displayed to the user before launch. A catalog row is a quote, not a booking, and pinning an offering fixes which machine is placed but not its rate. If the launch-time price exceeds this by more than $0.01 the launch fails with `price_changed` carrying the new price instead of proceeding at the higher price; omit to accept the launch-time price (previous behavior). Refusal only — it is never read as consent, so it can neither raise what you are charged nor widen what may be bought on your behalf. Use max_price_per_hour to bound spend.","format":"double","type":"number"}},"required":["gpu_type","gpu_count","tier"],"type":"object"}}},"required":true}},"responses":{"GPUTypePage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GPUTypePage"}}},"description":"OK"},"InstancePage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstancePage"}}},"description":"OK"},"OpenAIBadGateway":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"The upstream answered but its response could not be used (OpenAI error envelope): code upstream_response_too_large when the vector payload exceeded the per-request size limit, or upstream_error for a malformed / misaligned response. Not retryable as-is for upstream_response_too_large — send fewer inputs."},"OpenAIBadRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Invalid request (OpenAI error envelope)."},"OpenAIForbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"API key lacks the required scope (OpenAI error envelope)."},"OpenAIGone":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"The requested artifact has expired and is no longer available (OpenAI error envelope)."},"OpenAIImages":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesResponse"}}},"description":"OpenAI-shaped image generation response (b64_json only)."},"OpenAIInternalError":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Internal server error (OpenAI error envelope)."},"OpenAIModel":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}},"description":"OpenAI-shaped single model."},"OpenAIModelsList":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}},"description":"OpenAI-shaped model list."},"OpenAINotFound":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Model or resource not found (OpenAI error envelope)."},"OpenAIPaymentRequired":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Insufficient balance (OpenAI error envelope, SERV-06)."},"OpenAIRateLimited":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Rate limit exceeded (OpenAI error envelope). Retry-After header indicates seconds to wait.","headers":{"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"minimum":1,"type":"integer"}}}},"OpenAIRequestTooLarge":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Request body too large (OpenAI error envelope, code request_too_large)."},"OpenAIUnauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Missing or invalid API key (OpenAI error envelope)."},"OpenAIUnprocessableEntity":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Request validation failed (OpenAI error envelope)."},"OpenAIUpstreamTimeout":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Upstream provider exceeded the synchronous per-attempt deadline (OpenAI\nerror envelope). 504 semantic — distinct from 503 OpenAIUpstreamUnavailable\nwhich signals a connection or routing failure rather than a timeout.\n"},"OpenAIUpstreamUnavailable":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIErrorEnvelope"}}},"description":"Upstream provider unavailable (OpenAI error envelope). Retry-After header may indicate seconds to wait.","headers":{"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"minimum":1,"type":"integer"}}}},"OpenAIVideo":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}},"description":"A video generation job object."},"OpenAIVideoList":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoList"}}},"description":"A page of video generation jobs."},"PricingPage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPage"}}},"description":"OK"},"Problem":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Error response (RFC 7807)"},"RateLimited":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate limit exceeded (RFC 7807). Retry-After header indicates seconds to wait.","headers":{"Retry-After":{"description":"Seconds the client should wait before retrying.","schema":{"minimum":1,"type":"integer"}}}},"SSHKeyPage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHKeyPage"}}},"description":"OK"},"UsagePage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsagePage"}}},"description":"OK"},"WebhookEndpointPage":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPage"}}},"description":"OK"}},"schemas":{"ChatChoice":{"properties":{"finish_reason":{"enum":["stop","length","content_filter","tool_calls"],"type":"string"},"index":{"type":"integer"},"message":{"$ref":"#/components/schemas/ChatMessage"}},"type":"object"},"ChatCompletionRequest":{"properties":{"max_tokens":{"minimum":1,"nullable":true,"type":"integer"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},"model":{"description":"Canonical model id, e.g. \"gpuai/qwen2.5-7b-instruct\".","type":"string"},"stream":{"default":false,"type":"boolean"},"stream_options":{"$ref":"#/components/schemas/StreamOptions"},"temperature":{"nullable":true,"type":"number"}},"required":["model","messages"],"type":"object"},"ChatCompletionResponse":{"properties":{"choices":{"items":{"$ref":"#/components/schemas/ChatChoice"},"type":"array"},"created":{"description":"Unix timestamp (seconds).","type":"integer"},"id":{"type":"string"},"model":{"description":"Canonical (gpuai/...) model id, NEVER the upstream HF path.","type":"string"},"object":{"enum":["chat.completion"],"type":"string"},"usage":{"$ref":"#/components/schemas/Usage"}},"required":["id","object","created","model","choices","usage"],"type":"object"},"ChatMessage":{"properties":{"content":{"type":"string"},"role":{"enum":["system","user","assistant"],"type":"string"}},"required":["role","content"],"type":"object"},"CommunityEarnings":{"properties":{"accrued_cents":{"description":"Lifetime accrued earnings in cents.","format":"int64","type":"integer"},"entries":{"items":{"$ref":"#/components/schemas/CommunityEarningsEntry"},"type":"array"},"unpaid_cents":{"description":"Accrued but not yet paid out, in cents.","format":"int64","type":"integer"}},"required":["accrued_cents","unpaid_cents","entries"],"type":"object"},"CommunityEarningsEntry":{"properties":{"accrued_at":{"format":"date-time","type":"string"},"amount_cents":{"format":"int64","type":"integer"},"instance_id":{"type":"string"},"ledger_id":{"format":"uuid","type":"string"},"machine_id":{"format":"uuid","type":"string"},"paid":{"type":"boolean"}},"required":["ledger_id","machine_id","instance_id","amount_cents","accrued_at","paid"],"type":"object"},"CommunityMachine":{"description":"A self-declared Community Cloud machine. Spec fields are optional and unverified until Phase 57. The enrollment token hash is never serialized.","properties":{"created_at":{"format":"date-time","type":"string"},"gpu_count":{"nullable":true,"type":"integer"},"gpu_type":{"nullable":true,"type":"string"},"last_heartbeat_at":{"format":"date-time","nullable":true,"type":"string"},"machine_id":{"format":"uuid","type":"string"},"price_per_hour":{"nullable":true,"type":"number"},"region":{"nullable":true,"type":"string"},"status":{"enum":["pending_verification","listed","delisted","suspended"],"type":"string"},"supplier_id":{"format":"uuid","type":"string"},"tier":{"description":"Supplier-chosen rental model. on_demand = guaranteed whole-node capacity; spot = cheaper interruptible capacity. Defaults to on_demand. Becomes the catalog offering's tier.","enum":["on_demand","spot"],"type":"string"},"verification_status":{"enum":["unverified","verified","failed"],"type":"string"},"vram_per_gpu_gb":{"nullable":true,"type":"integer"}},"required":["machine_id","supplier_id","status","verification_status","created_at"],"type":"object"},"CommunityMachineDelistResult":{"description":"The terminal status a machine reached after a delist. `draining` means it was occupied and the existing rental keeps running (never killed); `delisted` means it was idle and left supply immediately.","properties":{"machine_id":{"type":"string"},"status":{"enum":["draining","delisted"],"type":"string"}},"required":["machine_id","status"],"type":"object"},"CommunityMachineRegistration":{"properties":{"enrollment_token":{"description":"One-time enrollment token — shown exactly once, store securely.","type":"string"},"machine":{"$ref":"#/components/schemas/CommunityMachine"}},"required":["machine","enrollment_token"],"type":"object"},"CommunitySupplier":{"description":"One organization's Community Cloud supplier profile (ONBD-01).","properties":{"created_at":{"format":"date-time","type":"string"},"org_id":{"format":"uuid","type":"string"},"status":{"enum":["active","suspended"],"type":"string"},"supplier_id":{"format":"uuid","type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["supplier_id","org_id","status","created_at","updated_at"],"type":"object"},"CreateFineTuningJobRequest":{"description":"Request body for POST /fine_tuning/jobs. The `method` object carries the Axolotl LoRA/QLoRA hyperparameters; `gpuai` is a native extension for the optional budget cap and GPU preference. The backing training environment (image, GPU provider) is an internal orchestration detail and is intentionally absent from this schema (privacy-by-omission, D6).","properties":{"gpuai":{"properties":{"gpu_preference":{"type":"string"},"max_budget_usd":{"type":"number"}},"type":"object"},"method":{"properties":{"lora":{"properties":{"lora_alpha":{"type":"integer"},"lora_dropout":{"type":"number"},"lora_r":{"type":"integer"}},"type":"object"},"type":{"enum":["lora","qlora"],"type":"string"}},"required":["type"],"type":"object"},"model":{"description":"An operator-curated tunable base model id.","type":"string"},"seed":{"type":"integer"},"suffix":{"type":"string"},"training_file":{"description":"The id of a previously uploaded file (purpose=fine-tune).","type":"string"}},"required":["model","training_file","method"],"type":"object"},"CryptoDeposit":{"description":"A stablecoin deposit. Mirrors the Go DTO field for field. Like that struct, this schema deliberately has NO payment-processor property — the processor is an implementation detail and is structurally absent from the customer contract, not merely filtered out.\n","properties":{"amount_usd_cents":{"description":"The amount requested, in USD cents. Never the settled or credited value.","type":"integer"},"asset":{"enum":["usdc","usdt"],"type":"string"},"chain":{"enum":["ethereum","base","arbitrum","polygon","solana"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"credited_cents":{"description":"USD cents actually credited to the balance. Absent until credited.","type":"integer"},"deposit_id":{"type":"string"},"expires_at":{"description":"RFC3339 UTC. After this, send nothing to pay_address.","format":"date-time","type":"string"},"pay_address":{"description":"The address to send funds to. Unique to this deposit.","type":"string"},"pay_amount":{"description":"The exact token amount to send, as a decimal string (never a number — the value must not round-trip through a float).\n","type":"string"},"status":{"description":"Lifecycle state: created, detected, confirming, settled, screening, held_screening, credited, credited_underpaid, credited_overpaid, expired, expired_received, failed, failed_screening.\n","type":"string"},"tx_hash":{"type":"string"}},"required":["deposit_id","status","chain","asset","amount_usd_cents","created_at"],"type":"object"},"Embedding":{"properties":{"embedding":{"description":"The embedding vector as 32-bit floats.","items":{"format":"float","type":"number"},"type":"array"},"index":{"description":"Position of this vector's input in the request.","type":"integer"},"object":{"enum":["embedding"],"type":"string"}},"required":["object","embedding","index"],"type":"object"},"EmbeddingsRequest":{"properties":{"dimensions":{"description":"Requested output dimensionality, for models that support truncated (Matryoshka) embeddings. Passed through to the model when set.","minimum":1,"type":"integer"},"encoding_format":{"default":"float","description":"Only \"float\" is supported. A value of \"base64\" is rejected with invalid_request_error / unsupported_parameter.","enum":["float"],"type":"string"},"input":{"description":"Text to embed: either a single string or an array of up to 2048 strings. Token-id arrays are not supported. The per-request ceiling is bounded so the response stays under 64 MiB — about 680 inputs at 4096 dimensions, fewer at a larger `dimensions` value; an over-limit batch is rejected with 400 invalid_request_error whose message states the limit, before any processing.","oneOf":[{"type":"string"},{"items":{"type":"string"},"maxItems":2048,"type":"array"}]},"model":{"description":"Canonical embedding model id, e.g. \"gpuai/qwen3-embedding-8b\".","type":"string"},"user":{"description":"Opaque end-user identifier for abuse tracing. Optional.","type":"string"}},"required":["model","input"],"type":"object"},"EmbeddingsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Embedding"},"type":"array"},"model":{"description":"Canonical (gpuai/...) model id, NEVER the upstream identifier.","type":"string"},"object":{"enum":["list"],"type":"string"},"usage":{"$ref":"#/components/schemas/EmbeddingsUsage"}},"required":["object","data","model","usage"],"type":"object"},"EmbeddingsUsage":{"description":"Embeddings are billed on input tokens only, so this block carries no completion_tokens field — an embeddings call emits none, and total_tokens always equals prompt_tokens.","properties":{"prompt_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"required":["prompt_tokens","total_tokens"],"type":"object"},"Environments":{"description":"The launch environment catalog (GET /v1/environments).","properties":{"frameworks":{"description":"Certified framework ids whose images are fully published — the `certified:\u003cframework\u003e` options.","example":["pytorch","cuda-devel","jupyter"],"items":{"type":"string"},"type":"array"},"includes":{"additionalProperties":{"additionalProperties":{"items":{"$ref":"#/components/schemas/IncludeItem"},"type":"array"},"type":"object"},"description":"\"What's included\" software lists: framework id (roster ids plus \"base\") → CUDA variant (\"cuda128\"/\"cuda124\") → components.","type":"object"},"versions":{"additionalProperties":{"items":{"$ref":"#/components/schemas/FrameworkVersion"},"type":"array"},"description":"The version picker roster: framework id → selectable versions (the `certified:\u003cframework\u003e@\u003cversion\u003e` grammar). A framework absent here has one build per CUDA variant. `variant` is the CUDA variant a version targets — only offerings whose GPU maps to it can run it.","type":"object"},"vm_images":{"additionalProperties":{"$ref":"#/components/schemas/VMImage"},"description":"The raw-VM OS catalog (the `raw_vm:\u003cos\u003e` grammar), keyed by os id.","type":"object"}},"required":["frameworks","versions","includes","vm_images"],"type":"object"},"FileObject":{"description":"An uploaded file object. The storage location is an internal detail and is intentionally absent from this schema (privacy-by-omission, D6).","properties":{"bytes":{"type":"integer"},"created_at":{"description":"Unix timestamp (seconds).","type":"integer"},"filename":{"type":"string"},"id":{"type":"string"},"object":{"enum":["file"],"type":"string"},"purpose":{"enum":["fine-tune"],"type":"string"}},"required":["id","object","bytes","created_at","filename","purpose"],"type":"object"},"FineTuningJob":{"description":"The fine-tuning job object. `status` is the COLLAPSED public enum (the rich internal states are hidden). `result_files` are freshly-presigned, short-lived download URLs regenerated per read. No backing-provider identity is present (D6).","properties":{"created_at":{"description":"Unix timestamp (seconds) at creation.","type":"integer"},"error":{"nullable":true,"properties":{"code":{"type":"string"},"message":{"type":"string"},"param":{"nullable":true,"type":"string"}},"type":"object"},"fine_tuned_model":{"description":"Null in this release (catalog auto-serve is a later phase).","nullable":true,"type":"string"},"finished_at":{"description":"Unix timestamp (seconds) at terminal state; null until terminal.","nullable":true,"type":"integer"},"id":{"type":"string"},"metadata":{"additionalProperties":true,"nullable":true,"type":"object"},"method":{"properties":{"lora":{"properties":{"lora_alpha":{"type":"integer"},"lora_dropout":{"type":"number"},"lora_r":{"type":"integer"}},"type":"object"},"type":{"enum":["lora","qlora"],"type":"string"}},"type":"object"},"model":{"type":"string"},"object":{"enum":["fine_tuning.job"],"type":"string"},"result_files":{"items":{"type":"string"},"type":"array"},"seed":{"type":"integer"},"status":{"enum":["validating","queued","running","succeeded","failed","cancelled"],"type":"string"},"suffix":{"type":"string"},"training_file":{"type":"string"}},"required":["id","object","model","created_at","status","training_file","result_files"],"type":"object"},"FineTuningJobEvent":{"properties":{"created_at":{"description":"Unix timestamp (seconds).","type":"integer"},"data":{"additionalProperties":true,"nullable":true,"type":"object"},"id":{"type":"string"},"level":{"enum":["info","warn","error"],"type":"string"},"message":{"type":"string"},"object":{"enum":["fine_tuning.job.event"],"type":"string"},"type":{"type":"string"}},"required":["id","object","created_at","level","message"],"type":"object"},"FineTuningJobEventList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FineTuningJobEvent"},"type":"array"},"has_more":{"type":"boolean"},"object":{"enum":["list"],"type":"string"}},"required":["object","data","has_more"],"type":"object"},"FineTuningJobList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FineTuningJob"},"type":"array"},"has_more":{"type":"boolean"},"object":{"enum":["list"],"type":"string"}},"required":["object","data","has_more"],"type":"object"},"FrameworkVersion":{"properties":{"default":{"description":"Preselected in the picker (at most one per framework).","type":"boolean"},"id":{"description":"The version token used in `certified:\u003cframework\u003e@\u003cid\u003e`.","example":"2.13","type":"string"},"label":{"example":"PyTorch 2.13","type":"string"},"variant":{"description":"CUDA variant this version targets (cuda128/cuda124).","example":"cuda124","type":"string"}},"required":["id","label","variant"],"type":"object"},"GPUType":{"properties":{"architecture":{"type":"string"},"cpu_cores":{"description":"Representative host vCPU count for this GPU model. Unlike vram_gb (the card's nameplate VRAM; a model spanning capacity variants advertises the smallest currently offered, so it is the value every launch of the model can honor) this varies per offering, so it is the first-sighting/typical value; GET /v1/pricing carries the exact per-offering spec. 0 marks a spec the upstream did not report.","type":"integer"},"disk_configurable":{"description":"true when at least one offering of this model accepts a custom disk_gb at launch (an OR across offerings — requesting disk_gb narrows placement to the capable capacity).","type":"boolean"},"gpu_type":{"type":"string"},"instance_disk_gb":{"description":"Representative instance filesystem size (GB) a launch of this model receives — the platform default where the upstream honors a configured size, otherwise the machine's reported disk; varies per offering — see cpu_cores. 0 marks an unreported disk (unknown, not zero). GET /v1/pricing carries the exact per-offering value.","type":"integer"},"ram_gb":{"description":"Representative host RAM (GB) for this GPU model; varies per offering — see cpu_cores. 0 marks an unreported spec.","type":"integer"},"storage_gb":{"description":"Representative host storage (GB) for this GPU model; varies per offering — see cpu_cores. 0 marks an unreported spec.","type":"integer"},"vram_gb":{"type":"integer"}},"required":["gpu_type","vram_gb"],"type":"object"},"GPUTypePage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GPUType"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"},"ImagesGenerationsRequest":{"properties":{"model":{"description":"Customer-facing image model id (e.g. gpuai/flux.1-schnell) or alias.","type":"string"},"n":{"default":1,"description":"Number of images to generate. Defaults to 1.","minimum":1,"type":"integer"},"prompt":{"description":"Text description of the image(s) to generate.","type":"string"},"response_format":{"default":"b64_json","description":"Only b64_json is supported. A value of \"url\" is rejected with invalid_request_error until S3-backed URL delivery lands.","enum":["b64_json"],"type":"string"},"size":{"description":"Output image dimensions as WxH (e.g. 1024x1024).","type":"string"}},"required":["model","prompt"],"type":"object"},"ImagesResponse":{"properties":{"created":{"description":"Unix timestamp (seconds) when the response was created.","type":"integer"},"data":{"items":{"properties":{"b64_json":{"description":"Base64-encoded image bytes.","type":"string"}},"required":["b64_json"],"type":"object"},"type":"array"},"usage":{"properties":{"image_count":{"description":"Number of images generated (the billable unit).","type":"integer"}},"required":["image_count"],"type":"object"}},"required":["created","data","usage"],"type":"object"},"IncludeItem":{"properties":{"name":{"example":"PyTorch","type":"string"},"version":{"description":"Resolved build version; absent for unpinned components (e.g. git).","example":"2.13.0","type":"string"}},"required":["name"],"type":"object"},"Instance":{"properties":{"auto_terminate_at":{"description":"When the runtime limit expires and the platform terminates this instance. Computed when the instance became running (ready_at + auto_terminate_hours), so the countdown covers usable runtime, not the time spent provisioning. Absent when no limit was set, when the instance is not running yet, or once the platform has begun acting on an elapsed limit.","format":"date-time","type":"string"},"auto_terminate_hours":{"description":"The runtime limit this instance was launched with, in hours (the `auto_terminate_hours` you sent). Absent means the instance runs until something stops it. It stays present after the limit has fired, so a terminated instance still explains itself.","example":8,"type":"integer"},"connection":{"nullable":true,"properties":{"app_password":{"description":"HTTP Basic Auth password for app_url and terminal_url. Treat as a secret. OMITTED by default from all reads — returned only on GET /instances/{id}?include=credentials (same persistence availability as app_user); the list endpoint and operation results never include it.","type":"string"},"app_url":{"description":"HTTPS URL of the deployed application (template instances only), e.g. https://gpu-abcd1234.apps.gpu.ai.","type":"string"},"app_user":{"description":"HTTP Basic Auth username for app_url and terminal_url. Present on instances provisioned after the credential-persistence change; older deploys omit it (their credential was only surfaced once at deploy time).","type":"string"},"hostname":{"type":"string"},"port":{"type":"integer"},"ssh_command":{"type":"string"},"terminal_url":{"description":"HTTPS URL of the browser web console (a shell on the instance, no SSH key required), e.g. https://gpu-abcd1234-term.apps.gpu.ai. Guarded by the same app_user/app_password login. Present only on running instances provisioned with the console.","type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"disk_gb":{"description":"Instance filesystem size in GB that the platform configured for this launch. Present only where the placed capacity honors a configured disk size; absent means the machine's disk is provider-determined (its own flavor volume).","type":"integer"},"gpu_count":{"maximum":8,"minimum":1,"type":"integer"},"gpu_type":{"type":"string"},"id":{"type":"string"},"image":{"description":"The customer-supplied container image this instance was launched from, digest-pinned at verification time (e.g. `ghcr.io/acme/trainer:v1@sha256:…`). Present only on custom-image launches; template and certified launches never expose their images here.","type":"string"},"last_reachable_at":{"description":"Last time the platform verified the SSH path to this instance end-to-end through the tunnel. Absent means the instance has not been probed yet (freshly launched, or no tunnel) — it does NOT mean unreachable. An instance whose status is still \"running\" while this timestamp stops advancing is one whose SSH has died even though the machine is up.","format":"date-time","nullable":true,"type":"string"},"name":{"nullable":true,"type":"string"},"price_per_hour":{"description":"hourly rate for the whole instance — covers all gpu_count GPUs","format":"double","type":"number"},"ready_at":{"format":"date-time","nullable":true,"type":"string"},"region":{"type":"string"},"status":{"description":"Customer-facing lifecycle status. \"allocating\" = the GPU is still being acquired from the provider (slow-boot capacity such as baremetal can take ~15 min); \"starting\" = the node exists and is booting; \"running\" = ready to use. \"unreachable\" = the platform's tunnel probe has confirmed the SSH path is down while the machine may still be up: the instance is NOT usable right now, billing for the confirmed-dead window is auto-credited back, and the instance either recovers to \"running\" on its own or is failed after a grace window. It is a degraded reading of a running instance, not a separate lifecycle state — see unreachable_since.","enum":["allocating","starting","running","stopping","stopped","terminated","unreachable","error"],"type":"string"},"status_reason":{"description":"Why the instance stopped or failed, e.g. \"provisioning stalled: the instance started but never became reachable\", or — when a runtime limit fired — \"Terminated: this instance reached the 8-hour runtime limit set at launch\". Present only when the platform has something to explain.","type":"string"},"terminated_at":{"format":"date-time","nullable":true,"type":"string"},"tier":{"description":"`spot` is soft-deprecated: spot capacity is currently unavailable sitewide (requests with tier=spot return no offerings); use on_demand.","enum":["spot","on_demand"],"type":"string","x-gpuai-deprecated-enum-values":["spot"]},"unreachable_since":{"description":"Start of the confirmed tunnel outage the instance is currently in. Present exactly when status is \"unreachable\", absent otherwise. It is the timestamp the auto-credit for the dead window is computed from, so a ledger credit can be reconciled against it.","format":"date-time","nullable":true,"type":"string"}},"required":["id","status","gpu_type","gpu_count","region","tier","price_per_hour","created_at"],"type":"object"},"InstancePage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Instance"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"},"Model":{"properties":{"aliases":{"items":{"type":"string"},"type":"array"},"author":{"description":"Model creator/organization (e.g. \"Meta\", \"Qwen\", \"Black Forest Labs\").","type":"string"},"category":{"description":"Browse-facing category; mirrors modality (chat/image/video/embedding).","type":"string"},"context_length":{"type":"integer"},"created":{"type":"integer"},"fine_tunable":{"description":"Whether this model can be used as the base of a managed fine-tuning job. The tunable allowlist is operator-curated and much narrower than the serving catalog, so this is false for almost every model. Absent means false.","type":"boolean"},"fine_tune_base_model":{"description":"The exact id to send as `model` when creating a fine-tuning job for this entry. Present only when `fine_tunable` is true, and deliberately distinct from `id`: the allowlist matches the customer-facing base id (e.g. `qwen2.5-7b-instruct`), which a served model normally carries as an alias rather than as its namespaced catalog id.","type":"string"},"id":{"type":"string"},"modality":{"enum":["chat","image","video","embedding"],"type":"string"},"object":{"enum":["model"],"type":"string"},"owned_by":{"type":"string"},"parameters":{"description":"Typed parameter descriptors for media (image/video) models — name, type, enum/bounds/default. Playgrounds render input forms from these.","items":{"properties":{"default":{"description":"Default value for the field (any JSON scalar)."},"enum":{"items":{"type":"string"},"type":"array"},"max":{"type":"integer"},"min":{"type":"integer"},"name":{"type":"string"},"type":{"enum":["enum","int","string","bool"],"type":"string"}},"required":["name","type"],"type":"object"},"type":"array"},"pricing":{"properties":{"currency":{"type":"string"},"input_per_1m_tokens_cents":{"type":"integer"},"output_per_1m_tokens_cents":{"type":"integer"},"per_image_cents":{"type":"integer"},"per_image_microcents":{"description":"Exact per-image rate in micro-cents (1e-6 cent). Prefer this for image models — per_image_cents rounds sub-cent prices to 0.","type":"integer"},"per_mpxl_microcents":{"description":"Price per output megapixel in micro-cents (1e-6 cent) for image models metered per megapixel. Mutually exclusive with the per-image fields.","type":"integer"},"per_video_microcents":{"description":"Representative per-clip price in micro-cents (1e-6 cent) for video models — a \"from\" price taken from the provider's published example rate.","type":"integer"},"per_video_second_cents":{"type":"integer"},"per_video_second_microcents":{"description":"Exact per-second-of-output-video rate in micro-cents (1e-6 cent). Prefer this for video models.","type":"integer"}},"type":"object"},"status":{"enum":["active","coming_soon","deprecated"],"type":"string"},"supported_parameters":{"items":{"type":"string"},"type":"array"}},"required":["id","object","owned_by","modality","status","pricing"],"type":"object"},"ModelList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Model"},"type":"array"},"object":{"enum":["list"],"type":"string"}},"required":["object","data"],"type":"object"},"OpenAIErrorEnvelope":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code.","type":"string"},"message":{"type":"string"},"param":{"nullable":true,"type":"string"},"type":{"description":"OpenAI error class (e.g. invalid_request_error, authentication_error, billing_error).","type":"string"}},"required":["message","type","code"],"type":"object"}},"required":["error"],"type":"object"},"Operation":{"properties":{"completed_at":{"format":"date-time","nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"error":{"nullable":true,"properties":{"code":{"type":"string"},"detail":{"type":"string"}},"type":"object"},"kind":{"enum":["instance.create","instance.delete"],"type":"string"},"operation_id":{"format":"uuid","type":"string"},"resource_id":{"nullable":true,"type":"string"},"result":{"description":"Terminal-success payload. Carries the per-instance web-access coordinates — app_url for template deploys, terminal_url for instances provisioned with the browser web console, and the basic-auth username shared by both. The basic-auth PASSWORD is never included here — retrieve it via GET /instances/{id}?include=credentials (connection.app_password).","properties":{"app_basic_auth_user":{"type":"string"},"app_url":{"type":"string"},"terminal_url":{"type":"string"}},"type":"object"},"state":{"enum":["pending","in_progress","succeeded","failed","cancelled"],"type":"string"},"updated_at":{"format":"date-time","type":"string"},"warnings":{"description":"Create-time advisories, present only on the synchronous 202 from POST /instances (never on GET /operations/{id} polls) — e.g. the model-size guard failing open because a template deploy's MODEL is a gated or unknown Hugging Face repo whose size could not be verified.","items":{"type":"string"},"type":"array"}},"required":["operation_id","kind","state","created_at"],"type":"object"},"Pricing":{"properties":{"available":{"description":"count of available units, summed across merged identical offers","type":"integer"},"capacity_class":{"description":"per-offering capacity classification — \"secure\" for datacenter-operated hardware, \"community\" for supplier/peer-hosted hardware with a softer SLA. The string twin of `community`, classified per offering rather than per upstream. May transiently be empty for cache entries written before the field existed.","enum":["secure","community",""],"type":"string"},"community":{"description":"true when this offering is community-supplied capacity","type":"boolean"},"cpu_cores":{"description":"host vCPU count for this offering, tied to the shown (cheapest) price. 0 marks an unreported spec.","type":"integer"},"disk_configurable":{"description":"true when a launch of this offering may choose its own disk size via the create request's disk_gb. A distinguishing field in the offer merge — configurable and fixed-disk capacity for the same SKU stay separate rows.","type":"boolean"},"disk_price_per_gb_hour":{"description":"Retail price of one GB of instance disk beyond instance_disk_gb, per hour, for launches of this offering. A launch requesting disk_gb above instance_disk_gb is billed approximately price_per_hour + (disk_gb − instance_disk_gb) × disk_price_per_gb_hour (the exact billed rate folds disk into one cent-rounded hourly price). 0 when the offering is not disk-configurable, or when disk above the included allowance is currently free.","format":"double","type":"number"},"gpu_count":{"description":"number of GPUs in the listed configuration","type":"integer"},"gpu_type":{"type":"string"},"instance_disk_gb":{"description":"Instance filesystem size (GB) a launch of THIS offering receives — the platform default where the upstream honors a configured size, otherwise the machine's own reported disk; tied to the shown (cheapest) price like cpu_cores. 0 marks an unreported disk (unknown, not zero).","type":"integer"},"instant_boot":{"description":"true when instances of this offering are typically reachable within about a minute of launch; false for capacity with longer provisioning times (~3-5 minutes)","type":"boolean"},"price_per_hour":{"description":"hourly price for the whole listed configuration — covers all gpu_count GPUs","format":"double","type":"number"},"ram_gb":{"description":"host RAM (GB) for this offering, tied to the shown price. 0 marks an unreported spec.","type":"integer"},"region":{"type":"string"},"storage_gb":{"description":"host storage (GB) for this offering, tied to the shown price. 0 marks an unreported spec.","type":"integer"},"tier":{"description":"`spot` is soft-deprecated: spot capacity is currently unavailable sitewide (requests with tier=spot return no offerings); use on_demand.","enum":["spot","on_demand"],"type":"string","x-gpuai-deprecated-enum-values":["spot"]}},"required":["gpu_type","gpu_count","region","tier","price_per_hour","available","instant_boot","community"],"type":"object"},"PricingPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Pricing"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"},"Problem":{"properties":{"code":{"enum":["unauthenticated","invalid_api_key","insufficient_scope","not_found","idempotency_conflict","idempotency_mismatch","validation_failed","invalid_gpu_type","disk_unavailable","disk_exceeds_offering","model_too_large","gpu_vram_too_small","price_changed","insufficient_balance","quota_exceeded","rate_limited","internal_error","operation_failed"],"type":"string"},"detail":{"type":"string"},"request_id":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"format":"uri","type":"string"}},"required":["type","title","status","detail","code","request_id"],"type":"object"},"RegisterCommunityMachineRequest":{"description":"All fields optional; an empty body registers a zero-spec placeholder in pending_verification.","properties":{"gpu_count":{"maximum":64,"minimum":1,"type":"integer"},"gpu_type":{"maxLength":50,"type":"string"},"price_per_hour":{"maximum":10000,"minimum":0,"type":"number"},"region":{"maxLength":50,"type":"string"},"tier":{"description":"Supplier-chosen rental model. Optional; omitted resolves to on_demand. spot lists the machine as cheaper interruptible capacity.","enum":["on_demand","spot"],"type":"string"},"vram_per_gpu_gb":{"maximum":2048,"minimum":1,"type":"integer"}},"type":"object"},"RegistryCredential":{"description":"A stored private-registry login (metadata only — the password is write-only and encrypted at rest).","properties":{"created_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"name":{"example":"ghcr-acme","type":"string"},"registry":{"example":"ghcr.io","type":"string"},"username":{"type":"string"}},"type":"object"},"SSHKey":{"properties":{"created_at":{"format":"date-time","type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name","fingerprint","created_at"],"type":"object"},"SSHKeyPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SSHKey"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"},"SpendingLimit":{"properties":{"auto_terminate_hours":{"nullable":true,"type":"integer"},"billing_cycle_start":{"format":"date-time","type":"string"},"current_day_spend_cents":{"type":"integer"},"current_month_spend_cents":{"type":"integer"},"current_month_spend_dollars":{"type":"number"},"daily_limit_cents":{"nullable":true,"type":"integer"},"daily_limit_dollars":{"nullable":true,"type":"number"},"enforcement":{"enum":["stop_running","block_launch","notify_only"],"type":"string"},"monthly_limit_cents":{"type":"integer"},"monthly_limit_dollars":{"type":"number"},"percent_used":{"type":"number"}},"required":["monthly_limit_cents","monthly_limit_dollars","current_month_spend_cents","current_month_spend_dollars","percent_used","billing_cycle_start","enforcement","current_day_spend_cents"],"type":"object"},"StreamOptions":{"properties":{"include_usage":{"default":true,"description":"When true, the final stream chunk carries usage totals (CHAT-03).","type":"boolean"}},"type":"object"},"SupplierMachineView":{"description":"The supplier-facing projection of a community machine. `occupied` replaces the renting customer's instance id (never exposed to the supplier); `online` is the server-derived 60s-heartbeat liveness.","properties":{"agent_version":{"nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"delist_reason":{"nullable":true,"type":"string"},"first_heartbeat_at":{"format":"date-time","nullable":true,"type":"string"},"gpu_count":{"nullable":true,"type":"integer"},"gpu_type":{"nullable":true,"type":"string"},"last_heartbeat_at":{"format":"date-time","nullable":true,"type":"string"},"machine_id":{"format":"uuid","type":"string"},"occupied":{"description":"A customer instance is currently renting this machine.","type":"boolean"},"online":{"description":"Server-derived — heartbeated within the last 60 seconds.","type":"boolean"},"price_per_hour":{"description":"Whole-machine hourly rate (never per-GPU).","nullable":true,"type":"number"},"region":{"nullable":true,"type":"string"},"reliability_score":{"description":"Server-computed 0–100; machines below the platform threshold are auto-delisted.","nullable":true,"type":"number"},"status":{"enum":["pending_verification","listed","delisted","suspended","draining"],"type":"string"},"suspend_reason":{"nullable":true,"type":"string"},"tier":{"enum":["on_demand","spot"],"type":"string"},"verification_status":{"enum":["unverified","verified","failed"],"type":"string"},"vram_per_gpu_gb":{"nullable":true,"type":"integer"}},"required":["machine_id","tier","status","verification_status","online","occupied","created_at"],"type":"object"},"Template":{"description":"A deployable application template. The container image (registry path) and start command are internal orchestration details and are intentionally absent from this schema (TMPL-13 defense-by-omission).","properties":{"category":{"type":"string"},"container_disk_gb":{"type":"integer"},"description":{"type":"string"},"display_name":{"type":"string"},"docs_url":{"type":"string"},"env":{"items":{"properties":{"default":{"type":"string"},"key":{"type":"string"},"secret":{"type":"boolean"},"user_overridable":{"type":"boolean"}},"type":"object"},"type":"array"},"id":{"type":"string"},"includes":{"items":{"type":"string"},"type":"array"},"kind":{"description":"Deployable kind. \"service\" is a long-running app exposed at connection.app_url. \"finetuning\" is a run-to-completion job (no app_url) and is currently advertised only as a coming-soon catalog entry — not yet deployable.","enum":["service","finetuning"],"type":"string"},"min_gpu_count":{"type":"integer"},"min_vram_gb":{"type":"integer"},"ports":{"items":{"properties":{"port":{"type":"integer"},"primary":{"type":"boolean"},"protocol":{"enum":["http","tcp"],"type":"string"}},"type":"object"},"type":"array"},"status":{"enum":["coming_soon"],"type":"string"}},"required":["id","display_name","category","kind","ports"],"type":"object"},"TemplateList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Template"},"type":"array"},"object":{"enum":["list"],"type":"string"}},"required":["object","data"],"type":"object"},"UpdateCommunityMachineRequest":{"properties":{"price_per_hour":{"description":"Whole-machine hourly rate (never per-GPU). Must clear the platform floor; a below-floor price is rejected with `price-below-floor` carrying the concrete `floor_per_hour`.","maximum":10000,"minimum":0,"type":"number"}},"required":["price_per_hour"],"type":"object"},"Usage":{"properties":{"completion_tokens":{"type":"integer"},"prompt_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}},"required":["prompt_tokens","completion_tokens","total_tokens"],"type":"object"},"UsageBucket":{"properties":{"bucket_start":{"format":"date-time","type":"string"},"cost_cents":{"type":"integer"},"gpu_seconds":{"type":"integer"},"gpu_type":{"nullable":true,"type":"string"},"instance_id":{"nullable":true,"type":"string"}},"required":["bucket_start","gpu_seconds","cost_cents"],"type":"object"},"UsagePage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/UsageBucket"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"},"VMImage":{"properties":{"driver_preinstalled":{"description":"true when the image ships the NVIDIA driver + CUDA baked in.","type":"boolean"},"family":{"example":"ubuntu","type":"string"},"label":{"example":"Ubuntu 24.04 LTS","type":"string"},"version":{"example":"24.04","type":"string"}},"required":["label","family","version"],"type":"object"},"VideoCreateRequest":{"properties":{"model":{"description":"Customer-facing video model id (e.g. gpuai/wan-2.2-t2v) or alias.","type":"string"},"prompt":{"description":"Text description of the video to generate.","type":"string"},"seconds":{"description":"Output video duration in seconds (the billable unit).","minimum":1,"type":"integer"},"size":{"description":"Output video dimensions as WxH (e.g. 1280x720).","type":"string"}},"required":["model","prompt"],"type":"object"},"VideoJob":{"properties":{"completed_at":{"description":"Unix timestamp (seconds) when the job completed.","nullable":true,"type":"integer"},"cost_cents":{"description":"Final billed cost in cents; present once the job completes (failed/cancelled jobs are never billed).","nullable":true,"type":"integer"},"created_at":{"description":"Unix timestamp (seconds) when the job was created.","type":"integer"},"error":{"description":"Canonical failure code when status is failed.","nullable":true,"type":"string"},"expires_at":{"description":"Unix timestamp (seconds) when the artifact expires (24h after completion).","nullable":true,"type":"integer"},"id":{"type":"string"},"model":{"type":"string"},"object":{"enum":["video"],"type":"string"},"progress":{"description":"Generation progress 0-100.","type":"integer"},"seconds":{"type":"integer"},"size":{"type":"string"},"status":{"enum":["queued","in_progress","completed","failed","cancelled","expired"],"type":"string"}},"required":["id","object","model","status","progress","created_at"],"type":"object"},"VideoList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VideoJob"},"type":"array"},"has_more":{"type":"boolean"},"object":{"enum":["list"],"type":"string"}},"required":["object","data","has_more"],"type":"object"},"WebhookEndpoint":{"properties":{"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"event_types":{"items":{"enum":["instance.creating","instance.running","instance.terminated","instance.failed","video.completed","video.failed"],"type":"string"},"type":"array"},"id":{"format":"uuid","type":"string"},"secret":{"description":"Returned ONLY at creation; subsequent reads omit.","type":"string"},"url":{"format":"uri","type":"string"}},"required":["id","url","event_types","enabled","created_at"],"type":"object"},"WebhookEndpointPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookEndpoint"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"gpuai_live_\u003c24-base62\u003e","scheme":"bearer","type":"http"}}},"info":{"contact":{"email":"support@gpu.ai","name":"GPU.ai Support"},"description":"Programmatic API for GPU.ai. Authenticate with API keys minted from\nthe dashboard. See https://gpu.ai/docs for details.\n","license":{"identifier":"Apache-2.0","name":"Apache-2.0"},"title":"GPU.ai Public Developer API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/billing/deposits":{"get":{"description":"Returns the organization's stablecoin deposits, newest first, capped at 50. Requires the `billing:read` scope. The organization is taken from the authenticated API key, never from a parameter. Returns 404 when stablecoin deposits are not enabled for this deployment.\n","operationId":"listDeposits","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"deposits":{"items":{"$ref":"#/components/schemas/CryptoDeposit"},"type":"array"},"min_deposit_cents":{"description":"The effective minimum deposit in USD cents (admin override, else the deployment's configured floor). Validate amounts against this live value rather than hardcoding the default.","example":500,"format":"int64","type":"integer"}},"required":["deposits","min_deposit_cents"],"type":"object"}}},"description":"OK"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"List stablecoin deposits","tags":["Billing"]}},"/billing/deposits/crypto":{"post":{"description":"Creates a deposit intent and returns the payment address and the exact token amount to send. Requires the `billing:write` scope; any member of the organization may add funds. Send the exact `pay_amount` of `asset` on `chain` and no other network — funds sent on a different network are not detected automatically. Returns 404 when stablecoin deposits are not enabled for this deployment.\n","operationId":"createCryptoDeposit","requestBody":{"content":{"application/json":{"schema":{"properties":{"amount_cents":{"description":"Amount to deposit in USD cents. Must be at least the configured minimum (500 = $5.00 by default).\n","type":"integer"},"asset":{"enum":["usdc","usdt"],"type":"string"},"chain":{"enum":["ethereum","base","arbitrum","polygon","solana"],"type":"string"}},"required":["amount_cents","chain","asset"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CryptoDeposit"}}},"description":"Created"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`validation-error` — `amount_cents` is below the configured minimum. `unsupported-chain-asset` — the chain/asset pair is not available. `invalid-request` — malformed JSON body.\n"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`org-frozen` — the organization cannot add funds; contact support."},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`payment-source-unavailable` — deposits are temporarily unavailable; retry shortly."},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Create a stablecoin deposit","tags":["Billing"]}},"/billing/deposits/{id}":{"get":{"description":"Returns a single deposit belonging to the caller's organization. Requires the `billing:read` scope. A deposit belonging to another organization returns the same `404 deposit-not-found` as one that does not exist — deliberately, so this endpoint cannot be used to test whether a deposit id is real. Also 404 when stablecoin deposits are not enabled for this deployment.\n","operationId":"getDeposit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CryptoDeposit"}}},"description":"OK"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"`deposit-not-found` — no such deposit, or it belongs to another organization. `not-found` — the feature is not enabled.\n"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get one stablecoin deposit","tags":["Billing"]},"parameters":[{"description":"The deposit id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}]},"/billing/spending-limit":{"get":{"description":"Returns the organization's monthly spending limit and opt-in daily spend cap, with the current month and day spend. Requires the `billing:read` scope. Returns 404 when no limit is configured.\n","operationId":"getSpendingLimit","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingLimit"}}},"description":"OK"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get the org spending limit","tags":["Billing"]},"put":{"description":"Sets the monthly spending limit and optionally sets or clears the opt-in daily spend cap. Requires the `billing:write` scope AND org-admin privileges (a non-admin member gets 403). `daily_limit_dollars` uses pointer semantics: omit to leave the cap unchanged, 0 to clear it, a positive value to set it.\n","operationId":"updateSpendingLimit","requestBody":{"content":{"application/json":{"schema":{"properties":{"auto_terminate_hours":{"description":"Hours after the limit is reached before auto-terminate; null = never.","nullable":true,"type":"integer"},"daily_limit_dollars":{"description":"Opt-in daily cap in USD. Omit = unchanged, 0 = clear, \u003e 0 = set.","type":"number"},"enforcement":{"enum":["stop_running","block_launch","notify_only"],"type":"string"},"monthly_limit_dollars":{"description":"Monthly limit in USD (minimum 1.00).","type":"number"}},"required":["monthly_limit_dollars"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingLimit"}}},"description":"OK"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Set the org spending limit","tags":["Billing"]}},"/chat/completions":{"post":{"operationId":"createChatCompletion","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionResponse"}},"text/event-stream":{"schema":{"description":"Server-Sent Events stream of ChatCompletionChunk objects, terminated by `data: [DONE]`.","format":"binary","type":"string"}}},"description":"Successful response. application/json for non-streaming requests;\ntext/event-stream for streaming requests (stream=true).\n"},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"402":{"$ref":"#/components/responses/OpenAIPaymentRequired"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"422":{"$ref":"#/components/responses/OpenAIUnprocessableEntity"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"},"503":{"$ref":"#/components/responses/OpenAIUpstreamUnavailable"}},"security":[{"bearerAuth":[]}],"summary":"Create a chat completion (OpenAI-compatible)","tags":["Inference"]}},"/community/earnings":{"get":{"description":"Returns the caller org's supplier earnings — lifetime accrued and unpaid totals in cents plus recent ledger entries, newest first. An optional `limit` caps the ledger rows (server-clamped). Requires the `community` scope (read).","operationId":"getCommunityEarnings","parameters":[{"description":"Maximum ledger entries to return (default 100, max 500).","in":"query","name":"limit","schema":{"maximum":500,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityEarnings"}}},"description":"The earnings view."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The organization has not enabled the community supplier role."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Get your Community Cloud earnings","tags":["Community"]},"x-dark-launch":true},"/community/machines":{"get":{"description":"Returns every machine the caller's org has registered, newest first, as supplier-facing views (`occupied`/`online` projections — the renting customer's instance id is never exposed). Requires the `community` scope (read).","operationId":"listCommunityMachines","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"machines":{"items":{"$ref":"#/components/schemas/SupplierMachineView"},"type":"array"}},"required":["machines"],"type":"object"}}},"description":"The caller's machines."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The organization has not enabled the community supplier role."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"List your Community Cloud machines","tags":["Community"]},"post":{"description":"Registers a self-declared machine under the caller's community supplier and mints a one-time enrollment token. All spec fields are optional — an empty body registers a placeholder in `pending_verification`. The `enrollment_token` is shown exactly once and never returned again. Requires the `community` scope (or `full_access`).","operationId":"registerCommunityMachine","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterCommunityMachineRequest"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityMachineRegistration"}}},"description":"The registered machine plus its one-time enrollment token."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role is suspended."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role has not been enabled yet."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Register a Community Cloud machine","tags":["Community"]}},"/community/machines/{id}":{"get":{"description":"Returns one machine the caller's org owns, as a supplier-facing view (`occupied`/`online` projections — the renting customer's instance id is never exposed). A missing or cross-org machine returns 404 with an indistinguishable body. Requires the `community` scope (read).","operationId":"getCommunityMachine","parameters":[{"description":"The machine id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierMachineView"}}},"description":"The supplier-facing machine view."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The machine does not exist or is not owned by the caller's org."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Get one of your Community Cloud machines","tags":["Community"]},"patch":{"description":"Sets the machine's hourly price. `price_per_hour` is the WHOLE-MACHINE rate (never per-GPU). Prices below the platform floor are rejected with a `price-below-floor` problem carrying the concrete `floor_per_hour` extension member. A price change never affects an in-flight rental (its rate was snapshotted at provision); the catalog reprices on the next poll. Requires the `community` scope (or `full_access`).","operationId":"updateCommunityMachine","parameters":[{"description":"The machine id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommunityMachineRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierMachineView"}}},"description":"The updated supplier-facing machine view."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Validation failure, including `price-below-floor` (the problem doc then carries `floor_per_hour`)."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role is suspended."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The machine does not exist or is not owned by the caller's org."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Update a Community Cloud machine's price","tags":["Community"]},"x-dark-launch":true},"/community/machines/{id}/delist":{"post":{"description":"Removes a machine the caller's org owns from supply (ONBD-04). Drain-not-kill: an occupied machine becomes `draining` (its customer rental keeps running until it ends naturally) and an idle machine becomes `delisted`. The endpoint never force-terminates a running rental. A missing or cross-org machine returns 404 with an indistinguishable body so existence never leaks across orgs. Requires the `community` scope (or `full_access`).","operationId":"delistCommunityMachine","parameters":[{"description":"The machine id to delist.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityMachineDelistResult"}}},"description":"The terminal status the machine reached."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role is suspended."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The machine does not exist or is not owned by the caller's org."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role has not been enabled yet."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Delist a Community Cloud machine","tags":["Community"]}},"/community/machines/{id}/reclaim":{"post":{"description":"The spot interruption mechanic — the supplier takes back a machine they listed as interruptible (tier=spot). Drain-not-kill: an occupied machine becomes `draining` (the renter gets the grace window, surfaced to the spot router as a preemption warning) and an idle machine becomes `delisted`. An on-demand machine cannot be reclaimed (409 `machine-not-spot`) — use delist instead. Requires the `community` scope (or `full_access`).","operationId":"reclaimCommunityMachine","parameters":[{"description":"The machine id to reclaim.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityMachineDelistResult"}}},"description":"The status the machine reached."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The community supplier role is suspended."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The machine does not exist or is not owned by the caller's org."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The supplier role has not been enabled, or the machine is on-demand capacity (`machine-not-spot`)."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Reclaim a spot-tier Community Cloud machine","tags":["Community"]}},"/community/suppliers":{"post":{"description":"Idempotently enables the Community Cloud supplier role for the organization the API key belongs to. A repeat call is a no-op that returns the same supplier record (200, not 201). Requires the `community` scope (or `full_access`).","operationId":"enableCommunitySupplier","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunitySupplier"}}},"description":"The community supplier record (created or already-existing)."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Enable the Community Cloud supplier role","tags":["Community"]}},"/community/suppliers/me":{"get":{"description":"Returns the community supplier record for the organization the API key belongs to, or 404 `not-a-supplier` when the role has not been enabled. Requires the `community` scope (read).","operationId":"getCommunitySupplierMe","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunitySupplier"}}},"description":"The community supplier record."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The organization has not enabled the community supplier role."},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Get the caller's Community Cloud supplier","tags":["Community"]}},"/embeddings":{"post":{"description":"Synchronous text embeddings. Accepts a single string or an array of up to 2048 strings, bounded so the response stays under 64 MiB (about 680 inputs at 4096 dimensions; fewer at a larger `dimensions` value) — over-limit requests are rejected with 400 before any processing. Returns one float vector per input, in request order. Billed on the upstream's reported prompt tokens at the model's listed input rate, rounded up to the next whole cent per request; an embeddings call emits no completion tokens, so `usage` carries `prompt_tokens` and `total_tokens` only. `encoding_format` accepts only `float` — a value of `base64` is rejected with `unsupported_parameter`. A chat model id on this route returns 404 `model_not_found`: the id is valid, but not on this surface.","operationId":"createEmbeddings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingsResponse"}}},"description":"One embedding vector per input, in request order."},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"402":{"$ref":"#/components/responses/OpenAIPaymentRequired"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"413":{"$ref":"#/components/responses/OpenAIRequestTooLarge"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"},"502":{"$ref":"#/components/responses/OpenAIBadGateway"},"503":{"$ref":"#/components/responses/OpenAIUpstreamUnavailable"},"504":{"$ref":"#/components/responses/OpenAIUpstreamTimeout"}},"security":[{"bearerAuth":[]}],"summary":"Create embeddings (OpenAI-compatible)","tags":["Inference"]}},"/environments":{"get":{"description":"The server-controlled launch environment catalog — the certified framework roster, the selectable version(s) per framework (the version picker), the \"What's included\" software lists, and the raw-VM OS catalog. These are exactly the values accepted by the `environment` field of POST /v1/instances.","operationId":"getEnvironments","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Environments"}}},"description":"OK"},"default":{"$ref":"#/components/responses/Problem"}},"security":[],"summary":"List launch environments (no auth required)","tags":["Environments"]}},"/files":{"post":{"operationId":"createFile","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"description":"A JSONL chat-format training dataset.","format":"binary","type":"string"},"purpose":{"enum":["fine-tune"],"type":"string"}},"required":["purpose","file"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileObject"}}},"description":"The uploaded file object."},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"}},"security":[{"bearerAuth":[]}],"summary":"Upload a fine-tuning dataset file (OpenAI-compatible)","tags":["FineTuning"]}},"/files/{id}":{"get":{"description":"Returns the metadata for one of your uploaded files. The lookup is scoped to the organization the API key belongs to: a file id that does not exist and one that belongs to another organization both return the same 404, so this route cannot be used to probe for other tenants' ids.\n\nUse it to check that a `training_file` is present and usable BEFORE creating a fine-tuning job — the create path performs the identical ownership check, so a file this route returns is a file that create will accept.","operationId":"retrieveFile","parameters":[{"description":"The file id returned by the upload, e.g. `file-9f2c1a...`.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileObject"}}},"description":"The file object."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"}},"security":[{"bearerAuth":[]}],"summary":"Retrieve a file (OpenAI-compatible)","tags":["FineTuning"]}},"/fine_tuning/jobs":{"get":{"operationId":"listFineTuningJobs","parameters":[{"in":"query","name":"after","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FineTuningJobList"}}},"description":"A page of fine-tuning jobs."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"List fine-tuning jobs (OpenAI-compatible)","tags":["FineTuning"]},"post":{"operationId":"createFineTuningJob","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFineTuningJobRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FineTuningJob"}}},"description":"The created fine-tuning job."},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"402":{"$ref":"#/components/responses/OpenAIPaymentRequired"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"422":{"$ref":"#/components/responses/OpenAIUnprocessableEntity"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a managed fine-tuning job (OpenAI-compatible)","tags":["FineTuning"]}},"/fine_tuning/jobs/{id}":{"get":{"operationId":"getFineTuningJob","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FineTuningJob"}}},"description":"The fine-tuning job."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Retrieve a fine-tuning job (OpenAI-compatible)","tags":["FineTuning"]}},"/fine_tuning/jobs/{id}/cancel":{"post":{"operationId":"cancelFineTuningJob","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FineTuningJob"}}},"description":"The cancelled fine-tuning job."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Cancel a fine-tuning job (OpenAI-compatible)","tags":["FineTuning"]}},"/fine_tuning/jobs/{id}/events":{"get":{"operationId":"listFineTuningJobEvents","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"after","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FineTuningJobEventList"}}},"description":"A page of fine-tuning job events."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"List fine-tuning job events (OpenAI-compatible)","tags":["FineTuning"]}},"/gpu-types":{"get":{"operationId":"listGpuTypes","parameters":[{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"$ref":"#/components/responses/GPUTypePage"},"default":{"$ref":"#/components/responses/Problem"}},"security":[],"summary":"List available GPU types (no auth required)","tags":["GpuTypes"]}},"/health":{"get":{"operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"const":"ok","type":"string"}},"type":"object"}}},"description":"OK"}},"security":[],"summary":"Liveness probe","tags":["Meta"]}},"/images/generations":{"post":{"description":"Synchronous text-to-image generation. Returns base64-encoded images only (`response_format` is restricted to `b64_json`); a value of `url` is rejected with `invalid_request_error` until S3-backed URL delivery lands. Pass an `Idempotency-Key` header to make a retried request replay the original response without a second charge.","operationId":"createImage","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesGenerationsRequest"}}},"required":true},"responses":{"200":{"$ref":"#/components/responses/OpenAIImages"},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"402":{"$ref":"#/components/responses/OpenAIPaymentRequired"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"422":{"$ref":"#/components/responses/OpenAIUnprocessableEntity"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"},"503":{"$ref":"#/components/responses/OpenAIUpstreamUnavailable"},"504":{"$ref":"#/components/responses/OpenAIUpstreamTimeout"}},"security":[{"bearerAuth":[]}],"summary":"Create image (OpenAI-compatible)","tags":["Inference"]}},"/instances":{"get":{"description":"Lists the organization's instances. By default terminated instances are excluded; pass status=terminated for the history or status=all for everything.","operationId":"listInstances","parameters":[{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"},{"description":"Filter by customer-facing status (default = all non-terminated). There is no \"unreachable\" filter value: an unreachable instance is a running instance with a dead tunnel, so it is listed under status=running and reads \"unreachable\" in the response body.","in":"query","name":"status","schema":{"enum":["allocating","starting","running","stopping","stopped","terminated","error","all"],"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/InstancePage"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"List instances","tags":["Instances"]},"post":{"operationId":"createInstance","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"$ref":"#/components/requestBodies/CreateInstance"},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"}}},"description":"Accepted; long-running operation","headers":{"Operation-Id":{"description":"Use GET /operations/{id} to poll","schema":{"type":"string"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Create an instance (async — returns 202 + Operation-Id header)","tags":["Instances"]}},"/instances/{id}":{"delete":{"description":"Members can terminate only instances they created; organization admins can terminate any instance in the organization.","operationId":"deleteInstance","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"}}},"description":"Accepted; termination in progress","headers":{"Operation-Id":{"schema":{"type":"string"}}}},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Forbidden — members can only terminate instances they created"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Already gone — idempotent terminate (D-07)"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Terminate an instance (idempotent)","tags":["Instances"]},"get":{"operationId":"getInstance","parameters":[{"description":"Opt-in expansion. `credentials` restores connection.app_password on this single-instance read — the only surface that returns the web-console basic-auth password. Omitted by default so bare reads can be logged without leaking the secret. Any other value is a 400 validation_failed. The list endpoint and operation reads never return the password, with or without this parameter.","in":"query","name":"include","required":false,"schema":{"enum":["credentials"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get an instance","tags":["Instances"]},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"patch":{"operationId":"updateInstance","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Update an instance (rename only in v1)","tags":["Instances"]}},"/models":{"get":{"operationId":"listModels","parameters":[{"in":"query","name":"modality","required":false,"schema":{"enum":["chat","image","video","embedding"],"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/OpenAIModelsList"},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"List available models (OpenAI-compatible)","tags":["Inference"]}},"/models/{id}":{"get":{"operationId":"getModel","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/OpenAIModel"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Get a specific model (OpenAI-compatible)","tags":["Inference"]}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"}},"security":[],"summary":"OpenAPI 3.1 specification","tags":["Meta"]}},"/operations/{id}":{"get":{"operationId":"getOperation","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get an async operation status","tags":["Operations"]}},"/pricing":{"get":{"description":"Lists every distinct offer (gpu_type, gpu_count, region, tier, price, boot class). Customer-identical offers are merged with availability summed. Offers with zero availability are omitted unless include_unavailable=true.","operationId":"listPricing","parameters":[{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"},{"description":"Exact-match filter on gpu_type","in":"query","name":"gpu_type","schema":{"type":"string"}},{"description":"Exact-match filter on canonical region code","in":"query","name":"region","schema":{"type":"string"}},{"description":"Exact-match filter on tier. `spot` is soft-deprecated: spot capacity is currently unavailable sitewide (requests with tier=spot return no offerings); use on_demand.","in":"query","name":"tier","schema":{"enum":["spot","on_demand"],"type":"string","x-gpuai-deprecated-enum-values":["spot"]}},{"description":"Include offers whose current availability is zero","in":"query","name":"include_unavailable","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"$ref":"#/components/responses/PricingPage"},"default":{"$ref":"#/components/responses/Problem"}},"security":[],"summary":"List pricing per GPU type + region (no auth required)","tags":["Pricing"]}},"/registry-credentials":{"get":{"description":"Lists the organization's stored private-registry logins for custom-image launches. Passwords are never returned by any read. 503 when the feature is not enabled on this environment.","operationId":"listRegistryCredentials","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RegistryCredential"},"type":"array"}},"type":"object"}}},"description":"Credential list"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"List registry credentials","tags":["RegistryCredentials"]},"post":{"description":"Stores a private-registry login for pulling private custom images. The password crosses the wire exactly once — here — and is encrypted at rest; no read ever returns it. Reference the returned id from `registry_credential_id` on instance creation. The credential's registry host must obey the same rules as image references (no localhost/private addresses); username and password must not contain whitespace. Duplicate names return 409 `name_taken`.","operationId":"createRegistryCredential","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Org-unique handle (at most 64 characters).","example":"ghcr-acme","type":"string"},"password":{"description":"Registry password or access token. Write-only.","type":"string"},"registry":{"description":"Registry host the login belongs to.","example":"ghcr.io","type":"string"},"username":{"type":"string"}},"required":["name","registry","username","password"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredential"}}},"description":"Credential stored (metadata only; no password)"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Store a registry credential","tags":["RegistryCredentials"]}},"/registry-credentials/{id}":{"delete":{"operationId":"deleteRegistryCredential","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Delete a registry credential","tags":["RegistryCredentials"]}},"/ssh-keys":{"get":{"description":"Returns the SSH keys owned by the user the API key was minted by. Org-wide key visibility is an admin capability in the dashboard.","operationId":"listSshKeys","parameters":[{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"$ref":"#/components/responses/SSHKeyPage"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"List SSH keys","tags":["SshKeys"]},"post":{"operationId":"createSshKey","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"type":"string"},"public_key":{"type":"string"}},"required":["name","public_key"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHKey"}}},"description":"Created"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Create an SSH key","tags":["SshKeys"]}},"/ssh-keys/{id}":{"delete":{"operationId":"deleteSshKey","responses":{"204":{"description":"Deleted"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Already deleted (idempotent)"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Delete an SSH key (idempotent — 404 on already-gone per D-07)","tags":["SshKeys"]},"get":{"operationId":"getSshKey","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHKey"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get an SSH key","tags":["SshKeys"]},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}]},"/templates":{"get":{"operationId":"listTemplates","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateList"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"List deployable application templates","tags":["Templates"]}},"/templates/{id}":{"get":{"operationId":"getTemplate","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}},"description":"OK"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"security":[{"bearerAuth":[]}],"summary":"Get one deployable application template","tags":["Templates"]}},"/usage":{"get":{"operationId":"listUsage","parameters":[{"in":"query","name":"bucket","schema":{"enum":["hour","day","week","month"],"type":"string"}},{"in":"query","name":"group_by","schema":{"enum":["instance_id","gpu_type"],"type":"string"}},{"in":"query","name":"start","schema":{"format":"date-time","type":"string"}},{"in":"query","name":"end","schema":{"format":"date-time","type":"string"}},{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"$ref":"#/components/responses/UsagePage"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Time-bucketed usage","tags":["Usage"]}},"/videos":{"get":{"operationId":"listVideos","parameters":[{"in":"query","name":"after","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"$ref":"#/components/responses/OpenAIVideoList"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"List video generation jobs","tags":["Inference"]},"post":{"description":"Submit an asynchronous text-to-video generation job. Returns a job object with status `queued`; poll GET /videos/{id} until `completed`, then stream the result from GET /videos/{id}/content. Pass an `Idempotency-Key` header to make a retried request replay the original response without a second charge.","operationId":"createVideo","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCreateRequest"}}},"required":true},"responses":{"200":{"$ref":"#/components/responses/OpenAIVideo"},"400":{"$ref":"#/components/responses/OpenAIBadRequest"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"402":{"$ref":"#/components/responses/OpenAIPaymentRequired"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"},"500":{"$ref":"#/components/responses/OpenAIInternalError"}},"security":[{"bearerAuth":[]}],"summary":"Create a video generation job (async)","tags":["Inference"]}},"/videos/{id}":{"get":{"operationId":"getVideo","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/OpenAIVideo"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Get a video generation job","tags":["Inference"]}},"/videos/{id}/cancel":{"post":{"operationId":"cancelVideo","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/OpenAIVideo"},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"409":{"$ref":"#/components/responses/OpenAIBadRequest"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Cancel a video generation job","tags":["Inference"]}},"/videos/{id}/content":{"get":{"description":"Streams the generated MP4 for a completed job. Returns 410 Gone once the artifact has expired (24h retention).","operationId":"getVideoContent","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"video/mp4":{"schema":{"format":"binary","type":"string"}}},"description":"The generated video stream."},"401":{"$ref":"#/components/responses/OpenAIUnauthorized"},"403":{"$ref":"#/components/responses/OpenAIForbidden"},"404":{"$ref":"#/components/responses/OpenAINotFound"},"410":{"$ref":"#/components/responses/OpenAIGone"},"429":{"$ref":"#/components/responses/OpenAIRateLimited"}},"security":[{"bearerAuth":[]}],"summary":"Download a completed video artifact","tags":["Inference"]}},"/webhook-endpoints":{"get":{"operationId":"listWebhookEndpoints","parameters":[{"$ref":"#/components/parameters/CursorParam"},{"$ref":"#/components/parameters/LimitParam"}],"responses":{"200":{"$ref":"#/components/responses/WebhookEndpointPage"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"List webhook endpoints","tags":["Webhooks"]},"post":{"operationId":"createWebhookEndpoint","parameters":[{"$ref":"#/components/parameters/IdempotencyKeyHeader"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"event_types":{"items":{"enum":["instance.creating","instance.running","instance.terminated","instance.failed","video.completed","video.failed"],"type":"string"},"type":"array"},"url":{"format":"uri","type":"string"}},"required":["url","event_types"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"description":"Created"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Create a webhook endpoint","tags":["Webhooks"]}},"/webhook-endpoints/{id}":{"delete":{"operationId":"deleteWebhookEndpoint","responses":{"204":{"description":"Deleted"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Delete a webhook endpoint","tags":["Webhooks"]},"get":{"operationId":"getWebhookEndpoint","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"description":"OK"},"429":{"$ref":"#/components/responses/RateLimited"},"default":{"$ref":"#/components/responses/Problem"}},"summary":"Get a webhook endpoint","tags":["Webhooks"]},"parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}]}},"security":[{"bearerAuth":[]}],"servers":[{"description":"Production","url":"https://api.gpu.ai/v1"},{"description":"Demo","url":"https://api.demo.gpu.ai/v1"}],"tags":[{"description":"OpenAI-compatible inference: chat completions, image generation, video generation, and the model catalog.","name":"Inference"},{"description":"Reusable launch templates that capture an instance configuration for one-call launches.","name":"Templates"},{"description":"OpenAI-compatible fine-tuning: create and manage fine-tuning jobs and upload JSONL training files.","name":"FineTuning"},{"description":"Community Cloud supplier program: enroll as a supplier, register and manage your machines, and track your earnings.","name":"Community"},{"description":"Service metadata: the liveness probe and the machine-readable OpenAPI specification. No authentication required.","name":"Meta"},{"description":"The GPU hardware catalog — every GPU type available on the platform. No authentication required.","name":"GpuTypes"},{"description":"Live pricing offers per GPU type, GPU count, region, and tier, with current availability. No authentication required.","name":"Pricing"},{"description":"The launch environment catalog: certified frameworks, selectable versions, \"What's included\" software lists, and the raw-VM OS images accepted by instance launch. No authentication required.","name":"Environments"},{"description":"GPU instances: launch, list, inspect, update, and terminate. Mutating calls return an async operation to poll for completion.","name":"Instances"},{"description":"Async operation tracking. Instance launches and terminations return an operation id; poll it here until the operation reaches a terminal state.","name":"Operations"},{"description":"SSH public keys registered with your organization for instance access.","name":"SshKeys"},{"description":"Webhook endpoints for event delivery. The signing secret is returned once at creation; verify every delivery against it.","name":"Webhooks"},{"description":"Time-bucketed usage aggregates for your organization, optionally grouped by instance or GPU type.","name":"Usage"},{"description":"Billing controls and funding: the organization spending limit and account deposits.","name":"Billing"}]}