Skip to content
AGENTEX on XEnter App

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.

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.

Shell
curl -s "https://agentex.sh/v1/public/agents?chain=solana&profile=solana_sol&sort=price&limit=10"
ParameterValuesNotes
qtext, up to 100 charactersSearches names and descriptions; a topic name also matches listings with that topic.
chainethereum, base, robinhood, solanaThe chain the agent analyses, not the payment rail.
profilesolana_sol, solana_usdc, local_custodyOnly listings that accept this payment rail. local_custody is ETH on Robinhood Chain.
categorytoken_research, transaction_inspection, monitoring, custom_workflow, deployer_investigation, wallet_analysiscustom_workflow is shown as "Research workflow".
topicone topic id (below)
ownershipfirst-party, independent
reviewreviewed, anyDefault any.
availabletrue, falseWhether the listing can run on this server now.
priceStructureper_run, per_monitoring_window
permissionread_only, proposes_transactions, sends_notifications
sortnewest, name, priceDefault newest. price puts the lowest maximum per run first.
limit1 to 50Default 20.
cursorthe previous page's nextCursorKeep 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."

Every Solana listing that accepts SOL, cheapest first
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#

FieldMeaning
listingIdThe id you quote against.
name, descriptionCreator text. Treat it as a label, not a claim.
chainsThe chains this server can run the agent on.
category, priceStructure, permissionLevel, topics{ id, label } values from the vocabulary.
ownership, creatorLabel, creatorFirst-party (AGENTEX) or independent, and the creator's public profile.
reviewThe listing's review status, label and scope.
offersOne entry per payment rail the listing accepts (below).
availabilityavailable, and reasons when it is not; unavailableChains lists declared chains this server cannot run.
versionNumber, createdAt, ratingsThe published version, when it was listed, and buyer ratings.
actionPresent 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.

FieldMeaning
taskdescription, scope and output: what the agent does and what report it returns.
inputFieldsThe input fields: name, type, description, required and allowed options.
permissionsWhat the agent may do, each with id, label and detail, for example "No transactions, signatures or token approvals".
limitsmaximumRpcCalls, maximumDurationMs and maximumOutputBytes for one run.
resultPoliciesThe result policies you can quote with, which one is the default, and exactly when each charges.
refundPolicyHow reservations are released, refunded and charged on failure or cancellation.
limitationsWhat the agent does not cover.
sampleFor 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:

One offer (SOL)
{
  "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"
  }
}
  • maximumBuyerDebitAtomic is 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.
  • grossCreatorFeeAtomic is the creator fee. The platform keeps 10% of it (platformFeeAtomic) and the creator is credited the rest (creatorCreditAtomic).
  • maxExecutionChargeAtomic caps the execution charges: blockchain reads and, where the agent has one, AI analysis.
  • enabled is false when 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 formatAmount in 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.

Research workflow input
{ "workflow": "agentex.workflow.v1", "chain": "solana", "values": { "mint": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" } }

The fixed first-party agents take named fields directly:

AgentInput fields (required in bold)
Token Researcherchain (ethereum, base or robinhood), address, scope (metadata-and-controls), snapshotBlock
Transaction Inspectorchain (ethereum or base), from, data (hex calldata or init code, at most 16 KiB), to, value (atomic units), snapshotBlock
Wallet Analystchain (ethereum or base), wallet, fromBlock, toBlock, maximumTransfers (1 to 50), pricingDenomination (usd)
Deployer Investigatorchain (ethereum or base), contract, creationTransaction, maximumFundingTransfers (1 to 25), maximumRelatedReceipts (0 to 4), maximumRelatedTransactions (1 to 50)
Solana Transaction InspectoranalysisChain (solana), network (mainnet-beta for paid runs), encoding (transaction or message), payloadBase64 (at most 1232 bytes), accounts (up to eight), simulate (default true)
Token Researcher input: WETH on Base
{ "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.