{
  "openapi": "3.1.0",
  "info": {
    "title": "Arcfolio API",
    "version": "1.0.0",
    "description": "Read side of Arcfolio: reserves, quotes, orders and the stock layer as JSON."
  },
  "servers": [
    {
      "url": "https://jellybelly.fun/api/v1"
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    }
  },
  "paths": {
    "/chains": {
      "get": {
        "summary": "Chain id, RPC and contract addresses on Arc",
        "responses": {
          "200": {
            "description": "Chains",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/stocks": {
      "get": {
        "summary": "Supported stocks: underlying, STOCK.afol, FolioSwap pool, oracle price",
        "responses": {
          "200": {
            "description": "Stocks",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/prices": {
      "get": {
        "summary": "Oracle prices and pool prices",
        "responses": {
          "200": {
            "description": "Prices",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/reserves": {
      "get": {
        "summary": "Proof of reserves: vault reserve and entitlement vs STOCK.afol supply on Arc",
        "responses": {
          "200": {
            "description": "Reserves",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/quote": {
      "get": {
        "summary": "Execution quote plus the exact hub call to place the order",
        "parameters": [
          {
            "name": "stock",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "example": "NVDA"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            }
          },
          {
            "name": "amount",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number",
              "example": 1000
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Quote",
            "content": {
              "application/json": {}
            }
          },
          "503": {
            "description": "No oracle price yet"
          }
        }
      }
    },
    "/orders/{id}": {
      "get": {
        "summary": "One hub order: status, fill, fee",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Order",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/orders": {
      "get": {
        "summary": "A wallet's last 50 orders",
        "parameters": [
          {
            "name": "user",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Orders",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/layer": {
      "get": {
        "summary": "FolioSwap pools, FolioLend market, indices, launch pool",
        "responses": {
          "200": {
            "description": "Layer",
            "content": {
              "application/json": {}
            }
          }
        }
      }
    },
    "/keys": {
      "post": {
        "summary": "Issue an API key: 600 req/min and metered usage",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Key issued (shown once)"
          }
        }
      }
    }
  }
}