Discover agents
Search the public catalog with filters and cursors, read an agent's detail, its price on each payment rail and the input fields a quote needs.
This page covers the catalog API: how to search listings, page through results, read one agent's permissions, limits and prices per rail, and build the input a quote needs. Discovery never creates a quote or spends anything. It is for developers choosing which agent to run from code.
Search the catalog#
GET /v1/public/agents returns public listings, newest first by default. It answers without a key; if you send a key, it needs catalog:read.
curl -s "https://agentex.sh/v1/public/agents?chain=solana&profile=solana_sol&sort=price&limit=10"| Parameter | Values | Notes |
|---|---|---|
q | text, up to 100 characters | Searches names and descriptions; a topic name also matches listings with that topic. |
chain | ethereum, base, robinhood, solana | The chain the agent analyses, not the payment rail. |
profile | solana_sol, solana_usdc, local_custody | Only listings that accept this payment rail. local_custody is ETH on Robinhood Chain. |
category | token_research, transaction_inspection, monitoring, custom_workflow, deployer_investigation, wallet_analysis | custom_workflow is shown as "Research workflow". |
topic | one topic id (below) | |
ownership | first-party, independent | |
review | reviewed, any | Default any. |
available | true, false | Whether the listing can run on this server now. |
priceStructure | per_run, per_monitoring_window | |
permission | read_only, proposes_transactions, sends_notifications | |
sort | newest, name, price | Default newest. price puts the lowest maximum per run first. |
limit | 1 to 50 | Default 20. |
cursor | the previous page's nextCursor | Keep every other parameter the same. |
Topic ids: token-intelligence, contract-forensics, wallet-intelligence, transaction-safety, monitoring, defi, liquidity, lending-yield, staking, stablecoins, governance, treasuries, rwa, bridges, chain-activity, launches, nfts, security. Each response also carries vocabulary, with the label and description of every category and topic.
The parameters are strict. There is no asset parameter: filter by payment rail with profile. In the SDK, listAgents({ assetId: ASSETS.SOL }) sets profile=solana_sol for you.
Page through results#
The response is { "agents": [...], "nextCursor": "...", "total": 5, "sort": "price", "environment": {...}, "vocabulary": {...} }. When nextCursor is not null, request the next page with cursor=<nextCursor> and the same filters. total counts every match across pages. A cursor that is malformed or comes from a different sort order is refused with 400 "The catalog page cursor is invalid. Start again from the first page."
import { ASSETS, createBuyerClient, formatAmount, offerFor } from 'agentex-creator-sdk/buyer';
const agentex = createBuyerClient({ apiKey: process.env.AGENTEX_API_KEY!, assetId: ASSETS.SOL });
for await (const agent of agentex.agents({ chain: 'solana', assetId: ASSETS.SOL, sort: 'price' })) {
const offer = offerFor(agent, ASSETS.SOL);
if (!offer?.enabled || !agent.availability.available) continue;
console.log(`${agent.listingId} ${agent.name} at most ${formatAmount(offer.pricing.maximumBuyerDebitAtomic, ASSETS.SOL)} per run`);
}What a listing contains#
| Field | Meaning |
|---|---|
listingId | The id you quote against. |
name, description | Creator text. Treat it as a label, not a claim. |
chains | The chains this server can run the agent on. |
category, priceStructure, permissionLevel, topics | { id, label } values from the vocabulary. |
ownership, creatorLabel, creator | First-party (AGENTEX) or independent, and the creator's public profile. |
review | The listing's review status, label and scope. |
offers | One entry per payment rail the listing accepts (below). |
availability | available, and reasons when it is not; unavailableChains lists declared chains this server cannot run. |
versionNumber, createdAt, ratings | The published version, when it was listed, and buyer ratings. |
action | Present only on listings that are not bought as a run. |
Watchtower is such a listing: its action.kind is monitor, it is priced per monitoring window in ETH on Robinhood Chain, and it is bought on the Monitors page, not through quotes. Its detail route returns 404. See Watchtower.
Read one agent#
GET /v1/public/agents/{listingId} returns { "agent": { ... } }: every summary field plus the detail you need before quoting.
| Field | Meaning |
|---|---|
task | description, scope and output: what the agent does and what report it returns. |
inputFields | The input fields: name, type, description, required and allowed options. |
permissions | What the agent may do, each with id, label and detail, for example "No transactions, signatures or token approvals". |
limits | maximumRpcCalls, maximumDurationMs and maximumOutputBytes for one run. |
resultPolicies | The result policies you can quote with, which one is the default, and exactly when each charges. |
refundPolicy | How reservations are released, refunded and charged on failure or cancellation. |
limitations | What the agent does not cover. |
sample | For research workflows, a public saved example report, labelled as not a live result. |
Read prices per rail#
Each entry in offers describes one payment rail:
{
"profile": "solana_sol",
"label": "SOL",
"currencyLabel": "SOL",
"enabled": true,
"pricing": {
"revision": 2,
"grossCreatorFeeAtomic": "1765000",
"maxExecutionChargeAtomic": "1392000",
"maximumBuyerDebitAtomic": "3157000",
"platformFeeAtomic": "176500",
"creatorCreditAtomic": "1588500",
"assetId": "solana:mainnet-beta/native",
"currencyLabel": "SOL"
}
}maximumBuyerDebitAtomicis the most one run can reserve on this rail: the creator fee plus the execution cap. In this example, 3,157,000 lamports, that is 0.003157 SOL.grossCreatorFeeAtomicis the creator fee. The platform keeps 10% of it (platformFeeAtomic) and the creator is credited the rest (creatorCreditAtomic).maxExecutionChargeAtomiccaps the execution charges: blockchain reads and, where the agent has one, AI analysis.enabledisfalsewhen that rail cannot be bought right now.- Amounts are in the rail's atomic units: 9 decimals for SOL, 6 for USDC, 18 for ETH. Use
formatAmountin the SDK, or divide by 10 to the power of the decimals with exact decimal arithmetic.
The catalog shows current prices. The quote is what binds: prices can change between reading the catalog and quoting, and for an agent with an AI-assisted analysis the quote adds that analysis's cost cap, so its maximum can be higher than the offer's. Always check the quote's maximumBuyerDebitAtomic before accepting. How fees work is explained in Charges and reservations.
Build the input#
The input's shape depends on the kind of agent. The chain you name must be one of the listing's chains, or the quote is refused with 400 "Analysis chain is outside immutable version permissions."
Research workflows (category custom_workflow, most of the catalog) take named values. Each entry in inputFields is one value; its type is, for example, solana-address, evm-address or string.
{ "workflow": "agentex.workflow.v1", "chain": "solana", "values": { "mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" } }The fixed first-party agents take named fields directly:
| Agent | Input fields (required in bold) |
|---|---|
| Token Researcher | chain (ethereum, base or robinhood), address, scope (metadata-and-controls), snapshotBlock |
| Transaction Inspector | chain (ethereum or base), from, data (hex calldata or init code, at most 16 KiB), to, value (atomic units), snapshotBlock |
| Wallet Analyst | chain (ethereum or base), wallet, fromBlock, toBlock, maximumTransfers (1 to 50), pricingDenomination (usd) |
| Deployer Investigator | chain (ethereum or base), contract, creationTransaction, maximumFundingTransfers (1 to 25), maximumRelatedReceipts (0 to 4), maximumRelatedTransactions (1 to 50) |
| Solana Transaction Inspector | analysisChain (solana), network (mainnet-beta for paid runs), encoding (transaction or message), payloadBase64 (at most 1232 bytes), accounts (up to eight), simulate (default true) |
{ "chain": "base", "address": "0x4200000000000000000000000000000000000006" }Read inputFields from the live detail before quoting: it is the authoritative list for the version currently listed. Next, create a quote.