What Are Strategies?
A strategy is an automated instruction that runs on repeat. You describe it in the chat at /app, tell Fere how often to run it, and sit back. Every cycle, the agent goes through the full reasoning process — scanning, analyzing, deciding, and (if conditions are met) trading. And here’s what makes it powerful: Fere remembers.Gets Smarter Over Time
Every time a strategy runs, it carries forward what it found before. By day 7 of an hourly scan, your agent has a rich picture of every token it analyzed, every score it gave, every trade it made or skipped. It can spot things a stateless bot never would — like a token that scored 85 three days ago, dropped to 60 yesterday, and just came back to 82. That’s a recovery signal, and Fere catches it because it was watching.How to Create a Strategy
Go to the main chat at /app and describe what you want to automate. The AI sets it up and it appears in /strategies. A few examples to get you started:Whale-Gated Entry
“Every hour, scan Base and Solana for 100M mcap tokens. Only buy if whale net-buy exceeds $200k in 24h and the score is above 85.”
Polymarket Farming Autopilot
“Every hour, check my Polymarket balance and daily credit usage. Scan macro and entertainment markets, cap exposure at 5 limit buys 2% below market when conditions pass.”
High-Frequency YES Entry
“Every 5 minutes, verify Polymarket cash is above 10 YES, and set a 10% take-profit limit sell.”
Portfolio Drawdown Manager
“Every 4 hours, check open positions. If any drops 20% from entry, reduce by half and set a re-entry alert at -10% from current price.”
Morning Alpha Brief
“Daily at 5:30am, surface the 3 highest-conviction asymmetric setups across all chains. Score by sentiment plus on-chain signal. Report only — no trades.”
Silent Background Runner
“Every 5 minutes, run my Polymarket entry rules in the background. Execute trades when conditions are met but do not post chat responses unless something fails.”
Example: Hourly Token Scout
Runs Every Hour “Go to Base chain and find tokens between 20M market cap. Analyze them on socials and technical analysis and give them a score based on performance. Buy a token if it scores 90/100.”Every hour, Fere will: scan the chain for candidates, run social and TA analysis on each, score them, and only execute a trade if the quality bar is met. Open the strategy detail page after a run to read the executive summary, inspect past runs in the sidebar, and review any trades or files the agent produced.
The Strategies Page
Click Strategies in the top navigation bar. Here’s what you’ll see:- Active / Paused tabs — The page opens on Active. Switch to Paused to see anything you’ve stopped, with counts on each tab so you always know where you stand.
- Strategy cards — Each card shows your original instruction, how often it runs, when it runs next (or last ran if paused), and how many times it’s executed so far.
- Start a Strategy — At the bottom of the page, pre-built templates let you launch a strategy in one click without typing anything.
Start a Strategy
The Start a Strategy section inside the Strategies page has pre-built templates that get you running in one click. Pick one, fill in a few parameters, and Fere creates the full automated strategy for you.Trending Tokens
Buy trending tokens on any chain — filtered for volume, liquidity, and safety — without writing a single message.
DCA on Frequency
Dollar-cost average into any token on a daily, weekly, or custom schedule.
Buy Token on Chain
Buy a specific token on any supported chain with automatic routing and verification.
Strategy Detail Page
Click any strategy card to open its detail page at /strategies/[id]. This is your command center for one strategy — what it has done, what it traded, what it produced, and what you want it to do next.Executive briefing
At the top of the page, a briefing card shows:- Strategy name and description — the label Fere assigned plus your original instruction.
- Health and headline — whether the strategy is on track, degraded, blocked, paused, or research-only, plus a one-line verdict.
- Key metrics — run success rate, trade outcomes, and next scheduled run.
- Since last update — bullet changes since the previous briefing (incremental window).
- Top positions — largest holdings when portfolio data is available (hidden for research-only agents).
- Narrative sections — at-a-glance, recent performance, and since-last-update prose grounded in verified run and trade data.
Recommendations
Recommended actions sit in the same briefing card, directly under the metrics and positions. They are separate from the narrative briefing: short, actionable cards tuned for what to do next, not a prose recap of the last run.What you see on each card
Each recommendation includes:- Priority — Now (urgent), Soon, or Later, so you know what to tackle first.
- Category — Execution, Risk, Logic, Config, or Research.
- Title and why — a plain-language summary and the reason Fere surfaced it.
- Steps — one to five direct imperatives (for example, “Extend the schedule for 3 more runs” or “Set a take profit at 5% above entry”). Steps are written for you as the owner, not as developer instructions.
- Evidence (when shown) — pointers to the run, trade, signal, or script behavior that supported the suggestion.
What you can do
| Action | What happens |
|---|---|
| Accept | Sends the recommendation (title + steps) into Strategy chat at the bottom of the page. Fere treats it like your own instruction and can update the strategy workspace, schedule settings, or trading logic as needed. |
| Decline | Removes the card from your list. Declined items are remembered — they will not reappear after the next automatic refresh or when you tap Refresh recommendations. |
| Refresh recommendations | Enqueues a new generation pass on demand. The link is enabled when recommendations are stale (a run finished after the last recommendations update). |
How recommendations are generated (high level)
Recommendations are produced by a dedicated background job that runs in parallel with the executive briefing — not copied from the briefing text.- Gather evidence — Fere assembles a structured snapshot of your strategy: recent and older scheduled runs, trade outcomes, holdings, error patterns (with extra weight on recent failures), your active strategy text, saved workspace scripts when present, optimizer metrics if enabled, and your past Strategy chat follow-ups.
- Detect signals — Rule-based checks flag themes worth addressing (for example, repeated run failures, stale errors that are already resolved, or script-specific trading context on Hyperliquid or Polymarket).
- Generate cards — An AI model reads only that evidence and outputs structured recommendations. Each card must cite supporting evidence; invented balances, prices, or trade counts are not allowed.
- Sanitize for product context — Post-processing drops generic coding advice (logging, refactoring, “edit your
.pyfile”). Steps stay in owner language: schedule changes, risk guardrails, notifications, and workspace updates via Fere — aligned with how strategies actually run (saved scripts andstrategy_builder, not manual IDE edits). - Respect your choices — Declined recommendations are stored so refresh passes do not suggest the same intent again.
Strategy chat
Below the summary is Strategy chat — your follow-up conversation with this deployed strategy’s workspace. This is the right place to change what runs on the schedule (not the original /app thread). Strategy chat is also separate from scheduled runs themselves:- Ask clarifying questions (“Why did you skip the last trade?”)
- Request changes (“Raise the score threshold to 90 and cap buys at $25”)
- Pause or stop the strategy in plain language
Run status bar and input
A sticky bar at the bottom of the page shows:- Run count — how many scheduled cycles have completed.
- Next run — when the strategy fires again (hidden while paused).
@ to mention another active or paused strategy when you want to reference or coordinate across automations.
Right sidebar — Past Runs, Transactions, Artifacts
On desktop, a sidebar on the right replaces the generic Files panel while you are on a strategy detail page. It stays visible for that strategy. If you open the wallet drawer, the sidebar shifts left — it is never hidden behind the wallet. Three collapsible sections stack vertically. Drag the dividers to resize them, and your layout is remembered per strategy:| Section | What you see |
|---|---|
| Past Runs | Numbered list of every scheduled cycle (Run #1, Run #2, …) with timestamps. Click a run to open a detail modal with the full agent outcome and any on-chain Activities from that cycle. |
| Transactions | Swaps, buys, sells, and other trades this strategy executed. Tap a row to expand full details inline. |
| Artifacts | Files the agent generated across runs — reports, charts, exports. Click to preview or download. |
Pause or stop anytime. You are always in control. Pause from the Strategies list, or tell the agent in the detail input (“Pause this strategy until Monday”). No lock-in, no penalties — the agent stops on the next safe boundary.
More Strategy Ideas
Volatility-Adjusted Rebalance
“Every Sunday, check portfolio dominance. If ETH exceeds 55% of holdings, rotate 20% of alts to USDC. If BTC exceeds 60%, move 50% to stables.”
Smart Money Mirror
“Every 3 hours, monitor tracked wallets. If any opens a new position above 1,000 with take-profit at +40%.”
Momentum Sniper
“Every 30 minutes, check if any Base token gained 50%+ in the last hour with 20.”
DCA With Brains
“Every Monday, buy $50 of ETH — but only if the 7-day RSI is below 40. Otherwise, skip.”
Polymarket Risk Sweep
“Every hour, exit Polymarket positions held longer than 7 days (3 days for high-risk markets). Enforce take-profit and stop-loss guardrails before scanning for new entries.”
Cross-Chain Sentiment Scout
“Every day at 7am, find the top 5 trending tokens on Solana and Base. Cross-check Twitter and Farcaster sentiment. Deliver a ranked report with scores — no trades.”
Strategy system capabilities (fere_tools)
Scheduled strategies and the strategy_builder skill run Python in an isolated sandbox. Fere injects fere_tools — a single synchronous SDK that mirrors the gateway tool registry (/v1/tools). Use it to align automation with what Fere can actually execute: market data, analysis, wallet reads, on-chain writes, Hyperliquid perps, and Polymarket.
This catalog lists 69 sandbox-allowed tools (20 write money or on-chain/Polymarket/perp state). Examples appear only for wallet on-chain, Polymarket, and Hyperliquid perp tools (37 tools). Scheduling (
create_scheduled_task, modify_scheduled_task, cancel_scheduled_task) is not in the sandbox — create or change schedules from Strategy chat or the UI, not from fere_tools.Client API (module methods)
Every tool below is invoked the same way. Prefer keyword arguments only — positional args are not supported. Never passuser_id, agent_id, or chat_id; the gateway derives identity from the signed sandbox session.
| Method | Return type | Description |
|---|---|---|
fere_tools.call(name, **kwargs) | Tool logical result (dict, list, or scalar) | Canonical invoke by registry name. Unwraps the gateway envelope and JSON-decodes string results when applicable. |
fere_tools.<tool_name>(**kwargs) | Same as call | Attribute sugar — e.g. F.current_prices_tool(token_names=["ETH"]). |
fere_tools.call_raw(name, **kwargs) | dict envelope | Full gateway envelope (status, tool_name, result, error). Use for debugging or telemetry only. |
fere_tools.catalog(category=None) | list[dict] | Compact catalog: each entry has name, category, read_only, destructive. Optional category filter (market_data, analysis, wallet, …). |
fere_tools.describe(name) | dict | Full descriptor: description, input_schema, category, read_only, destructive. |
fere_tools.FereToolError | Exception | Raised on tool-level failure (tool, message attributes). Transport errors use RuntimeError. |
Tool catalog
Market data
Discovery — prices, search, trending, pools. 12 tools.available_cryptocurrency_categories_and_chains
Writes state: No
Description
current_prices_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token_names | any | Yes | typing.Annotated[list[str], ‘List of token names’] |
remove_optional | any | No | typing.Annotated[bool, ‘Remove optional fields like tickers. Tickers contains the exchange details, ticker symbols, price and more. Note that tickers information can be huge if used for more than 10 coins, might go beyond your context limits, so set this to False only when you really need it. If more than 10 coins are available, break this call into two with separate lists and remove_optional as False.’] |
get_trending_coins
Writes state: No
Description
get_trending_coins_by_chain
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
chain_name | any | Yes | <class ‘str’> |
score_interval | any | No | typing.Annotated[str, ‘Trending score time window. One of "5m", "1h", "4h", "12h" or "24h". Default this to "24h" if an interval is not explicitly mentioned.’] |
top_k | any | No | typing.Annotated[int, ‘Number of top trending coins to return. By default it is 10.’] |
custom_filters | any | No | typing.Annotated[dict, ‘Custom filters to apply on top of trending tokens response. Defaults to None to use Codex defined parameters for trending’] |
global_market_cap_and_volume
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
days | any | No | typing.Annotated[int, ‘Get data for these many days’] |
vs_currency | any | No | typing.Annotated[str, ‘The base currency’] |
historical_prices_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
contract_addresses | any | No | typing.Annotated[list[str], ‘List of token contract addresses to fetch historical prices for. Preferred method. Leave empty for native tokens.’] |
token_names | any | No | typing.Annotated[list[str], “List of token names for native tokens that don’t have contract addresses. Only used if contract_addresses is empty.”] |
days | any | No | typing.Annotated[float, ‘Number of days for which historical data to be fetched’] |
merged_trending_coins
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
category_ids | any | No | typing.Annotated[list[str], ‘List of Category ids to filter the trending coins on’] |
chain_id | any | No | typing.Annotated[str, ‘Chain identifier (name or ID). None for all chains’] |
include_attributes | any | No | typing.Annotated[str, ‘Comma-separated attributes to include in API response’] |
fetch_all | any | No | typing.Annotated[bool, ‘Whether to fetch all available data’] |
search_coin_by_name
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | Yes | typing.Annotated[str, ‘Search String’] |
remove_optional | any | No | typing.Annotated[bool, ‘Remove optional fields like tickers and exchange info.’] |
top_k_results | any | No | typing.Annotated[int, ‘The top k results you want from the search results. By defaults kept at 5’] |
search_coins
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | No | typing.Annotated[list[str], ‘Optional. Coin names, symbols, or contract addresses. Contract addresses preferred.’] |
category | any | No | typing.Annotated[list[str], ‘Optional. Category IDs from available_cryptocurrency_categories_and_chains. Not category names.’] |
filters | any | No | typing.Annotated[dict, ‘Optional. Filters for category search. Only used when category is provided. Can be omitted. Supported keys: market_cap_min: Minimum market cap in USD, market_cap_max: Maximum market cap in USD, fdv_min: Minimum fully diluted valuation in USD, fdv_max: Maximum fully diluted valuation in USD, circulating_supply_percentage_min: Minimum circulating supply as percentage of total supply, circulating_supply_percentage_max: Maximum circulating supply as percentage of total supply, volume_min: Minimum 24h trading volume in USD, network: List of network IDs to filter by (chain IDs), order: Ordering: market_cap_asc, market_cap_desc, volume_asc, volume_desc, price_change_percentage: Price change duration: 1h, 24h, 7d, 14d, 30d, 200d, 1y, count: Number of coins to return per category’] |
include_exchange_info | any | No | typing.Annotated[bool, ‘Whether to include exchange tickers and token holders data. WARNING: Exchange data can be large (MBs). Only enable if you need exchange/pair information. Defaults to False.’] |
search_coins_by_category
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
categories | any | Yes | typing.Annotated[list[str], ‘The category-id(s) in which coins are search for’] |
chain_id | any | No | typing.Annotated[str, ‘The chain-id of the chain on which to filter tokensIf user asks for a specific chain (with or without category), then use this field.’] |
market_cap_min | any | No | typing.Annotated[int, ‘Minimum Market Cap filter’] |
market_cap_max | any | No | typing.Annotated[int, ‘Maximum Market Cap filter’] |
fdv_min | any | No | typing.Annotated[int, ‘Fully Diluted Value minimum filter’] |
fdv_max | any | No | typing.Annotated[int, ‘Fully Diluted Value maximum filter’] |
circulating_supply_percentage_min | any | No | typing.Annotated[int, ‘Min Circulating supply as a percentage of total supply filter’] |
circulating_supply_percentage_max | any | No | typing.Annotated[int, ‘Max circulating supply as a percentage of total supply filter’] |
total_volume | any | No | typing.Annotated[int, ‘Total Volume Traded’] |
order | any | No | typing.Annotated[typing.Literal[‘market_cap_asc’, ‘market_cap_desc’, ‘volume_asc’, ‘volume_desc’], ‘Ordering of results’] |
count | any | No | <class ‘int’> |
price_change_percentage | any | No | typing.Annotated[typing.Literal[‘1h’, ‘24h’, ‘7d’, ‘14d’, ‘30d’, ‘200d’, ‘1y’], ‘price change percentage Duration’] |
sparkline | any | No | typing.Annotated[bool, ‘Show Spark Line’] |
token_holders
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
chain | any | Yes | typing.Annotated[typing.Literal[‘arbitrum’, ‘avalanche’, ‘base’, ‘bsc’, ‘eth’, ‘fantom’, ‘flare’, ‘gnosis’, ‘linea’, ‘optimism’, ‘polygon’, ‘polygon_zkevm’, ‘rollux’, ‘scroll’, ‘stellar’, ‘syscoin’], ‘Blockchain on which the contract exists’] |
contract_address | any | Yes | typing.Annotated[str, ‘Contract Address’] |
total_supply | any | Yes | typing.Annotated[int, ‘Total Supply’] |
limit | any | No | typing.Annotated[int, ‘Count of holders to return’] |
trending_pools
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
chain_id | any | No | typing.Annotated[str, ‘Optional chain name or ID to filter pools for a specific blockchain network, pass empty string when not applicable’] |
include_attributes | any | No | typing.Annotated[str, “Optional comma-separated string of attributes to include in response, e.g., ‘base_token,quote_token,dex’, pass empty string when not applicable”] |
count | any | No | typing.Annotated[int, ‘Number of trending pools to return’] |
fetch_all | any | No | typing.Annotated[bool, ‘Fetch all pages if True; otherwise fetch only the first page’] |
Analysis
TA, OHLCV, risk, and contract security. 5 tools.calculate_historical_investment_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
coin_id | any | Yes | typing.Annotated[str, “The ID of the cryptocurrency (e.g., ‘bitcoin’)“] |
vs_currency | any | Yes | typing.Annotated[str, “The currency to evaluate against (e.g., ‘usd’)“] |
initial_investment | any | Yes | typing.Annotated[float, ‘The initial investment amount’] |
duration | any | Yes | typing.Annotated[int, ‘Duration in days to look back’] |
contract_security_check_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
tokens | list[object] | Yes | List of tokens to check, each with ‘token_address’ and ‘chain_id’ keys. Example: [{‘token_address’: ‘0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913’, ‘chain_id’: 8453}, {‘token_address’: ‘So11111111111111111111111111111111111111112’, ‘chain_id’: ‘solana’}] |
ohlcv_history_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token_identifier | string | Yes | Token name (e.g. ‘ETH’, ‘BTC’) or contract address. |
interval | string | No | Candle interval. Options: ‘1’ (1min), ‘5’ (5min), ‘60’ (1hr), ‘240’ (4hr), ‘1D’ (1day). Defaults to ‘1D’. |
limit | integer | No | Number of candles to return (max 100). Defaults to 30. |
technical_analysis_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
contract_address | any | No | typing.Annotated[str, ‘The token contract address to fetch data for. Preferred method. Leave empty for native tokens.’] |
token_name | any | No | typing.Annotated[str, ‘Token name. Use this for native tokens because contract_address are not available for native tokens.’] |
indicators | any | No | typing.Annotated[collections.abc.Sequence[typing.Literal[‘rsi14’, ‘macd’, ‘ema9’, ‘ema21’, ‘ema50’, ‘ema200’, ‘bb_width20’, ‘atr14’, ‘adx14’, ‘stoch_rsi’, ‘stochastic’, ‘obv’, ‘vwap’, ‘support_resistance’]], ‘indicators (list): list of indicators to calculate. |
| Available options: |
- “rsi14” - Relative Strength Index
- “macd” - MACD line, signal, histogram
- “ema9”, “ema21”, “ema50”, “ema200” - Exponential Moving Averages
- “bb_width20” - Bollinger Bands width percentage
- “atr14” - Average True Range (volatility)
- “adx14” - Average Directional Index with +DI/-DI (trend strength)
- “stoch_rsi” - Stochastic RSI (momentum)
- “stochastic” - Stochastic Oscillator %K/%D
- “obv” - On-Balance Volume with SMA(20)
- “vwap” - Volume Weighted Average Price
- “support_resistance” - Pivot-based S1-S3, R1-R3 levels
- By default calculate ALL indicators for comprehensive analysis’] |
|
interval|any| No | typing.Annotated[str, ‘Candle Interval. Available options are15m,1hr,4hr,1day. If not specified use4hrby default.’] |
token_risk_analysis_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token_name | any | No | typing.Annotated[str, “Token name to analyze (e.g., ‘useless’, ‘official trump’, ‘debridge’). Leave empty to analyze all user holdings.”] |
Social
Twitter/X and Farcaster research. 8 tools.casts_from_channel_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
channel | any | Yes | typing.Annotated[str, ‘Channel ID’] |
casts_from_user
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
username | any | Yes | <class ‘str’> |
limit | any | No | typing.Annotated[int, ‘No. of casts to be fetched. By default 50.’] |
keyword_search_for_casts
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token | any | Yes | typing.Annotated[list[str], ‘Symbol of cryptocurrencies’] |
duration | any | No | typing.Annotated[int, ‘Number of days to look back’] |
news_searches
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
queries | any | Yes | typing.Annotated[list[str], ‘List of token names or symbol names to search for news’] |
time_hrs | any | No | typing.Annotated[int, ‘Time in hours to look back’] |
max_calls_per_second | any | No | typing.Annotated[int, ‘Maximum calls per second’] |
semantic_search_for_casts
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | Yes | typing.Annotated[str, ‘User query as it is’] |
duration | any | No | typing.Annotated[int, ‘Number of days to look back’] |
channels | any | No | typing.Annotated[list[str], ‘List of farcaster channels’] |
top_tweeters
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
topic | any | Yes | typing.Annotated[str, ‘The topic to search for’] |
social_network | any | No | typing.Annotated[str, ‘The social network to search on. Supported values are: youtube, tiktok, twitter’] |
top_tweets_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
tokens | any | Yes | typing.Annotated[list[str], ‘Symbols of cryptocurrency’] |
duration | any | No | typing.Annotated[int, ‘Number of days to look back’] |
tweets_from_users
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
users | any | Yes | typing.Annotated[list[str], ‘The user(s) whose tweets you want to fetch’] |
Web research
Web search, Exa, Firecrawl, PDF extract. 7 tools.combined_search_tool
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
objective | any | Yes | typing.Annotated[str, ‘What you want to learn about a specific token, protocol, chain, or crypto event. Include source preferences (official docs, crypto news, audit reports) and exclusions (price aggregators, promotional content).’] |
query | any | Yes | typing.Annotated[list[str], “2-5 search queries from different angles: e.g. fundamentals, news/catalysts, tokenomics, security, governance. Each query must add new information the others won’t surface.”] |
socials | any | No | typing.Annotated[list[str], ‘Names of the crypto currencies mentioned in your search query.’] |
exa_answer
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | Yes | typing.Annotated[str, ‘Question to answer using web search’] |
model | any | No | typing.Annotated[str, ‘Model to use: exa or exa-pro’] |
exa_find_similar
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
url | any | Yes | typing.Annotated[str, ‘URL to find similar pages for’] |
num_results | any | No | typing.Annotated[int, ‘Number of similar results to return’] |
exa_search
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | Yes | typing.Annotated[str, ‘Query string for web search’] |
num_results | any | No | typing.Annotated[int, ‘Number of results to return’] |
search_type | any | No | typing.Annotated[str, ‘Type of search: keyword, neural, or auto’] |
extract_text_from_pdf_url
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
url | any | Yes | typing.Annotated[str, ‘URL of the page where PDF is hosted’] |
scrape_firecrawl
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
urls | any | Yes | list[str] |
web_search
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
query | any | Yes | typing.Annotated[str, ‘Keywords or Phrase for web search’] |
Wallet & on-chain
Holdings, swaps, bridges, transfers, limit orders, hooks. 16 tools.aave_operation
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
chain | string | No | Chain on which user wants to supply |
token_address | string | No | Token Address |
amount | string | No | Amount |
amount_in_USD | boolean | No | True if amount is entered in USD, False otherwise |
operation | string | No | Operation type: supply, withdraw, borrow, repay |
cancel_limit_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
limit_order_id | string | No | The limit order ID to cancel. |
create_limit_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
limit_order_request | any | No | LimitOrderToolRequest object with limit order details. |
ens_to_address
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
ens_name | any | Yes | typing.Annotated[str, ‘ENS name’] |
get_holdings
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
wallet_address | any | No | typing.Annotated[str, ‘The address of the wallet to get the holdings for.’] |
get_limit_orders
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Optional status filter: ‘active’, ‘executed’, ‘cancelled’, ‘expired’ |
get_wallet_positions
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
wallet_address | any | Yes | typing.Annotated[str, ‘Wallet address in .ens or standardized EVM Wallet’] |
poll_transaction_status
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
task_ids | list[string] | No | List of task_ids returned by trade_tokens, transfer_tokens, create_limit_order, or Polymarket operation tools. These are the wallet-service task IDs that track transaction execution. |
tool_name | string | No | The tool that produced these task_ids (e.g. ‘trade_tokens’, ‘transfer_tokens’, ‘create_limit_order’, ‘polymarket_place_order’). |
timeout_seconds | integer | No | Maximum time in seconds to wait for transactions to complete. |
not_found_grace_seconds | number | No | Grace period before treating missing task IDs as NOT_FOUND. |
recharge_user_credits
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
chain_id | integer | No | Chain ID for the transfer |
amount_usd | number | No | Amount in USD to charge |
set_hooks_for_holding
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
set_hooks_request | any | No | — |
stake_tokens
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
amount | string | No | the amount to stake |
amount_in_USD | boolean | No | True if amount is entered in USD |
stake_ETH | boolean | No | True if staking ETH, False if unstaking ETH |
supported_chains
Writes state: No
Description
supported_chains_for_bridging
Writes state: No
Description
trade_tokens
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
trade_request | any | No | TradeToolRequest object with trade details. |
transfer_tokens
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
to_address | list[string] | No | A list of destination wallet addresses receiving the tokens. Ensure correct mapping of token addresses to recipient addresses. |
token_address | list[string] | No | A list of token addresses to transfer. This is not the Recipient(wallet) address. |
amount | list[string] | No | A list of amounts of tokens to transfer. Maintain values as provided by the user without modification. |
chain | string | No | The chain to transfer on. This is the chain’s slug in the database. |
token_decimals | list[integer] | No | A list of decimals for each token to transfer. Get this from holdings data. |
amount_in_USD | list[boolean] | No | A list indicating whether each transfer amount is in USD (True) or in token units (False). |
wallet_info
Writes state: No
Description
Hyperliquid perps
Perpetual futures on Hyperliquid. Day and Swing strategies in Settings require Hyperliquid funding before their first scheduled perp run. 10 tools.cancel_perp_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
cancel_request | any | No | PerpCancelOrderToolRequest with asset and order_id (Hyperliquid oid) |
close_perp_position
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
close_request | any | No | PerpCloseToolRequest with asset and optional size |
get_perp_funding_rates
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
asset | string | Yes | Asset symbol e.g. ‘BTC’ |
get_perp_market_overview
Writes state: No
Description
get_perp_open_orders
Writes state: No
Description
open_perp_position
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
trade_request | any | No | PerpTradeRequest with asset, side, size, leverage, and optional tp_price/sl_price for atomic TP/SL |
place_perp_limit_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
request | any | No | PerpReduceOnlyLimitToolRequest with asset, size, limit_price |
set_perp_tp_sl
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
request | any | No | PerpSetTpSlToolRequest with asset and tp_price/sl_price |
update_perp_leverage
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
leverage_request | any | No | PerpUpdateLeverageToolRequest with asset, leverage, cross vs isolated |
update_perp_margin
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
margin_request | any | No | PerpModifyMarginToolRequest: asset, margin_delta_usd, add vs remove |
Polymarket
Safe setup, cash preflight, markets, orders, positions. 11 tools.get_polymarket_safe_cash_usd
Writes state: No
Description
polymarket_cancel_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
order_id | string | null | No | Specific CLOB order ID to cancel. Mutually exclusive with cancel_all and market_id. |
market_id | string | null | No | Cancel all orders for this market/condition ID. |
cancel_all | boolean | No | Cancel ALL open orders across all markets. |
polymarket_fund_safe
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
wrap_only | boolean | No | When True, skip swap/transfer and wrap stranded USDC.e already on the Safe into spendable pUSD. amount/source_chain_id/source_token are ignored. |
amount | string | null | No | Amount to fund. Required when wrap_only=False. String for precision (e.g. ‘100’, ‘50.5’). |
source_chain_id | integer | null | No | Chain ID where the source tokens are (e.g. 1, 8453, 42161, 137). Required when wrap_only=False. |
source_token_address | string | null | No | Address of the token to convert to USDC.e for funding. Use native token address for ETH/MATIC. Required when wrap_only=False. |
amount_in_usd | boolean | No | True if amount is in USD, False if in token units. |
polymarket_get_markets
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
feed | string | No | Dashboard feed matching the Polymarket UI: ‘trending’ (default), ‘closing’ (ending soon), ‘easy_wins’, ‘arbitrage’, or ‘raw’ (Gamma market browse for slug/condition lookups). |
hours | integer | No | For feed=‘closing’: max hours until resolution (UI default 48). |
categories | string | null | No | Comma-separated topic slugs: sports, politics, culture, tech, finance, geopolitics, weather, science, other. Same as UI Topics. |
text_query | string | null | No | Substring search on title/slug/category/signal (UI search bar). |
sort_by | string | No | Sort: vol24h (default), liquidity, title, ends, top_price. |
ascending | boolean | No | Sort ascending when True (e.g. ends + ascending = soonest first). |
limit | integer | No | Max results (default 20, max 100). |
category | string | null | No | Legacy single topic slug; prefer categories. |
slug | string | null | No | For feed=‘raw’ only: market or event slug. |
active | boolean | null | No | For feed=‘raw’ only. |
closed | boolean | null | No | For feed=‘raw’ only. |
order | string | null | No | For feed=‘raw’ only: Gamma sort field. |
attach_gamma | boolean | No | When True, attach full Gamma gamma_market proto dict per row (best_bid, best_ask, outcome_prices, neg_risk, …). Capped by limit. |
polymarket_get_orderbook
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token_id | string | No | Polymarket condition token ID. Get from polymarket_get_markets. |
polymarket_get_positions
Writes state: No
Description
polymarket_get_trades
Writes state: No
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
market_id | string | null | No | Filter trades by market/condition ID. If None, returns all trades for the user’s Safe address. |
limit | integer | No | Max results to return (default 50, max 100). |
polymarket_place_order
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
token_id | string | No | Polymarket condition token ID for the outcome to trade. Get this from polymarket_get_markets results. |
side | string | No | Order side: ‘BUY’ to buy shares, ‘SELL’ to sell shares. |
price | string | No | Limit price between the market’s minimum tick and 1 - tick (probability). Sub-cent markets allow prices as low as 0.001 — do NOT floor at 0.01. String for tick-size precision (e.g. ‘0.55’, ‘0.005’). |
size | string | null | No | Number of shares for GTC/GTD. String for precision (e.g. ‘100’). Use amount instead for FOK/FAK. |
amount | string | null | No | FOK/FAK only: USD notional for BUY, share count for SELL. |
order_type | string | No | Order type: ‘GTC’ (good-til-cancelled, default), ‘FOK’ (fill-or-kill, immediate full fill), ‘FAK’ (fill-and-kill, partial fill ok), ‘GTD’ (good-til-date, requires expiration). |
expiration | integer | null | No | GTD only: order lifetime in seconds (not Unix timestamp). Must be at least 60. |
take_profit_price | string | null | No | BUY only: optional 0.01–0.99. Queues a separate GTC SELL after the buy fills — not a native exchange take-profit bracket. |
take_profit_pct | number | null | No | BUY only: expected TP percent above entry (e.g. 5 for +5%). When set with take_profit_price, price must reach entry * (1 + pct/100). |
min_take_profit_pct | number | null | No | BUY only: minimum TP uplift % above entry when take_profit_price is set (default 1). Ignored when take_profit_pct is provided. |
polymarket_setup
Writes state: Yes
Description
polymarket_setup_status
Writes state: No
Description
polymarket_withdraw
Writes state: Yes
Description
| Parameter | Type | Required | Description |
|---|---|---|---|
amount_usdc | string | No | Amount of USDC.e to withdraw from the Polymarket Safe. String for precision (e.g. ‘100’, ‘250.50’). |
destination_chain_id | integer | No | Chain ID to withdraw to (e.g. 1 for Ethereum, 8453 for Base, 42161 for Arbitrum). |
token_type | string | No | What to receive on destination chain: ‘usdc’ or ‘native’ (e.g. ETH, MATIC). |
Day and Swing Trading strategies (Settings) automate Hyperliquid perp checks. They require Hyperliquid setup and funding before the first scheduled run.

