Every HoodSniper chain runs the same agent API. Give your agent one key per chain: if a key leaks it only reaches one chain, and each key has its own scopes, expiry and revocation. The snippets below wire all 5 together. JSON: /api/agent/v1/chains
| Chain | Orders | Start | MCP |
|---|---|---|---|
| Arbitrum One · you are here | buy, sell, limit, exits, cancel | /agents · docs | arbitrum.46.225.83.168.nip.io/api/agent/v1/mcp |
| Robinhood Chain | buy, sell, limit, exits, cancel | /agents · docs | hoodsniper.fun/api/agent/v1/mcp |
| Abstract | buy, sell, limit, exits, cancel | /agents · docs | abs.hoodsniper.fun/api/agent/v1/mcp |
| Solana | buy, sell, limit, exits, cancel | /agents · docs | sol.46.225.83.168.nip.io/api/agent/v1/mcp |
| Base | buy, sell, limit, exits, cancel | /agents · docs | base.46.225.83.168.nip.io/api/agent/v1/mcp |
Sign in on each chain (Trade → 🤖 API keys) or take a sandbox key on each. Keep them in separate variables:
HSK_ARBITRUM=hsk_… # Arbitrum One HSK_ROBINHOOD=hsk_… # Robinhood Chain HSK_ABSTRACT=hsk_… # Abstract HSK_SOLANA=hsk_… # Solana HSK_BASE=hsk_… # Base
# a 24-hour sandbox key on every chain, in one go (3 a day per network per chain) export HSK_ARBITRUM=$(curl -s -X POST https://arbitrum.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])') export HSK_ROBINHOOD=$(curl -s -X POST https://hoodsniper.fun/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])') export HSK_ABSTRACT=$(curl -s -X POST https://abs.hoodsniper.fun/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])') export HSK_SOLANA=$(curl -s -X POST https://sol.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])') export HSK_BASE=$(curl -s -X POST https://base.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')
Each chain is its own MCP server, so the agent always knows which chain a tool call goes to. ${HSK_…} is your client's environment-variable syntax (Cursor, VS Code); paste the key itself if your client has none.
{
"mcpServers": {
"hoodsniper-arbitrum": {
"type": "http",
"url": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1/mcp",
"headers": {
"Authorization": "Bearer ${HSK_ARBITRUM}"
}
},
"hoodsniper-robinhood": {
"type": "http",
"url": "https://hoodsniper.fun/api/agent/v1/mcp",
"headers": {
"Authorization": "Bearer ${HSK_ROBINHOOD}"
}
},
"hoodsniper-abstract": {
"type": "http",
"url": "https://abs.hoodsniper.fun/api/agent/v1/mcp",
"headers": {
"Authorization": "Bearer ${HSK_ABSTRACT}"
}
},
"hoodsniper-solana": {
"type": "http",
"url": "https://sol.46.225.83.168.nip.io/api/agent/v1/mcp",
"headers": {
"Authorization": "Bearer ${HSK_SOLANA}"
}
},
"hoodsniper-base": {
"type": "http",
"url": "https://base.46.225.83.168.nip.io/api/agent/v1/mcp",
"headers": {
"Authorization": "Bearer ${HSK_BASE}"
}
}
}
}import os, requests
CHAINS = {
"arbitrum": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1",
"robinhood": "https://hoodsniper.fun/api/agent/v1",
"abstract": "https://abs.hoodsniper.fun/api/agent/v1",
"solana": "https://sol.46.225.83.168.nip.io/api/agent/v1",
"base": "https://base.46.225.83.168.nip.io/api/agent/v1",
}
def key(chain): return os.environ["HSK_" + chain.upper().replace("-", "_")]
def get(chain, path, **params):
r = requests.get(CHAINS[chain] + path, params=params, headers={"Authorization": "Bearer " + key(chain)}, timeout=15)
r.raise_for_status(); return r.json()
# one portfolio view across every chain (each call uses that chain's own key)
for chain in CHAINS:
p = get(chain, "/portfolio")
print(f"{chain:10} equity ${p['equityUsd']:.2f} open {len(p['positions'])}")const CHAINS = {
"arbitrum": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1",
"robinhood": "https://hoodsniper.fun/api/agent/v1",
"abstract": "https://abs.hoodsniper.fun/api/agent/v1",
"solana": "https://sol.46.225.83.168.nip.io/api/agent/v1",
"base": "https://base.46.225.83.168.nip.io/api/agent/v1",
};
const key = (c) => process.env["HSK_" + c.toUpperCase().replace("-", "_")];
const get = async (c, p) => (await fetch(CHAINS[c] + p, { headers: { Authorization: "Bearer " + key(c) } })).json();
const all = await Promise.all(Object.keys(CHAINS).map(async (c) => [c, await get(c, "/portfolio")]));
for (const [c, p] of all) console.log(c.padEnd(10), "equity $" + p.equityUsd?.toFixed(2), "open", p.positions?.length);A single cross-chain key would be one secret that unlocks every chain, and every app would have to trust every other app's key store. Separate keys keep a mistake or a leak contained. Events, webhooks, rate limits (60 a minute per account) and the leaderboard are per chain too.