For agents and scripts

The same answers as JSON.

Read-only. No key, no sign-up. 1,000 requests a day per IP address, shared by MCP and HTTP. Resets at midnight UTC.

Every route also has a short limit per IP address: 60 requests a minute for pages, JSON, /v1, /mcp and the card and chip embeds, and 20 requests a minute for images (/preview and the other /embed files). Health checks and static files are not limited. Over a limit the answer is 429 with a Retry-After header (seconds), and on /v1, /mcp and JSON the same error body as the daily budget; wait and try again.

01

Connect

Add the MCP server to Claude, Cursor or any client. No key.

https://mcp.underticker.com/mcp

02

Ask

Or call plain HTTP from any script.

curl -s 'https://api.underticker.com/v1/search?q=Tesla'

03

Tell your agent

One file that explains the site to a model.

https://underticker.com/llms.txt

lookup

One token or asset, as a single object — the word wallets and agents use for this lookup.

A ticker, a name, a full contract address or mint, or a CAIP-10 id (at most 200 characters)
A full wallet address (optional). This tool doesn’t check the wallet, so every row returns unknown. Use check_hold for supported token versions.
Optional. Set this to "exact" to search only for the text as typed, without close matches or suggestions. If omitted, the response may return a close match or a suggested asset and labels it accordingly.
Filter to one chain (optional), over a ticker or a name: its short name in any case (Solana), its chain id or its CAIP-2 id. The answer is the same underlying, its contrast recomputed on that chain's forms alone, with a link back to every chain. A chain the catalog does not hold is the honest empty answer, with the chains it does hold. Given with no query, or alongside class, form or issuer below, it instead answers a listing: every catalogued form on that chain (or narrowed by the others too), one or more chains comma-separated and OR'd within this one filter.
Narrow a listing to one or more classes, comma-separated, by the class's own name (see GET /v1/classes for the exact spelling of each: Stocks, Treasuries, Sovereign, Private equity, Strategies, Commodities, Real estate). Turns this into a listing (see chain, above); left out with every other filter, the plain search runs as before.
Narrow a listing to one or more forms, comma-separated (share, claim, tracker, the not-yet-read claim, unconfirmed, unofficial — the same words a listing's own rows carry, in any case, or their display word, such as "Claim not read yet" or "not read yet"). Turns this into a listing (see chain, above).
Narrow a listing to one or more issuers, comma-separated, by the issuer's own id (the tool that lists every issuer gives each one's id). Turns this into a listing (see chain, above).
Narrow a listing to how its books read: a public ledger, private but need to know, or inside one venue. Turns this into a listing (see chain, above); no row carries one yet, so this matches nothing today.
The most rows a listing gives back (default 50, at most 50: a larger number, or "all", gives 50). Only used once class, form, issuer or chain turns this into a listing.
Force the listing answer (optional) even when chain alone is given together with a query, which otherwise keeps its own chain-slice meaning (see chain, above). Set to "1" to match a composer link that lists a chain's forms alongside typed text.

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

passport

Full details for one token, including what the holder gets, rules checked onchain and its documents, given the chain and full address.

The chain: its short name in any case (Ethereum, Base, BNB, Solana, Robinhood, Arbitrum, Avalanche, Polygon, ZKsync), its chain id (1) or its CAIP-2 id (eip155:1)
The token's full contract address, or its full mint on Solana (at most 200 characters)
A full wallet address (optional). This tool doesn’t check the wallet, so every row returns unknown. Use check_hold for supported token versions.

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

resolve

Resolve a contract or mint to the underlying asset it belongs to (the same answer as search).

