{
  "openapi": "3.1.0",
  "info": {
    "title": "Aurelia API",
    "version": "1",
    "summary": "Onchain token data: prices, candles, trades, holders, wallets and new launches.",
    "description": "Aurelia indexes every swap on BSC, Solana, Base, Robinhood Chain and Ethereum itself. A free account gets 10,000 credits, with no card and no subscription: https://app.aurelia.build/#/login. Live data is one WebSocket, wss://app.aurelia.build/api/live, described at https://app.aurelia.build/docs/live. AI agents can use the MCP server at https://app.aurelia.build/mcp: https://app.aurelia.build/guides/mcp-server. This is not the Aurelia JavaScript framework.",
    "contact": {
      "name": "Aurelia",
      "url": "https://aurelia.build"
    }
  },
  "externalDocs": {
    "description": "API reference",
    "url": "https://app.aurelia.build/docs"
  },
  "servers": [
    {
      "url": "https://app.aurelia.build/api"
    }
  ],
  "security": [
    {
      "bearer": []
    },
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "operationId": "health",
        "summary": "Health",
        "description": "Whether the API can reach each of its three stores. Use it for uptime checks.\n\n- `200` when healthy, `503` with the same body when any service is down.\n\n- Never cached: every call checks all three.\n\n- For a liveness probe that touches nothing, `GET /` answers `{\"name\":\"aurelia\",\"status\":\"ok\"}`.\n\n- Open and not metered, like `/`, `/plans` and `/auth/*`: it needs no key and costs no credits.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/health"
        },
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success.\n\n- `healthy` (boolean): `true` when all three services answer.\n- `services.postgres` (string): `\"ok\"`, or the error message.\n- `services.clickhouse` (string): `\"ok\"`, or the error message.\n- `services.dragonfly` (string): `\"ok\"`, or the error message.",
            "content": {
              "application/json": {
                "example": {
                  "healthy": true,
                  "services": {
                    "postgres": "ok",
                    "clickhouse": "ok",
                    "dragonfly": "ok"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/plans": {
      "get": {
        "operationId": "plans",
        "summary": "Plans",
        "description": "The plans and their limits, the WebSocket caps included, as the API enforces them, so a client never hardcodes them.\n\n- Open and not metered.\n\n- See Authentication and limits for who gets which plan, and the socket for what the caps count.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/plans"
        },
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success.\n\n- `[]` (array): One entry per plan: `free`, `paid`.\n- `name` (string): The plan, as sent back in `X-Aurelia-Plan`.\n- `burstPerSecond, burstCapacity` (number): The burst limit: a bucket refilling `burstPerSecond` a second and holding `burstCapacity`, so a page's first batch of requests goes through.\n- `freeCredits` (number): On `free` only: the credits every account gets once. They do not renew.\n- `prices` (array): On `paid` only: what credits past the free ones cost, in USD: `from`, the size of one deposit, and `per1000`, the price of 1,000 credits on a deposit that size or larger.\n- `minimumDeposit` (number): On `paid` only: what deposits must total, in USD, before any of them is credited.\n- `live.sockets` (number): `/live` sockets open at once, per account.\n- `live.subscriptions` (number): Subscriptions one socket holds at once.\n- `live.balances` (number): Of those, `balances` subscriptions: each reads its wallet from the chain.",
            "content": {
              "application/json": {
                "example": [
                  {
                    "name": "free",
                    "burstPerSecond": 5,
                    "burstCapacity": 20,
                    "freeCredits": 10000,
                    "live": {
                      "sockets": 5,
                      "subscriptions": 25,
                      "balances": 5
                    }
                  },
                  {
                    "name": "paid",
                    "burstPerSecond": 30,
                    "burstCapacity": 120,
                    "prices": [
                      {
                        "from": 0,
                        "per1000": 0.28
                      },
                      {
                        "from": 280,
                        "per1000": 0.224
                      }
                    ],
                    "minimumDeposit": 5,
                    "live": {
                      "sockets": 5,
                      "subscriptions": 100,
                      "balances": 10
                    }
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/chains": {
      "get": {
        "operationId": "chains",
        "summary": "Chains",
        "description": "Every listed chain: how far indexing has got and how far behind the tip it is, and the chain's last 24 hours: volume, trades, traders, new tokens and pools.\n\n- Cached 15 s.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/chains"
        },
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chains[]` (array): One per listed chain: `evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) and `evm:1` (Ethereum).\n- `chains[].head` (number | null): Latest block (on Solana, confirmed slot) seen at the tip. `null` when no listener has reported one in the last 2 minutes.\n- `chains[].listener, parser` ({ number, hash } | null): The last block fetched from the chain and queued, and the last block fully indexed: everything up to it is queryable.\n- `chains[].lag` (number | null): Blocks (on Solana, slots) between `head` and `parser`; counted from `listener` while `head` is unknown.\n- `chains[].gaps` (number): Block ranges deliberately skipped, for example when public RPC fell too far behind. Known gaps, never silent ones.\n- `chains[].indexedTime` (number | null): Block time of `parser`, unix ms: `Date.now() - indexedTime` is how far behind real time the data is.\n- `chains[].indexedSince` (number | null): Block time of the oldest indexed block, unix ms: history starts there.\n- `chains[].stats24h` (object): `volumeUsd`, `trades` and `traders` (approximate, ~1%) of the chain's swaps over the last 24 h, each swap once; `newTokens`, tokens whose creation Aurelia saw; `newPools`, pools created in the chain's blocks of the last 24 h (`null` without such a block).\n- `updatedAt` (number): When the answer was built, unix ms.",
            "content": {
              "application/json": {
                "example": {
                  "chains": [
                    {
                      "chain": "evm:56",
                      "head": null,
                      "listener": null,
                      "parser": {
                        "number": 1000750,
                        "hash": "0x00000000000000000000000000000000000000000000000000000000000f452e"
                      },
                      "gaps": 0,
                      "lag": null,
                      "indexedTime": 1790618578665,
                      "indexedSince": 1790546261920,
                      "stats24h": {
                        "volumeUsd": 67218,
                        "trades": 131,
                        "traders": 8,
                        "newTokens": 3,
                        "newPools": 4
                      }
                    },
                    {
                      "chain": "solana",
                      "head": null,
                      "listener": null,
                      "parser": {
                        "number": 449600022,
                        "hash": "5q3oRWqw8jV5Wdw7vbCE9Bn1MG4xyCZjK3VTk6UGk26Y"
                      },
                      "gaps": 0,
                      "lag": null,
                      "indexedTime": 1790618141920,
                      "indexedSince": 1790546261920,
                      "stats24h": {
                        "volumeUsd": 31848,
                        "trades": 61,
                        "traders": 4,
                        "newTokens": 1,
                        "newPools": 1
                      }
                    }
                  ],
                  "updatedAt": 1790618612055
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens": {
      "get": {
        "operationId": "tokens",
        "summary": "Token lists",
        "description": "One list of tokens for every purpose, one row shape in every mode: up to 100 tokens by address (`tokens=`), a search by address, symbol or name (`q=`), or a screener over chains with range filters and sorts, a launchpad's tokens, or a creator's (`creator=`, dev history).\n\n- The mode is set by the parameters: `tokens=` is the batch, `q=` a search, anything else the screener. A parameter of another mode, an unknown one or a repeated one is `400`, and the error names it. `minHolders` is `400` too: holder counts are not known for many tokens at once (token holders answers them one token at a time).\n\n- Batch: items in request order, an unknown token `null` in its place (`<chain>:<address>`, split on the last colon: `evm:56:0xbb4c…`). No paging.\n\n- Search: an address is looked up first, on the chains it can belong to: a token with that address, then a pool, which stands for the token it trades against a stablecoin or the wrapped native token. Symbol and name matches follow, by kind and by activity: an `exact` match outranks a `prefix` match unless that one trades about 100 times as much, so the token that trades comes before the dozens that copy its symbol. Names and volumes are held in memory and read again every minute (in full every 5 minutes). A search pages through its 200 best matches.\n\n- Screener: the candidates are every token with a USD price from a trade in the last 24 hours, and the launches of the last 24 hours without one yet; with `creator`, every token the wallet created. Filters and order apply to a snapshot rebuilt every 30 s, the rows are current: a value may have moved past a bound since, except `feesPaidUsd`, the snapshot's, so a list sorted or filtered by fees reads in order. A `null` value never matches a range. A page is kept 10 s.\n\n- Every row is the same whatever the mode: a token has the same price, stats and flags here as in a batch or on its page, with two differences from the page: a token that is never the base (USDC) is priced here as the quote, where the page gives no price; and `liquidityUsd` is the price pool's alone, where the page sums its listed pools.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/tokens"
        },
        "parameters": [
          {
            "name": "tokens",
            "in": "query",
            "required": false,
            "description": "Batch: Up to 100 `<chain>:<address>` items, comma-separated, on any chains: `solana:So111…,evm:56:0xbb4c…`",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Search: a token or pool address, a symbol or a name; at most 100 characters. Case and a leading `$` are ignored",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chains",
            "in": "query",
            "required": false,
            "description": "Comma-separated: `evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Screener: `volume24hUsd`, `trades24h`, `feesPaid5mUsd`, `feesPaid15mUsd`, `feesPaid30mUsd`, `feesPaid45mUsd`, `feesPaid1hUsd`, `feesPaid6hUsd`, `feesPaid24hUsd`, `liquidityUsd`, `marketCapUsd`, `fdvUsd`, `change24h`, `priceUsd`, `createdAt`",
            "schema": {
              "type": "string",
              "enum": [
                "volume24hUsd",
                "trades24h",
                "feesPaid5mUsd",
                "feesPaid15mUsd",
                "feesPaid30mUsd",
                "feesPaid45mUsd",
                "feesPaid1hUsd",
                "feesPaid6hUsd",
                "feesPaid24hUsd",
                "liquidityUsd",
                "marketCapUsd",
                "fdvUsd",
                "change24h",
                "priceUsd",
                "createdAt"
              ]
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Screener: `desc`, `asc`. A null value sorts last either way",
            "schema": {
              "type": "string",
              "enum": [
                "desc",
                "asc"
              ]
            }
          },
          {
            "name": "minLiquidityUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxLiquidityUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minVolume24hUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid5mUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid15mUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid30mUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid45mUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid1hUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid6hUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minFeesPaid24hUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minMarketCapUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxMarketCapUsd",
            "in": "query",
            "required": false,
            "description": "Screener: a USD bound, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minChange24h",
            "in": "query",
            "required": false,
            "description": "Screener: a bound on the 24 h price change, a fraction (`0.5` is +50%)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxChange24h",
            "in": "query",
            "required": false,
            "description": "Screener: a bound on the 24 h price change, a fraction (`0.5` is +50%)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "createdAfter",
            "in": "query",
            "required": false,
            "description": "Screener: a bound on `createdAt`, unix ms, included",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "createdBefore",
            "in": "query",
            "required": false,
            "description": "Screener: a bound on `createdAt`, unix ms, included",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "excludeQuotes",
            "in": "query",
            "required": false,
            "description": "Screener: `true` leaves out what pools quote in: the stablecoins Aurelia prices at $1 and the chain's wrapped native token",
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            }
          },
          {
            "name": "creator",
            "in": "query",
            "required": false,
            "description": "Screener: a wallet; its tokens, on the listed chains its address fits",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "launchpad",
            "in": "query",
            "required": false,
            "description": "Screener: comma-separated launchpad ids, any of them: `pumpfun`, `fourmeme`…",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Search 1–50, screener 1–100",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`, as it came",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `tokens[].chain` (string): The token's chain.\n- `tokens[].token` ({ address, symbol, name, decimals, logo }): `logo` is an absolute URL of the re-hosted WebP, or `null`.\n- `tokens[].priceUsd` (number | null): As `GET /prices` gives it.\n- `tokens[].change` ({ 5m, 1h, 6h, 24h }): Price change as a fraction, as the token page's `priceChange`. Each is `null` without a priced trade that long ago; all are `null` for a token priced as the quote.\n- `tokens[].volume24hUsd, trades24h, buys24h, sells24h, traders24h` (number): The token's swaps as the base over 24 h, as the token page's `windows[\"24h\"]`. `traders24h` is approximate.\n- `tokens[].feesPaidUsd` ({ 5m, 15m, 30m, 45m, 1h, 6h, 24h }): The transaction fees traders paid on the token's swaps as the base over each window, as the token page's `windows[w].feesPaidUsd`. Each is `null` while Aurelia's fee records start inside that window.\n- `tokens[].marketCapUsd, fdvUsd` (number | null): `priceUsd` × circulating supply, and × total supply, with the token page's limits.\n- `tokens[].liquidityUsd` (number | null): The real balances, in USD, of the pool the price comes from. `null` where that pool's reserves are virtual (concentrated liquidity and bins on BSC) or a price is missing.\n- `tokens[].chartPool` (string | null): The pool the price comes from, when the token is its base.\n- `tokens[].createdAt` (number | null): When the token was created, unix ms, only when Aurelia saw the creation itself.\n- `tokens[].creator` ({ address, labels } | null): Who created it, when Aurelia saw the creation, with the creator's labels.\n- `tokens[].launchpad` ({ id, pool, progress, complete, graduatedAt } | null): For a launchpad token (`pumpfun`, `fourmeme`…): its launch pool, its bonding curve's progress (0 to 1) and whether it completed, and when.\n- `tokens[].flags` (string[] | null): The security flags of the token's last check. `null` until it was checked: asking queues a check, and a later request has them.\n- `next` (string | null): Cursor for the next page (search and screener). `null` on the last.\n- `query, tokens[].match` (string): Search: `q` as asked, and how each token matched: `address` (the token's own), `pool` (a pool's), `exact` (its symbol or name is the query), `prefix` (its symbol, or a word of its name, starts with it), `contains` (its symbol or name contains a query of 3+ characters).\n- `indexedAt, rankedAt` (number): Search: when the names searched, and the volumes that rank them, were last read, unix ms.\n- `total, updatedAt` (number): Screener: how many tokens match the filters, and when the oldest snapshot used was built, unix ms.\n- `creator` ({ address, labels, tokensCreated, graduated }): With `creator`: the wallet, its labels, and how many tokens Aurelia saw it create and how many graduated.\n- `tokens[].peakMarketCapUsd` (number | null): With `creator`: the highest daily candle high where the token was the base, × its circulating supply now. Null above $2T, or above $100M while the token's price pool holds under $1k (as for `marketCapUsd`).",
            "content": {
              "application/json": {
                "example": {
                  "tokens": [
                    {
                      "chain": "evm:56",
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18,
                        "logo": null
                      },
                      "priceUsd": 0.006,
                      "change": {
                        "5m": 0,
                        "1h": -0.019999999999999907,
                        "6h": 0,
                        "24h": null
                      },
                      "volume24hUsd": 1758,
                      "trades24h": 105,
                      "buys24h": 72,
                      "sells24h": 33,
                      "traders24h": 8,
                      "marketCapUsd": 6000000,
                      "fdvUsd": 6000000,
                      "liquidityUsd": 4204200,
                      "chartPool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "createdAt": 1790546861920,
                      "creator": {
                        "address": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                        "labels": [
                          "creator"
                        ]
                      },
                      "launchpad": {
                        "id": "fourmeme",
                        "pool": "0xf39f85a07237050d069187679c621b9df1df8585b01d625ae22bc7cb99430013",
                        "progress": 1,
                        "complete": true,
                        "graduatedAt": 1790549261920
                      },
                      "flags": [
                        "buy_tax",
                        "sell_tax"
                      ]
                    }
                  ],
                  "next": null,
                  "total": 1,
                  "updatedAt": 1790618550079
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/prices": {
      "get": {
        "operationId": "prices",
        "summary": "Prices",
        "description": "The USD price of up to 100 tokens on any chains, now or at a past moment, and the swap each comes from. The cheapest read the API has.\n\n- Now: the token page's price, the latest swap where the token was the base in its chart pool, the pool where it was the base with the most USD volume over the last 24 hourly buckets. A priced swap worth under $0.01 sets no price. A token that is never the base, such as USDC or USDT, is priced as the quote in its busiest priced pool, where the token answers `price: null`.\n\n- Now is current to the last indexed block: the price comes from the token's newest swaps, kept in memory. Which pool is the chart pool is decided again every 30 s. A token whose chart pool has no swap among its 100 newest is read from history, and kept for a tenth of that swap's age: 2 s to a minute.\n\n- With `at`: of the latest hour at or before `at` in which the token was the base anywhere, the pool where it was the base with the most USD volume; in it, the last priced swap worth at least $0.01 at or before `at`. Only what Aurelia indexed: before indexing began, the fields are null. Kept an hour once `at` is 2 minutes old, 5 s before.\n\n- `400` when `tokens` is missing, holds more than 100 items or a malformed one (the error names it), or `at` is not a whole number. A token listed twice is answered twice. A warm batch is answered from memory; its misses are read together, in one database query.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/prices"
        },
        "parameters": [
          {
            "name": "tokens",
            "in": "query",
            "required": true,
            "description": "Up to 100 `<chain>:<address>` items, comma-separated, on any chains: `solana:So111…,evm:56:0xbb4c…`",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "at",
            "in": "query",
            "required": false,
            "description": "Unix ms: the price at that moment",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `prices[]` (array): One entry per item, in request order, or `null` for a token Aurelia has never stored.\n- `prices[].chain, address` (string): The token.\n- `prices[].priceUsd` (number | null): USD price in the swap below. `null` when it was not priced, or when the token had no priced swap in the last 24 h (with `at`: none before then).\n- `prices[].time, pool` (number | null, string | null): When and where that swap happened: unix ms, and the token's chart pool.\n- `prices[].at, tx` (number, string | null): With `at`: the time asked for, and the swap's transaction.",
            "content": {
              "application/json": {
                "example": {
                  "prices": [
                    {
                      "chain": "evm:56",
                      "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                      "priceUsd": 0.006,
                      "time": 1790618578665,
                      "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b"
                    },
                    {
                      "chain": "solana",
                      "address": "So11111111111111111111111111111111111111112",
                      "priceUsd": 150,
                      "time": 1790618141920,
                      "pool": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2"
                    },
                    {
                      "chain": "solana",
                      "address": "Cs6pmAnogKf3eaouzrM4oCefKP34nVxoEQhtjT7Cpump",
                      "priceUsd": 0.00000675,
                      "time": 1790618141920,
                      "pool": "8sN9549P3Zn6xpQRqpApN5jE6mHYrqJKeTsKr8idYDqi"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens/{chain}/{address}": {
      "get": {
        "operationId": "token",
        "summary": "Token",
        "description": "Everything about one token: metadata, logo and socials, creation and creator, supply, price, stats and fees paid per window, ATH and ATL, bonding curve, market cap and FDV, holders summary, security checks, and its pools with the chart pool first.\n\n- Cached 5 s. `404 {\"error\":\"unknown token\"}` for a token Aurelia has never stored. The token channel sends this answer again as it changes, and the price after each trade.\n\n- `price` and the window stats count swaps where the token was the base. A stablecoin is always the quote, so USDC answers `price: null` and zero stats: it is priced at $1 when it quotes other tokens.\n\n- `marketCapUsd` and `fdvUsd` are null when the price or the supply is unknown, when the supply is 0, above $2T, or above $100M while the token's known liquidity is under $1k (a price printed in a pool nobody can exit). WBNB has no supply here, since its wrapped supply is not BNB's.\n\n- `security` waits at most 1.5 s for a chain read on a miss; a slower one finishes in the background and the block says so in `unknown` (\"the chain is being read\"): ask again in a few seconds.\n\n- A token seen for the first time can have null `symbol`, `name` and supplies for a short while; `logo`, `description` and `socials` follow once its metadata document is fetched, which can take minutes or never happen.\n\n- Window stats are built from 5-minute buckets, the newest one still filling: `5m` is the current bucket only. `priceChange` is null without a priced trade that long ago (the look-back is 48 h).\n\n- Fees paid are the transaction fees traders paid to get their swaps included: on Solana the base and priority fee plus any Jito tip, on BSC the gas, in USD at the native price of the moment. Trading-bot fees and the pool's own swap fee are not included.\n\n- `ath` and `atl` come from the pools where the token was the base with at least 5% of the chart pool's 24 h volume, plus its bonding curve. When set, they hold the current price: `ath.usd` ≥ `price.usd` ≥ `atl.usd`.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/token"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `token` (object): `address`, `decimals`, `symbol`, `name`, `firstSeenBlock`; `totalSupply` and `circulatingSupply` (decimal strings or null); `supplyAt` (unix ms the supply was read, or null).\n- `token.history` ({ complete, basis, from }): How much of the token's past Aurelia holds. `complete`: all of it. `basis`: why. `creation`, a parser saw it created; `minted`, the index saw all of its supply minted (EVM); `no-older-history`, a third-party provider that knows the token has no trade or candle older than Aurelia's first; `imported`, it is older than the index and its earlier candles and trades were imported; `null`, not known (nothing has read past its first trade yet, or the provider does not know it). `from`: when the data held starts, unix ms, or `null`.\n- `token.firstSeenAt` (number | null): Time of `firstSeenBlock`, unix ms: when Aurelia first saw the token, not when it was created.\n- `token.createdAt, createdTx, creator` (number | null, string | null, string | null): The token's creation: unix ms, transaction and creator. Only when Aurelia saw the creation itself, which means a launchpad's create; all `null` otherwise, never guessed from a first sighting, so `null` does not say the token is old. See `token.history`.\n- `token.logo` (string | null): Absolute URL of the logo, re-hosted as a WebP at most 256×256 and served by `GET /logos/:chain/:address`. `null` when none is stored.\n- `token.description, socials, uri` (string | null, object, string | null): From the token's metadata document: plain text (at most 1,000 characters); `website`, `twitter`, `telegram`, `discord` (`https://` URLs or null) and `others`; and where the document lives as the chain states it.\n- `token.security` (object | null): The token's risk checks, each saying how it was established: see Security. `null` for a chain Aurelia does not check.\n- `holders` ({ count, top10Share } | null): As the last holders read found them (kept an hour); each is null when that list was not complete. `null` before any read: this page never reads the chain for them.\n- `creator` ({ address, labels, tokensCreated, graduated } | null): The creator's labels, and how many tokens Aurelia saw it create and how many graduated from their bonding curve. `null` when the creation was not seen.\n- `price` (object | null): From the token's latest swap as the base in its chart pool: `usd` (null when that swap could not be priced), `quote` and `quoteToken` (the same price in the pool's quote token; the chain's own coin is address `native`, with its symbol), `pool`, `time`. `null` when it was never the base there.\n- `windows` ({ 5m, 15m, 1h, 4h, 6h, 12h, 24h }): Each: `priceChange` (fraction or null), `volumeUsd`, `buyVolumeUsd`, `sellVolumeUsd`, `trades`, `buys`, `sells`, `traders`, `buyers`, `sellers` (distinct, approximate), `feesPaidUsd` (null when Aurelia's fee records start inside the window).\n- `stats24h` (object): `windows[\"24h\"]` without `priceChange`.\n- `chartPool, poolCount` (string | null, number): The pool with the most 24 h volume where the token was the base (failing that, the pool holding most of it), and every pool that holds the token.\n- `liquidityUsd, marketCapUsd, fdvUsd` (number | null): The listed pools whose liquidity is known, summed; `price.usd` × circulating supply, and × total supply.\n- `pools[]` (array): Up to 25: the chart pool, then by 24 h volume. Each: `address`, `protocol`, `token0`, `token1`, `based` (the token was the base here in 24 h), `counter`, `priceUsd`, `reserve` and `counterReserve` (decimals applied; a curve's are virtual), `liquidityUsd` (real balances; null for concentrated liquidity and bins on BSC), `volume24hUsd`, `trades24h`. Token pools pages through all of them.\n- `feesPaidUsd` (number | null): All-time fees paid on the token's swaps as the base. `null` unless `token.history.complete` and the token's history starts after Aurelia's fee records began.\n- `ath, atl` ({ usd, at } | null): All-time high and low USD price and the minute it happened. `null` unless `token.history.complete`: imported history is not counted.\n- `bonding` ({ pool, progress, complete } | null): For a token launched on a bonding curve: the curve, the share of its sellable supply sold (0 to 1, or null when the program does not state it), and whether it completed.\n- `latestTradeAt` (number | null): The token's newest swap in any pool, unix ms.",
            "content": {
              "application/json": {
                "example": {
                  "token": {
                    "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "decimals": 18,
                    "symbol": "TAX",
                    "name": "Tax Token",
                    "firstSeenBlock": 1000002,
                    "totalSupply": "1000000000",
                    "circulatingSupply": "1000000000",
                    "supplyAt": 1790618262558,
                    "firstSeenAt": 1790546861920,
                    "createdAt": 1790546861920,
                    "createdTx": "0x4517764dd3b9782c02c5a640714b20335ea2585b394946c4b0f5f44bc1a7bf12",
                    "creator": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                    "history": {
                      "complete": true,
                      "basis": "creation",
                      "from": 1790546861920
                    },
                    "logo": null,
                    "description": null,
                    "socials": {
                      "website": null,
                      "twitter": null,
                      "telegram": null,
                      "discord": null,
                      "others": {}
                    },
                    "uri": null,
                    "security": {
                      "checkedAt": 1790618614169,
                      "flags": [
                        "buy_tax",
                        "sell_tax"
                      ],
                      "honeypot": {
                        "likely": false,
                        "buyers": 8,
                        "sellers": 7,
                        "window": "24h",
                        "how": "Distinct wallets that bought, and that sold, in the last 24h (the transaction's sender), leaving out the token's creator and its pools' creators where Aurelia saw them. Likely a honeypot when 10+ wallets bought and none of them sold; not one once any sold"
                      },
                      "lp": {
                        "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                        "lockedShare": null,
                        "burnedShare": 1,
                        "how": "The pool is its own LP token: totalSupply() and balanceOf() of the zero and dead addresses at block 124557783. Locked LP is not counted: Aurelia has no trustworthy list of lockers"
                      },
                      "top10Share": 0.30010822,
                      "logoReuses": null,
                      "unknown": {
                        "logoReuses": "the token has no logo"
                      },
                      "contract": {
                        "block": 124557783,
                        "owner": "0x0000000000000000000000000000000000000000",
                        "renounced": true,
                        "proxy": {
                          "kind": "minimal",
                          "implementation": "0x024f18294970b5c76c0691b87f138a0317156422",
                          "admin": null,
                          "upgradeable": false
                        },
                        "functions": {
                          "mint": {
                            "present": false,
                            "signatures": [],
                            "nonOwnerCall": null
                          },
                          "pause": {
                            "present": false,
                            "signatures": [],
                            "nonOwnerCall": null
                          },
                          "blacklist": {
                            "present": false,
                            "signatures": [],
                            "nonOwnerCall": null
                          },
                          "tradingToggle": {
                            "present": false,
                            "signatures": [],
                            "nonOwnerCall": null
                          }
                        },
                        "how": "At block 124557783: owner() or getOwner(); the EIP-1967, OpenZeppelin and EIP-1822 proxy slots and EIP-1167 code; the known mint, pause, blacklist and trading-toggle signatures the implementation's bytecode dispatches, each present one called once through Multicall3 (eth_call from a caller that is not the owner)"
                      },
                      "taxes": {
                        "buy": 0.02,
                        "sell": 0.02,
                        "buys": 69,
                        "sells": 33,
                        "window": "24h",
                        "how": "Median over the swaps of the last 24h in transactions with one swap of the token: what the pool's Transfer logs delivered to the recipient against what the pool sent (buys), what the pool received against what its sender sent in all (sells)"
                      }
                    }
                  },
                  "holders": {
                    "count": 13,
                    "top10Share": 0.30010822
                  },
                  "creator": {
                    "address": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                    "labels": [
                      "creator"
                    ],
                    "tokensCreated": 3,
                    "graduated": 1
                  },
                  "stats24h": {
                    "volumeUsd": 1758,
                    "buyVolumeUsd": 1560,
                    "sellVolumeUsd": 198,
                    "trades": 105,
                    "buys": 72,
                    "sells": 33,
                    "traders": 8,
                    "buyers": 8,
                    "sellers": 7,
                    "feesPaidUsd": null
                  },
                  "chartPool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                  "price": {
                    "usd": 0.006,
                    "quote": 0.00001,
                    "quoteToken": {
                      "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                      "symbol": "WBNB"
                    },
                    "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                    "time": 1790618578665
                  },
                  "windows": {
                    "5m": {
                      "priceChange": 0,
                      "volumeUsd": 600,
                      "buyVolumeUsd": 600,
                      "sellVolumeUsd": 0,
                      "trades": 2,
                      "buys": 2,
                      "sells": 0,
                      "traders": 1,
                      "buyers": 1,
                      "sellers": 0,
                      "feesPaidUsd": null
                    },
                    "1h": {
                      "priceChange": -0.019999999999999907,
                      "volumeUsd": 618,
                      "buyVolumeUsd": 612,
                      "sellVolumeUsd": 6,
                      "trades": 5,
                      "buys": 4,
                      "sells": 1,
                      "traders": 4,
                      "buyers": 3,
                      "sellers": 1,
                      "feesPaidUsd": null
                    },
                    "24h": {
                      "priceChange": null,
                      "volumeUsd": 1758,
                      "buyVolumeUsd": 1560,
                      "sellVolumeUsd": 198,
                      "trades": 105,
                      "buys": 72,
                      "sells": 33,
                      "traders": 8,
                      "buyers": 8,
                      "sellers": 7,
                      "feesPaidUsd": null
                    }
                  },
                  "poolCount": 2,
                  "liquidityUsd": 4204200,
                  "marketCapUsd": 6000000,
                  "fdvUsd": 6000000,
                  "pools": [
                    {
                      "address": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "protocol": "pancakeswap-v2",
                      "token0": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                      "token1": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                      "volume24hUsd": 1368,
                      "reserve": "700000000",
                      "based": true,
                      "counter": {
                        "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "symbol": "WBNB"
                      },
                      "trades24h": 102,
                      "priceUsd": 0.006,
                      "counterReserve": "7",
                      "liquidityUsd": 4204200
                    }
                  ],
                  "feesPaidUsd": null,
                  "ath": {
                    "usd": 0.006122448979591836,
                    "at": 1790549820000
                  },
                  "atl": {
                    "usd": 0.000012,
                    "at": 1790546820000
                  },
                  "bonding": {
                    "pool": "0xf39f85a07237050d069187679c621b9df1df8585b01d625ae22bc7cb99430013",
                    "progress": 1,
                    "complete": true
                  },
                  "latestTradeAt": 1790618578665
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens/{chain}/{address}/holders": {
      "get": {
        "operationId": "tokenHolders",
        "summary": "Token holders",
        "description": "Who holds a token now: its largest holders with their balance, share, USD value, labels and position (PnL), the holder count where it can be known, and how complete the list is.\n\n- BSC, `indexed-transfers` (complete): the sums of every Transfer the index holds, served only when the index has the token's whole history: all of its supply minted since indexing began, no recorded gap after its first transfer, and at the newest indexed block its supply and its 20 largest balances equal to the chain's (a rebasing or reflection token fails). The verdict is kept 5 minutes. One database query, not kept.\n\n- BSC, `indexed-addresses` (incomplete): any other token, most of all one minted before indexing began. The 300 addresses whose indexed balance moved most, its pools, its creator and the burn address, each read with `balanceOf` at the chain's head: every balance is exact, but holders that have not moved the token since indexing began are missing, so there is no count. The node keeps no older state or logs: the holder count of an older token cannot be established.\n\n- Solana (only DEX transactions are indexed, so balances come from the chain): `token-accounts` (complete) lists every token account of the mint, one holder per owner; `largest-accounts` (incomplete) is a mint with too many accounts to list, its 20 largest accounts.\n\n- A list read from the chain is kept 30 s (BSC) or 60 s (Solana), the answer 5 s. Reads spend the chain's read budget: past it, `503` with `Retry-After: 10`. `422` for an address that is not a token mint, `502` when the chain cannot be read, `404 {\"error\":\"unknown token\"}` for a token Aurelia has never stored.\n\n- The holders channel sends the first 100 again each time they change.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/token-holders"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`: pages reach the 1,000 largest",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, token, indexedSince` (string, object, number): `token` is `{ address, symbol, name, decimals }`; `indexedSince` bounds the positions, as in Wallets and PnL.\n- `source` (string): How the list was established: `indexed-transfers`, `indexed-addresses` (BSC), `token-accounts`, `largest-accounts` (Solana). See the notes.\n- `complete, coverage` (boolean, string): Whether the list holds every holder, and what it covers, in words.\n- `block` (number): The block (Solana: slot) the balances are at.\n- `supply, priceUsd` (string | null, number | null): Total supply (decimals applied) and the token's price now.\n- `count, top10Share` (number | null): How many addresses hold any, and the share of the supply the 10 largest hold, pools and the burn address left out. Only from a complete list; otherwise null.\n- `holders[]` (array): Largest first; ties by address. On Solana a holder is the owner of the token accounts: one per owner.\n- `holders[].address, balance, share, valueUsd` (string, string, number | null, number | null): The holder, its balance (decimals applied), its share of `supply`, and `balance × priceUsd`.\n- `holders[].tags` (string[]): `pool`: a pool of the token keeps it there (the pool, the contract holding a V4 pool's funds, or a Solana pool's vault). `burn`: a burn address. `creator`: the token's creator, when Aurelia saw the creation.\n- `holders[].labels` (string[]): The holder's labels.\n- `holders[].position` (object | null): The holder's position in the token, as in wallet positions without `token`. Null for a pool, and for an address that never traded it.\n- `next` (string | null): Cursor for the next page. `null` on the last.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "token": {
                    "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "symbol": "TAX",
                    "name": "Tax Token",
                    "decimals": 18
                  },
                  "source": "indexed-transfers",
                  "complete": true,
                  "coverage": "Every holder: the index holds the token's whole history, and its largest balances match the chain.",
                  "indexedSince": 1790546261920,
                  "block": 1000750,
                  "supply": "1000000000",
                  "priceUsd": 0.006,
                  "count": 13,
                  "top10Share": 0.30015722,
                  "holders": [
                    {
                      "address": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "balance": "699837340",
                      "share": 0.69983734,
                      "valueUsd": 4199024.04,
                      "tags": [
                        "pool"
                      ],
                      "labels": [],
                      "position": null
                    },
                    {
                      "address": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                      "balance": "200000000",
                      "share": 0.2,
                      "valueUsd": 1200000,
                      "tags": [
                        "creator"
                      ],
                      "labels": [
                        "creator"
                      ],
                      "position": null
                    },
                    {
                      "address": "0x5c952063c7fc8610ffdb798152d69f0b9550762b",
                      "balance": "73000000",
                      "share": 0.073,
                      "valueUsd": 438000,
                      "tags": [],
                      "labels": [],
                      "position": null
                    }
                  ],
                  "next": "3"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens/{chain}/{address}/pools": {
      "get": {
        "operationId": "tokenPools",
        "summary": "Token pools",
        "description": "Every pool of a token, busiest or deepest first, each with its state, price, liquidity and stats over 5m to 24h.\n\n- `volume` lists the pools with a swap of the token in its last 24 hourly buckets, busiest first (at most 1,000), then, for a token in at most 500 pools, its other pools by address. `liquidity` ranks the first 50 of that order by `liquidityUsd`, deepest first; a pool whose liquidity is unknown comes last.\n\n- The ranking is kept 30 s, so a walk through the pages sees one order; each pool's answer is kept 5 s.\n\n- `400` for a bad `sort`, `limit` or `cursor`. `404 {\"error\":\"unknown token\"}` for a token Aurelia has never stored.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/token-pools"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "`volume` (24 h), `liquidity`",
            "schema": {
              "type": "string",
              "enum": [
                "volume",
                "liquidity"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–25",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`, as it came",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, token, sort` (string): The request, echoed.\n- `poolCount` (number): Every pool that holds the token, as on its page.\n- `listed` (number): The pools this listing pages through (see the notes).\n- `pools[]` (array): Each a pool answer: the pool, its tokens with logos, its state, `price`, `liquidityUsd` and `windows`.\n- `next` (string | null): Cursor for the next page. `null` on the last.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "token": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                  "sort": "volume",
                  "poolCount": 2,
                  "listed": 2,
                  "pools": [
                    {
                      "pool": {
                        "chain": "evm:56",
                        "address": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                        "protocol": "pancakeswap-v2",
                        "token0": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "token1": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "factory": null,
                        "createdBlock": 1000008,
                        "createdTx": null,
                        "creator": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                        "extra": {},
                        "createdAt": 1790549261920
                      },
                      "token0": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "decimals": 18,
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "firstSeenBlock": 1000002,
                        "logo": null
                      },
                      "token1": {
                        "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "decimals": 18,
                        "symbol": "WBNB",
                        "name": "Wrapped BNB",
                        "firstSeenBlock": 1000001,
                        "logo": null
                      },
                      "state": {
                        "atBlock": 1000008,
                        "atIndex": 0,
                        "reserve0": "700000000",
                        "reserve1": "7"
                      },
                      "price": {
                        "baseToken": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "quoteToken": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "usd": 0.006,
                        "quote": 0.00001
                      },
                      "liquidityUsd": 4204200,
                      "windows": {
                        "5m": {
                          "volumeUsd": 600,
                          "buyVolumeUsd": 600,
                          "sellVolumeUsd": 0,
                          "trades": 2,
                          "buys": 2,
                          "sells": 0,
                          "traders": 1,
                          "priceChange": 0
                        },
                        "1h": {
                          "volumeUsd": 618,
                          "buyVolumeUsd": 612,
                          "sellVolumeUsd": 6,
                          "trades": 5,
                          "buys": 4,
                          "sells": 1,
                          "traders": 4,
                          "priceChange": -0.019999999999999907
                        },
                        "6h": {
                          "volumeUsd": 822,
                          "buyVolumeUsd": 762,
                          "sellVolumeUsd": 60,
                          "trades": 31,
                          "buys": 21,
                          "sells": 10,
                          "traders": 8,
                          "priceChange": 0
                        },
                        "24h": {
                          "volumeUsd": 1368,
                          "buyVolumeUsd": 1170,
                          "sellVolumeUsd": 198,
                          "trades": 102,
                          "buys": 69,
                          "sells": 33,
                          "traders": 8,
                          "priceChange": null
                        }
                      }
                    }
                  ],
                  "next": "1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens/{chain}/{address}/candles": {
      "get": {
        "operationId": "tokenCandles",
        "summary": "Token candles",
        "description": "OHLC bars of a token, in USD or in its quote token, from the pool that charts it. The answer names that pool. A price history is the bars' closes.\n\n- A token older than the index: reading past its first bar asks for its earlier history once, in the background, and the answer does not wait for it. A later read has up to 2,000 earlier bars per `res`, in `usd` only, marked `imported`, from the provider's largest pool rather than the answer's `pool`. A token Aurelia saw created never needs them. See Data and coverage.\n\n- The pool is the token's chart pool, where it was the base with the most USD volume in the last 24 h, as its price picks it. Without a trade in 24 h, the pool where it was the base with the most volume ever.\n\n- Bars, caching and parameters are those of pool candles: unix seconds, at most 5,000 bars a request.\n\n- A pool's candles price its base, so a token that is the base of no pool, such as USDC, answers `422`. `404 {\"error\":\"unknown token\"}` for a token Aurelia has never stored.\n\n- Keep the newest bar moving with the candles channel.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/token-candles"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "res",
            "in": "query",
            "required": false,
            "description": "`1m`, `5m`, `15m`, `1h`, `4h`, `1d`",
            "schema": {
              "type": "string",
              "enum": [
                "1m",
                "5m",
                "15m",
                "1h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Unix seconds",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Unix seconds, ≥ `from`; at most 5,000 bars from `from`",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "description": "`usd`, `quote`",
            "schema": {
              "type": "string",
              "enum": [
                "usd",
                "quote"
              ]
            }
          },
          {
            "name": "fill",
            "in": "query",
            "required": false,
            "description": "`1` or `true`: repeat the previous close through empty intervals",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, pool, res, currency` (string): `pool` is the pool the bars come from; the rest is the request, echoed.\n- `token` (string): The token asked for.\n- `bars[]` (array): Ascending, `from` ≤ `t` ≤ `to`.\n- `t` (number): Bar start, unix seconds, aligned to UTC multiples of `res`.\n- `o, h, l, c` (number): Open, high, low, close. Each bar opens at the previous bar's close.\n- `v` (number): USD volume, in both currencies.\n- `n` (number): Trades: priced ones in `usd`, all of them in `quote`.\n- `imported` (true, only on such bars): A USD bar from before Aurelia's first trade of the token, imported from a third-party provider. Its `n` is `null`.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                  "res": "1h",
                  "currency": "usd",
                  "bars": [
                    {
                      "t": 1790611200,
                      "o": 0.006,
                      "h": 0.006122448979591836,
                      "l": 0.006,
                      "c": 0.006122448979591836,
                      "v": 36,
                      "n": 5
                    },
                    {
                      "t": 1790614800,
                      "o": 0.006122448979591836,
                      "h": 0.006122448979591836,
                      "l": 0.006,
                      "c": 0.006,
                      "v": 18,
                      "n": 3
                    },
                    {
                      "t": 1790618400,
                      "o": 0.006,
                      "h": 0.006,
                      "l": 0.006,
                      "c": 0.006,
                      "v": 600,
                      "n": 2
                    }
                  ],
                  "token": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/pools/{chain}/{address}": {
      "get": {
        "operationId": "pool",
        "summary": "Pool",
        "description": "A pool's metadata, both tokens, its live state, and its market: price, liquidity, and stats over 5m to 24h.\n\n- Cached 5 s. The pool channel sends this answer again as it changes, and the price after each swap.\n\n- Constant-product pools report real balances. Concentrated liquidity reports the active range's virtual reserves: take the price from `sqrtPrice`, `price` or trades, not from reserves.\n\n- Window stats count every swap of the pool, unpriced ones (0 USD) and those under $0.01 included; `priceChange` follows the candles, which leave those out.\n\n- `404 {\"error\":\"unknown pool\"}` for a pool Aurelia has never stored.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/pool"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Pool address (BSC; a 32-byte pool id for Uniswap V4, PancakeSwap Infinity CL, and four.meme TokenManager2 and flap.sh curves) or pool account (Solana)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `pool` (object): `chain`, `address`, `protocol`, `token0`, `token1`, `factory` (or null), `extra` (protocol details: fee, tick spacing, vaults, hooks…).\n- `pool.createdBlock, createdAt, createdTx, creator` (number | null, number | null, string | null, string | null): The pool's creation. Null when Aurelia first saw the pool through a swap, not its creation.\n- `token0, token1` (object | null): `address`, `decimals`, `symbol`, `name`, `firstSeenBlock`, and `logo`: an absolute URL, or `null`.\n- `state` (object | null): After the last indexed event that touched the pool: `atBlock`, `atIndex`; `reserve0`, `reserve1` (decimals applied); `sqrtPrice` and `liquidity` (raw, concentrated liquidity only), `tick`, `activeBin`, `curveComplete` where the pool type has them. `null` when unknown.\n- `price` (object | null): The closes of the pool's charts: `baseToken` and `quoteToken`; `usd`, the base's USD price at the newest priced swap (null without one); `quote`, its price in quote-token units at the newest swap. `null` when the base of the pool's newest hour of swaps cannot be told.\n- `liquidityUsd` (number | null): Value of the pool's real balances at both tokens' USD prices in its newest priced swap. `null` for concentrated liquidity and bins on BSC, whose reserves are virtual, and without both prices.\n- `windows` ({ 5m, 1h, 6h, 24h }): Each: `volumeUsd`, `buyVolumeUsd`, `sellVolumeUsd`, `trades`, `buys`, `sells` (a buy is the trader receiving the base), `traders` (approximate), `priceChange` (the base's, from 1-minute closes).",
            "content": {
              "application/json": {
                "example": {
                  "pool": {
                    "chain": "evm:56",
                    "address": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                    "protocol": "pancakeswap-v2",
                    "token0": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "token1": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                    "factory": null,
                    "createdBlock": 1000008,
                    "createdTx": null,
                    "creator": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                    "extra": {},
                    "createdAt": 1790549261920
                  },
                  "token0": {
                    "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "decimals": 18,
                    "symbol": "TAX",
                    "name": "Tax Token",
                    "firstSeenBlock": 1000002,
                    "logo": null
                  },
                  "token1": {
                    "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                    "decimals": 18,
                    "symbol": "WBNB",
                    "name": "Wrapped BNB",
                    "firstSeenBlock": 1000001,
                    "logo": null
                  },
                  "state": {
                    "atBlock": 1000008,
                    "atIndex": 0,
                    "reserve0": "700000000",
                    "reserve1": "7"
                  },
                  "price": {
                    "baseToken": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "quoteToken": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                    "usd": 0.006,
                    "quote": 0.00001
                  },
                  "liquidityUsd": 4204200,
                  "windows": {
                    "5m": {
                      "volumeUsd": 600,
                      "buyVolumeUsd": 600,
                      "sellVolumeUsd": 0,
                      "trades": 2,
                      "buys": 2,
                      "sells": 0,
                      "traders": 1,
                      "priceChange": 0
                    },
                    "1h": {
                      "volumeUsd": 618,
                      "buyVolumeUsd": 612,
                      "sellVolumeUsd": 6,
                      "trades": 5,
                      "buys": 4,
                      "sells": 1,
                      "traders": 4,
                      "priceChange": -0.019999999999999907
                    },
                    "6h": {
                      "volumeUsd": 822,
                      "buyVolumeUsd": 762,
                      "sellVolumeUsd": 60,
                      "trades": 31,
                      "buys": 21,
                      "sells": 10,
                      "traders": 8,
                      "priceChange": 0
                    },
                    "24h": {
                      "volumeUsd": 1368,
                      "buyVolumeUsd": 1170,
                      "sellVolumeUsd": 198,
                      "trades": 102,
                      "buys": 69,
                      "sells": 33,
                      "traders": 8,
                      "priceChange": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/pools/{chain}/{address}/candles": {
      "get": {
        "operationId": "poolCandles",
        "summary": "Pool candles",
        "description": "OHLC bars of a pool's base token, in USD or in the quote token.\n\n- Bars are cached in pages of 500. A page the indexer has fully passed is cached for 24 h; the page holding now for up to a minute: tick it with the candles channel.\n\n- In `usd`, an interval without a priced swap has no bar. In `quote`, every interval with a trade has one. With `fill`, empty intervals repeat the previous close with `v` and `n` at 0. Swaps worth under $0.01 do not set a price.\n\n- `from` and `to` are seconds; milliseconds are not detected. An unknown pool answers `200` with no bars. `400` for a bad `res`, `currency` or range, or more than 5,000 bars.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/pool-candles"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Pool address (BSC; a 32-byte pool id for Uniswap V4, PancakeSwap Infinity CL, and four.meme TokenManager2 and flap.sh curves) or pool account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "res",
            "in": "query",
            "required": false,
            "description": "`1m`, `5m`, `15m`, `1h`, `4h`, `1d`",
            "schema": {
              "type": "string",
              "enum": [
                "1m",
                "5m",
                "15m",
                "1h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Unix seconds",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Unix seconds, ≥ `from`; at most 5,000 bars from `from`",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "description": "`usd`, `quote`",
            "schema": {
              "type": "string",
              "enum": [
                "usd",
                "quote"
              ]
            }
          },
          {
            "name": "fill",
            "in": "query",
            "required": false,
            "description": "`1` or `true`: repeat the previous close through empty intervals",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, pool, res, currency` (string): The request, echoed.\n- `bars[]` (array): Ascending, `from` ≤ `t` ≤ `to`.\n- `t` (number): Bar start, unix seconds, aligned to UTC multiples of `res`.\n- `o, h, l, c` (number): Open, high, low, close. Each bar opens at the previous bar's close.\n- `v` (number): USD volume, in both currencies.\n- `n` (number): Trades: priced ones in `usd`, all of them in `quote`.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "solana",
                  "pool": "8sN9549P3Zn6xpQRqpApN5jE6mHYrqJKeTsKr8idYDqi",
                  "res": "1h",
                  "currency": "usd",
                  "bars": [
                    {
                      "t": 1790611200,
                      "o": 0.000006,
                      "h": 0.000006,
                      "l": 0.000005857142857142857,
                      "c": 0.000006,
                      "v": 9.15,
                      "n": 2
                    },
                    {
                      "t": 1790614800,
                      "o": 0.000006,
                      "h": 0.00000675,
                      "l": 0.000006,
                      "c": 0.00000675,
                      "v": 13.5,
                      "n": 1
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/trades": {
      "get": {
        "operationId": "trades",
        "summary": "Trades",
        "description": "One trade feed, newest first: a token's trades in all its pools, a pool's, a wallet's, or a transaction's, filtered by side, USD size, trader or label. One row shape everywhere, with the trader's labels.\n\n- A token older than the index: reading its unfiltered feed to the end asks for its earlier trades once, in the background. A later read continues with up to 1,000 of them, marked `imported`. A filter, or a pool, wallet or transaction scope, reads Aurelia's own trades only.\n\n- One swap in one pool is one row. It is told from the side of the token in scope (`token=`), else from the swap's base token (see Basics): buying a memecoin with SOL is a buy of the memecoin. A multi-hop route is one row per pool it crossed, sharing `tx`, `block` and `txIndex`: `tx=` returns every leg, a token's feed the legs that moved it.\n\n- A filter never widens a read: a filtered page examines a bounded part of its scope (a pool's or a wallet's newest 50,000 swaps before the cursor; a token's last hour, day, then 7 days), and when that part ends before the page fills, `next` continues right after it. Follow `next` until it is `null`. `label=` reads 500 rows a page and keeps those whose trader has the label.\n\n- A token's first page comes from its 100 newest swaps, kept in memory: current to the last indexed block. A first page is cached 2 s, a later one 30 s (older trades change only in a reorg).\n\n- `400` without exactly one scope, for a bad `side`, `limit`, `cursor` or bound, `minUsd` above `maxUsd`, `trader` with `wallet`, or a malformed `label`. `404` for an unknown token or pool. An unknown wallet or transaction answers `200` with no trades.\n\n- The trades channel pushes the same rows as each block is indexed.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/trades"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": false,
            "description": "Exactly one of `token`, `pool`, `wallet`, `tx`: a token's trades, rows from its side",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pool",
            "in": "query",
            "required": false,
            "description": "A pool's trades, rows from its base's side",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "in": "query",
            "required": false,
            "description": "A wallet's trades, rows from each swap's base",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tx",
            "in": "query",
            "required": false,
            "description": "Every swap of a transaction (the last 7 days): each leg of a route",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "`buy` or `sell`, from the row's side",
            "schema": {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            }
          },
          {
            "name": "minUsd",
            "in": "query",
            "required": false,
            "description": "A lower bound on `amountUsd`, included; an unpriced trade never matches",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxUsd",
            "in": "query",
            "required": false,
            "description": "An upper bound on `amountUsd`, included",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "trader",
            "in": "query",
            "required": false,
            "description": "One wallet's trades within the scope (not with `wallet`)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Trades by wallets with this label: `sniper`, `insider`…",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–200",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`, as it came",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, token | pool | wallet | tx` (string): The request's chain and scope, echoed.\n- `indexedSince` (number | null): Unix ms from which trades are indexed: the chain's first indexed block, or for `tx` 7 days back (transactions are kept that long).\n- `trades[].time` (number): Block time, unix ms.\n- `trades[].block, txIndex, eventIndex` (number): Position in the chain: block (Solana: slot), transaction, event.\n- `trades[].tx, pool, protocol` (string): Transaction hash or signature, pool, and DEX (`pancakeswap-v2`, `pumpswap`…).\n- `trades[].side` (\"buy\" | \"sell\"): `buy` when the trader received `token`, `sell` when they paid it.\n- `trades[].token, amount` ({ address, symbol, name, decimals }, string): The token the row is told from (see the notes), and its amount, positive, decimals applied. Native BNB, ETH or SOL has address `\"native\"`.\n- `trades[].counter, counterAmount` ({ address, symbol, name, decimals }, string): The other token and its amount.\n- `trades[].priceUsd` (number | null): `token`'s USD price in this swap, whether it was the base or the quote. `null` when the swap could not be priced.\n- `trades[].amountUsd` (number | null): USD value of the swap. `null` when unpriced.\n- `trades[].priced` (boolean): Whether the swap has a USD price.\n- `trades[].imported` (true, only on such rows): On a token's own feed, a trade from before Aurelia's first trade of the token, imported from a third-party provider: `block` and `txIndex` are 0, `eventIndex` only orders it, and `protocol` and `labels` are empty.\n- `trades[].trader, labels` (string, string[]): The wallet that traded (see Wallets and PnL), `\"\"` when the swap belongs to no wallet, and its labels.\n- `next` (string | null): Cursor for the next older page, or for the part of the scope after the one a filtered page examined. `null` at the end.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "token": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                  "indexedSince": 1790546261920,
                  "trades": [
                    {
                      "time": 1790618578665,
                      "block": 1000750,
                      "txIndex": 0,
                      "eventIndex": 4,
                      "tx": "0x2b170741f16da7ea4287bbd163e3365f89c73c4face2b6ed032487c0dd9b0cb4",
                      "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "protocol": "pancakeswap-v2",
                      "side": "buy",
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18
                      },
                      "amount": "50000",
                      "counter": {
                        "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "symbol": "WBNB",
                        "name": "Wrapped BNB",
                        "decimals": 18
                      },
                      "counterAmount": "0.5",
                      "priceUsd": 0.006,
                      "amountUsd": 300,
                      "priced": true,
                      "trader": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                      "labels": [
                        "sniper",
                        "fresh"
                      ]
                    },
                    {
                      "time": 1790618554904,
                      "block": 1000749,
                      "txIndex": 0,
                      "eventIndex": 4,
                      "tx": "0xcd32103a902cba28b871741adf595a6b209ce0b66d6849cc8a603842adb07729",
                      "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "protocol": "pancakeswap-v2",
                      "side": "buy",
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18
                      },
                      "amount": "50000",
                      "counter": {
                        "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                        "symbol": "WBNB",
                        "name": "Wrapped BNB",
                        "decimals": 18
                      },
                      "counterAmount": "0.5",
                      "priceUsd": 0.006,
                      "amountUsd": 300,
                      "priced": true,
                      "trader": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                      "labels": [
                        "sniper",
                        "fresh"
                      ]
                    }
                  ],
                  "next": "1790618554904.1000749.0.4"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/tokens/{chain}/{address}/traders": {
      "get": {
        "operationId": "tokenTraders",
        "summary": "Token traders",
        "description": "A token's traders ranked by PnL, realized PnL or volume, over a window or all time, or its first buyers; each with its position, labels and first buy.\n\n- With a `window`, a trader's trade counts, amounts and realized PnL are the window's (its sells against the all-time average buy); the average buy, `open` and unrealized PnL are all-time. Windows are whole clock hours, the current one included: `24h` is the last 24 hours rounded down to the hour.\n\n- `first` ranks by the hour of each wallet's first buy, exactly, then by its first trade in that hour; with a `window`, only wallets whose first buy falls in it.\n\n- Wallets that traded the token, not its holders: one that only received it is not here (token holders). Every swap of the token counts, whether it was the base or the quote.\n\n- Cached 15 s. With `label`, a page examines 500 ranked traders. `404 {\"error\":\"unknown token\"}` for a token Aurelia has never stored.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/token-traders"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "`pnl` (total), `realized`, `volume` (bought + sold USD), `first` (first buyers, earliest first)",
            "schema": {
              "type": "string",
              "enum": [
                "pnl",
                "realized",
                "volume",
                "first"
              ]
            }
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "description": "`1h`, `6h`, `24h`, `7d`, `30d`, `all`",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "1h",
                "6h",
                "24h",
                "7d",
                "30d"
              ]
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Only traders with this label",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`, as it came",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, token, indexedSince, sort, window` (string, object, number, string, string): `token` is `{ address, symbol, name, decimals }`; `indexedSince` as in Wallets and PnL.\n- `traders[]` (array): In `sort` order: highest first (a null PnL last), or for `first` earliest first.\n- `traders[].wallet, labels` (string, string[]): The wallet and its labels.\n- `traders[].firstBuy` ({ time, block, tx } | null): The wallet's first buy of the token. `null` for a wallet that only sold it.\n- `traders[].quote` (boolean): A stablecoin, or the native or wrapped native token: listed, but left out of every wallet total.\n- `traders[].trades, buys, sells, unpricedTrades` (number): The swaps of the token. A buy is one where the wallet received it. `unpricedTrades` had no USD price and are left out of the USD figures.\n- `traders[].bought, sold` (string): Token amounts, decimals applied.\n- `traders[].open` (string): `bought − sold`, at least 0: what the trades leave held. Transfers are not counted, so it can differ from the balance.\n- `traders[].boughtUsd, soldUsd` (number): USD value of the priced buys and sells.\n- `traders[].avgBuyPriceUsd, avgSellPriceUsd` (number | null): USD per token over the priced buys, and sells. Null without one.\n- `traders[].priceUsd, priceAt` (number | null): The token's price now, and the start of the hour of the swap it came from, unix ms (see Wallets and PnL).\n- `traders[].realizedPnlUsd, unrealizedPnlUsd, totalPnlUsd` (number | null): See Wallets and PnL. Null is unknown, never 0.\n- `traders[].firstTradeAt, lastTradeAt` (number): Unix ms.\n- `next` (string | null): Cursor for the next page. `null` on the last.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "token": {
                    "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                    "symbol": "TAX",
                    "name": "Tax Token",
                    "decimals": 18
                  },
                  "indexedSince": 1790546261920,
                  "sort": "first",
                  "window": "all",
                  "traders": [
                    {
                      "wallet": "0x0883bc322b58788f1cce720a8a285db72a4facc4",
                      "labels": [
                        "insider"
                      ],
                      "firstBuy": {
                        "time": 1790546861920,
                        "block": 1000002,
                        "tx": "0x4517764dd3b9782c02c5a640714b20335ea2585b394946c4b0f5f44bc1a7bf12"
                      },
                      "quote": false,
                      "trades": 20,
                      "buys": 20,
                      "sells": 0,
                      "unpricedTrades": 0,
                      "bought": "5019000",
                      "sold": "0",
                      "open": "5019000",
                      "boughtUsd": 174,
                      "soldUsd": 0,
                      "avgBuyPriceUsd": 0.0000346682606096832,
                      "avgSellPriceUsd": null,
                      "priceUsd": 0.006,
                      "priceAt": 1790618400000,
                      "realizedPnlUsd": 0,
                      "unrealizedPnlUsd": null,
                      "totalPnlUsd": 0,
                      "firstTradeAt": 1790546861920,
                      "lastTradeAt": 1790615861920
                    },
                    {
                      "wallet": "0x000000000000000000000000000000000000a00c",
                      "labels": [
                        "sniper"
                      ],
                      "firstBuy": {
                        "time": 1790546864920,
                        "block": 1000003,
                        "tx": "0x5221ff9327bd2f842642692502d948d77a28f3b6fcda5992a0f8b3174155f12c"
                      },
                      "quote": false,
                      "trades": 12,
                      "buys": 8,
                      "sells": 4,
                      "unpricedTrades": 0,
                      "bought": "2011000",
                      "sold": "3920",
                      "open": "2007080",
                      "boughtUsd": 96,
                      "soldUsd": 24,
                      "avgBuyPriceUsd": 0.00004773744405768274,
                      "avgSellPriceUsd": 0.006122448979591836,
                      "priceUsd": 0.006,
                      "priceAt": 1790618400000,
                      "realizedPnlUsd": 23.81286921929388,
                      "unrealizedPnlUsd": 11946.667130780706,
                      "totalPnlUsd": 11970.48,
                      "firstTradeAt": 1790546864920,
                      "lastTradeAt": 1790615861920
                    }
                  ],
                  "next": "2"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets/{chain}/{address}": {
      "get": {
        "operationId": "walletPortfolio",
        "summary": "Wallet portfolio",
        "description": "A wallet's holdings now, read from the chain and valued in USD, its liquidity positions in the pools Aurelia indexes, each token with the wallet's position in it; and who the wallet is: its labels and its first funding.\n\n- Balances are read from the chain: on BSC, BNB and every token the wallet sent, received or traded since indexing began; on Solana, SOL and every token account it owns. Cached 15 s per wallet, the answer 5 s. `502` when the chain cannot be read, `422` for a BSC wallet that touched more than 2,000 tokens: a partial portfolio would be wrong, so neither sends one.\n\n- Liquidity positions: on BSC, the LP tokens among the balances (a V2-style pool is its own LP token) and the position NFTs of each enumerable position manager; on Solana, the token accounts whose mint is a position NFT or an LP mint. What withdrawing all of it pays now, read from one block or slot, rounded down as the program rounds (Raydium AMM v4 less the PnL it owes the protocol, CPMM less the fees held in its vaults); uncollected fees where the chain states them. An LP token a position stands for leaves the token holdings. Farm rewards, lending and staking are not covered.\n\n- Positions nothing on chain lists by owner (Uniswap V4 and PancakeSwap Infinity NFTs on BSC, Meteora DLMM accounts on Solana) come from Aurelia's record of every transfer, creation and close since `positionsIndexedSince`; each one is checked on chain (owner, liquidity) before it is shown. One whose last transfer came before that is not known, so these protocols are always in `incomplete`. BSC positions in pools whose hook can change what a withdrawal pays are left out.\n\n- The first funding is read on request and kept: for good once found. Solana: the wallet's oldest transactions; BSC: the first BNB transfer into it the index saw, confirmed by its balance and nonce being 0 the block before (the node must still keep that state). A request waits 3 s for it; a slower read goes on, and `fundedByReason` says to ask again.\n\n- The thin rule keeps airdropped tokens out of the total: a price from a pool nobody trades is no value. BNB and SOL are priced as WBNB and WSOL.\n\n- The balances channel sends this answer again whenever it changes.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-portfolio"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet address (BSC) or account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–500 holdings",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, wallet, indexedSince` (string, string, number): As in every wallet answer (see Wallets and PnL).\n- `labels` (string[]): The wallet's labels.\n- `fundedBy` ({ address, amount, time, tx, labels } | null): Its first funding: who sent it its first BNB, ETH or SOL, how much (decimals applied), when and in which transaction, and the sender's labels. `null` when it cannot be established, with the reason in `fundedByReason`.\n- `fundedByReason` (string | null): Why `fundedBy` is null.\n- `block, balancesAt` (number): The block (Solana: slot) the balances reflect, and when they were read, unix ms.\n- `totalValueUsd` (number): Sum of the counted holdings: priced, and not thin.\n- `pnl` ({ realizedUsd, unrealizedUsd, totalUsd }): All-time PnL of every non-quote position, held or not. Unknown unrealized PnL counts as 0.\n- `holdings[]` (array): Token balances above 0 and liquidity positions: the counted ones by `valueUsd`, then the thin ones, then the unpriced ones.\n- `holdings[].kind` (\"token\" | \"lp\"): A token balance, or a liquidity position in a pool Aurelia indexes.\n- `holdings[] (token)` (object): `token` (`address` `\"native\"` for BNB, ETH or SOL), `balance` (decimals applied), `priceUsd` and `valueUsd` (null without a price), `allocation` (share of `totalValueUsd`, null for thin and unpriced holdings), `thin` (the token traded under $1,000 in 24 h, or no market backs its price, as for a null market cap: shown, not counted), `position` (as in wallet positions without `token`; null when it never traded it).\n- `holdings[] (lp)` (object): `protocol`, `pool`, `position` (the position's id: an NFT or an account; null for a fungible LP token), `lpToken` (`{ address, balance, supply, share }` for a fungible one), `tokens[]` (each `{ token, amount, fees, locked, priceUsd, valueUsd }`: what withdrawing all of it pays now, the uncollected fees (null where the protocol states none), and the part of the amount locked or vesting (Meteora DAMM v2; counted in the value)), `range` (concentrated liquidity and bins: `lower`, `upper` (exclusive), `current` ticks or bins, `inRange`, and the prices at them), `valueUsd`, `feesUsd`, `allocation`, `thin`.\n- `unpriced, count` (number): Holdings without a price, and all holdings: `limit` cuts the list, never the totals.\n- `liquidity` ({ protocols, incomplete, notCovered, positionsIndexedSince, error }): What the liquidity read covered: the protocols read, those not read in full, those not covered and why, since when positions found through Aurelia's record of their transfers are known (unix ms; null while nothing is recorded), and the error when the chain could not be read (the portfolio then lists no position).",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                  "indexedSince": 1790546261920,
                  "labels": [
                    "sniper",
                    "fresh"
                  ],
                  "fundedBy": {
                    "address": "0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
                    "amount": "0.25",
                    "time": 1790616461920,
                    "tx": "0x124aa51a8b73a7c373249b80ec4beb9fa4e80b4aa78a8bc73a64c781b3f2925d",
                    "labels": []
                  },
                  "fundedByReason": null,
                  "block": 1000748,
                  "balancesAt": 1790618266812,
                  "totalValueUsd": 214134,
                  "pnl": {
                    "realizedUsd": 59.5089770354906,
                    "unrealizedUsd": 6.776263578034403e-14,
                    "totalUsd": 59.50897703549067
                  },
                  "holdings": [
                    {
                      "kind": "token",
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18
                      },
                      "balance": "21500000",
                      "priceUsd": 0.006,
                      "valueUsd": 129000,
                      "allocation": 0.6024265179747261,
                      "thin": false,
                      "position": {
                        "quote": false,
                        "trades": 22,
                        "buys": 12,
                        "sells": 10,
                        "unpricedTrades": 0,
                        "bought": "20118000",
                        "sold": "9800",
                        "open": "20108200",
                        "boughtUsd": 1008,
                        "soldUsd": 60,
                        "avgBuyPriceUsd": 0.00005010438413361169,
                        "avgSellPriceUsd": 0.006122448979591836,
                        "priceUsd": 0.006,
                        "priceAt": 1790618400000,
                        "realizedPnlUsd": 59.5089770354906,
                        "unrealizedPnlUsd": null,
                        "totalPnlUsd": 59.5089770354906,
                        "firstTradeAt": 1790546864920,
                        "lastTradeAt": 1790618578665
                      }
                    },
                    {
                      "kind": "lp",
                      "protocol": "pancakeswap-v2",
                      "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                      "position": null,
                      "lpToken": {
                        "address": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                        "balance": "2000000000000000000000",
                        "supply": "100000000000000000000000",
                        "share": 0.02
                      },
                      "tokens": [
                        {
                          "token": {
                            "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                            "symbol": "TAX",
                            "name": "Tax Token",
                            "decimals": 18
                          },
                          "amount": "14000000",
                          "fees": null,
                          "raw": {
                            "amount": "14000000000000000000000000",
                            "fees": null
                          },
                          "priceUsd": 0.006,
                          "valueUsd": 84000
                        },
                        {
                          "token": {
                            "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                            "symbol": "WBNB",
                            "name": "Wrapped BNB",
                            "decimals": 18
                          },
                          "amount": "0.14",
                          "fees": null,
                          "raw": {
                            "amount": "140000000000000000",
                            "fees": null
                          },
                          "priceUsd": 600,
                          "valueUsd": 84.00000000000001
                        }
                      ],
                      "range": null,
                      "valueUsd": 84084,
                      "feesUsd": null,
                      "allocation": 0.39267001036734006,
                      "thin": false
                    },
                    {
                      "kind": "token",
                      "token": {
                        "address": "native",
                        "symbol": "BNB",
                        "name": "BNB",
                        "decimals": 18
                      },
                      "balance": "1.25",
                      "priceUsd": 600,
                      "valueUsd": 750,
                      "allocation": 0.0035024797556670122,
                      "thin": false,
                      "position": null
                    }
                  ],
                  "unpriced": 0,
                  "count": 6,
                  "liquidity": {
                    "protocols": [
                      "pancakeswap-v2",
                      "pancakeswap-v3",
                      "uniswap-v2",
                      "uniswap-v3"
                    ],
                    "incomplete": [],
                    "notCovered": [
                      {
                        "protocol": "pancakeswap-infinity-cl",
                        "reason": "its positions are not enumerable per owner"
                      }
                    ],
                    "error": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets": {
      "get": {
        "operationId": "walletList",
        "summary": "Wallets",
        "description": "Several wallets' portfolios with totals, on every listed chain each address fits (`wallets=`); or wallet discovery: the top wallets by PnL, volume or win rate, by label.\n\n- `wallets=`: each portfolio reads its wallet's balances from the chain, as the wallet portfolio does, and shares that route's caches. A bare `0x` address is read on BSC, a base58 one on Solana. `400` for more than 10, one that fits no chain of `chains`, or `label`, `sort` or `cursor` alongside.\n\n- Discovery reads a ranking rebuilt every 15 minutes with the labels (the top 1,000 per chain, label and sort), never a scan per request: the wallets that traded at least $1,000 in 30 days, or carry a label. Figures are the analysis's over 7 and 30 days, quote tokens left out; `winRate30d` ranks only wallets with 10+ results. Cached a minute.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-list"
        },
        "parameters": [
          {
            "name": "wallets",
            "in": "query",
            "required": false,
            "description": "1–10 items, comma-separated: `<chain>:<address>`, or a bare address (every listed chain its format fits)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chains",
            "in": "query",
            "required": false,
            "description": "Comma-separated: `evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Holdings per portfolio 1–500; wallets per page 1–100",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Discovery: `creator`, `insider`, `sniper`, `smart_money`, `bot` (not `fresh`: see labels)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Discovery: `pnl7d`, `pnl30d`, `volume30d`, `winRate30d`",
            "schema": {
              "type": "string",
              "enum": [
                "pnl30d",
                "pnl7d",
                "volume30d",
                "winRate30d"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Discovery: the previous page's `next`",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `wallets, chains` (string[]): `wallets=`: the wallets and chains answered.\n- `totalValueUsd, pnl` (number, object): `wallets=`: sums of the portfolios' `totalValueUsd` and `pnl`.\n- `complete` (boolean): `wallets=`: `false` when a portfolio could not be read: the totals leave it out.\n- `portfolios[]` (array): `wallets=`: one per wallet and chain, in request order: the wallet portfolio answer, or `{ chain, wallet, status, error }` for one that could not be read (the status its own route would answer).\n- `chains, label, sort, rankedAt` (string[], string | null, string, number | null): Discovery: the request, and when the ranking was built, unix ms.\n- `wallets[]` (array): Discovery: highest first. Each: `chain`, `wallet`, `labels`, `pnl7dUsd`, `pnl30dUsd`, `volume30dUsd`, `winRate30d` (null without results), `wins30d`, `losses30d`, `swaps7d`.\n- `next` (string | null): Discovery: cursor for the next page.",
            "content": {
              "application/json": {
                "example": {
                  "wallets": [
                    "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                    "Fm1Nzv3EcgGMW2MFHHGKjdVDbvHsMMtoRdoBDmUmsFFE"
                  ],
                  "chains": [
                    "evm:56",
                    "solana"
                  ],
                  "totalValueUsd": 214764,
                  "pnl": {
                    "realizedUsd": 66.2589770354906,
                    "unrealizedUsd": 57.375000000000064,
                    "totalUsd": 123.63397703549066
                  },
                  "complete": true,
                  "portfolios": [
                    {
                      "chain": "evm:56",
                      "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                      "indexedSince": 1790546261920,
                      "labels": [
                        "sniper",
                        "fresh"
                      ],
                      "fundedBy": {
                        "address": "0x8894e0a0c962cb723c1976a4421c95949be2d4e3",
                        "amount": "0.25",
                        "time": 1790616461920,
                        "tx": "0x124aa51a8b73a7c373249b80ec4beb9fa4e80b4aa78a8bc73a64c781b3f2925d",
                        "labels": []
                      },
                      "fundedByReason": null,
                      "block": 1000748,
                      "balancesAt": 1790618266812,
                      "totalValueUsd": 214134,
                      "pnl": {
                        "realizedUsd": 59.5089770354906,
                        "unrealizedUsd": 6.776263578034403e-14,
                        "totalUsd": 59.50897703549067
                      },
                      "holdings": [
                        {
                          "kind": "token",
                          "token": {
                            "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                            "symbol": "TAX",
                            "name": "Tax Token",
                            "decimals": 18
                          },
                          "balance": "21500000",
                          "priceUsd": 0.006,
                          "valueUsd": 129000,
                          "allocation": 0.6024265179747261,
                          "thin": false,
                          "position": {
                            "quote": false,
                            "trades": 22,
                            "buys": 12,
                            "sells": 10,
                            "unpricedTrades": 0,
                            "bought": "20118000",
                            "sold": "9800",
                            "open": "20108200",
                            "boughtUsd": 1008,
                            "soldUsd": 60,
                            "avgBuyPriceUsd": 0.00005010438413361169,
                            "avgSellPriceUsd": 0.006122448979591836,
                            "priceUsd": 0.006,
                            "priceAt": 1790618400000,
                            "realizedPnlUsd": 59.5089770354906,
                            "unrealizedPnlUsd": null,
                            "totalPnlUsd": 59.5089770354906,
                            "firstTradeAt": 1790546864920,
                            "lastTradeAt": 1790618578665
                          }
                        }
                      ],
                      "unpriced": 0,
                      "count": 6,
                      "liquidity": {
                        "protocols": [
                          "pancakeswap-v2",
                          "pancakeswap-v3",
                          "uniswap-v2",
                          "uniswap-v3"
                        ],
                        "incomplete": [],
                        "notCovered": [
                          {
                            "protocol": "pancakeswap-infinity-cl",
                            "reason": "its positions are not enumerable per owner"
                          }
                        ],
                        "error": null
                      }
                    },
                    {
                      "chain": "solana",
                      "wallet": "Fm1Nzv3EcgGMW2MFHHGKjdVDbvHsMMtoRdoBDmUmsFFE",
                      "indexedSince": 1790546261920,
                      "labels": [
                        "insider"
                      ],
                      "fundedBy": null,
                      "fundedByReason": "the chain could not be read (Unable to connect. Is the computer able to access the url?)",
                      "block": 449600022,
                      "balancesAt": 1790618266815,
                      "totalValueUsd": 630,
                      "pnl": {
                        "realizedUsd": 6.75,
                        "unrealizedUsd": 57.37499999999999,
                        "totalUsd": 64.125
                      },
                      "holdings": [
                        {
                          "kind": "token",
                          "token": {
                            "address": "native",
                            "symbol": "SOL",
                            "name": "Solana",
                            "decimals": 9
                          },
                          "balance": "3.4",
                          "priceUsd": 150,
                          "valueUsd": 510,
                          "allocation": 0.8095238095238095,
                          "thin": false,
                          "position": null
                        }
                      ],
                      "unpriced": 0,
                      "count": 3,
                      "liquidity": {
                        "protocols": [
                          "raydium-cpmm",
                          "orca-whirlpool"
                        ],
                        "incomplete": [],
                        "notCovered": [],
                        "error": null
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets/{chain}/{address}/analysis": {
      "get": {
        "operationId": "walletAnalysis",
        "summary": "Wallet analysis",
        "description": "A wallet's PnL, win rate, volume, return distribution and PnL timeline over a window, with its labels.\n\n- Non-quote positions only. Windows are hourly buckets, the newest still filling: `1d` is the last 24, `7d` the last 168.\n\n- From the wallet's own rows, never the chain. Cached 5 s. An unknown wallet answers `200` with zeros.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-analysis"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet address (BSC) or account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "description": "`1d`, `7d`, `30d`, `90d`",
            "schema": {
              "type": "string",
              "enum": [
                "7d",
                "1d",
                "30d",
                "90d"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, wallet, labels, indexedSince, window` (string, string, string[], number, string): As in every wallet answer, its labels, and the window.\n- `realizedPnlUsd` (number): PnL of the window's sells, against each position's all-time average buy price.\n- `unrealizedPnlUsd, totalPnlUsd` (number): Unrealized PnL now, of every position, traded in the window or not (unknown ones count as 0); and the sum.\n- `boughtUsd, soldUsd, trades, buys, sells, tokens` (number): The window's swaps, and the tokens they traded.\n- `wins, losses, winRate` (number, number, number | null): Tokens with realized PnL above and below 0 in the window; `winRate` is wins / (wins + losses), null without either.\n- `distribution` (object): Tokens sold in the window by realized return (average sell / average buy − 1): `gt500`, `200to500`, `50to200`, `0to50`, `minus50to0`, `ltMinus50`.\n- `timeline[]` (array): `t` (bucket start, unix ms), `realizedPnlUsd`, `boughtUsd`, `soldUsd`, `trades`. Hourly for `1d`, per UTC day otherwise; ascending, empty buckets left out.\n- `best[], worst[]` (array): Up to 3 positions with the largest realized gain and loss in the window.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                  "labels": [
                    "sniper",
                    "fresh"
                  ],
                  "indexedSince": 1790546261920,
                  "window": "1d",
                  "realizedPnlUsd": 59.5089770354906,
                  "unrealizedPnlUsd": 6.776263578034403e-14,
                  "totalPnlUsd": 59.50897703549067,
                  "boughtUsd": 1608,
                  "soldUsd": 60,
                  "trades": 24,
                  "buys": 14,
                  "sells": 10,
                  "tokens": 3,
                  "wins": 1,
                  "losses": 0,
                  "winRate": 1,
                  "distribution": {
                    "gt500": 1,
                    "200to500": 0,
                    "50to200": 0,
                    "0to50": 0,
                    "minus50to0": 0,
                    "ltMinus50": 0
                  },
                  "timeline": [
                    {
                      "t": 1790611200000,
                      "realizedPnlUsd": 5.95089770354906,
                      "boughtUsd": 0,
                      "soldUsd": 6,
                      "trades": 1
                    },
                    {
                      "t": 1790618400000,
                      "realizedPnlUsd": 0,
                      "boughtUsd": 600,
                      "soldUsd": 0,
                      "trades": 2
                    }
                  ],
                  "best": [
                    {
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18
                      },
                      "quote": false,
                      "trades": 22,
                      "buys": 12,
                      "sells": 10,
                      "unpricedTrades": 0,
                      "bought": "20118000",
                      "sold": "9800",
                      "open": "20108200",
                      "boughtUsd": 1008,
                      "soldUsd": 60,
                      "avgBuyPriceUsd": 0.00005010438413361169,
                      "avgSellPriceUsd": 0.006122448979591836,
                      "priceUsd": 0.006,
                      "priceAt": 1790618400000,
                      "realizedPnlUsd": 59.5089770354906,
                      "unrealizedPnlUsd": null,
                      "totalPnlUsd": 59.5089770354906,
                      "firstTradeAt": 1790546864920,
                      "lastTradeAt": 1790618578665
                    }
                  ],
                  "worst": []
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets/{chain}/{address}/positions": {
      "get": {
        "operationId": "walletPositions",
        "summary": "Wallet positions",
        "description": "Every token the wallet traded since indexing began, open, closed or all: amounts, average prices, realized and unrealized PnL. With `token=`, one position.\n\n- A position is closed when its trades left at most 0.1% of what they bought open (`open`), as a position sold down to dust is; one the wallet only sold is closed too.\n\n- Quote positions (`quote: true`) are listed with their PnL, which is only the price move of the currency paid with: every wallet total leaves them out.\n\n- A page continues after the previous page's last position in the order as it is when read: sorted by PnL, a position can change place between pages as prices move.\n\n- From the wallet's own rows, never the chain: one database query on a miss. Cached 5 s. The positions channel sends them again as they change.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-positions"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet address (BSC) or account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": false,
            "description": "One position: a token address or mint, or `native` for BNB, ETH or SOL",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "`open`, `closed`, `all`",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "open",
                "closed"
              ]
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "`recent` (last trade), `pnl` (total), `realized`, `volume`",
            "schema": {
              "type": "string",
              "enum": [
                "recent",
                "pnl",
                "realized",
                "volume"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–200",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`, as it came",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, wallet, labels, indexedSince, status` (string, string, string[], number, string): As in every wallet answer, with its labels.\n- `positions[]` (array): Highest first by `sort`; a null PnL sorts last, ties by token address.\n- `positions[].token` ({ address, symbol, name, decimals }): `address` is `\"native\"` for BNB, ETH or SOL.\n- `quote` (boolean): A stablecoin, or the native or wrapped native token: listed, but left out of every wallet total.\n- `trades, buys, sells, unpricedTrades` (number): The swaps of the token. A buy is one where the wallet received it. `unpricedTrades` had no USD price and are left out of the USD figures.\n- `bought, sold` (string): Token amounts, decimals applied.\n- `open` (string): `bought − sold`, at least 0: what the trades leave held. Transfers are not counted, so it can differ from the balance.\n- `boughtUsd, soldUsd` (number): USD value of the priced buys and sells.\n- `avgBuyPriceUsd, avgSellPriceUsd` (number | null): USD per token over the priced buys, and sells. Null without one.\n- `priceUsd, priceAt` (number | null): The token's price now, and the start of the hour of the swap it came from, unix ms (see Wallets and PnL).\n- `realizedPnlUsd, unrealizedPnlUsd, totalPnlUsd` (number | null): See Wallets and PnL. Null is unknown, never 0.\n- `firstTradeAt, lastTradeAt` (number): Unix ms.\n- `next` (string | null): Cursor for the next page. Null on the last.\n- `position` (object | null): With `token`, in place of `positions`: that position, null when the wallet never traded the token.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                  "labels": [
                    "sniper",
                    "fresh"
                  ],
                  "indexedSince": 1790546261920,
                  "status": "all",
                  "positions": [
                    {
                      "token": {
                        "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                        "symbol": "TAX",
                        "name": "Tax Token",
                        "decimals": 18
                      },
                      "quote": false,
                      "trades": 22,
                      "buys": 12,
                      "sells": 10,
                      "unpricedTrades": 0,
                      "bought": "20118000",
                      "sold": "9800",
                      "open": "20108200",
                      "boughtUsd": 1008,
                      "soldUsd": 60,
                      "avgBuyPriceUsd": 0.00005010438413361169,
                      "avgSellPriceUsd": 0.006122448979591836,
                      "priceUsd": 0.006,
                      "priceAt": 1790618400000,
                      "realizedPnlUsd": 59.5089770354906,
                      "unrealizedPnlUsd": null,
                      "totalPnlUsd": 59.5089770354906,
                      "firstTradeAt": 1790546864920,
                      "lastTradeAt": 1790618578665
                    },
                    {
                      "token": {
                        "address": "0x5eed00000000000000000000000000000000b444",
                        "symbol": "NEWT2",
                        "name": "Newt Two",
                        "decimals": 18
                      },
                      "quote": false,
                      "trades": 1,
                      "buys": 1,
                      "sells": 0,
                      "unpricedTrades": 0,
                      "bought": "20000000",
                      "sold": "0",
                      "open": "20000000",
                      "boughtUsd": 300,
                      "soldUsd": 0,
                      "avgBuyPriceUsd": 0.000015,
                      "avgSellPriceUsd": null,
                      "priceUsd": 0.000015000000000000002,
                      "priceAt": 1790546400000,
                      "realizedPnlUsd": 0,
                      "unrealizedPnlUsd": 3.3881317890172014e-14,
                      "totalPnlUsd": 3.3881317890172014e-14,
                      "firstTradeAt": 1790547464920,
                      "lastTradeAt": 1790547464920
                    }
                  ],
                  "next": "3.3881317890172014e-14_0x5eed00000000000000000000000000000000b444"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets/{chain}/{address}/history": {
      "get": {
        "operationId": "walletHistory",
        "summary": "Value history",
        "description": "What a wallet's holdings were worth over the last day, week or month; with `token=`, one position's balance, value and PnL over time.\n\n- The balances now are the portfolio's chain read. A value at a point is each token's balance then, at its price in the hour before (the busiest priced pool that hour), counted as in the portfolio's total.\n\n- BSC: balances go back through the indexed transfers since each point, so values are exact only while the index holds every transfer since then: after the chain's first indexed block, its last skipped range and the start of per-wallet transfers (kept 30 days). Native BNB is left out: gas and internal transfers change it without a transfer the index sees, and the node keeps no past state to read it (`token=native` answers `422`).\n\n- Solana: balances go back through each of the wallet's transactions since the point, read from the chain (exact: SOL and token balances before and after), native SOL included. Points start after the oldest transaction a request could read; a later request reads further back. A token whose transactions do not link up changed in a transaction that does not name the wallet: it is left out, with the reason.\n\n- `422` while indexing has not reached the block the balances were read at, or for a wallet that moved too much to value in one request; `502` when the chain cannot be read; `503` while Solana's read budget is spent. Cached 30 s.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-history"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet address (BSC) or account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "description": "`1d` and `7d` (hourly points), `30d` (daily)",
            "schema": {
              "type": "string",
              "enum": [
                "7d",
                "1d",
                "30d"
              ]
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": false,
            "description": "One position's series: a token, or `native` (Solana)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, wallet, labels, indexedSince, window, resolution` (string, string, string[], number, string, string): As in every wallet answer, and the spacing of the points: `1h` or `1d`.\n- `exactSince` (number | null): Unix ms after which values are exact (see the notes). Points start after it.\n- `block, balancesAt` (number): The block (Solana: slot) the balances were read at, and when, unix ms.\n- `points[]` ([number, number]): Without `token`: `[t, valueUsd]`, ascending: each boundary of the window after `exactSince`, then one at `balancesAt`, the value now.\n- `points[] (token)` (object): With `token`: `t`, `balance` (null when it cannot be established), `priceUsd`, `valueUsd`, `realizedPnlUsd`, `unrealizedPnlUsd`, `totalPnlUsd` at each point; `balanceUnknown` says why a balance is null.\n- `excluded[]` (array): `{ token, reason }`: tokens left out because their balance cannot be traced back.\n- `coverage` ({ transactions, complete, listedAt, stopped }): Solana: the transactions read to go back, whether they reach the window's start, and where a read bound stopped.\n- `note` (string): What is left out, in words.",
            "content": {
              "application/json": {
                "example": {
                  "labels": [
                    "sniper",
                    "fresh"
                  ],
                  "chain": "evm:56",
                  "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                  "indexedSince": 1790546261920,
                  "window": "1d",
                  "resolution": "1h",
                  "exactSince": 1790546862000,
                  "block": 1000748,
                  "balancesAt": 1790618266812,
                  "points": [
                    [
                      1790611200000,
                      129906
                    ],
                    [
                      1790614800000,
                      132544.89795918367
                    ],
                    [
                      1790618266812,
                      129300
                    ]
                  ],
                  "excluded": [],
                  "note": "Tokens only: native BNB / ETH is left out, since gas and internal transfers change it without a transfer the index sees, and the chain's endpoints keep no past balances to read it at each point."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/wallets/{chain}/{address}/activity": {
      "get": {
        "operationId": "walletActivity",
        "summary": "Wallet activity",
        "description": "Every transaction of a wallet, newest first, with what it did: swaps, liquidity adds and removes, and transfers; on Solana complete, read from the chain.\n\n- BSC, from the index: swaps, liquidity events, every ERC-20 transfer and BNB sent as a transaction's value. Internal BNB transfers and gas are not indexed. A transfer of a token swapped or pooled in the same transaction is a leg of that action, and is not listed again. One database query a page.\n\n- Solana, from the chain: every transaction that names the wallet, with its exact balance changes; swaps and liquidity events from the index (with USD values) and the System Program and SPL Token transfers the node parsed. A token received by a transaction that does not name the wallet is not listed: Solana lists a transaction under the addresses it names. A request reads at most 40 transactions; `503` while the chain's read budget is spent, `502` when it cannot be read.\n\n- A page holds at most `limit` transactions, fewer when `type` leaves some without actions or a read bound stops it: follow `next` until it is `null`. Cached 5 s.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/wallet-activity"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet address (BSC) or account (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "`swap`, `liquidity` or `transfer`: only those actions",
            "schema": {
              "type": "string",
              "enum": [
                "swap",
                "liquidity",
                "transfer"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100 transactions",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The previous page's `next`: `time.block.txIndex` on BSC, a signature on Solana",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, wallet, labels, indexedSince` (string, string, string[], number): As in every wallet answer.\n- `covers, note` (string[], string): What is listed, and what is not, in words.\n- `transfersSince` (number | null): BSC: from when transfers are listed, unix ms (kept 30 days).\n- `coverage` ({ listedAt, start, stopped }): Solana: when the wallet's transaction list was read, whether it reaches its first transaction, and where a read bound stopped.\n- `transactions[]` (array): Newest first: `tx`, `time`, `block`, `txIndex`, `actions`. Solana adds `failed`, `fee` (SOL the wallet paid; null when another paid) and `changes` (the wallet's exact balance change per token: `{ token, amount, amountRaw }`).\n- `actions[] (swap)` (object): `type: \"swap\"`, `eventIndex`, `protocol`, `pool`; `tokenIn` and `amountIn` (what the wallet paid), `tokenOut` and `amountOut` (what it received), `amountUsd`.\n- `actions[] (liquidity)` (object): `type: \"liquidity\"`, `kind` (`add`, `remove`), `eventIndex`, `protocol`, `pool`, `token0`, `amount0`, `token1`, `amount1`, `valueUsd`.\n- `actions[] (transfer)` (object): `type: \"transfer\"`, `eventIndex`, `direction` (`in`, `out`, `self`), `token`, `amount` (null for a token Aurelia never stored), `amountRaw`, `from`, `to` (null for a mint or a burn), `labels` (the counterparty's).\n- `next` (string | null): Cursor for the next older page. `null` at the end.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "wallet": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
                  "labels": [
                    "sniper",
                    "fresh"
                  ],
                  "indexedSince": 1790546261920,
                  "transfersSince": 1790546861000,
                  "covers": [
                    "swaps",
                    "liquidity",
                    "transfers"
                  ],
                  "note": "Swaps and liquidity events the index decoded, ERC-20 transfers and native transfers sent as a transaction's value (transfers kept 30 days: see transfersSince). Internal native transfers and gas are not indexed. A transfer of a token swapped or pooled in the same transaction is part of that action, and is not listed again.",
                  "transactions": [
                    {
                      "tx": "0x2b170741f16da7ea4287bbd163e3365f89c73c4face2b6ed032487c0dd9b0cb4",
                      "time": 1790618578665,
                      "block": 1000750,
                      "txIndex": 0,
                      "actions": [
                        {
                          "type": "swap",
                          "eventIndex": 4,
                          "protocol": "pancakeswap-v2",
                          "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                          "tokenIn": {
                            "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                            "symbol": "WBNB",
                            "name": "Wrapped BNB",
                            "decimals": 18
                          },
                          "amountIn": "0.5",
                          "tokenOut": {
                            "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                            "symbol": "TAX",
                            "name": "Tax Token",
                            "decimals": 18
                          },
                          "amountOut": "50000",
                          "amountUsd": 300
                        }
                      ]
                    },
                    {
                      "tx": "0xcd32103a902cba28b871741adf595a6b209ce0b66d6849cc8a603842adb07729",
                      "time": 1790618554904,
                      "block": 1000749,
                      "txIndex": 0,
                      "actions": [
                        {
                          "type": "swap",
                          "eventIndex": 4,
                          "protocol": "pancakeswap-v2",
                          "pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
                          "tokenIn": {
                            "address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
                            "symbol": "WBNB",
                            "name": "Wrapped BNB",
                            "decimals": 18
                          },
                          "amountIn": "0.5",
                          "tokenOut": {
                            "address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
                            "symbol": "TAX",
                            "name": "Tax Token",
                            "decimals": 18
                          },
                          "amountOut": "50000",
                          "amountUsd": 300
                        }
                      ]
                    }
                  ],
                  "next": "1790618554904.1000749.0"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/chains/{chain}/pulse": {
      "get": {
        "operationId": "chainPulse",
        "summary": "Pulse board",
        "description": "The chain's board of launches: fresh launches, bonding curves close to graduating, and fresh graduations, filtered and sorted. A snapshot at most a few seconds old; follow it with the pulse channel.\n\n- A snapshot: each view's board is rebuilt at most every second, and a request answers at once from the latest one. The first request for a view after a quiet spell of over 5 minutes waits while its board is built.\n\n- `new` holds the newest 1,000 launches of the last 24 h that have not graduated; `graduating` the 500 open curves with the highest `progress` among those that traded in the last hour; `graduated` the newest 500 graduations of the last 24 h.\n\n- A `null` value never matches a range. `400` for an unknown parameter, a malformed range, an unknown view or a malformed launchpad id; the error names the parameter.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/chain-pulse"
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "view",
            "in": "query",
            "required": false,
            "description": "`new`, `graduating`, `graduated`",
            "schema": {
              "type": "string",
              "enum": [
                "new",
                "graduating",
                "graduated"
              ]
            }
          },
          {
            "name": "marketCapUsd",
            "in": "query",
            "required": false,
            "description": "A range `min..max`, bounds included, either side empty: `5000..`. Every range key works so: see Pulse",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "age",
            "in": "query",
            "required": false,
            "description": "A range of seconds since `createdAt`: `..600` is the last 10 minutes",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "launchpad",
            "in": "query",
            "required": false,
            "description": "Comma-separated, any of them. BSC: `fourmeme`, `flap`, `genius`; Solana: `pumpfun`, `letsbonk`, `raydium-launchlab`, `meteora-dbc`; Base: `doppler`, `zora`, `clanker`, `virtuals`, `o1`, `basestonk`, `flaunch`, `rwagmi`; Robinhood Chain: `flap`, `doppler`, `pons`, `pools-trade`, `torch`, `frontier`; Ethereum: `clanker`, `stockereum`",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "has",
            "in": "query",
            "required": false,
            "description": "Comma-separated, every one of them: `logo`, `website`, `twitter`, `telegram`, `discord`",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "keywords",
            "in": "query",
            "required": false,
            "description": "Comma-separated: the symbol or name contains any of them, case-insensitive",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "excludeKeywords",
            "in": "query",
            "required": false,
            "description": "Comma-separated: the symbol or name contains none of them",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Any range key, or `createdAt`, `graduatedAt`, `latestTradeAt`",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "`desc`, `asc`. Nulls sort last either way; ties break by `address`",
            "schema": {
              "type": "string",
              "enum": [
                "desc",
                "asc"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "0 or more",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `chain, view, total, updatedAt` (string, string, number, number): The request; board tokens that match the filters before `limit` and `offset`; when the board was built, unix ms.\n- `tokens[]` (array): The page, sorted.\n- `address, symbol, name, logo` (string, string | null, string | null, string | null): The token, and its logo's absolute URL.\n- `launchpad, pool, createdAt, creator` (string, string | null, number, string): The launch protocol, the pool it launched into, the launch (unix ms) and the wallet that made it.\n- `socials` (object): From the token's metadata document: `https://` URLs or `null`.\n- `priceUsd, marketCapUsd, liquidityUsd` (number | null): As on the token page: the chart pool's latest priced close, × circulating supply, and its real balances.\n- `progress, graduatedAt, latestTradeAt` (number | null): A bonding curve's share of its sellable supply sold (0 to 1), when the curve completed, and the token's newest swap.\n- `creatorNetShare` (number | null): What the creator bought minus sold through swaps of the token, as a share of total supply. Transfers do not count.\n- `sniperCount, sniperNetShare` (number | null): Wallets (the creator excluded) that bought in the launch block or the 4 after it (slots on Solana), and their bought minus sold as a share of supply.\n- `windows` ({ 5m, 1h, 6h, 24h }): As on the token page.",
            "content": {
              "application/json": {
                "example": {
                  "chain": "evm:56",
                  "view": "new",
                  "total": 2,
                  "updatedAt": 1790618579441,
                  "tokens": [
                    {
                      "address": "0x5eed00000000000000000000000000000000c444",
                      "symbol": "NEWT3",
                      "name": "Newt Three",
                      "logo": "http://localhost:7170/logos/evm:56/0x5eed00000000000000000000000000000000c444?v=cccccccccccc",
                      "launchpad": "fourmeme",
                      "pool": "0xed80c90b543397140863599d535a4427ed378a30e094a01a025bea52acb9fcc7",
                      "createdAt": 1790548061920,
                      "creator": "0x0f325bd174c70440fa62c31dce9f69d54baf717e",
                      "socials": {
                        "website": null,
                        "twitter": null,
                        "telegram": null,
                        "discord": null,
                        "others": {}
                      },
                      "priceUsd": 0.000015000000000000002,
                      "marketCapUsd": 15000.000000000002,
                      "liquidityUsd": null,
                      "progress": 0.18,
                      "graduatedAt": null,
                      "latestTradeAt": 1790548064920,
                      "creatorNetShare": 0,
                      "sniperCount": 2,
                      "sniperNetShare": 0.022,
                      "windows": {
                        "5m": {
                          "priceChange": 0,
                          "volumeUsd": 0,
                          "buyVolumeUsd": 0,
                          "sellVolumeUsd": 0,
                          "trades": 0,
                          "buys": 0,
                          "sells": 0,
                          "traders": 0,
                          "buyers": 0,
                          "sellers": 0,
                          "feesPaidUsd": null
                        },
                        "1h": {
                          "priceChange": 0,
                          "volumeUsd": 0,
                          "buyVolumeUsd": 0,
                          "sellVolumeUsd": 0,
                          "trades": 0,
                          "buys": 0,
                          "sells": 0,
                          "traders": 0,
                          "buyers": 0,
                          "sellers": 0,
                          "feesPaidUsd": null
                        },
                        "6h": {
                          "priceChange": 0,
                          "volumeUsd": 0,
                          "buyVolumeUsd": 0,
                          "sellVolumeUsd": 0,
                          "trades": 0,
                          "buys": 0,
                          "sells": 0,
                          "traders": 0,
                          "buyers": 0,
                          "sellers": 0,
                          "feesPaidUsd": null
                        },
                        "24h": {
                          "priceChange": null,
                          "volumeUsd": 330,
                          "buyVolumeUsd": 330,
                          "sellVolumeUsd": 0,
                          "trades": 2,
                          "buys": 2,
                          "sells": 0,
                          "traders": 2,
                          "buyers": 2,
                          "sellers": 0,
                          "feesPaidUsd": null
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/InsufficientBalance"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/logos/{chain}/{address}": {
      "get": {
        "operationId": "logo",
        "summary": "Token logo",
        "description": "A token's logo as a small WebP, re-hosted by Aurelia so pages never load a deployer's server or an IPFS gateway. Use the URL the token endpoints give in `logo`.\n\n- Open and not metered, so an `<img>` can load it directly.\n\n- `Cache-Control: public, max-age=31536000, immutable` when `v` names the stored image; without `v`, or with an older one, `max-age=3600`. A new image gets a new `v`.\n\n- `404 {\"error\":\"no logo\"}` when none is stored: the token's metadata has no image, it could not be fetched, or it was not fetched yet.",
        "externalDocs": {
          "url": "https://app.aurelia.build/docs/logo"
        },
        "security": [],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "`evm:56` (BSC), `solana`, `evm:8453` (Base), `evm:4663` (Robinhood Chain) or `evm:1` (Ethereum)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Token address (BSC) or mint (Solana)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "v",
            "in": "query",
            "required": false,
            "description": "The logo's version, as in the `logo` URL",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success.\n\n- `(body)` (image/webp): The token's image, fitted inside 256×256 and never enlarged; the first frame of an animated one.",
            "content": {
              "image/webp": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "An API key from https://app.aurelia.build/#/account, or a JWT."
      },
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "An API key from https://app.aurelia.build/#/account."
      }
    },
    "responses": {
      "BadRequest": {
        "description": "A bad parameter.",
        "content": {
          "application/json": {
            "example": {
              "error": "chain must be one of …"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No credentials, or a bad, expired or revoked key.",
        "content": {
          "application/json": {
            "example": {
              "error": "unauthorized"
            }
          }
        }
      },
      "InsufficientBalance": {
        "description": "Your credits cannot pay for the request.",
        "content": {
          "application/json": {
            "example": {
              "error": "insufficient_balance"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Over the burst limit: wait retryAfter seconds.",
        "content": {
          "application/json": {
            "example": {
              "error": "rate_limited",
              "retryAfter": 1
            }
          }
        }
      }
    }
  }
}