{"openapi":"3.1.0","info":{"title":"Vectr API","version":"2026-10-13","summary":"Tokens, market data, quotes, creator fees and AI-agent jobs on Robinhood Chain.","description":"The REST and server-sent-events API behind vectr.bot, the Terminal, Swap, the CLI and the MCP server: token lists and detail, candles and trade feeds, quotes and unsigned transactions, launch helpers, creator fee reads and asynchronous AI-agent jobs on Robinhood Chain.\n\n## Authentication\n\n- **Public**: market data, quotes, build-tx, streams, launch helpers and fee reads need no credentials.\n- **X-API-Key**: the agent job endpoints. A key acts for the wallet that created it and can be restricted to read-only, an IPv4 allowlist and a recipient allowlist.\n- **Session cookie**: account endpoints (orders, API keys, agent memory, the streaming agent) use the `vectr_session` cookie set by the X sign-in flow that starts at `GET /auth/login`.\n- `POST /wallet/sign-and-submit` accepts either a session or a read-write API key.\n\n## Compatibility\n\nThe API is unversioned: there is no version prefix in the path and no version header. Additive changes (new endpoints, new optional parameters, new response fields, new enum values, new stream events) can ship at any time without notice, so clients must ignore fields and events they do not recognise. Breaking changes (removing or renaming an endpoint or field, changing a type, a default or an auth requirement) are listed on https://vectr.bot/changelog and marked as breaking. Changelog entries are dated by the commit that shipped the change, so a breaking change is recorded when it ships; it is not currently announced ahead of time. `info.version` is the date this document was last revised, not an API version.\n\n## Errors and limits\n\nFailures return `{ statusCode, message, code?, path, requestId }`; `message` is an array of strings when request-body validation fails. Every response — success or failure — carries an `X-Request-ID` header, and sending your own on the request propagates it; quote that id when reporting a problem, because it is what identifies this exact request in the server's logs. The quote and build-tx endpoints report a bad `type` or `amount` as `{ \"error\": \"...\" }` with a success status, so check the body. The default rate limit is 200 requests per minute per route per client IP, served live as `platform.rateLimit` in `GET /config`. Throttled routes send `X-RateLimit-Limit-global`, `X-RateLimit-Remaining-global` and `X-RateLimit-Reset-global`; a 429 sends `Retry-After-global` in seconds.\n\nUnless a field says otherwise, amounts are decimal whole units of their asset (not base units) and prices are quote asset per token. Browser cross-origin requests are allowed only from Vectr's own sites, so call the API from a server, a script or the CLI.","contact":{"name":"Vectr","url":"https://vectr.bot/docs/api"}},"externalDocs":{"description":"API reference","url":"https://vectr.bot/docs/api"},"servers":[{"url":"https://api.vectr.bot","description":"Production (Robinhood Chain, chain id 4663)"}],"tags":[{"name":"Meta","description":"This document."},{"name":"Config","description":"Live deployment configuration: chain, contracts, fee rates, pairing assets, limits and the platform descriptor."},{"name":"Market data","description":"Stock Tokens, pairing assets and the native coin price."},{"name":"Tokens","description":"Token lists, detail, search, activity feeds, candles and per-wallet views. All public."},{"name":"Trading","description":"Quote a swap and build the unsigned transaction. Nothing here signs or broadcasts."},{"name":"Streams","description":"Server-sent event streams: the global tick stream and per-token candle streams."},{"name":"Launch","description":"Metadata and image upload, gas estimate and the daily launch limit. The launch itself is a factory contract call, not an endpoint."},{"name":"Creator fees","description":"Accrued and historical creator fees per wallet. Claiming is a contract call."},{"name":"Profiles and skills","description":"Public agent profiles and the published agent skill catalog."},{"name":"Agent jobs","description":"Asynchronous agent turns under an API key: create, poll, cancel."},{"name":"Agent (session)","description":"The streaming agent and agent memory, for a signed-in user."},{"name":"Wallet","description":"Sign and broadcast from the account's custodial wallet."},{"name":"Orders","description":"Limit, stop, TWAP and DCA orders for the signed-in wallet."},{"name":"Auth","description":"X sign-in and the session cookie."},{"name":"API keys","description":"Create, list and revoke API keys. Session only."}],"paths":{"/openapi.json":{"get":{"operationId":"getOpenApiDocument","tags":["Meta"],"summary":"This OpenAPI document","description":"Served with `Cache-Control: public, max-age=300`.","security":[],"responses":{"200":{"description":"The OpenAPI 3.1 document.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/status":{"get":{"operationId":"getStatus","tags":["Meta"],"summary":"Service status","description":"Measured at request time and cached for 30 seconds: database reachability, the chain head over RPC, how far the launchpad indexer trails it, whether every index cursor is at or behind the head, whether the indexed launches match the factory, and how recently Stock Token prices, the ETH price and the Stock Token registry were confirmed. Each component carries the readings behind its state in `metrics`. The page at https://vectr.bot/status renders this. Served with `Cache-Control: public, max-age=30`.","security":[],"responses":{"200":{"description":"Overall state and one entry per component.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/config":{"get":{"operationId":"getConfig","tags":["Config"],"summary":"Live platform configuration","description":"Chain, RPC, contract addresses, live fee rates, pairing assets, subscription limits and the platform descriptor (feature status, rate limit, supply split). Read these values here rather than hard-coding them: fee rates and thresholds are set on-chain and change.","security":[],"responses":{"200":{"description":"Current configuration.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Config"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/config/rpcs":{"get":{"operationId":"getRpcPool","tags":["Meta"],"summary":"Public RPC endpoints, probed","description":"The last probe of every keyless public RPC endpoint the backend knows for this chain: status, head lag, round-trip latency from Vectr's server, the widest eth_getLogs range accepted, whether a browser CORS preflight passes, and Chainlist's privacy label. Probed every 30 seconds (getLogs range and CORS every 10 minutes). Backend-only entries are cut to their origin so no key leaves the server. https://vectr.bot/docs/robinhood-chain renders it.","security":[],"responses":{"200":{"description":"The probe results.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpcPool"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stocks":{"get":{"operationId":"listStocks","tags":["Market data"],"summary":"List Stock Tokens","description":"Robinhood Stock Tokens deployed on this chain, the candidates for pairing assets. Symbol-prefix matches rank first.","security":[],"parameters":[{"name":"q","in":"query","required":false,"description":"Search ticker and name. Empty returns the first `limit` tokens.","schema":{"type":"string","default":""}},{"name":"limit","in":"query","required":false,"description":"Maximum results. Clamped to 1..500; a non-numeric value means 50.","schema":{"type":"integer","minimum":1,"maximum":500,"default":50}}],"responses":{"200":{"description":"Stock Tokens.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockList"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stocks/{symbol}":{"get":{"operationId":"getStock","tags":["Market data"],"summary":"One Stock Token with a live quote","security":[],"parameters":[{"name":"symbol","in":"path","required":true,"description":"Ticker (case-insensitive, e.g. `AAPL`) or the Stock Token contract address.","schema":{"type":"string"}}],"responses":{"200":{"description":"The Stock Token and its latest quote.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockDetail"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/quote-assets":{"get":{"operationId":"listQuoteAssets","tags":["Market data"],"summary":"Enabled pairing assets","description":"Assets a launch can be paired against, native coin first, with curve parameters and a USD price.","security":[],"responses":{"200":{"description":"Enabled pairing assets.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteAsset"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/quote-assets/{address}":{"get":{"operationId":"getQuoteAsset","tags":["Market data"],"summary":"One pairing asset","description":"Returns the asset even when it is currently disabled, as long as it is known.","security":[],"parameters":[{"name":"address","in":"path","required":true,"description":"Pairing asset address. The native coin is the zero address.","schema":{"$ref":"#/components/schemas/Address"}}],"responses":{"200":{"description":"The pairing asset.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteAsset"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/price/native":{"get":{"operationId":"getNativePrice","tags":["Market data"],"summary":"Native coin USD price","security":[],"responses":{"200":{"description":"Native coin price.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NativePrice"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens":{"get":{"operationId":"listTokens","tags":["Tokens"],"summary":"Top tokens by market cap","description":"Every launched token, ranked by USD market cap, with 24h stats from the indexer.","security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum results, capped at 200. Zero or a non-numeric value means 20.","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}}],"responses":{"200":{"description":"Ranked tokens.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenListItem"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/search":{"get":{"operationId":"searchTokens","tags":["Tokens"],"summary":"Search tokens by name or symbol","description":"Case-insensitive substring match on name and symbol over the top 100 tokens by market cap. At most 10 results. Addresses are not matched: fetch GET /tokens/{address} for that.","security":[],"parameters":[{"name":"q","in":"query","required":false,"description":"Search text.","schema":{"type":"string","default":""}}],"responses":{"200":{"description":"Matching tokens.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenSearchResult"},"maxItems":10}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/agents":{"get":{"operationId":"listAgentTokens","tags":["Tokens"],"summary":"Agent-launched tokens","description":"Reserved for tokens launched by agents. There is no agent-token source wired up yet, so this returns an empty array today. Use `isAgent` on GET /tokens items instead.","security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum results.","schema":{"type":"integer","default":5}}],"responses":{"200":{"description":"Always an empty array today.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/stats":{"get":{"operationId":"getPlatformStats","tags":["Tokens"],"summary":"Platform totals","security":[],"responses":{"200":{"description":"Tokens launched, distinct traders and fees.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformStats"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/activity":{"get":{"operationId":"listRecentTrades","tags":["Tokens"],"summary":"Latest trades across all tokens","description":"Newest buys and sells across every token. Launches are not included; watch `TokenLaunched` on the factory or use GET /tokens for new tokens.","security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum results, capped at 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}}],"responses":{"200":{"description":"Recent trades, newest first.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecentTrade"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/portfolio/{wallet}":{"get":{"operationId":"getPortfolio","tags":["Tokens"],"summary":"Vectr token holdings of a wallet","description":"On-chain balances of every Vectr-launched token for any wallet. Tokens whose balance read fails are left out.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"}],"responses":{"200":{"description":"Holdings and total value.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Portfolio"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/created-by/{creator}":{"get":{"operationId":"listTokensByCreator","tags":["Tokens"],"summary":"Tokens launched by a wallet","description":"Tokens whose creator is this wallet, in the GET /tokens shape and ranking. Only the top 100 tokens by market cap are considered.","security":[],"parameters":[{"name":"creator","in":"path","required":true,"description":"Creator wallet address.","schema":{"$ref":"#/components/schemas/Address"}}],"responses":{"200":{"description":"Tokens created by the wallet.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenListItem"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/trades/{wallet}":{"get":{"operationId":"listWalletTrades","tags":["Tokens"],"summary":"Trade history of a wallet","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"},{"name":"limit","in":"query","required":false,"description":"Maximum results, capped at 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Trades, newest first.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletTrade"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/stream":{"get":{"operationId":"streamTicks","tags":["Streams"],"summary":"Global tick stream (SSE)","description":"Server-sent events for list views. `tick`: one per token that traded in an indexer sync. `refresh`: once per sync that wrote trades, a signal to re-fetch GET /tokens instead of polling. A `: hb` comment is sent every 25 seconds. Events carry no id, so after a reconnect re-fetch the list.","security":[],"responses":{"200":{"description":"An open event stream.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"text/event-stream":{"schema":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/TickEvent"},{"$ref":"#/components/schemas/RefreshEvent"}]},"description":"The stream modelled as the sequence of events it sends, in order. Each item is one event: its `event` name (absent means the default `message`), its `id` when it has one, and its JSON-decoded `data` line."}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/{address}":{"get":{"operationId":"getToken","tags":["Tokens"],"summary":"Token detail","description":"Live curve (or, once graduated, Uniswap pool) state, market cap, creator, fee recipient and 24h stats. Falls back to the indexed row when a chain read fails.","security":[],"parameters":[{"$ref":"#/components/parameters/TokenAddress"}],"responses":{"200":{"description":"The token.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenDetail"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/tokens/{address}/activity":{"get":{"operationId":"getTokenActivity","tags":["Tokens"],"summary":"Per-token activity feed","description":"Launch, buys, sells and graduation for one token, newest first. Page with `before`: pass the smallest `id` you already have. The first page (no `before`) also carries a 24h `summary`; the `launch` row appears on the last page of an unfiltered feed.","security":[],"parameters":[{"$ref":"#/components/parameters/TokenAddress"},{"name":"limit","in":"query","required":false,"description":"Page size, capped at 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"before","in":"query","required":false,"description":"Trade-id cursor: return rows with a smaller id.","schema":{"type":"integer","minimum":1}},{"name":"kind","in":"query","required":false,"description":"Only buys or only sells. Launch and graduation rows are omitted when set.","schema":{"type":"string","enum":["buy","sell"]}}],"responses":{"200":{"description":"One page of the feed.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenActivity"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/{address}/ohlcv":{"get":{"operationId":"getTokenCandles","tags":["Tokens"],"summary":"OHLCV candles","description":"Gap-filled candles: quiet buckets between trades come back as flat bars at the previous close, and every bar opens at the previous close. Bucket = floor(ts / resolution). Prices are USD by default; volume is always quote-asset notional. Returns an empty array when the window has no trades.","security":[],"parameters":[{"$ref":"#/components/parameters/TokenAddress"},{"name":"resolution","in":"query","required":false,"description":"Bucket size. Any other value falls back to 5m.","schema":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"default":"5m"}},{"name":"limit","in":"query","required":false,"description":"Sizes the default window (2 x limit buckets back from `to`), capped at 1000. Ignored when `from` is set.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":300}},{"name":"from","in":"query","required":false,"description":"Window start, unix seconds.","schema":{"type":"integer"}},{"name":"to","in":"query","required":false,"description":"Window end, unix seconds. Defaults to now.","schema":{"type":"integer"}},{"name":"usd","in":"query","required":false,"description":"`false` returns prices in quote-asset units instead of USD.","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Bars, oldest first.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Bar"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/{address}/stream":{"get":{"operationId":"streamTokenCandles","tags":["Streams"],"summary":"Per-token candle stream (SSE)","description":"Live bars and trades for one token. `bar`: the USD bars that changed at the requested resolution, upsert by `time`. `trade`: the trades folded into those bars, oldest first. `reset`: sent only when a resume missed too much to replay (or the replay failed): drop local state and refetch history. `bar` and `trade` events carry the highest trade id as the SSE id, and the server sends `retry: 1500`, so a browser EventSource resumes with `Last-Event-ID` and the gap is replayed. A `: hb` comment is sent every 25 seconds.","security":[],"parameters":[{"$ref":"#/components/parameters/TokenAddress"},{"name":"res","in":"query","required":false,"description":"Bar resolution. Any other value falls back to 5m.","schema":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"],"default":"5m"}},{"name":"from","in":"query","required":false,"description":"Unix seconds of your last bar. Bars since then are sent before going live, at most 600 buckets back. Ignored when Last-Event-ID is sent.","schema":{"type":"integer"}},{"name":"Last-Event-ID","in":"header","required":false,"description":"The last event id you received. Replays the trades since then, or sends `reset` when too much was missed.","schema":{"type":"string"}}],"responses":{"200":{"description":"An open event stream.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"text/event-stream":{"schema":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/BarEvent"},{"$ref":"#/components/schemas/TradeEvent"},{"$ref":"#/components/schemas/ResetEvent"}]},"description":"The stream modelled as the sequence of events it sends, in order. Each item is one event: its `event` name (absent means the default `message`), its `id` when it has one, and its JSON-decoded `data` line."}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/{address}/quote":{"get":{"operationId":"getQuote","tags":["Trading"],"summary":"Price a buy or sell","description":"Prices a hypothetical swap against the bonding curve, or the Uniswap V3 pool once the token has graduated. A view, not a reservation: quote immediately before building. The path takes the market address (curve or pool), not the token address. An invalid `type` or `amount` returns `{ \"error\": \"...\" }` with status 200.","security":[],"parameters":[{"$ref":"#/components/parameters/MarketAddress"},{"name":"type","in":"query","required":false,"description":"Trade direction.","schema":{"type":"string","enum":["buy","sell"],"default":"buy"}},{"name":"amount","in":"query","required":false,"description":"Buys: quote-asset amount to spend. Sells: token amount to sell. Whole units.","schema":{"type":"number","exclusiveMinimum":0,"default":1}}],"responses":{"200":{"description":"The quote, or an error object for an invalid type or amount.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/BuyQuote"},{"$ref":"#/components/schemas/SellQuote"},{"$ref":"#/components/schemas/InlineError"}]}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/tokens/{address}/build-tx":{"post":{"operationId":"buildTradeTransaction","tags":["Trading"],"summary":"Build an unsigned buy or sell","description":"Returns the unsigned transaction (to, data, value) with slippage applied, plus an ERC-20 approval to send first when one is needed (a sell, or a buy paired against an ERC-20 quote asset). Nothing is signed or broadcast. The path takes the market address (curve or pool), not the token address. An invalid `type` or `amount` returns `{ \"error\": \"...\" }` with status 201. A session cookie, when present, supplies the default `recipient`.","security":[{},{"SessionCookie":[]}],"parameters":[{"$ref":"#/components/parameters/MarketAddress"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildTxRequest"}}}},"responses":{"201":{"description":"The unsigned transaction, or an error object for an invalid type or amount.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/BuiltTx"},{"$ref":"#/components/schemas/InlineError"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/estimate-fee":{"get":{"operationId":"estimateLaunchFee","tags":["Launch"],"summary":"Estimated gas for a launch","description":"Estimates `launchToken` on the factory for a native-paired launch. A `from` that is not a valid address fails with 500.","security":[],"parameters":[{"name":"from","in":"query","required":false,"description":"Sending wallet. Defaults to a fixed estimation address.","schema":{"$ref":"#/components/schemas/Address"}}],"responses":{"200":{"description":"Gas estimate.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchFeeEstimate"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/daily-limit/{wallet}":{"get":{"operationId":"getLaunchDailyLimit","tags":["Launch"],"summary":"Launches used and remaining today","description":"Per wallet, per UTC day, tiered by subscription. The tier caps are also served as `subscription.tiers.*.launchesPerDay` in GET /config.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"}],"responses":{"200":{"description":"Daily launch status.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyLimit"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/metadata":{"post":{"operationId":"uploadLaunchMetadata","tags":["Launch"],"summary":"Pin token metadata to IPFS","description":"Pins the metadata JSON (name, symbol, description, image, socials) and returns the URI the launch transaction stores. Upload the image first and pass its URI as `imageUrl`.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadMetadataRequest"}}}},"responses":{"201":{"description":"The pinned metadata.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataUpload"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/upload-image":{"post":{"operationId":"uploadLaunchImage","tags":["Launch"],"summary":"Pin a token image to IPFS","description":"Multipart upload, field `file`, at most 5 MB. The file is pinned as sent; the content type is not checked.","security":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","description":"The image file."}},"required":["file"],"additionalProperties":false}}}},"responses":{"201":{"description":"The pinned image.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUpload"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/fees/{wallet}":{"get":{"operationId":"getCreatorFees","tags":["Creator fees"],"summary":"Claimable creator fees","description":"Creator fees accrued in the FeeCollector for this wallet, per pairing asset. Fees accrue in the asset the token was launched against. Rows are listed for the native coin and for any asset with a non-zero balance.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"}],"responses":{"200":{"description":"Accrued creator fees.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorFees"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/launch/earnings/{wallet}":{"get":{"operationId":"getCreatorEarnings","tags":["Creator fees"],"summary":"Creator earnings history and projection","description":"Accrued fees, lifetime earnings, a per-token summary, a daily USD series and a 30-day projection from the last 7 days. The projection is arithmetic on past trades, not a forecast.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"},{"name":"days","in":"query","required":false,"description":"Length of the daily series, in days.","schema":{"type":"integer","minimum":1,"default":30}}],"responses":{"200":{"description":"Earnings.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorEarnings"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent-profiles":{"get":{"operationId":"listAgentProfiles","tags":["Profiles and skills"],"summary":"Approved agent profiles","description":"Approved profiles, newest first, each with its 3 latest updates.","security":[],"responses":{"200":{"description":"Agent profiles.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentProfile"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent-profiles/{wallet}":{"get":{"operationId":"getAgentProfile","tags":["Profiles and skills"],"summary":"One agent profile","description":"The profile for a wallet with up to 50 latest updates.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"}],"responses":{"200":{"description":"The profile.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfile"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/skills/catalog":{"get":{"operationId":"listSkillCatalog","tags":["Profiles and skills"],"summary":"Published agent skills","description":"Vectr's own skills followed by community skills, newest published first.","security":[],"parameters":[{"name":"category","in":"query","required":false,"description":"Case-insensitive category filter, e.g. `Trading` or `Community`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Skill catalog entries.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillCatalogEntry"}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/job":{"post":{"operationId":"createAgentJob","tags":["Agent jobs"],"summary":"Start an agent job","description":"Runs one agent turn in the background for the key's wallet and returns a job id to poll. The wallet and the read-only flag come from the key, never from the body; a read-only key cannot create or cancel orders through the agent. A transaction the turn builds comes back unsigned in `richData`.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentJobRequest"}}}},"responses":{"201":{"description":"The job was queued.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJobCreated"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/job/{id}":{"get":{"operationId":"getAgentJob","tags":["Agent jobs"],"summary":"Poll an agent job","description":"Status runs pending, processing, then completed, failed or cancelled. Poll every couple of seconds. A job that belongs to another wallet is a 403, not a 404.","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/JobId"}],"responses":{"200":{"description":"The job.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJob"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/job/{id}/cancel":{"post":{"operationId":"cancelAgentJob","tags":["Agent jobs"],"summary":"Cancel a pending agent job","description":"Only a `pending` job can be cancelled. Any other status returns `{ \"success\": false, \"message\": ... }` with status 201.","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/JobId"}],"responses":{"201":{"description":"Whether the job was cancelled.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResult"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/prompt":{"post":{"operationId":"streamAgentPrompt","tags":["Agent (session)"],"summary":"Run an agent turn as a stream (SSE)","description":"The terminal's streaming variant of an agent job, over the session cookie. The response is a text/event-stream of unnamed events whose JSON data has a `type`: `usage_update`, `thinking`, `text_delta`, `memory_saved`, `credits_topped_up`, `transaction`, `usage`, `error`, and always a final `done`. Failures after the stream opens arrive as an `error` event, not an HTTP status.","security":[{"SessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPromptRequest"}}}},"responses":{"200":{"description":"An event stream that ends after `done`.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"text/event-stream":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentStreamEvent"},"description":"The stream modelled as the sequence of events it sends, in order. Each item is one event: its `event` name (absent means the default `message`), its `id` when it has one, and its JSON-decoded `data` line."}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/memory":{"get":{"operationId":"listAgentMemory","tags":["Agent (session)"],"summary":"Agent memory for this wallet","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Stored memories, ordered by type, then most recently updated first.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentMemory"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/agent/memory/{key}":{"delete":{"operationId":"deleteAgentMemory","tags":["Agent (session)"],"summary":"Delete one memory","description":"An unknown key returns `{ \"success\": false, \"message\": \"Not found\" }` with status 200.","security":[{"SessionCookie":[]}],"parameters":[{"name":"key","in":"path","required":true,"description":"The memory key.","schema":{"type":"string"}}],"responses":{"200":{"description":"Whether the memory was deleted.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResult"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/wallet/sign-and-submit":{"post":{"operationId":"signAndSubmit","tags":["Wallet"],"summary":"Sign and broadcast from the account's custodial wallet","description":"Accepts a session or a read-write API key. Before the wallet key is touched: `txType` must match the calldata's function selector and target (trades must target a Vectr curve or the Uniswap router, launches the factory); a key's recipient allowlist must contain `to`; the wallet's own limits, pause switch and cooldowns must pass. A read-only key is refused with 403. Limited to 30 requests per minute per IP and 20 signing requests per minute per user (the latter answers 403 `Signing rate limit exceeded`). The call waits for the approval receipt when `approvalStep` is set, then returns the trade's hash without waiting for it to be mined.","security":[{"SessionCookie":[]},{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignAndSubmitRequest"}}}},"responses":{"201":{"description":"The broadcast transaction.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmittedTx"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/orders":{"get":{"operationId":"listOrders","tags":["Orders"],"summary":"The signed-in wallet's orders","description":"Every order of the wallet in any status (open, pending_execution, filled, cancelled, expired), newest first.","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Orders.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderWithQuote"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"post":{"operationId":"createOrder","tags":["Orders"],"summary":"Create an order","description":"Creates a limit, stop, TWAP or DCA order that executes from the wallet's own custodial wallet when it triggers. The order is always created for the session wallet. A DCA order is refused with 422 when the wallet does not hold `dcaAmountPerBuy x dcaMaxBuys` of the quote asset.","security":[{"SessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderRequest"}}}},"responses":{"201":{"description":"The created order.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/orders/history":{"get":{"operationId":"listOrderTokenTrades","tags":["Orders"],"summary":"The signed-in wallet's trades on one token","description":"All of this wallet's trades on the token, newest first, whether or not an order placed them.","security":[{"SessionCookie":[]}],"parameters":[{"name":"tokenAddress","in":"query","required":true,"description":"Token address.","schema":{"$ref":"#/components/schemas/Address"}},{"name":"limit","in":"query","required":false,"description":"Maximum results.","schema":{"type":"integer","minimum":1,"default":20}}],"responses":{"200":{"description":"Trades.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderTrade"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/orders/{id}":{"patch":{"operationId":"repriceOrder","tags":["Orders"],"summary":"Move an open order's trigger price","description":"Limit and stop orders only, and only while `open`; anything else is a 422.","security":[{"SessionCookie":[]}],"parameters":[{"$ref":"#/components/parameters/OrderId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderRequest"}}}},"responses":{"200":{"description":"The updated order.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"delete":{"operationId":"cancelOrder","tags":["Orders"],"summary":"Cancel an order","description":"Sets the order to `cancelled`. Unfilled TWAP or DCA slices stop.","security":[{"SessionCookie":[]}],"parameters":[{"$ref":"#/components/parameters/OrderId"}],"responses":{"200":{"description":"The cancelled order.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/auth/login":{"get":{"operationId":"startLogin","tags":["Auth"],"summary":"Start X sign-in","description":"Redirects to X OAuth. The callback sets `vectr_session`, a 7-day HttpOnly cookie, and redirects back to the site. Limited to 10 requests per 15 minutes.","security":[],"parameters":[{"name":"returnTo","in":"query","required":false,"description":"Where to land after sign-in.","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to X OAuth.","headers":{"Location":{"description":"The X authorization URL.","schema":{"type":"string","format":"uri"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/auth/me":{"get":{"operationId":"getCurrentUser","tags":["Auth"],"summary":"The signed-in user","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"The user.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionUser"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/auth/session":{"get":{"operationId":"getSession","tags":["Auth"],"summary":"The session, if any","description":"Same user payload as GET /auth/me, but `user: null` with a 200 for visitors instead of a 401.","security":[{},{"SessionCookie":[]}],"responses":{"200":{"description":"The session.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/auth/logout":{"get":{"operationId":"logout","tags":["Auth"],"summary":"Clear the session cookie","security":[],"responses":{"200":{"description":"Signed out.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"],"additionalProperties":true}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/auth/user/{wallet}":{"get":{"operationId":"getPublicProfile","tags":["Auth"],"summary":"Public X profile of a wallet","description":"Returns nulls for a wallet with no account. Not rate limited.","security":[],"parameters":[{"$ref":"#/components/parameters/Wallet"}],"responses":{"200":{"description":"The X handle and avatar, or nulls.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicProfile"}}}}}}},"/api-keys":{"post":{"operationId":"createApiKey","tags":["API keys"],"summary":"Create an API key","description":"The raw key (`vectr_` plus 24 random bytes as hex) is returned once, here. Keys are read-write unless `readOnly` is set; every option is a restriction, never a grant.","security":[{"SessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"The new key, including the raw key.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"get":{"operationId":"listApiKeys","tags":["API keys"],"summary":"This account's active keys","security":[{"SessionCookie":[]}],"responses":{"200":{"description":"Active keys, newest first, with a masked preview.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeySummary"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api-keys/{id}":{"delete":{"operationId":"revokeApiKey","tags":["API keys"],"summary":"Revoke a key","description":"Takes effect on the next request. Returns success even when the id is unknown or belongs to another account (nothing is changed then).","security":[{"SessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Key id from GET /api-keys.","schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked.","headers":{"X-RateLimit-Limit-global":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining-global":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset-global":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResult"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"An API key created in your profile or with POST /api-keys (`vectr_...`). Checked on every request, including its IPv4 allowlist."},"SessionCookie":{"type":"apiKey","in":"cookie","name":"vectr_session","description":"The HttpOnly session cookie set by the X sign-in flow (GET /auth/login). Valid for 7 days."}},"headers":{"RateLimitLimit":{"description":"Requests allowed in the current window for this route and client IP.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"parameters":{"TokenAddress":{"name":"address","in":"path","required":true,"description":"Token contract address (the ERC-20, not its curve). Case-insensitive.","schema":{"$ref":"#/components/schemas/Address"}},"MarketAddress":{"name":"address","in":"path","required":true,"description":"The token's bonding-curve address (`curveAddress` on token responses). For a graduated token the curve or its Uniswap pool address both work. A token address is not a market and returns 404.","schema":{"$ref":"#/components/schemas/Address"}},"Wallet":{"name":"wallet","in":"path","required":true,"description":"Wallet address. Case-insensitive.","schema":{"$ref":"#/components/schemas/Address"}},"JobId":{"name":"id","in":"path","required":true,"description":"Job id returned by POST /agent/job.","schema":{"type":"string"}},"OrderId":{"name":"id","in":"path","required":true,"description":"Numeric order id. A non-integer is a 400.","schema":{"type":"integer"}}},"responses":{"BadRequest":{"description":"The request failed validation. `message` is an array of strings when a body field was rejected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing or invalid credentials: no X-API-Key, an invalid or revoked key, or a missing or expired session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Authenticated but refused: a read-only key, a key used from an IP outside its allowlist, a recipient outside the key's allowlist, a job owned by another wallet, or a signing rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The token, market, asset, job, order or profile does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PayloadTooLarge":{"description":"The upload is over 5 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UnprocessableEntity":{"description":"Valid input the order cannot accept in its current state, or a DCA order the wallet cannot fund.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServiceUnavailable":{"description":"The chain RPC failed and the token is not indexed yet. Retry shortly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Throttled. Wait `Retry-After-global` seconds.","headers":{"Retry-After-global":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"0x-prefixed 20-byte address."},"Error":{"type":"object","description":"Body of every error response, written by the global exception filter. There is no timestamp.","properties":{"statusCode":{"type":"integer","description":"The HTTP status, repeated."},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"A message, or an array of messages when body validation fails."},"code":{"type":"string","description":"A stable machine-readable reason, present only when the error sets one."},"path":{"type":"string","description":"The request URL that failed, including its query string."},"requestId":{"type":"string","description":"The same value as the X-Request-ID response header. Quote it when reporting a failure: it is what finds the server-side record of this exact request."}},"required":["statusCode","message","path"],"additionalProperties":true},"InlineError":{"type":"object","description":"Returned with a success status by the quote and build-tx validators.","properties":{"error":{"type":"string","description":"Why the request was rejected."}},"required":["error"],"additionalProperties":true},"SuccessResult":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string","description":"Present when `success` is false."}},"required":["success"],"additionalProperties":true},"Config":{"type":"object","properties":{"chainId":{"type":"integer"},"chainName":{"type":"string"},"isMainnet":{"type":"boolean"},"rpcUrl":{"type":"string","description":"Public RPC URL for wallets."},"rpcUrls":{"type":"array","items":{"type":"string"},"description":"Public RPC URLs answering for this chain right now, best first. Probed every 30 seconds for chain id, head freshness and CORS; never empty."},"factoryAddress":{"type":"string","description":"Factory address; empty when not configured."},"feeCollectorAddress":{"type":"string","description":"FeeCollector address; empty when not configured."},"explorerUrl":{"type":"string"},"platformTokenAddress":{"type":"string","description":"Vectr's own token, lower-cased; empty until it launches."},"nativeCurrency":{"type":"object","properties":{"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"}},"required":["name","symbol","decimals"],"additionalProperties":true},"nativePriceUsd":{"type":"number"},"fees":{"$ref":"#/components/schemas/FeeConfig"},"uniswap":{"oneOf":[{"$ref":"#/components/schemas/UniswapConfig"},{"type":"null"}],"description":"Where graduated tokens trade; null when this chain has no Uniswap configured."},"contracts":{"type":"object","description":"Every platform contract; an empty string when not configured.","properties":{"factory":{"type":"string"},"feeCollector":{"type":"string"},"migrator":{"type":"string"},"lpLocker":{"type":"string"},"presaleFactory":{"type":"string"},"subscriptionTreasury":{"type":"string"}},"required":["factory","feeCollector","migrator","lpLocker","presaleFactory","subscriptionTreasury"],"additionalProperties":true},"platform":{"$ref":"#/components/schemas/PlatformInfo"},"quoteAssets":{"type":"array","items":{"$ref":"#/components/schemas/QuoteAsset"},"description":"Enabled pairing assets, native first."},"subscription":{"type":"object","properties":{"tiers":{"type":"object","properties":{"free":{"type":"object","properties":{"messagesPerDay":{"type":"integer"},"launchesPerDay":{"type":"integer"}},"required":["messagesPerDay","launchesPerDay"],"additionalProperties":true},"pro":{"type":"object","properties":{"messagesPerDay":{"type":"integer"},"launchesPerDay":{"type":"integer"}},"required":["messagesPerDay","launchesPerDay"],"additionalProperties":true}},"required":["free","pro"],"additionalProperties":true},"price":{"type":"object","properties":{"monthlyUsd":{"type":"number"},"yearlyUsd":{"type":"number"},"monthlyDays":{"type":"integer"},"yearlyDays":{"type":"integer"}},"required":["monthlyUsd","yearlyUsd","monthlyDays","yearlyDays"],"additionalProperties":true},"proTools":{"type":"array","items":{"type":"string"},"description":"Agent tools reserved for the Pro tier."}},"required":["tiers","price","proTools"],"additionalProperties":true}},"required":["chainId","chainName","isMainnet","rpcUrl","rpcUrls","factoryAddress","feeCollectorAddress","explorerUrl","platformTokenAddress","nativeCurrency","nativePriceUsd","fees","uniswap","contracts","platform","quoteAssets","subscription"],"additionalProperties":true},"FeeConfig":{"type":"object","description":"Live fee rates from the FeeCollector. Owner-adjustable on-chain.","properties":{"curve":{"type":"object","description":"Bonding-curve fee split, in basis points.","properties":{"creatorBps":{"type":"integer"},"protocolBps":{"type":"integer"},"totalBps":{"type":"integer"}},"required":["creatorBps","protocolBps","totalBps"],"additionalProperties":true},"pool":{"type":"object","description":"Swap fee after graduation and where the token trades then.","properties":{"feeBps":{"type":"integer"},"venue":{"type":"string","enum":["uniswap-v3","vectr-pool"]}},"required":["feeBps","venue"],"additionalProperties":true},"maxFeeBps":{"type":"integer"},"platformWallets":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"shareBps":{"type":"integer"}},"required":["address","shareBps"],"additionalProperties":true}},"fromChain":{"type":"boolean","description":"False while built-in defaults are served, before the first successful read from the FeeCollector."}},"required":["curve","pool","maxFeeBps","platformWallets","fromChain"],"additionalProperties":true},"UniswapConfig":{"type":"object","properties":{"factory":{"type":"string"},"positionManager":{"type":"string"},"router":{"type":"string","description":"SwapRouter02."},"quoter":{"type":"string","description":"QuoterV2."},"weth":{"type":"string"},"poolFee":{"type":"integer","description":"Fee tier of graduation pools, in hundredths of a bip (10000 = 1%)."}},"required":["factory","positionManager","router","quoter","weth","poolFee"],"additionalProperties":true},"PlatformInfo":{"type":"object","description":"What this deployment can do. Public pages render from it.","properties":{"features":{"type":"object","properties":{"terminal":{"$ref":"#/components/schemas/FeatureStatus"},"swap":{"$ref":"#/components/schemas/FeatureStatus"},"restApi":{"$ref":"#/components/schemas/FeatureStatus"},"cli":{"$ref":"#/components/schemas/FeatureStatus"},"mcp":{"$ref":"#/components/schemas/FeatureStatus"},"llmGateway":{"$ref":"#/components/schemas/FeatureStatus"}},"required":["terminal","swap","restApi","cli","mcp","llmGateway"],"additionalProperties":true},"rateLimit":{"type":"object","description":"Default per-route, per-IP rate limit.","properties":{"requests":{"type":"integer"},"windowSec":{"type":"integer"}},"required":["requests","windowSec"],"additionalProperties":true},"launch":{"type":"object","properties":{"supplyTokens":{"type":"number","description":"Total supply of every launched token."},"curveSupplyTokens":{"type":"number","description":"Part of the supply sold on the curve."},"lpReserveTokens":{"type":"number","description":"Part held back for the graduation position."},"virtualTokensInit":{"type":"number"}},"required":["supplyTokens","curveSupplyTokens","lpReserveTokens","virtualTokensInit"],"additionalProperties":true},"security":{"type":"object","additionalProperties":true,"description":"Custody, transaction controls, API key scopes and on-chain properties."},"mcp":{"type":"object","additionalProperties":true,"description":"The MCP server package, transport, environment variables and tools."}},"required":["features","rateLimit","launch","security","mcp"],"additionalProperties":true},"FeatureStatus":{"type":"string","enum":["live","beta","coming-soon"]},"QuoteAsset":{"type":"object","properties":{"address":{"type":"string","description":"Asset address; the zero address is the native coin."},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"isNative":{"type":"boolean"},"enabled":{"type":"boolean"},"type":{"type":"string","enum":["NATIVE","ROBINHOOD_STOCK_TOKEN","STABLECOIN","CRYPTO_ASSET","OTHER"],"description":"Asset class. Only ROBINHOOD_STOCK_TOKEN is a Stock Token."},"priceProvider":{"type":"string","enum":["robinhood","coingecko","uniswap-v3","stock-feed","fixed","none"],"description":"Where priceUsd comes from."},"logoUrl":{"type":"string","description":"Cached logo route. May 404; draw a lettermark then."},"priceUsd":{"type":"number"},"virtualInit":{"type":"string","description":"Curve virtual quote reserve at launch, base units."},"graduationThreshold":{"type":"string","description":"Real quote reserves that trigger graduation, base units."},"graduationThresholdAmount":{"type":"number","description":"graduationThreshold in whole units."},"maturesAt":{"type":["string","null"],"format":"date-time","description":"When the asset stops minting; null for undated assets."},"issuer":{"type":["string","null"]},"docsUrl":{"type":["string","null"]},"launchBlockedReason":{"type":["string","null"],"description":"Set when new launches on this asset are refused, e.g. too close to maturity."}},"required":["address","symbol","name","decimals","isNative","enabled","logoUrl","priceUsd","virtualInit","graduationThreshold","graduationThresholdAmount","maturesAt","issuer","docsUrl","launchBlockedReason"],"additionalProperties":true},"RpcPool":{"type":"object","properties":{"chainId":{"type":"integer"},"maxLagSec":{"type":"integer","description":"An endpoint whose head is further behind the freshest one than this is not routed to."},"checkedAt":{"type":["string","null"],"format":"date-time","description":"When the last probe round finished."},"backendOrder":{"type":"array","items":{"type":"string"},"description":"The order backend calls try endpoints in."},"browserUrls":{"type":"array","items":{"type":"string"},"description":"The endpoints served to browsers as `rpcUrls` on GET /config."},"endpoints":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"roles":{"type":"array","items":{"type":"string","enum":["backend","browser"]}},"status":{"type":"string","enum":["pending","up","stale","blocked","down","wrong-chain"]},"coolingDown":{"type":"boolean","description":"Benched for 30 seconds after an overload error."},"tracking":{"type":"string","enum":["none","limited","unknown","yes"],"description":"Chainlist's privacy label."},"chainId":{"type":["integer","null"]},"block":{"type":["integer","null"],"description":"Latest block the endpoint reported."},"lagSec":{"type":["number","null"],"description":"Seconds behind the freshest endpoint."},"latencyMs":{"type":["number","null"],"description":"Smoothed round trip from Vectr's server."},"logRange":{"type":["integer","null"],"description":"Widest eth_getLogs block range accepted (tried 10000, 2000, 1000, 100); 0 = refused."},"cors":{"type":["boolean","null"],"description":"Whether a preflight from the site's origin passes; null = not probed."},"lastError":{"type":["string","null"]}},"required":["url","roles","status","coolingDown","tracking","chainId","block","lagSec","latencyMs","logRange","cors","lastError"],"additionalProperties":true}}},"required":["chainId","maxLagSec","checkedAt","backendOrder","browserUrls","endpoints"],"additionalProperties":true},"NativePrice":{"type":"object","properties":{"symbol":{"type":"string"},"usd":{"type":"number","description":"Last known price. The configured fallback until the first CoinGecko answer; check `fresh`."},"formatted":{"type":"string","description":"e.g. `$2450.12`."},"updatedAt":{"type":["string","null"],"format":"date-time","description":"When CoinGecko last answered; null = never."},"fresh":{"type":"boolean","description":"True when updatedAt is within the last ten minutes. When false, show native amounts and no USD conversion."},"source":{"type":"string","enum":["coingecko"]}},"required":["symbol","usd","formatted","updatedAt","fresh","source"],"additionalProperties":true},"Stock":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUrl":{"type":"string","description":"Cached logo route. May 404."},"status":{"type":"string","description":"Registry status."},"tradable":{"type":"boolean"},"multiplier":{"type":"number","description":"Token units per share, folding in splits and dividends."},"isin":{"type":["string","null"],"description":"ISIN of the security the token tracks, from Robinhood's registry."},"sessions":{"oneOf":[{"type":"object","description":"Whether Robinhood lists the token as tradable in each session, whole and fractional.","properties":{"market":{"type":"object","properties":{"whole":{"type":"boolean"},"fractional":{"type":"boolean"}},"required":["whole","fractional"],"additionalProperties":true},"extended":{"type":"object","properties":{"whole":{"type":"boolean"},"fractional":{"type":"boolean"}},"required":["whole","fractional"],"additionalProperties":true},"overnight":{"type":"object","properties":{"whole":{"type":"boolean"},"fractional":{"type":"boolean"}},"required":["whole","fractional"],"additionalProperties":true}}},{"type":"null"}],"description":"Null until the first registry sync of the serving process."},"pendingMultiplier":{"type":["number","null"],"description":"A multiplier Robinhood has announced but not yet applied (split or dividend)."}},"required":["address","symbol","name","decimals","logoUrl","status","tradable","multiplier","isin","sessions","pendingMultiplier"],"additionalProperties":true},"StockList":{"type":"object","properties":{"chainId":{"type":"integer"},"total":{"type":"integer","description":"Stock Tokens known on this chain, before `q` and `limit`."},"stocks":{"type":"array","items":{"$ref":"#/components/schemas/Stock"}}},"required":["chainId","total","stocks"],"additionalProperties":true},"StockDetail":{"allOf":[{"$ref":"#/components/schemas/Stock"},{"type":"object","properties":{"priceUsd":{"type":["number","null"],"description":"Price per token (the share mid times the multiplier); null when no quote is available."},"quote":{"oneOf":[{"type":"object","description":"Robinhood's quote, passed through.","properties":{"tokenSymbol":{"type":"string"},"bid":{"type":"string"},"ask":{"type":"string"},"currency":{"type":"string"},"dailyHigh":{"type":"string"},"dailyLow":{"type":"string"},"isTradingHalt":{"type":"boolean"},"generatedAt":{"type":"string"}},"additionalProperties":true},{"type":"null"}]}},"required":["priceUsd","quote"],"additionalProperties":true}]},"TokenListItem":{"type":"object","properties":{"rank":{"type":"integer","description":"1-based rank by USD market cap."},"address":{"type":"string","description":"Token address."},"curveAddress":{"type":"string","description":"Bonding-curve address: the market for quote and build-tx."},"name":{"type":"string"},"symbol":{"type":"string"},"creator":{"type":"string"},"metadataUri":{"type":"string"},"quoteAsset":{"type":"string","description":"Pairing asset address."},"quoteSymbol":{"type":"string"},"quoteDecimals":{"type":"integer"},"price":{"type":"number","description":"Quote asset per token."},"priceUsd":{"type":"number"},"marketCap":{"type":"string","description":"Formatted USD label such as `$12K`, not a number."},"vol24h":{"type":"string","description":"Formatted USD label."},"change24h":{"type":"number","description":"Percent change over 24h, one decimal."},"tradeCount":{"type":"integer"},"uniqueTraders":{"type":"integer","description":"Distinct wallets that have traded it, lifetime."},"volumeUsd":{"type":"number","description":"Lifetime traded volume in USD, at current quote prices."},"moderation":{"type":"string","enum":["normal","adult","impersonation_warning","malicious_link","restricted","hidden"],"description":"Search and discovery state set by an operator. normal: listed, may be indexed. adult: listed, never featured or indexed. impersonation_warning, malicious_link: shown with a warning. restricted, hidden: kept out of lists and search; still resolvable by address. The on-chain name and symbol are never rewritten."},"graduated":{"type":"boolean"},"poolAddress":{"type":["string","null"],"description":"Uniswap V3 pool once graduated."},"quoteRaised":{"type":"number","description":"Real quote reserves on the curve."},"graduationThreshold":{"type":"number","description":"Quote reserves that trigger graduation."},"timestamp":{"type":"string","format":"date-time","description":"Launch time."},"isAgent":{"type":"boolean"}},"required":["rank","address","curveAddress","name","symbol","creator","metadataUri","quoteAsset","quoteSymbol","quoteDecimals","price","priceUsd","marketCap","vol24h","change24h","tradeCount","uniqueTraders","volumeUsd","moderation","graduated","poolAddress","quoteRaised","graduationThreshold","timestamp","isAgent"],"additionalProperties":true},"Status":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time","description":"When the checks ran."},"chainId":{"type":"integer","description":"Chain the checks read."},"state":{"type":"string","enum":["operational","degraded","down"],"description":"Worst component state."},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable identifier: database, rpc, indexer, cursors, launches, stock-prices, native-price, stock-registry."},"label":{"type":"string"},"state":{"type":"string","enum":["operational","degraded","down"]},"detail":{"type":"string","description":"The measured value behind the state, in one sentence."},"observedAt":{"type":"string","format":"date-time","description":"When this component was measured."},"metrics":{"type":"object","additionalProperties":{"type":["string","number","null"]},"description":"The readings behind `detail`. indexer: indexedBlock, headBlock, lagSec, lagBlocks, indexedAt. rpc: headBlock, headTime. launches: factoryLaunches, platformTokens, expected, indexedTokens. stock-prices and native-price: updatedAt, ageSec. stock-registry: count, syncedAt, ageSec. Blocks are decimal strings."}},"required":["id","label","state","detail","observedAt"],"additionalProperties":true}},"thresholds":{"type":"object","additionalProperties":{"type":"object","properties":{"operationalSec":{"type":"integer"},"degradedSec":{"type":"integer"}},"required":["operationalSec","degradedSec"],"additionalProperties":true},"description":"Age limits per check (indexerLag, stockPrices, nativePrice, registry): at or under operationalSec is operational, at or under degradedSec degraded, above it down."}},"required":["generatedAt","chainId","state","components","thresholds"],"additionalProperties":true},"TokenSearchResult":{"type":"object","properties":{"name":{"type":"string"},"symbol":{"type":"string"},"address":{"type":"string"},"curveAddress":{"type":"string"},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"price":{"type":"number","description":"USD price per token."},"marketCap":{"type":"string","description":"Formatted USD label."}},"required":["name","symbol","address","curveAddress","quoteAsset","quoteSymbol","price","marketCap"],"additionalProperties":true},"TokenDetail":{"type":"object","properties":{"address":{"type":"string"},"curveAddress":{"type":"string","description":"Bonding-curve address: the market for quote and build-tx."},"name":{"type":"string"},"symbol":{"type":"string"},"metadataUri":{"type":"string"},"creator":{"type":"string"},"graduated":{"type":"boolean"},"subjectHandle":{"type":"string","description":"X handle the fees are reserved for, without @; empty when none."},"feeRecipient":{"type":"string"},"feeRecipientClaimed":{"type":"boolean"},"poolAddress":{"type":["string","null"]},"poolUrl":{"type":["string","null"],"description":"Public pool page, when graduated."},"txHash":{"type":"string","description":"Launch transaction; empty when not indexed."},"creatorFees":{"type":"string","description":"Creator fees earned, quote-asset units, 6 decimals."},"timestamp":{"type":"string","format":"date-time","description":"Launch time."},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"quoteDecimals":{"type":"integer"},"quote":{"$ref":"#/components/schemas/QuoteAsset"},"price":{"type":"number","description":"Quote asset per token; the pool spot price once graduated."},"priceUsd":{"type":"number"},"marketCap":{"type":"string","description":"Formatted USD label."},"marketCapQuote":{"type":"number","description":"Market cap in quote-asset units."},"quoteRaised":{"type":"number"},"quoteRaisedFormatted":{"type":"string"},"graduationThreshold":{"type":"number"},"vol24h":{"type":"string","description":"Formatted USD label."},"change24h":{"type":"number","description":"Percent, one decimal."},"totalVolume":{"type":"string","description":"Formatted USD label."},"tradeCount":{"type":"integer"},"uniqueTraders":{"type":"integer","description":"Distinct wallets that have traded it, lifetime."},"volumeUsd":{"type":"number","description":"Lifetime traded volume in USD, at current quote prices."},"isAgent":{"type":"boolean"},"moderation":{"type":"string","enum":["normal","adult","impersonation_warning","malicious_link","restricted","hidden"],"description":"Search and discovery state set by an operator. normal: listed, may be indexed. adult: listed, never featured or indexed. impersonation_warning, malicious_link: shown with a warning. restricted, hidden: kept out of lists and search; still resolvable by address. The on-chain name and symbol are never rewritten."}},"required":["address","curveAddress","name","symbol","metadataUri","creator","graduated","subjectHandle","feeRecipient","feeRecipientClaimed","poolAddress","poolUrl","txHash","creatorFees","timestamp","quoteAsset","quoteSymbol","quoteDecimals","quote","price","priceUsd","marketCap","marketCapQuote","quoteRaised","quoteRaisedFormatted","graduationThreshold","vol24h","change24h","totalVolume","tradeCount","uniqueTraders","volumeUsd","isAgent","moderation"],"additionalProperties":true},"PlatformStats":{"type":"object","properties":{"totalTokens":{"type":"integer","description":"factoryLaunches plus platformTokens when read from the chain; see definitions.totalTokens."},"totalTraders":{"type":"integer"},"totalFeesUsd":{"type":"string","description":"Formatted USD label. Not a real USD figure when feesUsdAvailable is false."},"totalFeesByAsset":{"type":"array","items":{"type":"object","properties":{"quoteAsset":{"type":"string"},"symbol":{"type":"string"},"fee":{"type":"number","description":"Fees in that asset."},"feeUsd":{"type":"number"}},"required":["quoteAsset","symbol","fee","feeUsd"],"additionalProperties":true}},"factoryLaunches":{"type":["integer","null"],"description":"Tokens returned by VectrFactory.getAllTokens(); null when the count comes from the indexer."},"platformTokens":{"type":"integer","description":"1 when the $VECTR platform token is the standalone edition, deployed outside the factory."},"feesUsdAvailable":{"type":"boolean","description":"False while the native coin price is stale or the configured fallback and native fees are part of the total."},"nativePriceUpdatedAt":{"type":["string","null"],"format":"date-time","description":"When the native coin price was last read from CoinGecko."},"source":{"type":"string","enum":["chain+indexer","indexer"],"description":"Where totalTokens was read."},"observedAt":{"type":"string","format":"date-time","description":"When these totals were read."},"definitions":{"type":"object","description":"What each counter counts, in one sentence.","properties":{"totalTokens":{"type":"string"},"totalTraders":{"type":"string"},"totalFeesUsd":{"type":"string"}},"required":["totalTokens","totalTraders","totalFeesUsd"],"additionalProperties":true}},"required":["totalTokens","totalTraders","totalFeesUsd","totalFeesByAsset","factoryLaunches","platformTokens","feesUsdAvailable","nativePriceUpdatedAt","source","observedAt","definitions"],"additionalProperties":true},"RecentTrade":{"type":"object","properties":{"type":{"type":"string","enum":["buy","sell"]},"name":{"type":"string"},"symbol":{"type":"string"},"amount":{"type":"string","description":"Quote amount with symbol, e.g. `0.50 ETH`."},"action":{"type":"string","enum":["bought","sold"]},"time":{"type":"string","description":"Relative time, e.g. `5m ago`."}},"required":["type","name","symbol","amount","action","time"],"additionalProperties":true},"TokenActivity":{"type":"object","properties":{"quoteSymbol":{"type":"string"},"quoteUsd":{"type":"number","description":"USD price of the quote asset."},"items":{"type":"array","items":{"$ref":"#/components/schemas/TokenActivityItem"}},"hasMore":{"type":"boolean"},"summary":{"oneOf":[{"$ref":"#/components/schemas/TokenActivitySummary"},{"type":"null"}],"description":"Present on the first page only."}},"required":["quoteSymbol","quoteUsd","items","hasMore","summary"],"additionalProperties":true},"TokenActivityItem":{"type":"object","properties":{"kind":{"type":"string","enum":["launch","buy","sell","graduated"]},"id":{"type":"integer","description":"Trade id (the cursor for `before`); 0 for launch. A graduated row shares the id of the buy that crossed the threshold."},"txHash":{"type":"string"},"actor":{"type":"string","description":"Trader for buy and sell, creator for launch, empty for graduated."},"quoteAmount":{"type":"number"},"usdAmount":{"type":"number"},"tokenAmount":{"type":"number"},"price":{"type":"number","description":"Quote per token after this row; 0 for launch."},"priceUsd":{"type":"number"},"ts":{"type":"integer","description":"Unix seconds."}},"required":["kind","id","txHash","actor","quoteAmount","usdAmount","tokenAmount","price","priceUsd","ts"],"additionalProperties":true},"TokenActivitySummary":{"type":"object","properties":{"buys24h":{"type":"integer"},"sells24h":{"type":"integer"},"traders24h":{"type":"integer"},"buyVolume24hUsd":{"type":"number"},"sellVolume24hUsd":{"type":"number"}},"required":["buys24h","sells24h","traders24h","buyVolume24hUsd","sellVolume24hUsd"],"additionalProperties":true},"Bar":{"type":"object","properties":{"time":{"type":"integer","description":"Bucket start, unix seconds."},"o":{"type":"number"},"h":{"type":"number"},"l":{"type":"number"},"c":{"type":"number"},"v":{"type":"number","description":"Quote-asset notional, never USD."}},"required":["time","o","h","l","c","v"],"additionalProperties":true},"Portfolio":{"type":"object","properties":{"holdings":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"curveAddress":{"type":"string"},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"balance":{"type":"number"},"balanceFormatted":{"type":"string"},"price":{"type":"number"},"priceUsd":{"type":"number"},"valueUsd":{"type":"number"},"change24h":{"type":"number","description":"Percent, one decimal."},"metadataUri":{"type":"string"}},"required":["symbol","name","address","curveAddress","quoteAsset","quoteSymbol","balance","balanceFormatted","price","priceUsd","valueUsd","change24h","metadataUri"],"additionalProperties":true}},"totalValueUsd":{"type":"number"},"count":{"type":"integer"}},"required":["holdings","totalValueUsd","count"],"additionalProperties":true},"WalletTrade":{"type":"object","properties":{"type":{"type":"string","enum":["buy","sell"]},"name":{"type":"string"},"symbol":{"type":"string"},"tokenAddress":{"type":"string"},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"quoteAmount":{"type":"number"},"usdAmount":{"type":"number"},"tokenAmount":{"type":"number"},"price":{"type":"number"},"fee":{"type":"number","description":"Fee in quote-asset units."},"txHash":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"timeAgo":{"type":"string"}},"required":["type","name","symbol","tokenAddress","quoteAsset","quoteSymbol","quoteAmount","usdAmount","tokenAmount","price","fee","txHash","timestamp","timeAgo"],"additionalProperties":true},"BuyQuote":{"type":"object","properties":{"type":{"type":"string","const":"buy"},"venue":{"type":"string","enum":["curve","uniswap-v3","vectr-pool"],"description":"`curve` before graduation; after graduation the post-graduation venue from `fees.pool.venue` in GET /config (`uniswap-v3` on Robinhood Chain)."},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"quoteIn":{"type":"number","description":"Quote amount spent."},"tokensOut":{"type":"number"},"fee":{"type":"number","description":"Fee in quote-asset units."},"feeLabel":{"type":"string","description":"e.g. `0.97%`."},"usdValue":{"type":"number"}},"required":["type","venue","quoteAsset","quoteSymbol","quoteIn","tokensOut","fee","feeLabel","usdValue"],"additionalProperties":true},"SellQuote":{"type":"object","properties":{"type":{"type":"string","const":"sell"},"venue":{"type":"string","enum":["curve","uniswap-v3","vectr-pool"],"description":"`curve` before graduation; after graduation the post-graduation venue from `fees.pool.venue` in GET /config (`uniswap-v3` on Robinhood Chain)."},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"tokensIn":{"type":"number"},"quoteOut":{"type":"number"},"fee":{"type":"number","description":"Fee in quote-asset units."},"feeLabel":{"type":"string"},"usdValue":{"type":"number"},"exceedsLiquidity":{"type":"boolean","const":true,"description":"Present only when the curve cannot fill this sell: it pays out only the quote its buyers paid in. `quoteOut` is then 0 and a build of this sell is refused."},"maxTokensIn":{"type":"number","description":"With `exceedsLiquidity`: the most tokens the curve can buy back right now (rounded down)."},"quoteReserves":{"type":"number","description":"With `exceedsLiquidity`: the quote the curve holds, in quote-asset units."}},"required":["type","venue","quoteAsset","quoteSymbol","tokensIn","quoteOut","fee","feeLabel","usdValue"],"additionalProperties":true},"BuildTxRequest":{"type":"object","properties":{"type":{"type":"string","enum":["buy","sell"]},"amount":{"oneOf":[{"type":"string","pattern":"^\\d*\\.?\\d*$"},{"type":"number","exclusiveMinimum":0}],"description":"Whole units: quote asset for a buy, token for a sell. Send a decimal string so an exact 18-decimal balance survives."},"slippage":{"type":"number","default":1,"description":"Percent tolerance applied to the quote."},"recipient":{"$ref":"#/components/schemas/Address","description":"The wallet that will send the transaction. Required once the token has graduated; defaults to the session wallet when a session cookie is sent."}},"required":["type","amount"],"additionalProperties":true},"BuiltTx":{"type":"object","properties":{"to":{"type":"string","description":"Curve, or SwapRouter02 for a graduated token."},"data":{"type":"string","description":"Calldata, 0x hex."},"value":{"type":"string","description":"Wei, 0x hex."},"chainId":{"type":"integer"},"quoteAsset":{"type":"string"},"venue":{"type":"string","enum":["curve","uniswap-v3","vectr-pool"],"description":"`curve` before graduation; after graduation the post-graduation venue from `fees.pool.venue` in GET /config (`uniswap-v3` on Robinhood Chain)."},"approvalStep":{"type":"object","description":"Send this approval first. Present on sells and on buys paired against an ERC-20.","properties":{"tokenAddress":{"type":"string","description":"Token to approve."},"spender":{"type":"string"},"data":{"type":"string","description":"ERC-20 approve calldata."}},"required":["tokenAddress","spender","data"],"additionalProperties":true}},"required":["to","data","value","chainId","quoteAsset","venue"],"additionalProperties":true},"PriceTick":{"type":"object","properties":{"tokenAddress":{"type":"string"},"curveAddress":{"type":"string"},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"price":{"type":"number","description":"Quote asset per token."},"priceUsd":{"type":"number"},"marketCap":{"type":"number","description":"USD."},"quoteRaised":{"type":"number"},"graduated":{"type":"boolean"},"ts":{"type":"integer","description":"Unix milliseconds."}},"required":["tokenAddress","curveAddress","quoteAsset","quoteSymbol","price","priceUsd","marketCap","quoteRaised","graduated","ts"],"additionalProperties":true},"TickEvent":{"type":"object","properties":{"event":{"type":"string","const":"tick"},"data":{"$ref":"#/components/schemas/PriceTick"}},"required":["event","data"],"additionalProperties":true},"RefreshEvent":{"type":"object","properties":{"event":{"type":"string","const":"refresh"},"data":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"string"},"description":"Token addresses that traded."},"ts":{"type":"integer","description":"Unix milliseconds."}},"required":["tokens","ts"],"additionalProperties":true}},"required":["event","data"],"additionalProperties":true},"StreamTrade":{"type":"object","properties":{"id":{"type":"integer"},"txHash":{"type":"string"},"trader":{"type":"string"},"side":{"type":"string","enum":["buy","sell"]},"price":{"type":"number","description":"Quote per token."},"priceUsd":{"type":"number"},"quoteAmount":{"type":"number"},"tokenAmount":{"type":"number"},"ts":{"type":"integer","description":"Unix seconds."},"block":{"type":"integer"}},"required":["id","txHash","trader","side","price","priceUsd","quoteAmount","tokenAmount","ts","block"],"additionalProperties":true},"BarEvent":{"type":"object","properties":{"event":{"type":"string","const":"bar"},"id":{"type":"string","description":"Highest trade id folded into these bars."},"data":{"type":"object","properties":{"id":{"type":"integer","description":"Highest trade id folded into these bars."},"quoteUsd":{"type":"number"},"bars":{"type":"array","items":{"$ref":"#/components/schemas/Bar"},"description":"USD bars whose values changed; upsert by `time`."}},"required":["id","quoteUsd","bars"],"additionalProperties":true}},"required":["event","id","data"],"additionalProperties":true},"TradeEvent":{"type":"object","properties":{"event":{"type":"string","const":"trade"},"id":{"type":"string","description":"Highest trade id in the batch."},"data":{"type":"object","properties":{"trades":{"type":"array","items":{"$ref":"#/components/schemas/StreamTrade"},"description":"Oldest first."}},"required":["trades"],"additionalProperties":true}},"required":["event","id","data"],"additionalProperties":true},"ResetEvent":{"type":"object","properties":{"event":{"type":"string","const":"reset"},"data":{"type":"object","maxProperties":0,"description":"Always `{}`."}},"required":["event","data"],"additionalProperties":true},"LaunchFeeEstimate":{"type":"object","properties":{"gasLimit":{"type":"string","description":"Integer string."},"gasPriceWei":{"type":"string","description":"Integer string."},"estimatedFeeTao":{"type":"string","description":"Estimated fee in the native coin, 6 decimals. The name predates Robinhood Chain."},"estimatedFeeUsd":{"type":"string","description":"4 decimals."}},"required":["gasLimit","gasPriceWei","estimatedFeeTao","estimatedFeeUsd"],"additionalProperties":true},"DailyLimit":{"type":"object","properties":{"count":{"type":"integer","description":"Launches by this wallet today (UTC)."},"limit":{"type":"integer"},"remaining":{"type":"integer"}},"required":["count","limit","remaining"],"additionalProperties":true},"UploadMetadataRequest":{"type":"object","properties":{"name":{"type":"string"},"symbol":{"type":"string"},"description":{"type":"string"},"imageUrl":{"type":"string","description":"Image URI, e.g. `imageUri` from POST /launch/upload-image."},"twitter":{"type":"string"},"telegram":{"type":"string"},"website":{"type":"string"},"subjectHandle":{"type":"string","description":"Accepted but not written to the pinned metadata; the handle is a launchToken argument."}},"required":["name","symbol"],"additionalProperties":false},"MetadataUpload":{"type":"object","properties":{"metadataUri":{"type":"string","description":"`ipfs://` URI for the launch transaction."},"gatewayUrl":{"type":"string"}},"required":["metadataUri","gatewayUrl"],"additionalProperties":true},"ImageUpload":{"type":"object","properties":{"imageUri":{"type":"string","description":"`ipfs://` URI."},"gatewayUrl":{"type":"string"}},"required":["imageUri","gatewayUrl"],"additionalProperties":true},"CreatorFees":{"type":"object","properties":{"wallet":{"type":"string"},"accruedTao":{"type":"string","description":"Native-coin fees accrued, 8 decimals. The name predates Robinhood Chain."},"accruedUsd":{"type":"string","description":"All assets, USD, 4 decimals."},"claimable":{"type":"boolean"},"byAsset":{"type":"array","items":{"type":"object","properties":{"quoteAsset":{"type":"string"},"symbol":{"type":"string"},"isNative":{"type":"boolean"},"accrued":{"type":"string","description":"8 decimals."},"accruedUsd":{"type":"string","description":"4 decimals."},"claimable":{"type":"boolean"}},"required":["quoteAsset","symbol","isNative","accrued","accruedUsd","claimable"],"additionalProperties":true}}},"required":["wallet","accruedTao","accruedUsd","claimable","byAsset"],"additionalProperties":true},"CreatorEarnings":{"type":"object","properties":{"accrued":{"$ref":"#/components/schemas/CreatorFees"},"totalEarnedTao":{"type":"string","description":"Lifetime earnings in native-coin terms."},"totalEarnedUsd":{"type":"string"},"projectedMonthlyTao":{"type":"string"},"projectedMonthlyUsd":{"type":"string","description":"Last 7 days extrapolated to 30."},"nativePrice":{"type":"string","description":"Native coin USD price used."},"tokenCount":{"type":"integer"},"tokens":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"metadataUri":{"type":"string"},"quoteAsset":{"type":"string"},"quoteSymbol":{"type":"string"},"creatorFees":{"type":"string","description":"Quote-asset units."},"creatorFeesTao":{"type":"string","description":"Same value as creatorFees; legacy name."},"creatorFeesUsd":{"type":"string"},"tradeCount":{"type":"integer"},"marketCapUsd":{"type":"string"},"totalVolumeUsd":{"type":"string"},"graduated":{"type":"boolean"}},"required":["address","name","symbol","metadataUri","quoteAsset","quoteSymbol","creatorFees","creatorFeesTao","creatorFeesUsd","tradeCount","marketCapUsd","totalVolumeUsd","graduated"],"additionalProperties":true}},"daily":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"UTC date, YYYY-MM-DD."},"feeUsd":{"type":"number"},"feeTao":{"type":"number"}},"required":["date","feeUsd","feeTao"],"additionalProperties":true},"description":"One row per day, oldest first."}},"required":["accrued","totalEarnedTao","totalEarnedUsd","projectedMonthlyTao","projectedMonthlyUsd","nativePrice","tokenCount","tokens","daily"],"additionalProperties":true},"AgentProfile":{"type":"object","properties":{"wallet":{"type":"string"},"projectName":{"type":"string"},"description":{"type":["string","null"]},"profileImageUrl":{"type":["string","null"]},"tokenAddress":{"type":["string","null"]},"twitterUsername":{"type":["string","null"]},"website":{"type":["string","null"]},"teamMembers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"role":{"type":"string"},"twitter":{"type":"string"}},"required":["name"],"additionalProperties":true}},"products":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"}},"required":["name"],"additionalProperties":true}},"revenueSources":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name"],"additionalProperties":true}},"approved":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","title","content","createdAt"],"additionalProperties":true},"description":"Newest first."}},"required":["wallet","projectName","description","profileImageUrl","tokenAddress","twitterUsername","website","teamMembers","products","revenueSources","approved","createdAt","updates"],"additionalProperties":true},"SkillCatalogEntry":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"author":{"type":"string"},"category":{"type":"string"},"url":{"type":"string","description":"SKILL.md source; empty for community skills without one."},"publishedAt":{"type":"string","format":"date-time","description":"Community skills only."},"communityId":{"type":"integer","description":"Community skills only."}},"required":["slug","name","description","author","category","url"],"additionalProperties":true},"ChatTurn":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"}},"required":["role","content"]},"CreateAgentJobRequest":{"type":"object","description":"The body is not schema-validated server-side; `wallet` and `readOnly` in it are ignored.","properties":{"prompt":{"type":"string","description":"What to ask the agent."},"threadId":{"type":"string","description":"Your own conversation id, stored on the job and echoed back. It does not load earlier turns; send those in `history`."},"history":{"type":"array","items":{"$ref":"#/components/schemas/ChatTurn"},"description":"Earlier turns of the conversation, oldest first."},"model":{"type":"string","description":"Model id. An unknown id falls back to the default model."}},"required":["prompt"],"additionalProperties":true},"AgentJobStatus":{"type":"string","enum":["pending","processing","completed","failed","cancelled"]},"AgentJobCreated":{"type":"object","properties":{"success":{"type":"boolean","const":true},"jobId":{"type":"string"},"threadId":{"type":"string","description":"The threadId you sent, else the job id."},"status":{"type":"string","const":"pending"},"message":{"type":"string"}},"required":["success","jobId","threadId","status","message"],"additionalProperties":true},"AgentJob":{"type":"object","properties":{"success":{"type":"boolean","const":true},"jobId":{"type":"string"},"threadId":{"type":"string"},"status":{"$ref":"#/components/schemas/AgentJobStatus"},"prompt":{"type":"string"},"response":{"type":["string","null"],"description":"The agent's full text answer."},"richData":{"oneOf":[{"$ref":"#/components/schemas/AgentTransaction"},{"type":"null"}],"description":"Set when the turn built a transaction."},"error":{"type":["string","null"],"description":"Client-safe message, set when the job failed."},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"processingTime":{"type":["integer","null"],"description":"Milliseconds from start to completion."},"cancellable":{"type":"boolean","description":"True only while pending."}},"required":["success","jobId","threadId","status","prompt","response","richData","error","createdAt","startedAt","completedAt","processingTime","cancellable"],"additionalProperties":true},"AgentTransaction":{"type":"object","description":"An unsigned transaction for the wallet owner to confirm. Nothing has been signed or broadcast.","properties":{"type":{"type":"string","enum":["buy","sell","launch","claim_fees","transfer","buy_credits"]},"description":{"type":"string"},"to":{"type":"string"},"data":{"type":"string","description":"Calldata, 0x hex."},"value":{"type":"string","description":"Wei."},"chainId":{"type":"integer"},"approvalStep":{"type":"object","properties":{"tokenAddress":{"type":"string"},"spender":{"type":"string"},"data":{"type":"string"}},"required":["tokenAddress","spender","data"],"additionalProperties":true},"displayInfo":{"type":"object","properties":{"action":{"type":"string"},"details":{"type":"string"},"fee":{"type":"string"},"slippage":{"type":"string"}},"required":["action","details","fee","slippage"],"additionalProperties":true}},"required":["type","description","to","data","chainId","displayInfo"],"additionalProperties":true},"AgentPromptRequest":{"type":"object","properties":{"prompt":{"type":"string"},"history":{"type":"array","items":{"$ref":"#/components/schemas/ChatTurn"},"description":"Earlier turns, oldest first."},"model":{"type":"string","description":"Model id. An unknown id falls back to the default model."}},"required":["prompt"],"additionalProperties":true},"AgentStreamEvent":{"type":"object","description":"One unnamed event (dispatched as `message`).","properties":{"data":{"type":"object","properties":{"type":{"type":"string","enum":["usage_update","thinking","text_delta","memory_saved","credits_topped_up","transaction","usage","error","done"]}},"required":["type"],"additionalProperties":true,"description":"Fields by type. usage_update: messagesUsedToday, dailyLimit. thinking: tool, label. text_delta: content. memory_saved: key, description. credits_topped_up: usd, txHash, balanceUsdc. transaction: data (an AgentTransaction). usage: model, inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens, costUsdc, balanceUsdc. error: message. done: no fields."}},"required":["data"],"additionalProperties":true},"AgentMemory":{"type":"object","properties":{"id":{"type":"integer"},"key":{"type":"string"},"type":{"type":"string"},"description":{"type":["string","null"]},"value":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","key","type","description","value","createdAt","updatedAt"],"additionalProperties":true},"SignAndSubmitRequest":{"type":"object","description":"The body a build-tx response or an agent transaction becomes: add `txType`.","properties":{"to":{"$ref":"#/components/schemas/Address"},"data":{"type":"string","description":"Calldata, 0x hex. `0x` only for `subscribe`."},"value":{"type":"string","description":"Wei, as a decimal or 0x hex integer string."},"txType":{"type":"string","enum":["buy","sell","launch","claim","transfer","buy_credits","subscribe"],"description":"Required. Must match the calldata's function selector. Note an agent's `richData.type` of `claim_fees` is sent here as `claim`."},"approvalStep":{"type":"object","properties":{"tokenAddress":{"$ref":"#/components/schemas/Address"},"spender":{"$ref":"#/components/schemas/Address"},"data":{"type":"string","description":"ERC-20 approve calldata."}},"required":["tokenAddress","spender","data"],"description":"Sent and mined before the main transaction. The spender must be the trade (or factory) contract."}},"required":["to","txType"],"additionalProperties":true},"SubmittedTx":{"type":"object","properties":{"txHash":{"type":"string","description":"Hash of the main transaction. Not yet mined."}},"required":["txHash"],"additionalProperties":true},"OrderType":{"type":"string","enum":["limit_buy","limit_sell","stop_buy","stop_sell","twap","dca"]},"OrderStatus":{"type":"string","enum":["open","pending_execution","filled","cancelled","expired"]},"Order":{"type":"object","properties":{"id":{"type":"integer"},"wallet":{"type":"string"},"tokenAddress":{"type":"string"},"curveAddress":{"type":"string"},"tokenSymbol":{"type":"string"},"tokenName":{"type":"string"},"type":{"$ref":"#/components/schemas/OrderType"},"side":{"type":"string","enum":["buy","sell"]},"status":{"$ref":"#/components/schemas/OrderStatus"},"taoAmount":{"type":["number","null"],"description":"Quote-asset amount to spend on buys. The name predates Robinhood Chain."},"tokenAmount":{"type":["number","null"],"description":"Token amount to sell."},"limitPrice":{"type":["number","null"],"description":"Trigger price, quote asset per token."},"slippage":{"type":"number","description":"Percent."},"twapTotalAmount":{"type":["number","null"]},"twapIntervalSecs":{"type":["integer","null"]},"twapSlices":{"type":["integer","null"]},"twapExecuted":{"type":"integer"},"twapNextExecution":{"type":["string","null"],"format":"date-time"},"dcaAmountPerBuy":{"type":["number","null"]},"dcaIntervalSecs":{"type":["integer","null"]},"dcaMaxBuys":{"type":["integer","null"]},"dcaBuysExecuted":{"type":"integer"},"dcaNextExecution":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"cancelledAt":{"type":["string","null"],"format":"date-time"},"filledAmount":{"type":["string","null"],"description":"Decimal string."},"executionTxHash":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","wallet","tokenAddress","curveAddress","tokenSymbol","tokenName","type","side","status","taoAmount","tokenAmount","limitPrice","slippage","twapTotalAmount","twapIntervalSecs","twapSlices","twapExecuted","twapNextExecution","dcaAmountPerBuy","dcaIntervalSecs","dcaMaxBuys","dcaBuysExecuted","dcaNextExecution","expiresAt","cancelledAt","filledAmount","executionTxHash","createdAt","updatedAt"],"additionalProperties":true},"OrderWithQuote":{"allOf":[{"$ref":"#/components/schemas/Order"},{"type":"object","properties":{"quoteAsset":{"type":["string","null"],"description":"Pairing asset address; null when the token is not indexed."},"quoteSymbol":{"type":"string"}},"required":["quoteAsset","quoteSymbol"],"additionalProperties":true}]},"CreateOrderRequest":{"type":"object","properties":{"wallet":{"type":"string","description":"Required by validation but ignored: the order is created for the session wallet."},"tokenAddress":{"type":"string"},"curveAddress":{"type":"string"},"tokenSymbol":{"type":"string"},"tokenName":{"type":"string"},"type":{"$ref":"#/components/schemas/OrderType"},"side":{"type":"string","enum":["buy","sell"]},"taoAmount":{"type":"number","exclusiveMinimum":0,"description":"Quote-asset amount to spend on buys."},"tokenAmount":{"type":"number","exclusiveMinimum":0,"description":"Token amount to sell."},"limitPrice":{"type":"number","exclusiveMinimum":0,"description":"Trigger price for limit and stop orders, quote asset per token."},"slippage":{"type":"number","minimum":0,"maximum":50,"default":1,"description":"Percent."},"twapTotalAmount":{"type":"number","exclusiveMinimum":0},"twapIntervalSecs":{"type":"integer","minimum":60,"maximum":2592000},"twapSlices":{"type":"integer","minimum":2,"maximum":100},"dcaAmountPerBuy":{"type":"number","exclusiveMinimum":0},"dcaIntervalSecs":{"type":"integer","minimum":60,"maximum":2592000},"dcaMaxBuys":{"type":"integer","minimum":1,"maximum":365},"expiresAt":{"type":"string","format":"date-time","description":"ISO 8601 date."}},"required":["wallet","tokenAddress","curveAddress","tokenSymbol","tokenName","type","side"],"additionalProperties":false},"UpdateOrderRequest":{"type":"object","properties":{"limitPrice":{"type":"number","exclusiveMinimum":0,"description":"New trigger price, quote asset per token."}},"required":["limitPrice"],"additionalProperties":false},"OrderTrade":{"type":"object","properties":{"txHash":{"type":"string"},"type":{"type":"string","enum":["buy","sell"]},"quoteAmount":{"type":"number"},"tokenAmount":{"type":"number"},"price":{"type":"number"},"timestamp":{"type":"string","format":"date-time"}},"required":["txHash","type","quoteAmount","tokenAmount","price","timestamp"],"additionalProperties":true},"SessionUser":{"type":"object","properties":{"wallet":{"type":"string","description":"Custodial wallet address."},"handle":{"type":"string","description":"X handle."},"pfp":{"type":["string","null"],"description":"X avatar URL."}},"required":["wallet","handle","pfp"],"additionalProperties":true},"Session":{"type":"object","properties":{"user":{"oneOf":[{"$ref":"#/components/schemas/SessionUser"},{"type":"null"}]}},"required":["user"],"additionalProperties":true},"PublicProfile":{"type":"object","properties":{"handle":{"type":["string","null"]},"pfp":{"type":["string","null"]}},"required":["handle","pfp"],"additionalProperties":true},"CreateApiKeyRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":64,"description":"Label. Defaults to `Default`."},"readOnly":{"type":"boolean","default":false,"description":"Blocks the signing path and order-changing agent tools."},"allowedIps":{"type":"array","items":{"type":"string","pattern":"^(\\d{1,3}\\.){3}\\d{1,3}(\\/(3[0-2]|[12]?\\d))?$"},"maxItems":50,"description":"IPv4 addresses or CIDR ranges the key may be used from. Empty allows any."},"allowedRecipients":{"type":"array","items":{"$ref":"#/components/schemas/Address"},"maxItems":50,"description":"Contracts a read-write key may send transactions to. Empty allows any the wallet rules allow."}},"additionalProperties":false},"ApiKeyCreated":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string","description":"The raw key. Shown only in this response."},"name":{"type":"string"},"readOnly":{"type":"boolean"},"allowedIps":{"type":"array","items":{"type":"string"}},"allowedRecipients":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","key","name","readOnly","allowedIps","allowedRecipients","createdAt"],"additionalProperties":true},"ApiKeySummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"readOnly":{"type":"boolean"},"allowedIps":{"type":"array","items":{"type":"string"}},"allowedRecipients":{"type":"array","items":{"type":"string"}},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"keyPreview":{"type":"string","description":"First 12 and last 4 characters."}},"required":["id","name","readOnly","allowedIps","allowedRecipients","lastUsedAt","createdAt","keyPreview"],"additionalProperties":true}}}}