Search Profiles
Search and filter wallet profiles by address, socials, labels, net worth, chain activity, and more. Returns paginated results with full profile data.
Authentication
This endpoint requires authentication using a Workspace API Key withprofiles:read permission. Include the API key in your request headers:
Query Parameters
address
Filter by a specific wallet address (exact match). Accepts an EVM address, a Solana address, or an ENS name (e.g. vitalik.eth) which is resolved to an address before filtering. An unresolvable ENS name or an otherwise invalid value returns a 400 BAD_REQUEST.
search
Case-insensitive free-text search across wallet addresses and all supported social fields. This includes values from both global wallet profiles and project-scoped identify overrides.
expand
Comma-separated list of optional sections to include in each profile response.
Supported values:
apps- DeFi app interactions and balanceschains- Per-chain activity metricstokens- Token holdingslabels- Wallet labels
chains, tokens, or apps increases response size and latency. The collections are capped at 50 items each.order_by
Field to sort results by. Supported values:
last_onchain(default) - Last on-chain activity timestampfirst_onchain- First on-chain activity timestampnet_worth_usd- Total net worthupdated_at- Last profile update timestamptx_count- Total transaction countfirst_seen- First seen timestamp in your applast_seen- Last seen timestamp in your appnum_sessions- Number of sessionsrevenue- Total revenuevolume- Total volumepoints- Total points
order_dir
Sort direction:
desc(default) - Descending orderasc- Ascending order
page
1-indexed page number to return.
- Default:
1
size
Page size - number of profiles per page.
- Default:
100 - Maximum:
1000
Request Body (Filters)
The search endpoint supports rich filtering capabilities through a JSON request body. The body contains a filter object withfilters and logic.
Filter Schema
Filter Condition
Each filter in thefilters array carries the canonical {field, op, value} core, plus named qualifier properties for resource filters:
field are rejected with a 400.
Operators
defi.lender, defi.borrower, defi.staker and defi.perp_trader store a USD amount as their value, so the comparison operators work on them. For example, wallets that supply at least $10,000 to lending markets: {"field": "labels.value", "op": "gte", "value": "10000", "tag_id": "defi.lender"}. See Wallet labels for the full list and each label’s rule.
equals, notEquals, greater, greaterOrEqual, less, lessOrEqual, notIn, and includes (and symbol forms like = / != / like) are no longer accepted on this endpoint. A request carrying one is rejected with a 400 whose message names the offending token. Send only the canonical operators above. notEmpty / isEmpty are value-less existence checks (any value is ignored) and are supported on string user/profile attributes only, not on numeric metrics (net_worth_usd, volume, revenue, points), the lifecycle enum, or chain/app/token/label fields.chains.1.balance, apps.aave-v3.balance, tokens.0x….balance, and labels.coinbase.verified_account are no longer accepted and return a 400. Use the stable field (chains.balance, apps.balance, tokens.balance, labels.value) with the matching qualifier property (chain_id, app_id, token_address, tag_id) instead. Balance fields support only the comparison operators (eq, neq, gt, gte, lt, lte); labels.value supports comparisons plus case-insensitive contains.Field Reference
User Fields (users.*)
Filter by user engagement and profile data. Use the format users.{attribute}.
Profile Fields
Engagement Fields
UTM & Referral Fields
Lifecycle Filter
Filter by user lifecycle stage. Valid values:New, Returning, Power user, At Risk, Churned, Resurrected.
Social Fields
Social fields support two modes:- Presence checks: use
notEmptyto match profiles where the field is set (orisEmptyfor the opposite). The value is ignored. - Value matching: use
eq,neq, orcontains(case-insensitive substring) with a non-empty string to match the actual social value.
bob:
Chain Filters (chains.balance)
Filter by per-chain net worth using the stable field chains.balance and an optional chain_id qualifier. This is distinct from users.net_worth_usd, which compares the profile’s total net worth.
All Chains
Omitchain_id to filter across all chains (returns profiles where any chain matches).
Example - Find users with >$1,000 on any chain:
Specific Chain
Set thechain_id qualifier to filter on a specific chain.
Common chain IDs:
1- Ethereum Mainnet137- Polygon42161- Arbitrum One10- Optimism8453- Base56- BNB Chain43114- Avalanche
App Filters (apps.balance)
Filter by DeFi app balances using the stable field apps.balance with a required app_id qualifier and an optional chain_id qualifier.
All Chains
Omitchain_id to filter by app balance across all chains.
Example - Find users with >$1,000 in Uniswap:
Specific Chain
Set thechain_id qualifier to filter by app balance on a specific chain.
Example - Find users with >$500 in Aave on Ethereum:
Token Filters (tokens.balance)
Filter by token holdings using the stable field tokens.balance with required token_address and scope qualifiers, plus an optional chain_id and, for protocol scope, a required app_id.
Token Filter Qualifiers
All Chains
Omitchain_id to filter by token balance across all chains.
Example - Find users holding >1000 USDC (any chain):
Specific Chain
Set thechain_id qualifier to filter by token balance on a specific chain.
Example - Find users with >500 USDC on Ethereum:
Protocol-Specific Token Filters
Usescope: "protocol" with app_id to filter for tokens deposited in a specific DeFi protocol.
Example - Find users with USDC deposited in Aave V3:
Label Filters (labels.value)
Filter by wallet labels using the stable field labels.value with a required tag_id qualifier (and an optional chain_id). Supported operators are the comparisons (eq, neq, gt, gte, lt, lte) and case-insensitive contains; the value must be non-empty.
Common label tags:
coinbase.verified_account- Coinbase verified account (boolean)coinbase.verified_country- Coinbase verified country codecoinbase.verified_coinbase_one- Coinbase One membership (boolean)sanctions.designated- Sanctioned address (boolean)passport.models_aggregate_score- Passport aggregate score (0-100)passport.unique_humanity_score- Passport uniqueness score
Combined Filter Examples
High-Value Web3 Users
Find users with >$10,000 net worth, ENS name, and activity on Ethereum:Active DeFi Users
Find users with activity in Uniswap or Aave:Verified Power Users
Find Coinbase-verified power users from specific countries:Multi-Chain Whales
Find users with significant holdings across multiple chains:Response
The response is a paginated envelope of wallet profiles.Response Fields
Profile Fields
Each profile in thedata array includes:
Error Responses
Authorizations
Workspace API key (e.g. formo_xxx). Create one in the Formo dashboard under Team Settings > API.
Query Parameters
Filter by wallet address. Accepts an EVM (0x...) or Solana address, or an ENS name (e.g. vitalik.eth) which is resolved to an address.
Comma-separated: apps, chains, tokens, labels
Optional point in time for wallet-enrichment data. Requires the address query parameter; unbounded historical collection scans are rejected. Returns the wallet's stored base snapshot closest to this instant instead of its latest snapshot; an exact-distance tie chooses the later snapshot. Expanded chains, apps, and tokens come from the selected snapshot's profiling batch. Project engagement fields, project-defined identity overrides, and labels remain current. Must be ISO-8601 with a timezone.
Sort field
net_worth_usd, tx_count, first_onchain, last_onchain, updated_at, first_seen, last_seen, num_sessions, revenue, volume, points Sort direction
asc, desc 1-indexed page number (default 1).
x >= 1Page size (default 100, max 1000).
1 <= x <= 1000Body
Optional filter conditions
Response
Paginated wallet profile search results.
Pagination cursor returned alongside data on every paginated list endpoint. Use these to walk pages: has_more is true while page * size < total. Combine with the matching Page and Size query parameters to request the next page.