The nextCursor of the previous page, sent back as it came. Leave it out for the first page. A cursor belongs to the query that produced it: sent with other parameters it answers 400 INVALID_ARGUMENT.
The cursor of the next page (c_…), or null on the last page. Treat it as opaque: send it back as cursor, never parse or build it.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"FomoScan","colors":{"primary":"#2D6BF5","light":"#3B78FF","dark":"#2D6BF5"},"logo":{"light":"https://mintcdn.com/socialscan/HNyN-bTZ1IatgGfu/images/mark.png?fit=max\u0026auto=format\u0026n=HNyN-bTZ1IatgGfu\u0026q=85\u0026s=d477c368ad11635c9133ca701da2f527","dark":"https://mintcdn.com/socialscan/HNyN-bTZ1IatgGfu/images/mark.png?fit=max\u0026auto=format\u0026n=HNyN-bTZ1IatgGfu\u0026q=85\u0026s=d477c368ad11635c9133ca701da2f527"},"favicon":"https://mintcdn.com/socialscan/HNyN-bTZ1IatgGfu/images/mark.png?fit=max\u0026auto=format\u0026n=HNyN-bTZ1IatgGfu\u0026q=85\u0026s=d477c368ad11635c9133ca701da2f527","api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","javascript","python"]}},"appearance":{"default":"dark"},"background":{"color":{"dark":"#08090C"}},"navbar":{"links":[{"href":"https://partner.fomoscan.sh/login","label":"Log in"}],"primary":{"type":"button","label":"Get an API key","href":"https://partner.fomoscan.sh/signup"}},"footer":{"socials":{"website":"https://fomoscan.sh"}},"contextual":{"options":["copy","view","chatgpt","claude","cursor","mcp"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Partner portal","icon":"key","href":"https://partner.fomoscan.sh"},{"anchor":"OpenAPI spec","icon":"code","href":"https://api.fomoscan.sh/openapi.json"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"socialscan","hasAudioNarration":false,"actualSubdomain":"socialscan","customDomains":["docs.fomoscan.sh"],"gitSource":{"type":"github","owner":"funny-development-org","repo":"fomoscan-monorepo","deployBranch":"main","contentDirectory":"apps/web/docs","isPrivate":true,"mountPath":"","label":"","_id":"6aeb9444574a98914de25354"},"chroma":{"latestBuiltDeploymentHistoryId":"6aeba1c79a06eb92c7d964e2","collectionId":"ebaf5f04-b731-4f1f-be6c-a698b18b49c8","liveDeploymentHistoryId":"6aeba1c79a06eb92c7d964e2","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6aeba1c79a06eb92c7d964e2","clientVersion":"0.0.4064","searchFilterCounts":[{"language":"default","tag":"API reference","count":56},{"language":"default","tag":"Endpoints","count":49},{"language":"default","tag":"Overview","count":26},{"language":"default","tag":"Core concepts","count":10},{"language":"default","tag":"Examples","count":10},{"language":"default","tag":"Identities","count":9},{"language":"default","tag":"WebSocket","count":7},{"language":"default","tag":"Pump","count":7},{"language":"default","tag":"Traders","count":7},{"language":"default","tag":"Get started","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"v3/api-reference/trades/read-the-trades-of-one-wallet","slug":"/v3/api-reference/trades/read-the-trades-of-one-wallet","pageMetadata":{"title":"Read the trades of one wallet","description":"The trades of one wallet, mapped to a trader or not, newest first. `owner` is `null`: `GET /v3/wallets/{family}/{address}` names the owners.\n\n- `network` and `token` narrow the list.\n- A wallet without trades, or one we never saw, answers 200 with an empty page.\n- Order as in `GET /v3/trades`. Paged with `cursor` and `limit` (default 20, maximum 100). Follow `nextCursor` to read older rows.\n\n## Price\n\n**200 credits per started 20 rows of `limit`**, on every call. A short or empty page costs the same as a full one.\n\n| Answer | Credits | Reveals |\n| --- | --- | --- |\n| `limit` 1. | 200 | 0 |\n| `limit` 20 (the default). | 200 | 0 |\n| `limit` 50. | 600 | 0 |\n| `limit` 100 (the maximum). | 1,000 | 0 |\n\n## Limits\n\n- 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key.\n- A key with less than 200 credits left gets 402 `QUOTA_EXCEEDED` before any work.","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/wallets/{family}/{address}/trades","href":"/v3/api-reference/trades/read-the-trades-of-one-wallet","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h2: \"h2\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n table: \"table\",\n tbody: \"tbody\",\n td: \"td\",\n th: \"th\",\n thead: \"thead\",\n tr: \"tr\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"The trades of one wallet, mapped to a trader or not, newest first. \", _jsx(_components.code, {\n children: \"owner\"\n }), \" is \", _jsx(_components.code, {\n children: \"null\"\n }), \": \", _jsx(_components.code, {\n children: \"GET /v3/wallets/{family}/{address}\"\n }), \" names the owners.\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"network\"\n }), \" and \", _jsx(_components.code, {\n children: \"token\"\n }), \" narrow the list.\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"A wallet without trades, or one we never saw, answers 200 with an empty page.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"Order as in \", _jsx(_components.code, {\n children: \"GET /v3/trades\"\n }), \". Paged with \", _jsx(_components.code, {\n children: \"cursor\"\n }), \" and \", _jsx(_components.code, {\n children: \"limit\"\n }), \" (default 20, maximum 100). Follow \", _jsx(_components.code, {\n children: \"nextCursor\"\n }), \" to read older rows.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Price\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"200 credits per started 20 rows of \", _jsx(_components.code, {\n children: \"limit\"\n })]\n }), \", on every call. A short or empty page costs the same as a full one.\"]\n }), \"\\n\", _jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: \"Answer\"\n }), _jsx(_components.th, {\n children: \"Credits\"\n }), _jsx(_components.th, {\n children: \"Reveals\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [_jsx(_components.code, {\n children: \"limit\"\n }), \" 1.\"]\n }), _jsx(_components.td, {\n children: \"200\"\n }), _jsx(_components.td, {\n children: \"0\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [_jsx(_components.code, {\n children: \"limit\"\n }), \" 20 (the default).\"]\n }), _jsx(_components.td, {\n children: \"200\"\n }), _jsx(_components.td, {\n children: \"0\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [_jsx(_components.code, {\n children: \"limit\"\n }), \" 50.\"]\n }), _jsx(_components.td, {\n children: \"600\"\n }), _jsx(_components.td, {\n children: \"0\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [_jsx(_components.code, {\n children: \"limit\"\n }), \" 100 (the maximum).\"]\n }), _jsx(_components.td, {\n children: \"1,000\"\n }), _jsx(_components.td, {\n children: \"0\"\n })]\n })]\n })]\n }), \"\\n\", _jsx(_components.h2, {\n children: \"Limits\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsx(_components.li, {\n children: \"2,000 requests per minute from one address on this operation, beside the per-minute limit of the key.\"\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"A key with less than 200 credits left gets 402 \", _jsx(_components.code, {\n children: \"QUOTA_EXCEEDED\"\n }), \" before any work.\"]\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Read the trades of one wallet","description":"The trades of one wallet, mapped to a trader or not, newest first. `owner` is `null`: `GET /v3/wallets/{family}/{address}` names the owners.\n\n- `network` and `token` narrow the list.\n- A wallet without trades, or one we never saw, answers 200 with an empty page.\n- Order as in `GET /v3/trades`. Paged with `cursor` and `limit` (default 20, maximum 100). Follow `nextCursor` to read older rows.\n\n## Price\n\n**200 credits per started 20 rows of `limit`**, on every call. A short or empty page costs the same as a full one.\n\n| Answer | Credits | Reveals |\n| --- | --- | --- |\n| `limit` 1. | 200 | 0 |\n| `limit` 20 (the default). | 200 | 0 |\n| `limit` 50. | 600 | 0 |\n| `limit` 100 (the maximum). | 1,000 | 0 |\n\n## Limits\n\n- 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key.\n- A key with less than 200 credits left gets 402 `QUOTA_EXCEEDED` before any work.","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/wallets/{family}/{address}/trades","href":"/v3/api-reference/trades/read-the-trades-of-one-wallet","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"listWalletTrades","summary":"Read the trades of one wallet","description":"The trades of one wallet, mapped to a trader or not, newest first. `owner` is `null`: `GET /v3/wallets/{family}/{address}` names the owners.\n\n- `network` and `token` narrow the list.\n- A wallet without trades, or one we never saw, answers 200 with an empty page.\n- Order as in `GET /v3/trades`. Paged with `cursor` and `limit` (default 20, maximum 100). Follow `nextCursor` to read older rows.\n\n## Price\n\n**200 credits per started 20 rows of `limit`**, on every call. A short or empty page costs the same as a full one.\n\n| Answer | Credits | Reveals |\n| --- | --- | --- |\n| `limit` 1. | 200 | 0 |\n| `limit` 20 (the default). | 200 | 0 |\n| `limit` 50. | 600 | 0 |\n| `limit` 100 (the maximum). | 1,000 | 0 |\n\n## Limits\n\n- 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key.\n- A key with less than 200 credits left gets 402 `QUOTA_EXCEEDED` before any work.","tags":["Trades"],"x-operation":24,"parameters":["59b990ce-dabe-4f1b-bd4f-522c11a66038","9b3a1f47-fad0-4f3e-bdc0-bd7b4a6560ed","3a5206d4-ff5e-43fc-a785-4a4821169ffd","7ff4f6e2-cc8e-4cac-be0e-3b96a3f5a136","3004316a-7378-4a43-a9e1-6be4718a230c","bd2e17e9-a314-4e64-a6e2-ce2e0ab4861e"],"responses":{"200":"662abfe2-f428-4892-bd32-db2a5be781b4","400":"3304d73e-230d-4e9c-9616-4907d3d167d4","401":"fdb20abb-6af5-497c-a9b5-751b29756c6d","402":"a442f5ea-d6da-4c43-9227-c1d55ffadd83","403":"2de9d922-6a50-4435-8b9d-1f76de7ea2ab","429":"09afddd0-dc55-486a-b438-2b39f53f493a","500":"14ecd3d6-e799-4e08-9f4f-d7143eecca80","503":"bca99018-1afb-4a86-aba7-a36d2ee78694"},"method":"get","type":"path","servers":["5fe32091-bca0-4091-894b-0b0476baa441"],"security":["1dae2ee9-4ade-434c-a812-454ff298e096","cc08a9cd-c1f8-4037-b1f0-a8a921734bd0"],"path":"/v3/wallets/{family}/{address}/trades","baseUrlOptions":["https://api.fomoscan.sh"],"title":"Read the trades of one wallet","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"59b990ce-dabe-4f1b-bd4f-522c11a66038":{"name":"family","in":"path","description":"The address family: `svm` for Solana, `evm` for EVM networks.","required":true,"schema":{"type":"string","enum":["svm","evm"],"isRequired":true,"description":"The address family: `svm` for Solana, `evm` for EVM networks.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"9b3a1f47-fad0-4f3e-bdc0-bd7b4a6560ed":{"name":"address","in":"path","description":"The wallet address. An EVM address matches in any letter case.","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"isRequired":true,"description":"The wallet address. An EVM address matches in any letter case.","uniqueKey":"","typeLabel":"string"}},"3a5206d4-ff5e-43fc-a785-4a4821169ffd":{"name":"network","in":"query","description":"Only trades on this network. Leave it out for every network.","required":false,"schema":{"type":"string","enum":["solana","ethereum","base","bsc","arbitrum","optimism","polygon","robinhood","hyperevm","monad","arc","xlayer","ink","hyperliquid"],"isRequired":false,"description":"Only trades on this network. Leave it out for every network.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"7ff4f6e2-cc8e-4cac-be0e-3b96a3f5a136":{"name":"token","in":"query","description":"Only trades in this token: `tok_\u003cnetwork>_\u003caddress>`.","required":false,"schema":{"type":"string","minLength":5,"maxLength":200,"isRequired":false,"description":"Only trades in this token: `tok_\u003cnetwork>_\u003caddress>`.","uniqueKey":"","typeLabel":"string"}},"3004316a-7378-4a43-a9e1-6be4718a230c":{"name":"cursor","in":"query","description":"The `nextCursor` of the previous page, sent back as it came. Leave it out for the first page. A cursor belongs to the query that produced it: sent with other parameters it answers 400 `INVALID_ARGUMENT`.","required":false,"schema":{"type":"string","minLength":3,"maxLength":1024,"isRequired":false,"description":"The `nextCursor` of the previous page, sent back as it came. Leave it out for the first page. A cursor belongs to the query that produced it: sent with other parameters it answers 400 `INVALID_ARGUMENT`.","uniqueKey":"","typeLabel":"string"}},"bd2e17e9-a314-4e64-a6e2-ce2e0ab4861e":{"name":"limit","in":"query","description":"Rows per page, 1 to 100. 20 when left out.","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100,"isRequired":false,"description":"Rows per page, 1 to 100. 20 when left out.","uniqueKey":"","typeLabel":"integer"}}},"responses":{"662abfe2-f428-4892-bd32-db2a5be781b4":{"description":"OK","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests per minute allowed for the key.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the current minute ends.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","const":"trade","description":"The kind of object, `trade` here, and the only field to switch on. Skip objects whose kind you do not know.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].kind","typeLabel":"string"},"id":{"type":"string","description":"Our id of the object, `trd_` and 26 lowercase base32 characters. Store it: it stays the same across calls and never holds a platform's own id.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].id","typeLabel":"string"},"canonical":{"type":"object","properties":{"network":{"type":"string","enum":["solana","ethereum","base","bsc","arbitrum","optimism","polygon","robinhood","hyperevm","monad","arc","xlayer","ink","hyperliquid"],"description":"The network of the transaction.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.network","typeLabel":"enum\u003cstring>"},"txHash":{"type":"string","description":"The transaction hash (the signature on Solana).","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.txHash","typeLabel":"string"},"blockNumber":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The block, or the slot on Solana.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.blockNumber","typeLabel":"integer"},"executedAt":{"oneOf":[{"type":"string","description":"The block time of the transaction.","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.executedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"The block time of the transaction.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.executedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.executedAt","typeLabel":"string\u003cdate-time> | null"},"wallet":{"type":"string","description":"The `wal_` id of the wallet that traded.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.wallet","typeLabel":"string"},"side":{"type":"string","enum":["buy","sell","swap"],"description":"`buy` and `sell` trade `token` against `quoteToken`; `swap` trades two tokens.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.side","typeLabel":"enum\u003cstring>"},"token":{"type":"string","description":"The `tok_` id of the token traded.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.token","typeLabel":"string"},"quantity":{"type":"object","properties":{"value":{"type":"string","pattern":"^(0|-?[1-9]\\d*)$","description":"An integer in base units, as a string, and negative below zero. Read it with a decimal or big integer type; a float loses digits.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quantity.value","typeLabel":"string"},"decimals":{"type":"integer","minimum":0,"maximum":36,"description":"The power of ten between base units and one whole unit: `value` ÷ 10^`decimals`.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quantity.decimals","typeLabel":"integer"},"currency":{"type":"string","minLength":1,"description":"`USD`, or the token id (`tok_\u003cnetwork>_\u003caddress>`) of a token quantity.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quantity.currency","typeLabel":"string"},"priceAsOf":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$","description":"The time of the price we converted the value with. Absent when no price was used.","uniqueKey":"\\items.items.[INDEX].canonical.quantity.priceAsOf","typeLabel":"string\u003cdate-time>"}},"required":["value","decimals","currency"],"description":"How much of `token` moved, in that token.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quantity","typeLabel":"object"},"quoteToken":{"oneOf":[{"description":"The `tok_` id of the token paid or received for it.","type":"string","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteToken.oneOf.0","typeLabel":"string"},{"description":"The `tok_` id of the token paid or received for it.","type":"null","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteToken.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteToken","typeLabel":"string | null"},"quoteQuantity":{"oneOf":[{"type":"object","description":"How much of `quoteToken` moved, in that token.","required":["value","decimals","currency"],"properties":{"value":{"type":"string","pattern":"^(0|-?[1-9]\\d*)$","description":"An integer in base units, as a string, and negative below zero. Read it with a decimal or big integer type; a float loses digits.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.0.value","typeLabel":"string"},"decimals":{"type":"integer","minimum":0,"maximum":36,"description":"The power of ten between base units and one whole unit: `value` ÷ 10^`decimals`.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.0.decimals","typeLabel":"integer"},"currency":{"type":"string","minLength":1,"description":"`USD`, or the token id (`tok_\u003cnetwork>_\u003caddress>`) of a token quantity.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.0.currency","typeLabel":"string"},"priceAsOf":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$","description":"The time of the price we converted the value with. Absent when no price was used.","uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.0.priceAsOf","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.0","typeLabel":"object"},{"type":"null","description":"How much of `quoteToken` moved, in that token.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.quoteQuantity","typeLabel":"object | null"},"platform":{"oneOf":[{"type":"string","description":"The platform that routed the trade, when we can tell.","enum":["fomo","pump","hyperliquid","markets","polymarket","legend","risex"],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.platform.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The platform that routed the trade, when we can tell.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.platform.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.platform","typeLabel":"enum\u003cstring> | null"},"verification":{"type":"string","enum":["chain","relay"],"description":"`chain`: we read it from the chain. `relay`: a relay reported it and the chain has not confirmed it yet.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.verification","typeLabel":"enum\u003cstring>"},"owner":{"oneOf":[{"type":"object","description":"The trader the operation shows as the owner of `wallet`. `null` on `GET /v3/wallets/{family}/{address}/trades`.","required":["trader","handle","tier"],"properties":{"trader":{"type":"string","description":"The `tdr_` id of the owner.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0.trader","typeLabel":"string"},"handle":{"oneOf":[{"description":"The owner's `canonical.display.handle`.","type":"string","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0.handle.oneOf.0","typeLabel":"string"},{"description":"The owner's `canonical.display.handle`.","type":"null","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0.handle","typeLabel":"string | null"},"tier":{"type":"string","enum":["proven","account","partial","weak","unverified"],"description":"How sure we are that the trader owns the wallet, strongest first: `proven` (an on-chain proof), `account` (the wallet is the key of the platform account), `partial` (a one-sided proof), `weak` (an ambiguous or imported link), `unverified`.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0.tier","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.0","typeLabel":"object"},{"type":"null","description":"The trader the operation shows as the owner of `wallet`. `null` on `GET /v3/wallets/{family}/{address}/trades`.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical.owner","typeLabel":"object | null"}},"required":["network","txHash","blockNumber","executedAt","wallet","side","token","quantity","quoteToken","quoteQuantity","platform","verification","owner"],"description":"Fields that mean the same on every platform.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].canonical","typeLabel":"object"},"sources":{"type":"object","propertyNames":{"type":"string","enum":["fomo","pump","hyperliquid","markets","polymarket","legend","risex"]},"additionalProperties":{"type":"object","properties":{},"uniqueKey":"\\items.items.[INDEX].sources.additionalProperties","typeLabel":"object"},"description":"Capability blocks keyed by platform. A platform key is absent when the object has no side on that platform. A block is absent when the platform cannot provide it (`GET /v3/capabilities` lists which can) or we hold no reading of it yet. A field is `null` when the platform left it empty at `observedAt` or never fills it (`unfilled` in `GET /v3/capabilities`). Skip platform keys and blocks you do not know.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].sources","typeLabel":"object"}},"required":["kind","id","canonical","sources"],"description":"One on-chain swap by one wallet. Quantities only; prices come from the token.","uniqueKey":"\\items.items.[INDEX]","typeLabel":"object"},"description":"The rows of this page, in the order the operation states.","isRequired":true,"uniqueKey":"\\items","typeLabel":"object[]"},"hasMore":{"type":"boolean","description":"`true` when another page follows this one.","isRequired":true,"uniqueKey":"hasMore","typeLabel":"boolean"},"nextCursor":{"oneOf":[{"description":"The cursor of the next page (`c_…`), or `null` on the last page. Treat it as opaque: send it back as `cursor`, never parse or build it.","type":"string","isRequired":true,"uniqueKey":"nextCursor.oneOf.0","typeLabel":"string"},{"description":"The cursor of the next page (`c_…`), or `null` on the last page. Treat it as opaque: send it back as `cursor`, never parse or build it.","type":"null","isRequired":true,"uniqueKey":"nextCursor.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"nextCursor","typeLabel":"string | null"}},"required":["items","hasMore","nextCursor"],"description":"One page of a list. Pass `nextCursor` back as `cursor` for the next page.","uniqueKey":"","typeLabel":"object"},"example":{"items":[{"kind":"trade","id":"trd_01jbsta8h2ecsr8h2nank6cxvq","canonical":{"network":"solana","txHash":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW","blockNumber":371904117,"executedAt":"2026-11-01T08:57:12.000Z","wallet":"wal_svm_9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","side":"buy","token":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","quantity":{"value":"412500000000","decimals":5,"currency":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"},"quoteToken":"tok_solana_So11111111111111111111111111111111111111112","quoteQuantity":{"value":"326814220","decimals":9,"currency":"tok_solana_So11111111111111111111111111111111111111112"},"platform":"fomo","verification":"chain","owner":null},"sources":{}},{"kind":"trade","id":"trd_01jbstacskeh28anb6csvqf248","canonical":{"network":"solana","txHash":"3nTq8bVf9Lw2Hk7Yd4Rx6Cm1Pz5Js8Ga2Ue9Wo4Bt7Nc3Fy6Qh1Dk5Mv8Xr2Lp9Sg4Ja7Ze3Tb6Wn1Ku5Yc8Hf2Vd","blockNumber":371903650,"executedAt":"2026-11-01T08:54:03.000Z","wallet":"wal_svm_9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","side":"sell","token":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","quantity":{"value":"150000000000","decimals":5,"currency":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"},"quoteToken":"tok_solana_So11111111111111111111111111111111111111112","quoteQuantity":{"value":"121480930","decimals":9,"currency":"tok_solana_So11111111111111111111111111111111111111112"},"platform":"fomo","verification":"chain","owner":null},"sources":{}}],"hasMore":true,"nextCursor":"c_eyJxIjoiazNKOXhRMm1aN2FCIiwidiI6eyJzIjoiMjAyNi0xMS0wMVQwODo0MTowMi45MTdaIiwiaSI6IjAxOTJmM2E1LTIyMjItNzMzMy04NDQ0LTU1NTU2NjY2Nzc3NyJ9fQ"},"examples":{"Example":{"title":"Example","value":{"items":[{"kind":"trade","id":"trd_01jbsta8h2ecsr8h2nank6cxvq","canonical":{"network":"solana","txHash":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW","blockNumber":371904117,"executedAt":"2026-11-01T08:57:12.000Z","wallet":"wal_svm_9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","side":"buy","token":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","quantity":{"value":"412500000000","decimals":5,"currency":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"},"quoteToken":"tok_solana_So11111111111111111111111111111111111111112","quoteQuantity":{"value":"326814220","decimals":9,"currency":"tok_solana_So11111111111111111111111111111111111111112"},"platform":"fomo","verification":"chain","owner":null},"sources":{}},{"kind":"trade","id":"trd_01jbstacskeh28anb6csvqf248","canonical":{"network":"solana","txHash":"3nTq8bVf9Lw2Hk7Yd4Rx6Cm1Pz5Js8Ga2Ue9Wo4Bt7Nc3Fy6Qh1Dk5Mv8Xr2Lp9Sg4Ja7Ze3Tb6Wn1Ku5Yc8Hf2Vd","blockNumber":371903650,"executedAt":"2026-11-01T08:54:03.000Z","wallet":"wal_svm_9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM","side":"sell","token":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","quantity":{"value":"150000000000","decimals":5,"currency":"tok_solana_DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"},"quoteToken":"tok_solana_So11111111111111111111111111111111111111112","quoteQuantity":{"value":"121480930","decimals":9,"currency":"tok_solana_So11111111111111111111111111111111111111112"},"platform":"fomo","verification":"chain","owner":null},"sources":{}}],"hasMore":true,"nextCursor":"c_eyJxIjoiazNKOXhRMm1aN2FCIiwidiI6eyJzIjoiMjAyNi0xMS0wMVQwODo0MTowMi45MTdaIiwiaSI6IjAxOTJmM2E1LTIyMjItNzMzMy04NDQ0LTU1NTU2NjY2Nzc3NyJ9fQ"}}},"exampleType":"examples"}},"exampleType":"examples"},"3304d73e-230d-4e9c-9616-4907d3d167d4":{"description":"`INVALID_ARGUMENT`: a parameter, an id, a cursor or the body is malformed, or the operation does not take it.\n\n- `address` is not a valid address of `family`.\n- `token` is not a token id (`tok_\u003cnetwork>_\u003caddress>`).","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"fdb20abb-6af5-497c-a9b5-751b29756c6d":{"description":"`UNAUTHENTICATED`: no key, or the key is unknown, revoked or expired.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"a442f5ea-d6da-4c43-9227-c1d55ffadd83":{"description":"`QUOTA_EXCEEDED`: the credit balance cannot pay for the call.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"2de9d922-6a50-4435-8b9d-1f76de7ea2ab":{"description":"`PERMISSION_DENIED`: the key may not make this call.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"09afddd0-dc55-486a-b438-2b39f53f493a":{"description":"`RATE_LIMITED`: too many requests. Retry after the seconds in `Retry-After`.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"14ecd3d6-e799-4e08-9f4f-d7143eecca80":{"description":"`INTERNAL`: the call failed on our side.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"bca99018-1afb-4a86-aba7-a36d2ee78694":{"description":"`OVERLOADED`: the API holds too many requests at once. Retry after the seconds in `Retry-After`.","headers":{"X-Request-Id":{"description":"The id of this request, as in our logs.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["invalid_request","authentication","quota","permission","rate_limit","internal","overloaded"],"description":"The group of the error. Each `code` belongs to one type.","isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","QUOTA_EXCEEDED","REVEAL_LIMIT_REACHED","PERMISSION_DENIED","PLAN_REQUIRED","NOT_FOUND","RATE_LIMITED","INTERNAL","OVERLOADED"],"description":"What went wrong, from a closed list. Act on this field.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"A sentence for people. It can change; never parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request, equal to `X-Request-Id`. Quote it when you write to us.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"}},"required":["type","code","message","requestId"],"description":"The error.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"description":"The body of every error answer.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"INVALID_ARGUMENT","message":"\u003cstring>","requestId":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"1dae2ee9-4ade-434c-a812-454ff298e096":{"bearerAuth":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"bearerAuth"}},"cc08a9cd-c1f8-4037-b1f0-a8a921734bd0":{"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key","scopes":[],"schemeName":"apiKeyHeader"}}},"servers":{"5fe32091-bca0-4091-894b-0b0476baa441":{"url":"https://api.fomoscan.sh","description":"The API host"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Api-Key","scopes":[],"schemeName":"apiKeyHeader"},"schema":{"title":"X-Api-Key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyHeader","name":"X-Api-Key"}],"title":"apiKeyHeader"}]},"originalFileLocation":"https://api.fomoscan.sh/v3/openapi.json"},"subdomain":"socialscan","siteName":"FomoScan","title":"Read the trades of one wallet - FomoScan","navMaps":{"firstHrefInVersion":{"v2":{"href":"/api-reference/identities/read-a-wallet-free-stored-profile","matchLevel":2},"v3":{"href":"/v3/api-reference/trades/read-the-trades-of-one-wallet","matchLevel":0}},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T20:47:34.209Z","originalFileLocation":"v3/api-reference/trades/read-the-trades-of-one-wallet.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The trades of one wallet, mapped to a trader or not, newest first. owner is null: GET /v3/wallets/{family}/{address} names the owners. - network and token narrow the list. - A wallet without trades, or one we never saw, answers 200 with an empty page. - Order as in GET /v3/trades. Paged with cursor and limit (default 20, maximum 100). Follow nextCursor to read older rows. ## Price 200 credits per started 20 rows of limit, on every call. A short or empty page costs the same as a full one. | Answer | Credits | Reveals | | --- | --- | --- | | limit 1. | 200 | 0 | | limit 20 (the default). | 200 | 0 | | limit 50. | 600 | 0 | | limit 100 (the maximum). | 1,000 | 0 | ## Limits - 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key. - A key with less than 200 credits left gets 402 QUOTA_EXCEEDED before any work.\">\u003cmeta data-mint-head name=\"application-name\" content=\"FomoScan\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Read the trades of one wallet - FomoScan\">\u003cmeta data-mint-head property=\"og:description\" content=\"The trades of one wallet, mapped to a trader or not, newest first. owner is null: GET /v3/wallets/{family}/{address} names the owners. - network and token narrow the list. - A wallet without trades, or one we never saw, answers 200 with an empty page. - Order as in GET /v3/trades. Paged with cursor and limit (default 20, maximum 100). Follow nextCursor to read older rows. ## Price 200 credits per started 20 rows of limit, on every call. A short or empty page costs the same as a full one. | Answer | Credits | Reveals | | --- | --- | --- | | limit 1. | 200 | 0 | | limit 20 (the default). | 200 | 0 | | limit 50. | 600 | 0 | | limit 100 (the maximum). | 1,000 | 0 | ## Limits - 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key. - A key with less than 200 credits left gets 402 QUOTA_EXCEEDED before any work.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"FomoScan\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://socialscan.mintlify.app/_mintlify/api/og/v2?division=Trades\u0026amp;title=Read+the+trades+of+one+wallet\u0026amp;description=The+trades+of+one+wallet%2C+mapped+to+a+trader+or+not%2C+newest+first.+%60owner%60+is+%60null%60%3A+%60GET+%2Fv3%2Fwallets%2F%7Bfamily%7D%2F%7Baddress%7D%60+names+the+owners.%0A%0A-+%60network%60+and+%60t\u0026amp;theme=eee421e92d714c8c3b4eb52f\u0026amp;signature=e8940551748f3ad2fe75a95002f8d08e29cb2e147d07ad3d5048e003403a4d2a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Read the trades of one wallet - FomoScan\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The trades of one wallet, mapped to a trader or not, newest first. owner is null: GET /v3/wallets/{family}/{address} names the owners. - network and token narrow the list. - A wallet without trades, or one we never saw, answers 200 with an empty page. - Order as in GET /v3/trades. Paged with cursor and limit (default 20, maximum 100). Follow nextCursor to read older rows. ## Price 200 credits per started 20 rows of limit, on every call. A short or empty page costs the same as a full one. | Answer | Credits | Reveals | | --- | --- | --- | | limit 1. | 200 | 0 | | limit 20 (the default). | 200 | 0 | | limit 50. | 600 | 0 | | limit 100 (the maximum). | 1,000 | 0 | ## Limits - 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key. - A key with less than 200 credits left gets 402 QUOTA_EXCEEDED before any work.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://socialscan.mintlify.app/_mintlify/api/og/v2?division=Trades\u0026amp;title=Read+the+trades+of+one+wallet\u0026amp;description=The+trades+of+one+wallet%2C+mapped+to+a+trader+or+not%2C+newest+first.+%60owner%60+is+%60null%60%3A+%60GET+%2Fv3%2Fwallets%2F%7Bfamily%7D%2F%7Baddress%7D%60+names+the+owners.%0A%0A-+%60network%60+and+%60t\u0026amp;theme=eee421e92d714c8c3b4eb52f\u0026amp;signature=e8940551748f3ad2fe75a95002f8d08e29cb2e147d07ad3d5048e003403a4d2a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/socialscan/Akelxu7vD__0Z47A/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"FomoScan\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2D6BF5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v3/api-reference/trades/read-the-trades-of-one-wallet.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.fomoscan.sh/#organization\",\"name\":\"FomoScan\",\"url\":\"https://docs.fomoscan.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/socialscan/HNyN-bTZ1IatgGfu/images/mark.png?fit=max\u0026auto=format\u0026n=HNyN-bTZ1IatgGfu\u0026q=85\u0026s=d477c368ad11635c9133ca701da2f527\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.fomoscan.sh#website\",\"name\":\"FomoScan\",\"url\":\"https://docs.fomoscan.sh\",\"publisher\":{\"@id\":\"https://docs.fomoscan.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet#webpage\",\"url\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet\",\"name\":\"Read the trades of one wallet\",\"description\":\"The trades of one wallet, mapped to a trader or not, newest first. owner is null: GET /v3/wallets/{family}/{address} names the owners. - network and token narrow the list. - A wallet without trades, or one we never saw, answers 200 with an empty page. - Order as in GET /v3/trades. Paged with cursor and limit (default 20, maximum 100). Follow nextCursor to read older rows. ## Price 200 credits per started 20 rows of limit, on every call. A short or empty page costs the same as a full one. | Answer | Credits | Reveals | | --- | --- | --- | | limit 1. | 200 | 0 | | limit 20 (the default). | 200 | 0 | | limit 50. | 600 | 0 | | limit 100 (the maximum). | 1,000 | 0 | ## Limits - 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key. - A key with less than 200 credits left gets 402 QUOTA_EXCEEDED before any work.\",\"dateModified\":\"2026-11-04T20:47:34.209Z\",\"isPartOf\":{\"@id\":\"https://docs.fomoscan.sh#website\"},\"breadcrumb\":{\"@id\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.fomoscan.sh/v3/api-reference/traders/read-one-trader\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Trades\",\"item\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-newest-trades-of-the-traders-we-mapped\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Read the trades of one wallet\",\"item\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet#apireference\",\"headline\":\"Read the trades of one wallet\",\"name\":\"Read the trades of one wallet\",\"description\":\"The trades of one wallet, mapped to a trader or not, newest first. owner is null: GET /v3/wallets/{family}/{address} names the owners. - network and token narrow the list. - A wallet without trades, or one we never saw, answers 200 with an empty page. - Order as in GET /v3/trades. Paged with cursor and limit (default 20, maximum 100). Follow nextCursor to read older rows. ## Price 200 credits per started 20 rows of limit, on every call. A short or empty page costs the same as a full one. | Answer | Credits | Reveals | | --- | --- | --- | | limit 1. | 200 | 0 | | limit 20 (the default). | 200 | 0 | | limit 50. | 600 | 0 | | limit 100 (the maximum). | 1,000 | 0 | ## Limits - 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key. - A key with less than 200 credits left gets 402 QUOTA_EXCEEDED before any work.\",\"url\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet\",\"mainEntityOfPage\":{\"@id\":\"https://docs.fomoscan.sh/v3/api-reference/trades/read-the-trades-of-one-wallet#webpage\"},\"dateModified\":\"2026-11-04T20:47:34.209Z\",\"publisher\":{\"@id\":\"https://docs.fomoscan.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.fomoscan.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"FomoScan\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"FomoScan","nav":{"global":{"anchors":[{"anchor":"Partner portal","icon":"key","href":"https://partner.fomoscan.sh"},{"anchor":"OpenAPI spec","icon":"code","href":"https://api.fomoscan.sh/openapi.json"}]},"versions":[{"version":"v2","default":true,"pages":[{"title":"v2","href":"/api-reference/identities/read-a-wallet-free-stored-profile"}]},{"version":"v3","tag":"New","tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":"/v3"}]},{"tab":"API reference","groups":[{"group":"Overview","pages":[{"title":"API reference","href":"/v3/api-reference/introduction"},{"title":"Traders, wallets and PnL","href":"/v3/guides/traders"},{"title":"Posts","href":"/v3/guides/posts"},{"title":"Leaderboards and rankings","href":"/v3/guides/boards"}]},{"group":"Endpoints","pages":[{"group":"Traders","pages":[{"title":"Read one trader","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}","href":"/v3/api-reference/traders/read-one-trader"},{"title":"Find traders by handle","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/lookup","href":"/v3/api-reference/traders/find-traders-by-handle"},{"title":"List the wallets of a trader","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/wallets","href":"/v3/api-reference/traders/list-the-wallets-of-a-trader"},{"title":"Read a trader's PnL across whole wallets","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/pnl","href":"/v3/api-reference/traders/read-a-traders-pnl-across-whole-wallets"},{"title":"Read the PnL of up to 100 traders","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json post /v3/traders/pnl","href":"/v3/api-reference/traders/read-the-pnl-of-up-to-100-traders"},{"title":"List the traders who follow a trader","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/followers","href":"/v3/api-reference/traders/list-the-traders-who-follow-a-trader"},{"title":"List the traders a trader follows","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/following","href":"/v3/api-reference/traders/list-the-traders-a-trader-follows"}]},{"group":"Wallets","pages":[{"title":"Read one wallet and who owns it","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/wallets/{family}/{address}","href":"/v3/api-reference/wallets/read-one-wallet-and-who-owns-it"},{"title":"Read one wallet's PnL across the whole wallet","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/wallets/{family}/{address}/pnl","href":"/v3/api-reference/wallets/read-one-wallets-pnl-across-the-whole-wallet"},{"title":"Read the PnL of up to 100 wallets","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json post /v3/wallets/pnl","href":"/v3/api-reference/wallets/read-the-pnl-of-up-to-100-wallets"}]},{"group":"Posts","pages":[{"title":"Read the post feed","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/posts","href":"/v3/api-reference/posts/read-the-post-feed"},{"title":"Read the posts about a token","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/tokens/{network}/{address}/posts","href":"/v3/api-reference/posts/read-the-posts-about-a-token"},{"title":"Read the posts of a trader","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/posts","href":"/v3/api-reference/posts/read-the-posts-of-a-trader"}]},{"group":"Tokens","pages":[{"title":"Read one token","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/tokens/{network}/{address}","href":"/v3/api-reference/tokens/read-one-token"}]},{"group":"Leaderboards","pages":[{"title":"List the leaderboards platforms publish","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/leaderboards","href":"/v3/api-reference/leaderboards/list-the-leaderboards-platforms-publish"},{"title":"Read one capture of a platform leaderboard","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/leaderboards/{platform}/{board}","href":"/v3/api-reference/leaderboards/read-one-capture-of-a-platform-leaderboard"}]},{"group":"Rankings","pages":[{"title":"List our rankings","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/rankings","href":"/v3/api-reference/rankings/list-our-rankings"},{"title":"Read the newest snapshot of one of our rankings","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/rankings/{key}","href":"/v3/api-reference/rankings/read-the-newest-snapshot-of-one-of-our-rankings"}]},{"group":"Account","pages":[{"title":"Read the calling key, its plan and its usage","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/me","href":"/v3/api-reference/account/read-the-calling-key-its-plan-and-its-usage"},{"title":"Read which platform provides which block","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/capabilities","href":"/v3/api-reference/account/read-which-platform-provides-which-block"}]},{"group":"Trades","pages":[{"title":"Read the newest trades of the traders we mapped","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/trades","href":"/v3/api-reference/trades/read-the-newest-trades-of-the-traders-we-mapped"},{"title":"Read the trades of a trader's wallets","description":"The trades of the wallets `GET /v3/traders/{traderId}/wallets` lists for the trader, newest first. `owner` is this trader, with its tier on each wallet.\n\n- `network` and `token` narrow the list.\n- Order as in `GET /v3/trades`. Paged with `cursor` and `limit` (default 20, maximum 100). Follow `nextCursor` to read older rows.\n\n## Price\n\n**200 credits per started 20 rows of `limit`**, plus **100 credits and one reveal for each distinct trader the page shows as an owner**, on every call. A trader on two pages takes two reveals.\n\n| Answer | Credits | Reveals |\n| --- | --- | --- |\n| `limit` 20 (the default), an empty page. | 200 | 0 |\n| `limit` 20 (the default), the page lists trades. | 300 | 1 |\n| `limit` 100 (the maximum), an empty page. | 1,000 | 0 |\n| `limit` 100 (the maximum), the page lists trades. | 1,100 | 1 |\n| 404: no trader has this id. | 200 | 0 |\n\nReveals count against a key with a monthly reveal cap. When the answer needs more reveals than the key has left, the call is refused before any credit is taken: 402 `REVEAL_LIMIT_REACHED`, or 403 `PERMISSION_DENIED` for a key on a free plan without reveals.\n\n## Limits\n\n- 2,000 requests per minute from one address on this operation, beside the per-minute limit of the key.\n- A key with less than 200 credits left gets 402 `QUOTA_EXCEEDED` before any work.","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/traders/{traderId}/trades","href":"/v3/api-reference/trades/read-the-trades-of-a-traders-wallets"},{"title":"Read the trades of one wallet","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3/wallets/{family}/{address}/trades","href":"/v3/api-reference/trades/read-the-trades-of-one-wallet"}]},{"group":"WebSocket","pages":[{"title":"Live posts (WebSocket)","description":"One WebSocket pushes every new post as we publish it, from every platform, narrowed to the platforms and tokens you choose. A `post` frame carries the envelope `GET /v3/posts` returns.\n\nThis path lives on the stream host and answers only a WebSocket upgrade, so \"Try it out\" cannot open it. A plain `GET` gets `404`.\n\n## Connect\n\nURL: `wss://stream.fomoscan.sh/v3`\n\nSend the key on the upgrade request in one of the two headers every REST call takes:\n\n- `Authorization: Bearer \u003ckey>`\n- `X-Api-Key: \u003ckey>`\n\nThe URL takes no key parameter. A browser `WebSocket` cannot set headers, so hold the socket on your server and relay frames to your front end. Never ship the key to a browser.\n\n```sh\nnpx wscat -c 'wss://stream.fomoscan.sh/v3' -H \"Authorization: Bearer $FOMOSCAN_KEY\"\n```\n\n```js\nimport WebSocket from 'ws';\n\nconst socket = new WebSocket('wss://stream.fomoscan.sh/v3', {\n headers: { Authorization: `Bearer ${apiKey}` },\n});\nsocket.on('message', (data) => {\n const frame = JSON.parse(data.toString());\n if (frame.type === 'ready') socket.send(JSON.stringify({ type: 'subscribe', topic: 'posts' }));\n if (frame.type === 'post') handle(frame.item, frame.cursor);\n});\n```\n\nFrames you send before `ready` wait in a queue of 32 frames or 64 KB and run after it.\n\n## Which keys may connect\n\nThe stream checks the key before the upgrade. A refusal is an HTTP status with the error body every REST call uses, listed under Responses below.\n\n| Check | Rule | Refusal |\n| --- | --- | --- |\n| Key | An active key that has not expired. | `401 UNAUTHENTICATED` |\n| Scope | The key holds `basic` or `live:read`. | `403 PERMISSION_DENIED` |\n| Plan | `growth`, `pro`, `scale`, `enterprise`, `custom`, `legacy`, and every plan whose name starts with `legacy-`. A key on a free plan (`pilot` or `explore`) connects unless its monthly reveal allowance is zero; an unmetered free key always connects. A key on any other plan connects only when it is unmetered. | `403 PLAN_REQUIRED` |\n| Credit | At least 20,000 credits left, one minute; an unmetered key always passes. | `402 QUOTA_EXCEEDED` |\n| Rate | The per-minute request limit of the key, and a limit per address. | `429 RATE_LIMITED` |\n\nWhile free keys are switched off, a key on a free plan gets `403 PERMISSION_DENIED`.\n\nThe stream checks the key again before every minute charge, through an authentication cache that holds a key for up to 30 seconds. A key that was revoked or expired, or lost the scope or the plan, gets an error frame and the socket closes with `1008`.\n\n## Price\n\nEach open connection costs **20,000 credits per started minute**, taken from the same credit balance as REST calls.\n\n- The stream charges the first minute on attach, before the upgrade completes, and one more every 60 seconds while the socket is open. A socket without a subscription pays the same.\n- The price is per socket: one token, fifty tokens or every post cost the same. One socket carries every platform; each socket you open is charged on its own.\n- An upgrade needs 20,000 credits left, or it gets `402 QUOTA_EXCEEDED`. A key with too few credits for the next minute gets an error frame with `QUOTA_EXCEEDED`, and the socket closes with `1008`.\n- An unmetered key is counted and never refused. A child key pays from its parent's balance, as on REST.\n- `GET /v3/me` shows the balance: socket minutes count in `api.unitsUsed`, and `websocket.minutesUsed` is `null`. Your usage lists each minute under `GET /v3`.\n\n## Client frames\n\nSend JSON text frames. The stream takes `subscribe` and `unsubscribe`; schema `StreamClientFrame`.\n\n### subscribe\n\n```json\n{\n \"type\": \"subscribe\",\n \"topic\": \"posts\",\n \"platforms\": [\n \"fomo\",\n \"pump\"\n ],\n \"tokens\": [\n \"tok_solana_EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n \"tok_base_0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"\n ],\n \"since\": \"s_eyJzZXEiOjEwNDIxN30\"\n}\n```\n\n| Field | Rule |\n| --- | --- |\n| `topic` | Required: `posts`. |\n| `platforms` | Optional. One or more of `fomo`, `pump`, `hyperliquid`, `markets`, `polymarket`, `legend`, `risex`; posts come from `fomo` and `pump` today. Omit the field for every platform. An empty list, `null` or an unknown name is rejected. |\n| `tokens` | Optional. 1 to 50 token ids, `tok_\u003cnetwork>_\u003caddress>`. Omit the field for every token. A post without a token never matches a token filter. An empty list, `null` or a value that is not a token id is rejected. |\n| `since` | Optional. The `cursor` of a `post` or `replay_done` frame you received. The stream replays what you missed first; see Replay. |\n\n- A post must match both filters.\n- A connection holds one subscription. A new `subscribe` replaces it in full, so send the whole token list each time.\n- Nothing arrives before the first accepted `subscribe`.\n- A field the frame type does not take is rejected.\n- A rejected frame changes nothing and keeps the socket open.\n\n### unsubscribe\n\n```json\n{\n \"type\": \"unsubscribe\"\n}\n```\n\nClears the subscription. The socket stays open and keeps being charged.\n\n## Server frames\n\nEvery frame is a JSON object with a `type`; schema `StreamServerFrame`. Ignore types and fields you do not know: new ones arrive as additive changes.\n\n### ready\n\nOnce, after the upgrade and the first minute charge. `connectionId` names this connection in our logs, and error frames carry it as `requestId`.\n\n```json\n{\n \"type\": \"ready\",\n \"connectionId\": \"0192f3a4-5b6c-7d8e-9f01-23456789abcd\"\n}\n```\n\n### subscribed\n\nAfter every accepted `subscribe`. `subscription` is what you receive from now on, normalised: duplicates dropped, EVM token addresses lowercased, and `platforms` or `tokens` set to `null` when they do not filter. `replaced` is the subscription it replaced, or `null`.\n\n```json\n{\n \"type\": \"subscribed\",\n \"subscription\": {\n \"topic\": \"posts\",\n \"platforms\": [\n \"fomo\",\n \"pump\"\n ],\n \"tokens\": [\n \"tok_solana_EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n \"tok_base_0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"\n ]\n },\n \"replaced\": {\n \"topic\": \"posts\",\n \"platforms\": null,\n \"tokens\": null\n }\n}\n```\n\n### unsubscribed\n\nAfter every `unsubscribe`. `replaced` is the subscription it cleared, or `null`.\n\n```json\n{\n \"type\": \"unsubscribed\",\n \"replaced\": {\n \"topic\": \"posts\",\n \"platforms\": [\n \"fomo\",\n \"pump\"\n ],\n \"tokens\": [\n \"tok_solana_EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n \"tok_base_0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"\n ]\n }\n}\n```\n\n### post\n\nOne per delivered post. `item` is the post envelope, the same object `GET /v3/posts` returns (schema `PostEnvelope`). `cursor` is the stream cursor of this post: store the last one you processed.\n\n```json\n{ \"type\": \"post\", \"cursor\": \"s_eyJzZXEiOjEwNDIzMH0\", \"item\": { \"kind\": \"post\", \"id\": \"pst_…\", \"canonical\": { … }, \"sources\": { … } } }\n```\n\n### replay_done\n\nAfter the last replayed post and before the first live one. `cursor` is the newest cursor the replay sent, or your own `since` when nothing was replayed.\n\n```json\n{\n \"type\": \"replay_done\",\n \"cursor\": \"s_eyJzZXEiOjEwNDIzMX0\"\n}\n```\n\n### error\n\nA frame the stream rejected, or the moment before the stream closes the socket. Act on `code`; `message` is for people. `requestId` is the connection id.\n\n```json\n{\n \"type\": \"error\",\n \"error\": {\n \"type\": \"invalid_request\",\n \"code\": \"INVALID_ARGUMENT\",\n \"message\": \"The cursor is older than the replay window.\",\n \"requestId\": \"0192f3a4-5b6c-7d8e-9f01-23456789abcd\"\n }\n}\n```\n\n## Error frames\n\n| `code` | When | The socket |\n| --- | --- | --- |\n| `INVALID_ARGUMENT` | The frame is not JSON or not an object; it has an unknown `type`, field or `topic`; a `platforms` or `tokens` filter breaks the rules above; `since` is malformed, or names no post (\"The cursor is not valid.\"). | Stays open. Nothing changes. |\n| `INVALID_ARGUMENT` | A frame larger than 64 KB. | Closes with `1009`. |\n| `INVALID_ARGUMENT` | `since` is older than the replay window: \"The cursor is older than the replay window.\" | Stays open. The error comes before `subscribed`, and the subscription runs without a replay. |\n| `RATE_LIMITED` | More than 10 `subscribe` or `unsubscribe` frames in 60 seconds. | Stays open. The frame is ignored. |\n| `OVERLOADED` | The stream could not attach the subscription. | Stays open. Send the `subscribe` again. |\n| `OVERLOADED` | Charging a minute failed on our side 2 times in a row. | Closes with `1011`. Reconnect with `since`. |\n| `QUOTA_EXCEEDED` | The balance cannot pay the next minute. | Closes with `1008`. |\n| `UNAUTHENTICATED` | At a minute charge the key is revoked or expired. | Closes with `1008`. |\n| `PERMISSION_DENIED` | At a minute charge the key has lost the stream scope, or free keys are switched off. | Closes with `1008`. |\n| `PLAN_REQUIRED` | At a minute charge the plan of the key no longer includes the stream. | Closes with `1008`. |\n\nAt most 10 error frames in 10 seconds answer rejected frames; past that a rejected frame changes nothing and gets no answer. The replay window error, `OVERLOADED` for a `subscribe`, and the error before a close always arrive.\n\n## Replay with `since`\n\n- Every `post` frame carries a `cursor` (`s_…`). Store the last one you processed and send it back as it is; do not parse it.\n- A `subscribe` with `since` sends the posts published after that cursor which match the new filters, oldest first, then `replay_done`, then live posts. Live posts published while the replay loads wait and follow `replay_done`; a post in both arrives once.\n- The replay window is the last 5 minutes by publication time. A `since` older than that gets the error frame `INVALID_ARGUMENT` \"The cursor is older than the replay window.\", then `subscribed`, and no `replay_done`: live posts flow, and you fill the gap from `GET /v3/posts`, deduplicated on `item.id`.\n- A `since` that names no post gets `INVALID_ARGUMENT` \"The cursor is not valid.\", and the subscription does not change.\n- Stream cursors work only here. The `c_` cursors of REST collections are a different thing.\n\n## Ordering and duplicates\n\n- Posts arrive in the order we published them, which can differ from `canonical.postedAt`. Sort by `postedAt` when you need the author time order.\n- On one connection a post arrives once. A `subscribe` without `since` continues after the newest post the connection already sent, so it repeats nothing.\n- A `subscribe` with `since` replays everything after that cursor, posts this connection already delivered included. Reconnect with the last cursor you processed and nothing repeats; an older cursor repeats posts.\n- Deduplicate on `item.id` wherever you merge the stream with REST pages or with a replay from an older cursor.\n- The stream sends a post once, when we publish it. Later edits, counts and hides send no frame; read the post from REST for its current state.\n\n## Heartbeats\n\n- The server sends a WebSocket ping every 30 seconds. Browser and Node `ws` clients answer with a pong on their own; a hand-written client must answer itself.\n- The stream closes a socket it heard nothing from (no pong, no frame) for 90 seconds with `1011`.\n- Watch the other direction too: when neither a ping nor a frame arrives for 75 seconds, the path is dead. Terminate the socket and reconnect.\n\n## Limits\n\n| Limit | Value | Past it |\n| --- | --- | --- |\n| Inbound frame | 64 KB | Error frame `INVALID_ARGUMENT` and close `1009`; over 1 MiB, close `1009` with no frame. |\n| Frames sent before `ready` | 32 frames or 64 KB | Close `1009`. |\n| Frames waiting for the stream to handle them | 32 frames or 64 KB | Close `1013`. |\n| Frames waiting for you to read them | 8 MB | Close `1013`. |\n| `subscribe` and `unsubscribe` | 10 in 60 seconds | Error frame `RATE_LIMITED`; the frame is ignored. |\n| Error frames that answer rejected frames | 10 in 10 seconds | Further rejected frames get no answer. |\n| Tokens in one filter | 50 | Error frame `INVALID_ARGUMENT`. |\n| Replay window | 5 minutes | Error frame `INVALID_ARGUMENT`; no replay. |\n\n## Close codes\n\n| Code | Meaning | What to do |\n| --- | --- | --- |\n| `1001` | The stream is restarting for a deploy. | Reconnect at once with `since`. |\n| `1008` | The key may not continue: the balance is spent, the key is revoked or expired, or it lost the stream scope or plan. An error frame names the code first. | Do not retry in a loop. Fix the key or the balance, then reconnect with `since`. |\n| `1009` | A frame larger than 64 KB (larger than 1 MiB closes with no error frame), or more than 32 frames or 64 KB sent before `ready`. | Fix the client first: the same frames close the next socket too. |\n| `1011` | Nothing heard from you for 90 seconds, or charging a minute failed on our side 2 times in a row (after an `OVERLOADED` error frame). | Reconnect with backoff and `since`. |\n| `1013` | You read too slowly (8 MB wait in the send buffer) or send faster than the stream handles (32 frames or 64 KB wait). | Read faster or narrow the filters, then reconnect with `since`. |\n\nAny other code, or a drop without a close frame (`1006` in most libraries), means the network path broke: reconnect with backoff and `since`.\n\n## Reconnect correctly\n\n1. Store the `cursor` of each post once you have processed it.\n2. On close, read the code. `1008`: stop and fix the key or the balance. `1009`: fix the client. Anything else: reconnect.\n3. Reconnect at once after `1001`. Otherwise wait 1, 2, 4 and up to 30 seconds between attempts, with jitter. A refused handshake with `429` or `503` names the wait in `Retry-After`; `401`, `402` and `403` need a fix before a retry.\n4. After `ready`, send the same `subscribe` with `since` set to the stored cursor.\n5. Process the replayed posts, then `replay_done`, then live posts.\n6. When the replay window error arrives instead, fill the gap from `GET /v3/posts` and deduplicate on `item.id`.","deprecated":null,"version":null,"openapi":"https://api.fomoscan.sh/v3/openapi.json get /v3","href":"/v3/api-reference/websocket/live-posts-websocket"}]}]}]},{"tab":"WebSocket","pages":[{"title":"WebSocket","href":"/v3/websocket/overview"}]}]}]},"basePath":"","title":"Read the trades of one wallet - FomoScan","buildId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","deploymentId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-hfTk6MZX.js","utils-Bfp7HcY4.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D8dSW7yV.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CFgQXcZO.js","snippetPresets-dMW1-pV3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-DyrCOido.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Bwwdcyh3.js","shallow-drVXTg79.js","getApiPlaygroundDisplay-GMPxUzWV.js","CodeSnippet-wTmV0wP6.js","CodeSnippets-D_QxCJEq.js","Page-BsZAA8xk.js","getPastedJson-Dev-X0Xy.js","icon-7L2WL0jD.js","MethodPill-Ble59Dl_.js","DuplicateIcon-r-98uLGh.js","createIcon-DaFzipjW.js","DynamicMarkdown-Jk8YAWGN.js","SectionHeading-nLgrCDOg.js","axios-vUo_bRtp.js","Markdown-_QGow1Wo.js","clsx-v8ssfMzu.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CjboTi0T.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DkAyo-p5.js"]}