POST · JSON API
Base Token Pool Analysis / Token Verdict
See a selected Base pool’s liquidity, 24-hour volume, and price change—plus a plain-English market summary.
No deposit. No payment. Credit and daily limits apply.
Start with the trial-only Agent quickstart$0.015 USD / paid request
Covered: up to 3 calls if you use the entire initial $0.050 grant on this API. Shared credit, daily budget, and availability apply.
A selected-pool market summary, not a contract-security assessment, an audit, or investment advice. It does not describe the entire token market.
Historical example · No wallet required
What a Token Verdict looks like
Historical snapshot observed at
This saved example is not live data or a current quote. Viewing it does not execute a token analysis or use trial credit.
Wrapped Ether · WETH
0x4200000000000000000000000000000000000006
- Pool liquidity
- $128,313,173.27
- 24-hour volume
- $91,274,033.86
- 24-hour price change
- +5.68%
Read the original market summary
Selected pool (highest_liquidity) for Wrapped Ether (WETH) on Uniswap: pool address 0x6c56...1372. Observation fetched 2026-09-19T06:49:53.255Z. Metrics for this pool: USD price 2624.99, pool liquidity USD 128,313,173.27, 24h volume USD 91,274,033.86, 24h price change +5.68%. Trade counts in the last 24h: 6,589 buys and 4,988 sells. Pool age reported as 24,864.85 hours. Provenance: data from dexscreener (provided URL). Limitations: these figures apply only to the selected pool, upstream freshness is not guaranteed (fetchedAt is retrieval time), pool age is not token age, and missing/unknown fields should not be treated as zero.
Selected pool, observations, and limitations
Retrieval time is not the provider's source freshness. Metrics describe one selected pool, not the entire token market.
- No rule observations were returned. This is not a safety assessment.
- Market data covers only the selected pool, not all pools or token activity.
- Upstream freshness is not guaranteed; fetchedAt is retrieval time, not the provider's last update.
- Pool age does not represent token age.
- Pools without usable identifiers, a positive USD price, or positive USD liquidity were omitted.
Market observations only. Not a contract-security assessment or investment advice.
Use this in an agent: read the pool metrics, inspect any rule observations, and attach the source and retrieval time to your report. An empty observations list is not proof of token safety.
How a rule observation can help your agent
Synthetic contract example, not the WETH observation above: a pool with $5,000 in liquidity returns LOW_LIQUIDITY. Your agent can surface that observation alongside the report for review.
{
"signals": [
{
"code": "LOW_LIQUIDITY",
"description": "The selected pool has less than $10,000 in reported liquidity."
}
]
}
Trial only · No deposit
Try Token Verdict for free
Covered: up to 3 calls if you use the entire initial $0.050 grant on this API. Shared credit, daily budget, and availability apply.
Enter a Base token address to see its selected pool’s liquidity, 24-hour volume, price change, and a plain-English summary.
No deposit. No payment. You approve a wallet signature to use service credit.
Ready. No request is made until you choose to try.
Remaining service credit appears after a trial response.
View result JSON
No analysis requested.
Your available trial credit cannot cover another call. See how to use the paid API, or explore other APIs.
Using an existing wallet
Open this page in your existing EVM wallet's built-in browser, or use its official desktop browser extension. Unlock it, then choose "Connect wallet and try" and review the sign-in message. This trial supports externally owned accounts, not contract wallets.
No wallet funds, deposit, or on-chain transaction are needed. Never paste a private key into this site. If you only want to see the output, view an example without connecting a wallet.
Wallet support, credit limits, and privacy
Connect an EVM EOA wallet and approve a SIWX authentication signature. The wallet signature is not a payment or blockchain transaction. This page never asks for private keys and never auto-pays.
Contract wallets are not supported. Execution requires enough remaining service credit, available global daily budget, and API availability. Stop after a failed or uncertain attempt; no paid fallback is performed. Service credit is not a wallet token balance.
This page sends bounded, self-reported trial-stage diagnostics. Events contain no wallet addresses, signatures, request inputs, result contents, IP addresses, or persistent identifiers. This diagnostic feature creates no cookies or accounts.
Run a trial without paying
Try eligible APIs with free service credit. Each verified EVM externally owned wallet receives $0.050 once, shared across APIs with no expiry. No deposit, payment, on-chain transaction, API key, or registration is required. Wallet sign-in (SIWX) is required; contract wallets are not supported. Credit is nontransferable. Execution requires sufficient credit, daily trial budget, and API availability.
Covered: up to 3 calls if you use the entire initial $0.050 grant on this API. Shared credit, daily budget, and availability apply.
Start here for a business result, not just a 402 response. The trial client handles wallet sign-in and never signs a payment or automatically retries.
Already have an Agent signer?
Install @x402/extensions and pass your existing EVM EOA signer to its official wrapFetchWithSIWx helper. No seller-specific download, private-key export, or new wallet is needed.
// npm install @x402/extensions
// existingSigner is your EVM EOA signer with address and signMessage({ message }).
// Use plain fetch, never a payment-wrapped fetch, for trial-only access.
import { wrapFetchWithSIWx } from "@x402/extensions/sign-in-with-x";
const trialFetch = wrapFetchWithSIWx(fetch, existingSigner);
const response = await trialFetch("https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/crypto/token-verdict", {
method: "POST",
headers: { "content-type": "application/json", accept: "application/json" },
body: JSON.stringify({
"tokenAddress": "0x4200000000000000000000000000000000000006"
}),
redirect: "error",
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Trial stopped: HTTP ${response.status}. Do not automatically retry or pay.`);
if (response.headers.get("x-access-mode") !== "trial" ||
response.headers.get("x-trial-status") !== "charged" ||
response.headers.get("x-trial-accounting-status") !== "confirmed" ||
response.headers.has("payment-response") || response.headers.has("x-payment-response")) {
throw new Error("Trial accounting is unconfirmed. Do not repeat this request or pay.");
}
console.log(await response.json());
// No payment signer, paid fallback, or application retry loop is installed.
Trial only: use plain fetch, not a payment-wrapped fetch. Adding a SIWX hook to a payment client can still fall through to payment; it is not a trial-only policy. Use the separate paid guide only after explicitly choosing to pay.
If the promise rejects, stop and inspect the error. Do not repeat uncertain business work or automatically switch to payment.
Run locally with an existing EOA key
Use Node.js 22+ in a new project directory. Supply TRIAL_PRIVATE_KEY securely in your local environment before running; never paste it into this site or into source code. Review downloaded code before executing it.
Download the complete trial.js example. Replace its documented example input with your own data where needed.
npm init -y
npm pkg set type=module
npm install @x402/extensions viem
curl --fail 'https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/apis/token-verdict/trial.js' -o trial.js
node trial.js
// Node.js 22+ ES module. Use an existing EOA key locally; never send it to the seller.
// npm init -y && npm pkg set type=module && npm install @x402/extensions viem
import { privateKeyToAccount } from "viem/accounts";
const privateKey = process.env.TRIAL_PRIVATE_KEY;
if (!/^0x[0-9a-fA-F]{64}$/.test(privateKey ?? "")) throw new Error("Set an existing EOA's TRIAL_PRIVATE_KEY locally.");
const existingSigner = privateKeyToAccount(privateKey);
// npm install @x402/extensions
// existingSigner is your EVM EOA signer with address and signMessage({ message }).
// Use plain fetch, never a payment-wrapped fetch, for trial-only access.
import { wrapFetchWithSIWx } from "@x402/extensions/sign-in-with-x";
const trialFetch = wrapFetchWithSIWx(fetch, existingSigner);
const response = await trialFetch("https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/crypto/token-verdict", {
method: "POST",
headers: { "content-type": "application/json", accept: "application/json" },
body: JSON.stringify({
"tokenAddress": "0x4200000000000000000000000000000000000006"
}),
redirect: "error",
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Trial stopped: HTTP ${response.status}. Do not automatically retry or pay.`);
if (response.headers.get("x-access-mode") !== "trial" ||
response.headers.get("x-trial-status") !== "charged" ||
response.headers.get("x-trial-accounting-status") !== "confirmed" ||
response.headers.has("payment-response") || response.headers.has("x-payment-response")) {
throw new Error("Trial accounting is unconfirmed. Do not repeat this request or pay.");
}
console.log(await response.json());
// No payment signer, paid fallback, or application retry loop is installed.
Optional strict helper: quote, challenge, and accounting validation
The official SDK handles SIWX authentication. For additional advertised-grant, expected-price, network, timestamp and result checks, download the maintained trial-client.js and use fetchTrial. Neither approach automatically pays.
// Download from the trusted seller origin: curl --fail "https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/assets/trial-client.js" -o trial-client.js
// existingSigner is your existing EVM EOA signer: address and signMessage({ message }).
// No deposit, payment signing, or private-key export is needed.
// Execution requires remaining credit, daily budget, and API availability.
import { fetchTrial } from "./trial-client.js";
const outcome = await fetchTrial({
url: "https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/crypto/token-verdict",
network: "eip155:8453", quotedAmountAtomic: "15000",
body: {
"tokenAddress": "0x4200000000000000000000000000000000000006"
},
signer: existingSigner,
});
console.log(JSON.stringify(outcome.result, null, 2));
// A rejected promise stops this attempt. Do not automatically retry or pay.
Download the strict Node.js example
Manual authentication protocol
A valid request without payment headers can discover a SIWX challenge. Sign once and resend the identical URL, method, and body with SIGN-IN-WITH-X. Empty requests only discover the API. The canonical challenge is in the PAYMENT-REQUIRED header, not a cached directory entry.
Ready for continued use? Set up explicit paid API calls at the listed price. This quickstart never falls back to payment.
Continue with paid API calls
$0.015 per request, paid in USDC on Base. Use the same API URL and JSON body. Payment is an explicit choice in your own client; this page never pays.
- Prepare your existing EVM payment signer with USDC on the network above.
- Install
@x402/fetchand@x402/evmin your Node.js ES module project. - Review the price cap below and replace the example body with your input before running.
Show a paid integration example
// Explicit paid usage. existingPaymentSigner must support address and signTypedData.
// It must hold USDC on the configured network. This code authorizes a payment.
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
const paidFetch = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(existingPaymentSigner) }],
paymentRequirementsSelector(version, accepts) {
const quote = version === 2 && accepts.find((item) =>
item.scheme === "exact" && item.network === "eip155:8453" &&
item.asset.toLowerCase() === "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" &&
item.payTo.toLowerCase() === "0x9cd3f0d8a73a9a87f752f09d220652dc7de398cc" &&
/^[0-9]+$/.test(item.amount) && BigInt(item.amount) > 0n &&
BigInt(item.amount) <= 15000n);
if (!quote) throw new Error("No payment quote within the displayed price and network.");
return quote;
},
});
const response = await paidFetch("https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/crypto/token-verdict", {
method: "POST", redirect: "error",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"tokenAddress": "0x4200000000000000000000000000000000000006"
}),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}. Inspect before retrying.`);
console.log(await response.json());Keep your application's spending limits in place for repeated calls. After an uncertain trial result, resolve its status before issuing another request.
Inspect access requirements (returns 402)
Analyze a selected Base token pool: USD liquidity, 24h volume, price change, rule-based observations and an AI summary with sources. For agent market reports, not contract-security checks or investment advice.
POST /api/v1/crypto/token-verdict
Send the documented JSON body. Invalid input is rejected before payment or upstream execution. An empty request does not execute the API.
This curl example only inspects access requirements. It sends no payment or wallet proof and does not return a business result. HTTP 402 is expected. Use the trial-only quickstart above to request a result without paying. A paid call requires an explicit x402 payment using a compatible client.
The input below uses WETH's ERC-20 address on Base, not the native ETH sentinel.
curl --request 'POST' 'https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/crypto/token-verdict' \
--header 'Content-Type: application/json' \
--data-raw '{
"tokenAddress": "0x4200000000000000000000000000000000000006"
}'
Illustrative response · Not live data
This is a synthetic contract example, not a live result or a current WETH market quote. Actual results depend on the submitted input and upstream availability.
{
"token": {
"address": "0x1111111111111111111111111111111111111111",
"name": "Example Token",
"symbol": "EXAMPLE"
},
"pool": {
"address": "0x2222222222222222222222222222222222222222",
"dex": "example-dex",
"selectionMethod": "highest_liquidity",
"createdAt": "2026-01-01T00:00:00.000Z"
},
"metrics": {
"priceUsd": "0.002",
"liquidityUsd": 5000,
"volume24hUsd": 1000,
"priceChange24hPercent": -5,
"buys24h": 10,
"sells24h": 12,
"poolAgeHours": 48
},
"rulesVersion": "v1",
"signals": [
{
"code": "LOW_LIQUIDITY",
"description": "The selected pool has less than $10,000 in reported liquidity."
}
],
"summary": "The selected pool has limited liquidity and a reported 5% decline over 24 hours. This is a market observation, not a security assessment or trading recommendation.",
"provenance": {
"provider": "dexscreener",
"url": "https://dexscreener.com/base/0x2222222222222222222222222222222222222222",
"fetchedAt": "2026-01-03T00:00:00.000Z",
"sourceUpdatedAt": null
},
"limitations": [
"Metrics describe one selected pool, not the entire token market.",
"The provider's underlying data update time is unknown."
]
}
Schemas & documentation
These schemas come from the same API descriptor used for validation and discovery. Read the complete OpenAPI contract for responses, errors, and access requirements.
Request JSON Schema
{
"type": "object",
"additionalProperties": false,
"required": [
"tokenAddress"
],
"properties": {
"tokenAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"not": {
"const": "0x0000000000000000000000000000000000000000"
},
"description": "A Base ERC-20 contract address, not the native ETH sentinel."
}
}
}Response JSON Schema
{
"type": "object",
"description": "The response example is illustrative synthetic data, not a live token quote or assessment.",
"additionalProperties": false,
"required": [
"token",
"pool",
"metrics",
"signals",
"rulesVersion",
"summary",
"provenance",
"limitations"
],
"properties": {
"token": {
"type": "object",
"additionalProperties": false,
"required": [
"address",
"name",
"symbol"
],
"properties": {
"address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"name": {
"type": [
"string",
"null"
],
"maxLength": 128
},
"symbol": {
"type": [
"string",
"null"
],
"maxLength": 64
}
}
},
"pool": {
"type": "object",
"additionalProperties": false,
"required": [
"address",
"dex",
"selectionMethod",
"createdAt"
],
"properties": {
"address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"dex": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"selectionMethod": {
"const": "highest_liquidity"
},
"createdAt": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"
}
}
},
"metrics": {
"type": "object",
"additionalProperties": false,
"required": [
"priceUsd",
"liquidityUsd",
"volume24hUsd",
"priceChange24hPercent",
"buys24h",
"sells24h",
"poolAgeHours"
],
"properties": {
"priceUsd": {
"type": "string",
"maxLength": 128,
"pattern": "^(?:0|[1-9]\\d*)(?:\\.\\d+)?$"
},
"liquidityUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"volume24hUsd": {
"type": [
"number",
"null"
],
"minimum": 0
},
"priceChange24hPercent": {
"type": [
"number",
"null"
]
},
"buys24h": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"sells24h": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"poolAgeHours": {
"type": [
"number",
"null"
],
"minimum": 0
}
}
},
"rulesVersion": {
"const": "v1"
},
"signals": {
"type": "array",
"maxItems": 4,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"code",
"description"
],
"properties": {
"code": {
"enum": [
"LOW_LIQUIDITY",
"NEW_POOL",
"LARGE_PRICE_MOVE",
"INCOMPLETE_DATA"
]
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
}
},
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 1200
},
"provenance": {
"type": "object",
"additionalProperties": false,
"required": [
"provider",
"url",
"fetchedAt",
"sourceUpdatedAt"
],
"properties": {
"provider": {
"const": "dexscreener"
},
"url": {
"type": "string",
"pattern": "^https://dexscreener\\.com/base/0x[0-9a-f]{40}$"
},
"fetchedAt": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"
},
"sourceUpdatedAt": {
"type": "null"
}
}
},
"limitations": {
"type": "array",
"minItems": 1,
"maxItems": 32,
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
}
}How your submitted data is used
Quality review is enabled: executed paid and trial request/response bodies, including uploaded documents and images, are retained in private storage for operator review. Deletion is scheduled after 30 days and runs asynchronously. Authentication and payment headers are not recorded. Do not submit secrets or unnecessary personal data.