A ticker, a name, a full contract address or mint, or a CAIP-10 id (at most 200 characters)
A full wallet address (optional). This tool doesn’t check the wallet, so every row returns unknown. Use check_hold for supported token versions.
Optional. Set this to "exact" to search only for the text as typed, without close matches or suggestions. If omitted, the response may return a close match or a suggested asset and labels it accordingly.
Filter to one chain (optional), over a ticker or a name: its short name in any case (Solana), its chain id or its CAIP-2 id. The answer is the same underlying, its contrast recomputed on that chain's forms alone, with a link back to every chain. A chain the catalog does not hold is the honest empty answer, with the chains it does hold. Given with no query, or alongside class, form or issuer below, it instead answers a listing: every catalogued form on that chain (or narrowed by the others too), one or more chains comma-separated and OR'd within this one filter.
Narrow a listing to one or more classes, comma-separated, by the class's own name (see GET /v1/classes for the exact spelling of each: Stocks, Treasuries, Sovereign, Private equity, Strategies, Commodities, Real estate). Turns this into a listing (see chain, above); left out with every other filter, the plain search runs as before.
Narrow a listing to one or more forms, comma-separated (share, claim, tracker, the not-yet-read claim, unconfirmed, unofficial — the same words a listing's own rows carry, in any case, or their display word, such as "Claim not read yet" or "not read yet"). Turns this into a listing (see chain, above).
Narrow a listing to one or more issuers, comma-separated, by the issuer's own id (the tool that lists every issuer gives each one's id). Turns this into a listing (see chain, above).
Narrow a listing to how its books read: a public ledger, private but need to know, or inside one venue. Turns this into a listing (see chain, above); no row carries one yet, so this matches nothing today.
The most rows a listing gives back (default 50, at most 50: a larger number, or "all", gives 50). Only used once class, form, issuer or chain turns this into a listing.
Force the listing answer (optional) even when chain alone is given together with a query, which otherwise keeps its own chain-slice meaning (see chain, above). Set to "1" to match a composer link that lists a chain's forms alongside typed text.

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

check_hold

Checks one supported onchain rule for one wallet and token version.

The form: its CAIP-10 id (eip155:43114:0x…), or its full contract address or Solana mint
The full wallet address to check, on the form's chain (at most 200 characters)

chain optional

The chain, when the address is a bare EVM address: its short name in any case (Avalanche), its chain id (43114) or its CAIP-2 id (eip155:43114)

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

check_contract

Whether a contract is an official version of an asset we cover.

The contract's full address or Solana mint, or its CAIP-10 id
The chain, when the address is a bare EVM address: its short name in any case (Avalanche), its chain id (43114) or its CAIP-2 id (eip155:43114)
The underlying it should be (optional): its id (us.equity.tsla) or its listed ticker (TSLA)

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

list_issuers

Up to 50 issuers we cover, who they are and what they put onchain.

Run this one from an MCP client; its arguments are above.

Response

Nothing to run here yet: see its arguments beside this.

get_issuer

One issuer: its legal entity, the lists checked for it and every token version it puts onchain.

id required
The issuer's own id (the tool that lists every issuer gives each one's id)

Run this one from an MCP client; its arguments are above.

Response

Nothing to run here yet: see its arguments beside this.

list_classes

Every class used to group the assets we cover, and what has been checked in each.

Run this one from an MCP client; its arguments are above.

Response

Nothing to run here yet: see its arguments beside this.

claims_spotlight

Returns the effective date and issuer-listed denominator, counts by section and class, examples, 14-fact rights counts, source conflicts, documents and the disclaimer.

Filter counts and examples to one class ID; GET /v1/classes lists the IDs.
Filter counts and examples to one issuer ID; list_issuers lists the IDs.
Filter counts and examples to one chain slug.
Show examples for one section only: share, claim, tracker or not_read.

Response

// Press Run to see the answer

Note: If you go over the free daily limit, the API returns 429 with {"code":"RATE_LIMITED"} and a message saying when your limit resets.

Lists

GET /v1/search?class=&issuer=&chain=

A list returns at most 50 results and says how many matched. If more matched, the same 50 appear all day and change the next day. Narrow the filter to see the others.

One token

GET /v1/passport?chain=&address=

Everything we know about one token, with supporting evidence.

One asset

GET /v1/underlyings/{id}/deployments

Every token for one asset, in page order.

Check a wallet

POST /v1/check

Check a wallet and get a result ID. There’s no public link unless you share it.

Rights

GET /v1/claims-spotlight

Returns the effective date and issuer-listed denominator, counts by section and class, examples, 14-fact rights counts, source conflicts, documents and the disclaimer. /claims /claims?format=json

Every page is its own JSON too: add ?format=json to any address, like /tsla?format=json.

Put one line next to your buy button. It says what the token is and links here. It fits widths from 320 to 600, in light or dark mode.

<iframe src="https://underticker.com/embed/chip?chain=solana&amp;address=XsDoVfqeBukxuZHWhdvWHBhgEHjGNst4MLodqsJHzoB" width="100%" height="120" title="TSLAx on Under the Ticker" loading="lazy" style="border:0;max-width:600px;color-scheme:light"></iframe>