{
  "openapi": "3.1.0",
  "info": {
    "title": "Atheron for developers",
    "version": "2026-10-15",
    "description": "Sign in with Atheron (OpenID Connect), the developer API and the MCP server. Every operation links to its page in the docs.",
    "contact": {
      "url": "https://developers.aton-network.org/docs/support"
    }
  },
  "servers": [
    {
      "url": "https://accounts.aton-network.org"
    },
    {
      "url": "https://developers.aton-network.org"
    }
  ],
  "paths": {
    "/.well-known/openid-configuration": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "get": {
        "operationId": "discovery",
        "summary": "Discovery document",
        "description": "Where every other endpoint is, and what the provider supports: scopes, claims, grants, algorithms and client authentication methods.\n\nWhen to use it: Read it when your app starts, and let your OpenID Connect library configure itself from it. Never hard-code the other addresses.\n\nAuthentication: None. It is public.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/discovery"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "issuer": "https://accounts.aton-network.org",
                  "authorization_endpoint": "https://accounts.aton-network.org/oauth/authorize",
                  "token_endpoint": "https://accounts.aton-network.org/oauth/token",
                  "userinfo_endpoint": "https://accounts.aton-network.org/oauth/userinfo",
                  "revocation_endpoint": "https://accounts.aton-network.org/oauth/revoke",
                  "jwks_uri": "https://accounts.aton-network.org/.well-known/jwks.json",
                  "scopes_supported": [
                    "openid",
                    "profile",
                    "email",
                    "offline_access",
                    "age",
                    "membership",
                    "wallet",
                    "licences",
                    "creator"
                  ],
                  "response_types_supported": [
                    "code"
                  ],
                  "grant_types_supported": [
                    "authorization_code",
                    "refresh_token"
                  ],
                  "subject_types_supported": [
                    "public",
                    "pairwise"
                  ],
                  "id_token_signing_alg_values_supported": [
                    "ES256"
                  ],
                  "token_endpoint_auth_methods_supported": [
                    "client_secret_basic",
                    "client_secret_post",
                    "none",
                    "private_key_jwt"
                  ],
                  "token_endpoint_auth_signing_alg_values_supported": [
                    "ES256",
                    "RS256"
                  ],
                  "code_challenge_methods_supported": [
                    "S256"
                  ],
                  "claims_supported": [
                    "sub",
                    "iss",
                    "aud",
                    "exp",
                    "iat",
                    "nonce",
                    "sid",
                    "email",
                    "email_verified",
                    "name",
                    "creator",
                    "plan",
                    "age",
                    "membership",
                    "wallets"
                  ],
                  "code_challenge_required": true
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/.well-known/jwks.json": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "get": {
        "operationId": "jwks",
        "summary": "Signing keys (JWKS)",
        "description": "The public keys that sign ID tokens and access tokens, as a JSON Web Key Set.\n\nWhen to use it: Your JOSE library reads it to check token signatures. Fetch it again when a token names a kid you do not have.\n\nAuthentication: None. It is public.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/jwks"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "keys": [
                    {
                      "kty": "EC",
                      "crv": "P-256",
                      "alg": "ES256",
                      "use": "sig",
                      "kid": "2026-10-01",
                      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
                      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
                    }
                  ]
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/oauth/authorize": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "get": {
        "operationId": "authorize",
        "summary": "Authorize",
        "description": "The page you send somebody to. They sign in, see what you ask for, and come back to your redirect address with a one-time code.\n\nWhen to use it: Every time somebody chooses Sign in with Atheron in your app. Build the address on your server, keep the verifier, state and nonce for this browser, then redirect.\n\nAuthentication: None: it identifies your app by client_id and proves the request is yours with PKCE.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/authorize"
        },
        "parameters": [
          {
            "name": "response_type",
            "in": "query",
            "required": true,
            "description": "Always code. The implicit and hybrid flows are not offered. code",
            "schema": {
              "type": "string",
              "enum": [
                "code"
              ]
            }
          },
          {
            "name": "client_id",
            "in": "query",
            "required": true,
            "description": "Your test or live client ID, from the app's Sign-in page. test-<16 hex> or live-<16 hex>",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "redirect_uri",
            "in": "query",
            "required": true,
            "description": "Where we send the person back. No wildcards and no prefixes: the whole address must equal one you registered. one registered address, matched exactly, up to 500 characters",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "scope",
            "in": "query",
            "required": true,
            "description": "What you ask for. Every scope is shown on the consent screen. See Scopes and claims. space separated; openid is added if missing",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code_challenge",
            "in": "query",
            "required": true,
            "description": "BASE64URL(SHA-256(code_verifier)). Required of every client, including server apps that hold a secret. 43 to 128 characters, base64url",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code_challenge_method",
            "in": "query",
            "required": true,
            "description": "plain is refused. S256",
            "schema": {
              "type": "string",
              "enum": [
                "S256"
              ]
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Returned unchanged. Make it random per sign-in, keep it, and compare it in constant time when the person comes back. up to 500 characters",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "nonce",
            "in": "query",
            "required": false,
            "description": "Copied into the ID token. Check it there to stop a token being replayed into another sign-in. up to 500 characters",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "prompt",
            "in": "query",
            "required": false,
            "description": "none: answer at once or send an error. login: ask them to sign in again. consent: show the consent screen even if they agreed before. create: open registration. none, login, consent or create",
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "login",
                "consent",
                "create"
              ]
            }
          },
          {
            "name": "max_age",
            "in": "query",
            "required": false,
            "description": "The oldest sign-in you accept. Older, and they sign in again. whole seconds, 0 or more",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "login_hint",
            "in": "query",
            "required": false,
            "description": "With prompt=create, starts registration with this address filled in. an email address",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "302": {
            "description": "Back to your redirect address"
          },
          "400": {
            "description": "invalid_request: A parameter is missing or malformed: no PKCE, PKCE with plain, a bad max_age, prompt=none combined with another prompt, or a token request that is not form encoded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/oauth/token": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "post": {
        "operationId": "token",
        "summary": "Token: swap a code",
        "description": "Swaps the code from the redirect for an ID token, an access token and, with offline_access, a refresh token.\n\nWhen to use it: On your server, in the route your redirect address points at, straight after checking state.\n\nAuthentication: client_secret_basic (preferred), client_secret_post, private_key_jwt, or none for a public app. See Secrets and certificates.\n\nAlso: Token: refresh. Swaps a refresh token for a new access token and a new refresh token. The old refresh token stops working.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/token"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCJ9",
                  "token_type": "Bearer",
                  "expires_in": 900,
                  "scope": "openid profile email offline_access",
                  "id_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IjIwMjYtMTAtMDEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmF0b24tbmV0d29yay5vcmciLCJzdWIiOiI5YTZk",
                  "refresh_token": "ath_rt_6Qm9"
                }
              }
            }
          },
          "400": {
            "description": "unsupported_grant_type: grant_type is not authorization_code or refresh_token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "invalid_client: Your app could not be authenticated: a wrong or expired secret, a revoked or expired certificate, a bad client_assertion (aud must be the token endpoint, exp at most ten minutes ahead, jti new), a public app sending a secret, or the app is suspended.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "required": [
                  "grant_type",
                  "code",
                  "redirect_uri",
                  "code_verifier"
                ],
                "properties": {
                  "grant_type": {
                    "type": "string",
                    "enum": [
                      "authorization_code"
                    ],
                    "description": "This grant."
                  },
                  "code": {
                    "type": "string",
                    "description": "The code from the redirect. 60 seconds, once."
                  },
                  "redirect_uri": {
                    "type": "string",
                    "description": "The same redirect address the authorize request used."
                  },
                  "code_verifier": {
                    "type": "string",
                    "description": "The verifier whose challenge you sent to authorize."
                  },
                  "client_id": {
                    "type": "string",
                    "description": "Required for a public app, and with client_secret_post."
                  },
                  "client_secret": {
                    "type": "string",
                    "description": "Only with client_secret_post. Prefer HTTP Basic."
                  },
                  "client_assertion_type": {
                    "type": "string",
                    "enum": [
                      "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"
                    ],
                    "description": "With private_key_jwt."
                  },
                  "client_assertion": {
                    "type": "string",
                    "description": "A JWT signed with your certificate's private key: iss and sub your client ID, aud the token endpoint, exp at most ten minutes ahead, a jti used once."
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "clientBasic": []
          },
          {}
        ]
      }
    },
    "/oauth/userinfo": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "get": {
        "operationId": "userinfo",
        "summary": "Userinfo",
        "description": "Who the person is as of now: the claims their consent allows, read fresh from their account.\n\nWhen to use it: When you need current details (a plan, a verified age, linked wallets) rather than what the ID token said when they signed in.\n\nAuthentication: Authorization: Bearer <access token>. ID tokens are refused.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/userinfo"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "sub": "9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11",
                  "name": "Ada Lovelace",
                  "email": "ada@example.com",
                  "email_verified": true,
                  "age": {
                    "verified": true,
                    "adult": true,
                    "sixteen_or_over": true
                  }
                }
              }
            }
          },
          "401": {
            "description": "invalid_token: Not an access token (ID tokens are refused), expired (15 minutes), the account is suspended, access was withdrawn, or the app is suspended.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "accessToken": []
          }
        ]
      },
      "post": {
        "operationId": "userinfoPost",
        "summary": "Userinfo",
        "description": "Who the person is as of now: the claims their consent allows, read fresh from their account.\n\nWhen to use it: When you need current details (a plan, a verified age, linked wallets) rather than what the ID token said when they signed in.\n\nAuthentication: Authorization: Bearer <access token>. ID tokens are refused.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/userinfo"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "sub": "9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11",
                  "name": "Ada Lovelace",
                  "email": "ada@example.com",
                  "email_verified": true,
                  "age": {
                    "verified": true,
                    "adult": true,
                    "sixteen_or_over": true
                  }
                }
              }
            }
          },
          "401": {
            "description": "invalid_token: Not an access token (ID tokens are refused), expired (15 minutes), the account is suspended, access was withdrawn, or the app is suspended.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "accessToken": []
          }
        ]
      }
    },
    "/oauth/revoke": {
      "servers": [
        {
          "url": "https://accounts.aton-network.org"
        }
      ],
      "post": {
        "operationId": "revoke",
        "summary": "Revoke",
        "description": "Ends a refresh token and every token in its line.\n\nWhen to use it: When somebody signs out of your app for good, or disconnects their Atheron account from it.\n\nAuthentication: The same client authentication as the token endpoint.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/revoke"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {}
              }
            }
          },
          "400": {
            "description": "invalid_request: A parameter is missing or malformed: no PKCE, PKCE with plain, a bad max_age, prompt=none combined with another prompt, or a token request that is not form encoded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "invalid_client: Your app could not be authenticated: a wrong or expired secret, a revoked or expired certificate, a bad client_assertion (aud must be the token endpoint, exp at most ten minutes ahead, jti new), a public app sending a secret, or the app is suspended.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string",
                    "description": "The refresh token to end."
                  },
                  "token_type_hint": {
                    "type": "string",
                    "enum": [
                      "refresh_token"
                    ],
                    "description": "Optional."
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "clientBasic": []
          },
          {}
        ]
      }
    },
    "/api/v1/app": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "apiApp",
        "summary": "Developer API: your app",
        "description": "The application and environment your API key belongs to: its client ID, redirect addresses, scopes, approved scopes and counts.\n\nWhen to use it: In deploy checks: confirm the redirect addresses and scopes your code expects are the ones registered.\n\nAuthentication: Authorization: Bearer <API key> with the app:read right.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/api-app"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "name": "Price Check",
                  "state": "live",
                  "kind": "confidential",
                  "quota": "free",
                  "env": "live",
                  "client_id": "live-1a2b3c4d5e6f7a8b",
                  "redirect_uris": [
                    "https://app.example.com/callback"
                  ],
                  "scopes": [
                    "openid",
                    "profile",
                    "email"
                  ],
                  "approved_scopes": [
                    "openid",
                    "profile",
                    "email"
                  ],
                  "privacy_url": "https://app.example.com/privacy",
                  "homepage_url": "https://app.example.com",
                  "credentials": 2,
                  "testers": 0,
                  "webhooks": 1
                }
              }
            }
          },
          "401": {
            "description": "invalid_key: No API key was sent, or it is not one of ours, expired or revoked.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "missing_right: The key does not carry the right this call needs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: The application this key belonged to has been removed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "server_error: Something went wrong at our end.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/api/v1/usage": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "apiUsage",
        "summary": "Developer API: usage",
        "description": "Calls, errors and latency per day and bucket for your key's environment.\n\nWhen to use it: In your own dashboards and alerts, for example to warn before you reach a daily limit.\n\nAuthentication: Authorization: Bearer <API key> with the usage:read right.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/api-usage"
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "How many days back, today included. 1 to 90, default 7",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "env": "live",
                  "days": 7,
                  "usage": [
                    {
                      "day": "2026-10-14",
                      "bucket": "token",
                      "calls": 1203,
                      "errors": 4,
                      "ms_avg": 38,
                      "ms_max": 412
                    },
                    {
                      "day": "2026-10-14",
                      "bucket": "userinfo",
                      "calls": 2210,
                      "errors": 0,
                      "ms_avg": 22,
                      "ms_max": 190
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "invalid_key: No API key was sent, or it is not one of ours, expired or revoked.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "missing_right: The key does not carry the right this call needs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "server_error: Something went wrong at our end.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/api/v1/events": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "apiEvents",
        "summary": "Developer API: events stream",
        "description": "Your app's events as Server-Sent Events, the same events and the same bodies as its webhooks, in order, resumable for 30 days.\n\nWhen to use it: When you would rather hold a connection open than run a public address for webhooks: a worker, a desktop app's server, a test. The WebSocket form is wss://developers.aton-network.org/api/v1/events/ws.\n\nAuthentication: Authorization: Bearer <API key> with the events:read right.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/api-events"
        },
        "parameters": [
          {
            "name": "Last-Event-ID",
            "in": "header",
            "required": false,
            "description": "The id of the last event you handled; the stream sends what you missed first. EventSource-style clients send it on their own.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "The same as Last-Event-ID, for clients that cannot set headers.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "types",
            "in": "query",
            "required": false,
            "description": "Only these event types. user.signed_in, consent.revoked, membership.changed, ping, comma separated",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/event-stream": {
                "schema": {
                  "type": "string"
                },
                "example": "retry: 3000\n\nevent: ready\ndata: {\"types\":null}\n\nid: 5b1c2a8e-0000-4000-8000-000000000001\nevent: user.signed_in\ndata: {\"id\":\"5b1c2a8e-0000-4000-8000-000000000001\",\"type\":\"user.signed_in\",\"created\":\"2026-10-15T17:02:11.000Z\",\"client_id\":\"live-1a2b3c4d5e6f7a8b\",\"data\":{\"sub\":\"9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11\",\"scopes\":[\"openid\",\"email\"],\"at\":\"2026-10-15T17:02:11.000Z\"}}\n\n: beat"
              }
            }
          },
          "400": {
            "description": "invalid_request: A parameter is missing or malformed: no PKCE, PKCE with plain, a bad max_age, prompt=none combined with another prompt, or a token request that is not form encoded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key: No API key was sent, or it is not one of ours, expired or revoked.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "missing_right: The key does not carry the right this call needs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "server_error: Something went wrong at our end.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/mcp": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "post": {
        "operationId": "mcp",
        "summary": "MCP server",
        "description": "The Model Context Protocol server your AI tools connect to: the docs, the reference, examples by language, error lookup, the changelog, status, and, with a key, your app's settings, usage and sandbox calls.\n\nWhen to use it: Connect Claude, your editor or any MCP client to it while you build.\n\nAuthentication: None for the docs tools. A test or live API key as Authorization: Bearer for your app's data; a test key with the sandbox right for sandbox calls.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/reference/mcp"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "jsonrpc": "2.0",
                  "id": 1,
                  "result": {
                    "protocolVersion": "2025-06-18",
                    "capabilities": {
                      "tools": {
                        "listChanged": false
                      }
                    },
                    "serverInfo": {
                      "name": "atheron-developers",
                      "version": "0.2.0"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "invalid_key: No API key was sent, or it is not one of ours, expired or revoked.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: Over your quota for this bucket, this minute or this day.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ]
      }
    },
    "/api/kestrel/v1/signals": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSignalsList",
        "summary": "Kestrel API: signals.list",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/signals/{symbol}": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSignalsGet",
        "summary": "Kestrel API: signals.get",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/signals/{symbol}/history": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSignalsHistory",
        "summary": "Kestrel API: signals.history",
        "description": "Counts as 5 calls, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/signals/stream": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSignalsStream",
        "summary": "Kestrel API: signals.stream",
        "description": "Counts as 1 call, times the version's weight. From the pro seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/event-stream": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/sentiment": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSentimentGet",
        "summary": "Kestrel API: sentiment.get",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/sentiment/history": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelSentimentHistory",
        "summary": "Kestrel API: sentiment.history",
        "description": "Counts as 5 calls, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/eye": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelEyeGet",
        "summary": "Kestrel API: eye.get",
        "description": "Counts as 1 call, times the version's weight. From the pro seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/backtests": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "post": {
        "operationId": "kestrelBacktestsCreate",
        "summary": "Kestrel API: backtests.create",
        "description": "Counts as 100 calls, times the version's weight. From the studio seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "202": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/backtests/{id}": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelBacktestsGet",
        "summary": "Kestrel API: backtests.get",
        "description": "Counts as 1 call, times the version's weight. From the studio seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/versions": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelVersionsList",
        "summary": "Kestrel API: versions.list",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/paper/orders": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "post": {
        "operationId": "kestrelPaperOrdersCreate",
        "summary": "Kestrel API: paper.orders.create",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "Atheron-User-Token",
            "in": "header",
            "required": true,
            "description": "The end user's Sign in with Atheron access token, with the trading scope.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/paper/bots": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelPaperBotsList",
        "summary": "Kestrel API: paper.bots.list",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "Atheron-User-Token",
            "in": "header",
            "required": true,
            "description": "The end user's Sign in with Atheron access token, with the trading scope.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/paper/portfolio": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "get": {
        "operationId": "kestrelPaperPortfolioGet",
        "summary": "Kestrel API: paper.portfolio.get",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "Atheron-User-Token",
            "in": "header",
            "required": true,
            "description": "The end user's Sign in with Atheron access token, with the trading scope.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        }
      }
    },
    "/api/kestrel/v1/live/orders": {
      "servers": [
        {
          "url": "https://developers.aton-network.org"
        }
      ],
      "post": {
        "operationId": "kestrelLiveOrdersCreate",
        "summary": "Kestrel API: live.orders.create",
        "description": "Counts as 1 call, times the version's weight. From the builder seat.",
        "tags": [
          "kestrel"
        ],
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/kestrel/reference"
        },
        "parameters": [
          {
            "name": "Kestrel-Version",
            "in": "header",
            "required": false,
            "description": "The ATON Kestrel version to answer with, such as v0.1.0; the newest when absent.",
            "schema": {
              "type": "string",
              "pattern": "^v[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$"
            }
          },
          {
            "name": "Atheron-User-Token",
            "in": "header",
            "required": true,
            "description": "The end user's Sign in with Atheron access token, with the trading scope.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "kestrelKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "invalid_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "401": {
            "description": "invalid_key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "402": {
            "description": "no_seat",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "403": {
            "description": "missing_right or tier_too_low",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "404": {
            "description": "unknown_version",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "429": {
            "description": "allowance_used or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          },
          "503": {
            "description": "not_published",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KestrelError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "accessToken": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "An access token issued to your client."
      },
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "A developer API key: ath_test_... or ath_live_..., carrying the rights each operation names: app:read, usage:read, events:read, webhooks:write, sandbox, kestrel."
      },
      "clientBasic": {
        "type": "http",
        "scheme": "basic",
        "description": "Your client ID and secret."
      },
      "kestrelKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "A developer API key with the kestrel right, on a Kestrel API seat for a live key."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "access_denied",
              "invalid_request",
              "invalid_scope",
              "unsupported_response_type",
              "login_required",
              "consent_required",
              "interaction_required",
              "invalid_client",
              "invalid_grant",
              "unsupported_grant_type",
              "invalid_token",
              "rate_limited",
              "invalid_key",
              "missing_right",
              "not_found",
              "server_error"
            ]
          },
          "error_description": {
            "type": "string"
          }
        }
      },
      "KestrelError": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "invalid_version",
              "invalid_key",
              "no_seat",
              "missing_right",
              "tier_too_low",
              "unknown_version",
              "allowance_used",
              "rate_limited",
              "not_published"
            ]
          },
          "error_description": {
            "type": "string"
          }
        }
      },
      "WebhookEvent": {
        "type": "object",
        "required": [
          "id",
          "type",
          "created",
          "client_id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "user.signed_in",
              "consent.revoked",
              "membership.changed",
              "ping"
            ]
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "client_id": {
            "type": "string"
          },
          "data": {
            "type": "object"
          }
        }
      }
    }
  },
  "webhooks": {
    "user.signed_in": {
      "post": {
        "summary": "Somebody signed in to your app: a code was issued to your client.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/webhooks/user.signed_in"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEvent"
              },
              "example": {
                "id": "6f0c2e1a-8b0d-4f4e-9a51-2c1d7e9b3a10",
                "type": "user.signed_in",
                "created": "2026-10-15T17:02:11.000Z",
                "client_id": "live-1a2b3c4d5e6f7a8b",
                "data": {
                  "sub": "9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11",
                  "scopes": [
                    "openid",
                    "profile",
                    "email"
                  ],
                  "at": "2026-10-15T17:02:11.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Any 2xx within ten seconds"
          }
        }
      }
    },
    "consent.revoked": {
      "post": {
        "summary": "Somebody took back your access, from their account or any other way, or we suspended your app.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/webhooks/consent.revoked"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEvent"
              },
              "example": {
                "id": "6f0c2e1a-8b0d-4f4e-9a51-2c1d7e9b3a10",
                "type": "consent.revoked",
                "created": "2026-10-15T17:02:11.000Z",
                "client_id": "live-1a2b3c4d5e6f7a8b",
                "data": {
                  "sub": "9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11",
                  "at": "2026-10-15T17:02:11.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Any 2xx within ten seconds"
          }
        }
      }
    },
    "membership.changed": {
      "post": {
        "summary": "The plan of somebody who granted you the membership scope changed.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/webhooks/membership.changed"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEvent"
              },
              "example": {
                "id": "6f0c2e1a-8b0d-4f4e-9a51-2c1d7e9b3a10",
                "type": "membership.changed",
                "created": "2026-10-15T17:02:11.000Z",
                "client_id": "live-1a2b3c4d5e6f7a8b",
                "data": {
                  "sub": "9a6d4c1e-1f0b-4a51-8a8e-3b2f6c0d7e11",
                  "at": "2026-10-15T17:02:11.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Any 2xx within ten seconds"
          }
        }
      }
    },
    "ping": {
      "post": {
        "summary": "You pressed Send a test on the app's Webhooks page.",
        "externalDocs": {
          "url": "https://developers.aton-network.org/docs/webhooks/ping"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEvent"
              },
              "example": {
                "id": "6f0c2e1a-8b0d-4f4e-9a51-2c1d7e9b3a10",
                "type": "ping",
                "created": "2026-10-15T17:02:11.000Z",
                "client_id": "live-1a2b3c4d5e6f7a8b",
                "data": {
                  "at": "2026-10-15T17:02:11.000Z"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Any 2xx within ten seconds"
          }
        }
      }
    }
  }
}