Launchpad venue policy (URC-5)
Every token launched on the Standard Reserve launchpad v2 can say, on chain, which Uniswap v4 pools are its official venues. The standard for that is URC-5, "Token Venue Policy" (also at urc5.org). This page explains what the policy means and which routes report it. The dashboard page Check a pool asks the same question for one pool.
Launchpad v1 launches predate URC-5, and STANDARD itself does not implement it. Both routes below cover v2 launch tokens only.
What a token declares
A token that supports URC-5 answers three questions on chain:
- Mode.
Enforcedmeans routers that follow URC-5 must not use a v4 pool outside the token's list.Preferredmeans the listed pools are recommended and other venues are allowed. - Official pools. The pools the token calls its own, most preferred first. The API names them
canonical_pools. - Outside venues. Flags for non-v4 venues, plus a directional allowlist (
external_venues).
URC-5 is a declaration. It does not stop anyone from creating a pool or trading in it. It tells routers and aggregators which pools the token wants used, and an Enforced token asks them to honor that.
Graduation and the official-pool list
A launchpad token lists no official pool until it graduates. Before graduation, a token in Enforced mode allows no v4 pool at all, so any v4 pool that already holds the token is off-list and not allowed. After graduation the list holds the token's own pool. launch.graduated is true when the token lists an official pool or the curve's graduation event was indexed, and launch.graduated_via says which (canonical_pool or graduation_event).
Creator choice is not the live mode
At launch the creator picks where the token should trade after graduation: "Only in its own pool" or "Trades anywhere". The API reports that as launch.creator_venue_choice (own_pool_only or trades_anywhere).
It is not the token's current mode. It takes effect at graduation, once the token lists an official pool. Read venue_policy.mode for what the token says now. In the data, as of 28 October 2026, every ungraduated v2 token reads Enforced, including hundreds that launched with "Trades anywhere". That is what the data shows today, not a rule of URC-5.
Off-list, allowed and not allowed
Two fields carry the meaning, and they answer different questions:
statussays whether the pool is on the token's own list.canonicalmeans it is.off_listmeans the token's policy has been read and the pool is not on it. It isnullif the policy has not been read.allowed_by_policysays whether the token's policy lets routers use the pool. In Preferred mode it istruefor every pool. In Enforced mode it istrueonly for a canonical pool. It isnullwhen the mode has not been read.
So an off-list pool is not automatically a problem. An off-list pool on a Preferred token is allowed. An off-list pool on an Enforced token is not allowed, and that is the case to watch. Off-list means "not on the token's list" and nothing more: the API does not say why a pool exists or who created it.
A pool can hold two launchpad v2 tokens. It then appears once per token, each judged by that token's own policy.
In-range liquidity
in_range_liquidity_raw is the liquidity active at the pool's current price, meaning the part of the deposits that can fill a trade right now. It is not total deposits. A pool can hold funds and still report zero in range, because its deposits sit at prices the market has moved away from. has_in_range_liquidity is the yes-or-no version. The raw value is an integer string, like other _raw fields (see How to read a TSR response).
Freshness and withheld answers
Policy and pool values are the last snapshot reads from chain, at read_block and state_read_block. They are not live reads, and each response carries an assumptions line saying so.
Stale data is withheld, not guessed at:
- Token route. If the token's policy read or its pools' state reads are too old, the route answers
503withlast_good_blockand no classification. Otherwise the response carriesserving_state(freshorlagging) andlag_blocks. - Venues route. One old row does not take the route down. That row has
stale: trueand anullclassification (ornullliquidity and price, for a pool whose state read is old), and apool_idlookup on it answersunknown. Tokens in that state are counted intokens_withheld, and pools whose tokens are all withheld are counted inpools_withheld. Neither appears in any classification count. If even the newest read is too old, the whole route answers503.
A null here means "not read recently". It never means "allowed" or "not allowed".
Which route answers which question
| Question | Route | MCP tool |
|---|---|---|
| What is this token's mode, and what are its official pools? | GET /v1/launchpad/tokens/{address} | 1s_std_launchpad_token |
| Which v4 pools hold this token, and is each official and allowed? | GET /v1/launchpad/tokens/{address} | 1s_std_launchpad_token |
| What did the creator pick at launch, and has the token graduated? | GET /v1/launchpad/tokens/{address} | 1s_std_launchpad_token |
| How has this token's policy changed? | GET /v1/launchpad/tokens/{address} (policy_history) | 1s_std_launchpad_token |
| How many tokens and pools are there, in each mode and status? | GET /v1/launchpad/venues | 1s_std_launchpad_venues |
| Which off-list pools does their token's policy not allow? | GET /v1/launchpad/venues (add scope=all for every pool) | 1s_std_launchpad_venues (scope) |
| Is this one pool official, and is it allowed? | GET /v1/launchpad/venues?pool_id=0x... | 1s_std_launchpad_venues (pool_id) |
The token route answers 404 for an address that is not a launchpad v2 token, 400 for a malformed address, and 503 when withheld. The venues route lists pools newest first and pages with before (pass next_before from the previous page). An unknown query parameter, or a bad scope, pool_id or before, is a 400.
One token
GET /v1/launchpad/tokens/{address} returns launch, venue_policy, pools, summary and policy_history. This excerpt is from the OpenAPI example, for a token that has not graduated and has one off-list pool:
{
"launch": {
"graduated": false,
"graduated_via": null,
"creator_venue_choice": "trades_anywhere"
},
"venue_policy": {
"supports_urc5": true,
"mode": "enforced",
"canonical_pools": []
},
"pools": [
{
"status": "off_list",
"allowed_by_policy": false,
"in_range_liquidity_raw": "1000000000000000000",
"has_in_range_liquidity": true
}
],
"summary": {
"pools_total": 1,
"canonical": 0,
"off_list": 1,
"off_list_not_allowed": 1,
"off_list_not_allowed_with_liquidity": 1
}
}
The creator chose "Trades anywhere", yet the live mode is Enforced and the pool is not allowed. That is the gap between creator choice and live mode, and it is what an ungraduated token looks like in the data as of 28 October 2026.
Chain-wide
GET /v1/launchpad/venues returns counts, a page of pools, next_before and freshness. By default the list holds only off-list pools that the token's policy does not allow. This is the counts block from the OpenAPI example:
{
"counts": {
"tokens": 469,
"tokens_withheld": 0,
"supporting_urc5": 469,
"mode_enforced": 465,
"mode_preferred": 4,
"graduated": 9,
"pools": 91,
"canonical_pools": 9,
"off_list_pools": 82,
"off_list_not_allowed": 32,
"off_list_not_allowed_with_liquidity": 5
}
}
Counts are over distinct pools. A pool counts as off-list or not allowed if it is so for either of its tokens.
With pool_id, the response also carries pool_lookup: an answer, a plain-language message, and one entry per token in tokens. The answer is one of these:
answer | Meaning |
|---|---|
official | The pool is on the token's official list. |
not_official_allowed | Not on the list, but the token is in Preferred mode, so routers may still use it. |
not_official_not_allowed | Not on the list and the token is Enforced, so routers that follow URC-5 must not use it. |
not_official | Not on the list, and the token's mode has not been read, so whether it is allowed is unknown. |
unknown | The token's policy has not been read, or not recently, so the pool cannot be classed. |
not_found | No launchpad v2 token trades in this pool, or the pool has not been indexed yet. |
If a pool holds two v2 tokens, answer is the most restrictive of the per-token answers.
What this does not tell you
- It reports what a token declares and whether a pool is on that list. It does not say whether a particular router honors URC-5.
- The values are snapshot reads, not live chain reads. Check
read_block,state_read_blockandserving_statebefore acting on one. off_listdescribes a list. It says nothing about intent or quality.
See also Launchpad charter drops for the other half of launchpad v2, and Contracts and addresses for the factory addresses. The MCP tool 1s_std_launchpad_venues takes scope, pool_id, limit and before.