{
  "components": {
    "responses": {
      "PaymentRequired": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/X402PaymentRequired"
            }
          }
        },
        "description": "x402 v2 payment required. The response body matches `X402PaymentRequired`. Retry the same request with a base64-encoded x402 payment payload in the `X-PAYMENT` header. See https://www.x402.org for the wire format.",
        "headers": {
          "PAYMENT-REQUIRED": {
            "description": "Base64-encoded copy of the `X402PaymentRequired` JSON body — the canonical x402 v2 HTTP transport location for the challenge.",
            "schema": {
              "type": "string"
            }
          }
        }
      }
    },
    "schemas": {
      "OpenAIChatChoice": {
        "additionalProperties": true,
        "properties": {
          "finish_reason": {
            "type": "string"
          },
          "index": {
            "type": "integer"
          },
          "message": {
            "$ref": "#/components/schemas/OpenAIChatMessage"
          }
        },
        "title": "OpenAIChatChoice",
        "type": "object"
      },
      "OpenAIChatCompletionsRequest": {
        "additionalProperties": true,
        "properties": {
          "frequency_penalty": {
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "max_tokens": {
            "minimum": 1,
            "type": "integer"
          },
          "messages": {
            "items": {
              "$ref": "#/components/schemas/OpenAIChatMessage"
            },
            "type": "array"
          },
          "model": {
            "description": "Model identifier. Use the model name advertised in the operator's `/api/services.json` entry.",
            "type": "string"
          },
          "n": {
            "minimum": 1,
            "type": "integer"
          },
          "presence_penalty": {
            "maximum": 2,
            "minimum": -2,
            "type": "number"
          },
          "stop": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              }
            ]
          },
          "stream": {
            "type": "boolean"
          },
          "temperature": {
            "maximum": 2,
            "minimum": 0,
            "type": "number"
          },
          "top_p": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "user": {
            "type": "string"
          }
        },
        "required": [
          "model",
          "messages"
        ],
        "title": "OpenAIChatCompletionsRequest",
        "type": "object"
      },
      "OpenAIChatCompletionsResponse": {
        "additionalProperties": true,
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/OpenAIChatChoice"
            },
            "type": "array"
          },
          "created": {
            "type": "integer"
          },
          "id": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "object": {
            "examples": [
              "chat.completion"
            ],
            "type": "string"
          },
          "usage": {
            "$ref": "#/components/schemas/OpenAIChatUsage"
          }
        },
        "title": "OpenAIChatCompletionsResponse",
        "type": "object"
      },
      "OpenAIChatMessage": {
        "additionalProperties": true,
        "properties": {
          "content": {
            "description": "Message text. May be a string or a structured content array depending on the model.",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "type": "string"
          },
          "role": {
            "enum": [
              "system",
              "user",
              "assistant",
              "tool"
            ],
            "type": "string"
          },
          "tool_call_id": {
            "type": "string"
          }
        },
        "required": [
          "role",
          "content"
        ],
        "title": "OpenAIChatMessage",
        "type": "object"
      },
      "OpenAIChatUsage": {
        "additionalProperties": true,
        "properties": {
          "completion_tokens": {
            "type": "integer"
          },
          "prompt_tokens": {
            "type": "integer"
          },
          "total_tokens": {
            "type": "integer"
          }
        },
        "title": "OpenAIChatUsage",
        "type": "object"
      },
      "X402PaymentRequired": {
        "description": "x402 v2 payment-required response body. The client must read `accepts[]`, choose one PaymentRequirements entry, sign a payment payload, and retry with the base64-encoded payload in the `X-PAYMENT` request header. See https://www.x402.org.",
        "properties": {
          "accepts": {
            "description": "One or more payment configurations the server will accept. Client picks the entry matching its wallet's chain and asset.",
            "items": {
              "$ref": "#/components/schemas/X402PaymentRequirements"
            },
            "type": "array"
          },
          "error": {
            "description": "Human-readable summary of why payment is required.",
            "type": "string"
          },
          "extensions": {
            "additionalProperties": true,
            "description": "Protocol extensions advertised by the server. Each value follows the x402 v2 `{info, schema}` extension pattern — e.g. `bazaar` (machine-readable invocation schemas for discovery) and `eip2612GasSponsoring` (gasless Permit2 approve support). Clients echo received extensions in their PaymentPayload.",
            "type": "object"
          },
          "resource": {
            "$ref": "#/components/schemas/X402Resource"
          },
          "x402Version": {
            "const": 2,
            "description": "x402 protocol version. Obol Stack currently emits v2 responses.",
            "type": "integer",
            "x-x402-protocol-version": 2
          }
        },
        "required": [
          "x402Version",
          "accepts"
        ],
        "title": "X402PaymentRequired",
        "type": "object"
      },
      "X402PaymentRequirements": {
        "properties": {
          "amount": {
            "description": "Price in atomic units of `asset` (e.g. micro-USDC for a 6-decimal token).",
            "examples": [
              "1000"
            ],
            "type": "string"
          },
          "asset": {
            "description": "Settlement token contract address (e.g. USDC or OBOL).",
            "pattern": "^0x[0-9a-fA-F]{40}$",
            "type": "string"
          },
          "extra": {
            "additionalProperties": true,
            "description": "Per-asset metadata, e.g. EIP-712 domain name/version for ERC-3009 signing.",
            "type": "object"
          },
          "maxTimeoutSeconds": {
            "description": "Maximum age (seconds) of the signed payment authorization the server will accept.",
            "minimum": 1,
            "type": "integer"
          },
          "network": {
            "description": "CAIP-2 chain identifier (e.g. `eip155:8453` for Base mainnet).",
            "examples": [
              "eip155:8453",
              "eip155:84532"
            ],
            "type": "string"
          },
          "payTo": {
            "description": "Recipient wallet address.",
            "pattern": "^0x[0-9a-fA-F]{40}$",
            "type": "string"
          },
          "scheme": {
            "description": "x402 settlement scheme. Obol Stack uses `exact` (single signed authorization per request).",
            "enum": [
              "exact"
            ],
            "type": "string"
          }
        },
        "required": [
          "scheme",
          "network",
          "asset",
          "amount",
          "payTo",
          "maxTimeoutSeconds"
        ],
        "title": "X402PaymentRequirements",
        "type": "object"
      },
      "X402Resource": {
        "properties": {
          "description": {
            "type": "string"
          },
          "iconUrl": {
            "description": "Absolute https URL to an icon representing the service.",
            "format": "uri",
            "type": "string"
          },
          "mimeType": {
            "type": "string"
          },
          "serviceName": {
            "description": "Human-readable name of the service hosting the resource.",
            "maxLength": 32,
            "type": "string"
          },
          "tags": {
            "description": "Topical tags for discovery filtering.",
            "items": {
              "maxLength": 32,
              "type": "string"
            },
            "maxItems": 5,
            "type": "array"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "title": "X402Resource",
        "type": "object"
      }
    }
  },
  "info": {
    "contact": {
      "name": "Obol Stack",
      "url": "https://github.com/ObolNetwork/obol-stack"
    },
    "description": "x402 payment-gated services advertised by this Obol Stack operator. Every operation expects an `X-PAYMENT` header carrying a signed x402 v2 payment payload; unpaid requests receive a 402 with `accepts[]` describing the prices the operator will honour. See https://www.x402.org for the wire protocol and https://github.com/ObolNetwork/obol-stack for the source.\n\nNote: schemas for individual operations are derived heuristically from the underlying ServiceOffer's `type` field. Buyers using generated clients should treat request and response shapes as advisory until operators tighten them with explicit OpenAPI fragments.",
    "title": "Obol Stack — paid services",
    "version": "1",
    "x-guidance": "All operations are x402 payment-gated; no API key or signup is needed — any wallet holding the listed settlement asset can pay. To call one: (1) send the request without payment and read the 402 JSON response — `accepts[]` lists the price in atomic units, the CAIP-2 chain id, and the settlement token contract; (2) sign a payment authorization matching one accepts entry and retry the identical request with the payload base64-encoded in the `X-PAYMENT` header; (3) on success the settlement metadata arrives in the `X-PAYMENT-RESPONSE` header. Each 402 also carries machine-readable invocation schemas in `extensions.bazaar` and the same challenge base64-encoded in the `PAYMENT-REQUIRED` header. For chat-completions operations, take the model identifier from the operation summary or the catalog at /api/services.json. Streaming (`stream: true`) is supported and recommended for long-running agent calls."
  },
  "openapi": "3.1.0",
  "paths": {
    "/services/aeon7": {
      "post": {
        "description": "AEON-7 Gemma-4 31B: uncensored, NVFP4-quantized (dFlash) chat/completions. OpenAI-compatible at /services/aeon7/v1/chat/completions with a 256K context window. Request model 'gemma4-aeon-uncensored' (or 'gemma4-fast' for the speed profile). Pay per-MTok via x402 (OBOL on Ethereum or USDC on Base) -- no signup, no API key.",
        "operationId": "llm_aeon7",
        "requestBody": {
          "content": {
            "application/json": {
              "description": "Operator-defined JSON payload. Shape is not specified in phase 1.",
              "schema": {
                "additionalProperties": true,
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object"
                }
              }
            },
            "description": "Upstream response (shape is operator-defined)."
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          }
        },
        "security": [],
        "summary": "Invoke aeon7",
        "tags": [
          "http"
        ],
        "x-payment-info": {
          "accepts": [
            {
              "amount": "0.0000001",
              "currency": "OBOL",
              "mode": "fixed",
              "network": "eip155:1"
            },
            {
              "amount": "0.00003",
              "currency": "USD",
              "mode": "fixed",
              "network": "eip155:8453"
            }
          ],
          "price": {
            "amount": "0.0000001",
            "currency": "OBOL",
            "mode": "fixed"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        }
      }
    },
    "/services/conf-spark1/v1/chat/completions": {
      "post": {
        "description": "Confidential dstack inference on spark1 (experimental stub TEE). Model qwen3.5:9b. Base Sepolia USDC demo.",
        "operationId": "llm_conf-spark1",
        "requestBody": {
          "content": {
            "application/json": {
              "description": "OpenAI Chat Completions request payload.",
              "schema": {
                "$ref": "#/components/schemas/OpenAIChatCompletionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenAIChatCompletionsResponse"
                }
              }
            },
            "description": "Chat completion (OpenAI-compatible)."
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          }
        },
        "security": [],
        "summary": "Chat completions — conf-spark1 (qwen3.5:9b)",
        "tags": [
          "inference"
        ],
        "x-payment-info": {
          "price": {
            "amount": "0.001",
            "currency": "USD",
            "mode": "fixed"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        }
      }
    }
  },
  "servers": [
    {
      "description": "Public tunnel",
      "url": "https://inference.v1337.org"
    },
    {
      "description": "Local cluster (obol stack up host)",
      "url": "http://obol.stack:8080"
    }
  ],
  "tags": []
}