Building with an AI Agent or LLM?
The Myriad CLI is the best, fastest, way to get your agent trading on Myriad Markets.
npm install -g @myriadmarkets/cliThis document describes the public REST API exposed by the Myriad Protocol API service.
Base URLAuthenticationRate LimitingPaginationQuestionsGET /questionsGET /questions/:idMarketsGET /marketsGET /markets/:idGET /markets/:id/eventsGET /markets/:id/referralsGET /markets/:id/holdersPOST /markets/quotePOST /markets/quote_with_feePOST /markets/claimUsersGET /users/:address/eventsGET /users/:address/referralsGET /users/:address/portfolioGET /users/:address/marketsTagsGET /tagsTopicsGET /topicsPrice DataErrorsNetworksBNB Smart ChainOther chainsAbstractLineaCeloAuditsOrder BookAMMChangelogV2.0.0V2.0.1V2.0.2V2.0.3V2.0.4
Base URL
- Production -
https://api-v2.myriadprotocol.com/
Authentication
API access is public, with higher rate limits if an API key is provided.
Some endpoints require authentication and whitelisting, such as
/markets/quote_with_fee .How to authenticate your request:
- Header:
x-api-key: <your_api_key>
- Or Query:
?api_key=<your_api_key>
To obtain an API key, please reach out to the Myriad team.
Rate Limiting
- Requests with API key - 200 requests/second per IP and/or API key.
- Requests w/o API key - 30 requests/10 seconds per IP
- Headers included on responses:
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset
Pagination
All list endpoints support pagination:
page(default: 1)
limit(default: 20, max: 100)
Response pagination object:
json{ "pagination": { "page": 1, "limit": 20, "total": 123, "totalPages": 7, "hasNext": true, "hasPrev": false } }
Questions
A question is the canonical proposition (title + expiration), independent of which chain itβs traded on.
The same question can have multiple markets across different chains, each with its own liquidity, prices, and activity.
Questions endpoints return the question with all its markets and a marketCount, letting clients compare performance across chains and build crossβchain summaries, while trading/price data remains perβmarket.
GET /questions
Paginated list of questions with associated markets and outcome summaries.
Query params:
page,limit
keyword: search in question title
min_markets: minimum number of linked markets
max_markets: maximum number of linked markets
Example:
plain textGET /questions?keyword=politics&page=2&limit=20&min_markets=2&max_markets=10
Response shape:
{ data, meta }. Unlike other list endpoints, /questions wraps pagination in a meta object that also carries a totalMarkets count:json{ "data": [ /* questions */ ], "meta": { "total": 42, "totalMarkets": 130, "page": 1, "limit": 20, "totalPages": 3, "hasNext": true, "hasPrev": false } }
Data (per question):
id,title,expiresAt
marketCount: number of linked markets
markets: array of full market objects (same shape asGET /marketsitems, includingoutcomes,oracle,externalSources, etc.)
GET /questions/:id
Get a single question with markets and outcomes.
Example:
plain textGET /questions/1
Returns the question object directly (not wrapped in
data/meta):id,title,expiresAt
marketCount: number of linked markets
markets: array of full market objects (same shape asGET /marketsitems, includingoutcomes,oracle,externalSources, etc.)
Markets
GET /markets
Paginated list of markets with filtering and sorting.
Query params:
page,limit(pagination)
sort:volume|volume_24h|volume_notional|volume_notional_24h|liquidity|expires_at|published_at|in_play_starts_at|featured(default:volume)
order:asc|desc(default:desc)
network_id: comma-separated list of network ids (e.g.2741,59144)
state:open|closed|resolved
token_address: comma-separated list of ERC20 token addresses
oracle_address: comma-separated list of oracle contract addresses (matched case-insensitively)
topics: comma-separated list of topics
tags: tag slug(s) to filter by. Repeat the param to AND multiple groups; comma-separate within a value to OR (e.g.tags=world-cup&tags=stage-a,stage-bβworld-cup AND (stage-a OR stage-b))
exclude_tags: comma-separated tag slugs to exclude (a market matching ANY is filtered out)
keyword: full-text search acrosstitle,description, and outcome titles
ids: comma-separated list of on-chain market ids
event_id: filter to markets belonging to a single event (UUID)
in_play: boolean (true/false/1/0)
moneyline: boolean (true/false/1/0)
min_duration: minimum market duration in seconds (filters byexpiresAt - publishedAt)
max_duration: maximum market duration in seconds (filters byexpiresAt - publishedAt)
group_by_event: boolean (true/false/1/0). Whentrue, sibling markets sharing an event are collapsed into a single event row ({ type: "event", ... }); standalone markets are returned as{ type: "market", ...market }. Pagination then operates on logical rows.
Fee filters
Filter markets by protocol fees (decimals between 0 and 1). Fees can be filtered separately for buy and sell, for individual components or by total.
- Components:
lp(liquidity provider fee, fieldfee)dt(distributor fee, fielddistributor_fee)tr(treasury fee, fieldtreasury_fee)total=fee + treasury_fee + distributor_fee
- Actions:
buy,sell
- Operators:
lt,lte,gt,gte,eq
- Parameter patterns:
- Component-specific:
{action}_{component}_fee_{operator}(e.g.,buy_lp_fee_lte=0.01) - Total:
{action}_fee_{operator}(e.g.,sell_fee_lt=0.02)
- Examples:
buy_lp_fee_lte=0.01β buy LP fee β€ 1%sell_tr_fee_gte=0.0025β sell treasury fee β₯ 0.25%buy_dt_fee_eq=0.003β buy distributor fee = 0.3%sell_fee_lt=0.02β total sell fee < 2%
- Notes:
- Multiple fee filters are combined with AND.
- All fee values are decimals (e.g., 0.01 = 1%).
Example:
plain textGET /markets?keyword=eth&network_id=2741&page=1&limit=20&sort=volume_24h
Response data (per market):
id: blockchain market id
networkId: number
slug,title,shortName,ctaName,description
publishedAt,expiresAt,resolvesAt
fees,state,voided,resolvedOutcomeId,topics,tags,resolutionSource,resolutionTitle
token:{ address, symbol, name, decimals }
imageUrl,bannerImageUrl,ogImageUrl
liquidity,liquidityPrice,volume,volume24h,volumeNotional,volumeNotional24h,users,shares
featured,featuredAt,inPlay,inPlayStartsAt,perpetual,moneyline
oracle: always-present object{ address, name, url, image_url, data }.address/dataarenullfor markets Myriad resolves itself;name/url/image_urlare always populated (brand metadata).
externalSources: array of{ id, providerName, externalMarketId, externalMarketUrl, externalMarketTitle }(may be empty)
topHolders: array (may be empty)
outcomes: array with:id(on-chain outcome id)titleprice,closingPrice,priceChange24hshares,sharesHeldholdersimageUrltokenId: ERC1155 token id ((ethMarketId << 1) | outcomeId)
Order Book / event fields (present on every market regardless of trading model β see the Order Book API reference):
executionMode:0(AMM) or1(Order Book)
tradingModel:"amm"or"ob"(string form ofexecutionMode)
eventId: parent event UUID, ornullfor standalone markets
outcomeIndex: index within the parent event, ornull
negRisk: boolean β whether the market belongs to a NegRisk (mutually-exclusive) event
Notes:
- Numeric monetary/decimal fields are returned as numbers.
GET /markets/:id
Get a single market by slug or by
marketId + network_id.Modes:
- By slug:
GET /markets/{slug}
- By id + network:
GET /markets/{marketId}?network_id=2741
Price charts:
- Field
outcomes[*].price_charts.
- Timeframes and buckets
24h: 5-minute (max 288)7d: 30-minute (max 336)30d: 4-hour (max 180)all: 4-hour
- Series end at
min(now, expiresAt)with backfill from the last known price before the window start.
Example:
plain textGET /markets/164?network_id=2741
GET /markets/:id/events
Paginated actions (trades/liquidity/claims) for a market, ordered by
timestamp desc.Lookup:
- By slug:
GET /markets/{slug}/events
- By id + network:
GET /markets/{marketId}/events?network_id=2741
Query params:
page,limit
since: unix seconds (inclusive)
until: unix seconds (inclusive)
only_relevant:1/true/yesto exclude wash-trade actions (whererelevant = false)
Response items:
user: wallet address
action:buy|sell|add_liquidity|remove_liquidity|claim_winnings|claim_liquidity|claim_fees|claim_voided
marketTitle,marketSlug,marketId,networkId
outcomeTitle,outcomeId
imageUrl
shares,value: numbers
timestamp: unix seconds
blockNumber: number
token: ERC20 token address used for this market
txId: transaction hash
Example:
plain textGET /markets/164/events?network_id=2741&since=1755600000&until=1755800000&page=1&limit=50
GET /markets/:id/referrals
Paginated referrals for a market, ordered by
timestamp desc.Lookup:
- By slug:
GET /markets/{slug}/referrals
- By id + network:
GET /markets/{marketId}/referrals?network_id=2741
Query params:
page,limit
since: unix seconds (optional, inclusive)
until: unix seconds (optional, inclusive)
code: referral code (optional)
Response items (camelCase):
user: wallet address
action:buy|sell(referral trade type)
marketTitle,marketSlug,marketId,networkId
outcomeTitle,outcomeId
imageUrl
value: number (trade value that generated referral fees)
timestamp: unix seconds
blockNumber: number
token: ERC20 token address used for this market
code: referral code used
fees:lp(number): LP fee portion attributed to this referraltreasury(number): treasury fee portiondistributor(number): distributor/referrer fee portion
Example:
plain textGET /markets/164/referrals?network_id=2741&since=1755600000&until=1755800000&page=1&limit=50
GET /markets/:id/holders
Market holders grouped by outcome. Aggregates buy/sell actions to compute net shares per user for each outcome, filters holders with at least 1 share, orders by shares, and applies the
limit per outcome.Lookup:
- By slug:
GET /markets/{slug}/holders
- By id + network:
GET /markets/{marketId}/holders?network_id=2741
Query params:
page,limit(pagination; limit applies per outcome)
network_id(required when using marketId)
Response data (per outcome):
outcomeId: number
outcomeTitle: string | null
totalHolders: total addresses with β₯ 1 share in this outcome
holders: array limited per outcome with:user: addressshares: number
Pagination notes:
totalequals the maximumtotal_holdersacross outcomes for this market.
totalPages = ceil(max(total_holders) / limit);limitis applied per outcome.
Example:
plain textGET /markets/164/holders?network_id=2741&page=1&limit=50
POST /markets/quote
Get a trade quote and transaction calldata for a specific market outcome.
- Method: POST
- Path:
/markets/quote
- Body: JSON
Request body:
- Exactly one of the following is required (send only one):
market_id(number): on-chain market id +network_id(number): network idmarket_slug(string)
outcome_id(number, required): on-chain outcome id
action(string, required):buy|sell
- Exactly one of the following is required (send only one):
value(number): amount of tokens to spend (buy) or receive (sell)shares(number): number of shares to buy or sell
slippage(number, optional, default 0.005): between 0 (0%) and 1 (100%)
Validation rules:
- For buy: provide only
value;sharesmust be omitted.
- For sell: provide exactly one of
valueorshares.
- Market must exist and be
open.
- Market must have at least 2 outcomes and sufficient shares/liquidity.
Response body:
value(number): input value used for the calculation
shares(number): expected shares bought/sold
shares_threshold(number): min acceptable based onslippage(for buy, min shares; for sell, min value)
price_average(number): average execution price
price_before(number): price before the trade
price_after(number): price after the trade
calldata(string): hex-encoded calldata for the contract
net_amount(number): value after protocol/treasury/distributor fees
fees:treasury(number)distributor(number)fee(number)
Example request (buy by value):
json{ "market_id": 164, "outcome_id": 0, "network_id": 2741, "action": "buy", "value": 100, "slippage": 0.01 }
Example success response:
json{ "value": 100, "shares": 312.3456, "shares_threshold": 309.2221, "price_average": 0.3201, "price_before": 0.315, "price_after": 0.3252, "calldata": "0x...", "net_amount": 99.3, "fees": { "treasury": 0.2, "distributor": 0.1, "fee": 0.4 } }
Possible errors:
400Invalid request parameters, unsupported network, market not open, insufficient liquidity, or invalid slippage/value/shares combination
404Market or outcome not found
500Unable to resolve token decimals or unexpected server error
POST /markets/quote_with_fee
Select integrators can charge a frontend fee at the time of a trade by using bundled transactions (
wallet_sendCalls) that include a transfer plus the trade (and token approval when needed). The frontend fee is in addition to any of the standard fees that apply to markets, and which are managed by the smart contract.To use this flow, your dapp/wallet integration must support EIP-5792 transactions.
This endpoint requires API authentication and whitelisting. If youβre interested in using the Myriad API to charge frontend fees for your integration, please reach out to the Myriad team.
Get the trade quote plus an ordered set of EIP-5792
calls that can be sent via wallet_sendCalls to:- (Optionally) approve ERC20 collateral spending for the PredictionMarket contract (buy-only, included only when allowance is insufficient)
- Transfer a frontend fee to
to_wallet
- Execute the trade
Request body:
- All fields from
POST /markets/quote
fee(number, required): decimal fee rate, between 0 and 0.05 (e.g.0.01= 1%)
from_wallet(string, required): wallet that will sign/send the bundle (used for allowance+balance checks)
to_wallet(string, required): fee recipient wallet
Response body:
- All fields from
POST /markets/quote
fees.frontend(number): frontend fee amount in token units
approval:required(boolean)currentAllowanceWei(string, optional)requiredAllowanceWei(string, optional)
calldata(object): ready to pass towallet_sendCallsas the first (and only)paramsitem to an EIP-5792 capable walletversion:"2.0.0"from: sender address (same asfrom_wallet)chainId: hex chain id (derived from marketnetwork_id)atomicRequired:truecalls: ordered array of{ to, data, value }(hex quantities)
Example request (buy with 1% frontend fee):
json{ "market_id": 164, "outcome_id": 0, "network_id": 2741, "action": "buy", "value": 100, "slippage": 0.01, "fee": 0.01, "from_wallet": "0x0000000000000000000000000000000000000001", "to_wallet": "0x0000000000000000000000000000000000000002" }
Example success response:
json{ "value": 100, "shares": 107.71301097629218, "shares_threshold": 107.17444592141072, "price_average": 0.9191090203744288, "price_before": 0.89954079, "price_after": 0.9019004096700267, "calldata": { "version": "2.0.0", "from": "0x0000000000000000000000000000000000000001", "chainId": "0xab5", "atomicRequired": true, "calls": [ { "to": "0x55d398326f99059fF775485246999027B3197955", "data": "0x095ea7b300000000000000000000000039e66ee6b2ddaf4defded3038e0162180dbef3400000000000000000000000000000000000000000000000055de6a779bbac0000", "value": "0x0" }, { "to": "0x55d398326f99059fF775485246999027B3197955", "data": "0xa9059cbb00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0b6b3a7640000", "value": "0x0" }, { "to": "0x39E66eE6b2ddaf4DEfDEd3038E0162180dbeF340", "data": "0x1281311d00000000000000000000000000000000000000000000000000000000000023270000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000005cf581ebb20ffaa2d0000000000000000000000000000000000000000000000055de6a779bbac0000", "value": "0x0" } ] }, "net_amount": 97.02, "fees": { "treasury": 0, "distributor": 0.99, "fee": 0.99, "frontend": 1 }, "approval": { "required": true, "currentAllowanceWei": "0", "requiredAllowanceWei": "99000000000000000000" } }
Examples with two wallet providers:
Notes:
- Buy fee semantics: for
action="buy", the requestvalueis treated as the total amount charged from the user. The frontend fee is deducted first, and the trade is quoted/executed with the remaining amount. The responsevalueequals the total charged (same as request value).
- Sell fee semantics: for
action="sell", the frontend fee is charged after the trade, and the responsevaluereflects the amount after frontend fee deduction.
- Clients should strongly prefer requiring atomic bundling (i.e.
"atomicRequired": true) so the fee transfer is not executed without the trade.
- Insufficient balance (buy only): for
action="buy", thefrom_walletbalance is checked against the total spend (trade value + frontend fee). If it can't cover the total, the endpoint returns400with the token, current balance, and required amount (in wei).
Possible errors:
400Invalid request parameters; fee too high for the provided value; insufficientfrom_walletbalance (buy); plus anyPOST /markets/quoteerror
401Missing/invalid API key (no authenticated user)
403API key is not whitelisted for frontend fees
404Market or outcome not found
500Unable to resolve token decimals or unexpected server error
POST /markets/claim
Get a trade claim and transaction calldata for a specific market.
- Method: POST
- Path:
/markets/claim
- Body: JSON
Request body:
- Exactly one of the following is required (send only one):
market_id(number): on-chain market id +network_id(number): network idmarket_slug(string)
outcome_id(number, optional): on-chain outcome id (only required when market is voided)
Validation rules:
- Market must exist and be
resolved.
Response body:
action(string):claim_winnings|claim_voided, depending on whether the market is voided (both require the market to beresolved)
outcome_id: winning outcome id, or voided outcome id to be claimed
calldata(string): hex-encoded calldata for the contract
Example request (buy by value):
json{ "market_id": 164, "outcome_id": 0, "network_id": 2741 }
Example success response:
json{ "action": "claim_winnings", "outcome_id": 0, "calldata": "0x..." }
Possible errors:
400Invalid request parameters, unsupported network, market not resolved
404Market or outcome not found
500Unable to resolve token decimals or unexpected server error
Users
GET /users/:address/events
Paginated actions for a user across markets, ordered by
timestamp desc.Query params:
page,limit
market_id: chain market id (optional)
market_slug: market slug (optional; resolves to id/network for filtering)
network_id: number (optional)
token_address: comma-separated list of ERC20 token addresses (optional)
since: unix seconds (inclusive)
until: unix seconds (inclusive)
only_relevant:1/true/yesto exclude wash-trade actions (optional)
Response items:
user: wallet address
action: action type
marketTitle,marketSlug,marketId,networkId
outcomeTitle,outcomeId
imageUrl
shares,value: numbers
timestamp: unix seconds
blockNumber: number
token: ERC20 token address
txId: transaction hash
Example:
plain textGET /users/0x1234.../events?network_id=2741&market_id=144&page=1&limit=50
GET /users/:address/referrals
Paginated referrals attributed to a user across markets, ordered by
timestamp desc.Query params:
page,limit
market_id: chain market id (optional)
market_slug: market slug (optional; resolves to id/network)
network_id: number (optional)
since: unix seconds (optional, inclusive)
until: unix seconds (optional, inclusive)
code: referral code (optional)
Response items (camelCase):
user: wallet address (referrer or user recorded on referral)
action:buy|sell
marketTitle,marketSlug,marketId,networkId
outcomeTitle,outcomeId
imageUrl
value: number
timestamp: unix seconds
blockNumber: number
token: ERC20 token address
code: referral code used
fees:lp(number)treasury(number)distributor(number)
Example:
plain textGET /users/0x1234.../referrals?network_id=2741&market_id=144&page=1&limit=50
GET /users/:address/portfolio
Aggregated user positions per market/outcome/network, ordered by latest activity.
Query params:
page,limit
min_shares: minimum shares threshold per outcome and for liquidity positions (default0.1)
market_slug: market unique slug (optional)
market_id: chain market id (optional)
network_id: number (optional)
token_address: comma-separated list of ERC20 token addresses (optional)
status: comma-separated subset ofongoing|lost|won|claimed|sold|voided, orallto include every position regardless of size (optional)
exclude_history:trueto return only currently-actionable positions (open, or resolved+unclaimed) (optional)
keyword: full-text search acrosstitle,description, and outcome titles (optional)
sort:asc|desc(defaultdesc)
sort_by:created_at(default) |profit|roi|shares|value|marketTitle|expires_at
group_by_event:true/1to fold positions sharing an event into a single event row (optional)
Notes:
- Positions with net
shares < min_shares(default0.1) are excluded (unlessstatusis provided orstatus=all).
- Pagination and totals are computed after filtering.
priceis the current outcome price;sharesis net buys minus sells; average buy price follows proportional cost-basis when selling.
Response items:
marketId,marketTitle,marketSlug,outcomeId,outcomeTitle,networkId,token,imageUrl
shares: net shares held (number)
price: average buy price (number)
value:shares * currentPrice
profit:shares * (currentPrice - price)
roi:(profit - totalAmount) / totalAmount(null if not computable)
totalProfit,totalRoi: realized + unrealized P/L over the lifetime of the position (null if not computable)
positionFees,totalFees: fees attributed to the open position / to all activity on it
winningsToClaim: true if resolved, holding winning outcome, and noclaim_winnings
winningsClaimed: true if resolved, holding winning outcome, andclaim_winningsexists
voidedWinningsToClaim,voidedWinningsClaimed: same, for voided markets
claimed: true if winnings or voided winnings were claimed
status:ongoing|lost|won|claimed|sold|voided
expiresAt: market expiry (ISO string or null)
eventId: parent event UUID, ornull
executionMode:0(AMM) or1(Order Book);tokenId(ERC1155 id) is set for Order Book positions β see the Order Book API reference
Example:
plain textGET /users/0x1234.../portfolio?network_id=2741&token_address=0x84A71ccD554Cc1b02749b35d22F684CC8ec987e1&page=1&limit=20
GET /users/:address/markets
Portfolio view aggregated by markets (grouped by market, ordered by latest user activity in the market).
Query params:
page,limit(pagination; defaultlimit=10, max100)
min_shares: minimum shares threshold per outcome and for liquidity positions (default0.1)
network_id: number (optional)
state:open|closed|resolved(optional)
token_address: ERC20 token address (optional)
topics: comma-separated list of topics (optional)
keyword: full-text search acrosstitle,description, and outcome titles
market_ids: comma-separated list of{networkId}:{marketId}pairs (optional), e.g.2741:164,2741:200
market_slug: comma-separated market slug(s) (optional)
status: comma-separated subset ofongoing|lost|won|claimed|sold|voided, orall(optional)
sort:asc|desc(defaultdesc);sort_by:created_at(default)
group_by_event:true/1to fold sibling markets into a single event row (optional)
- Buy fee filters (optional; decimals between 0 and 1):
buy_lp_fee_lt,buy_lp_fee_lte,buy_lp_fee_gt,buy_lp_fee_gte,buy_lp_fee_eq
Response items:
market: a market object (same shape as/marketsitems)
portfolio:positions: array of outcome positions with:marketId,marketTitle,marketSlug,imageUrl,networkId,tokenoutcomeId,outcomeTitleshares,price,value,profit,roi,totalProfit,totalRoi,positionFees,totalFeeswinningsToClaim,winningsClaimed,voidedWinningsToClaim,voidedWinningsClaimed,claimedstatus:ongoing|lost|won|claimed|sold|voidedliquidity:shares,price,valuetotalAdded,totalRemoved,totalClaimed,totalToClaimfeesClaimed
Tags
GET /tags
Aggregates tag occurrences across published, open markets, returning one row per distinct tag slug with a
marketCount scoped to currently-tradeable markets. Useful for filter chips on a markets listing page.Tags are denormalized onto markets (synced from the offchain CMS); the matching
tags/exclude_tags filters on GET /markets accept the same slugs.Query params (optional):
type: filter to a single tag namespace (e.g.type=league)
Example:
plain textGET /tags?type=league
Response:
json{ "data": [ { "marketCount": 18, "tag": { "type": "league", "title": "Premier League", "slug": "premier-league", "imageUrl": "https://..." } } ] }
Sorted by
marketCount descending, then tag title ascending.Topics
GET /topics
Per-topic market counts, broken down by
markets.topics. Intended for clients such as sidebar category counters that need counts per topic.Counts are always restricted to published markets that are currently open (
state = open and expires_at in the future) with at least 1 hour between publication and expiry. Sibling markets under the same event always collapse into a single tally β an event is counted once even if several of its siblings carry the topic.Query params (all optional):
network_id: comma-separated list of network ids
Example:
plain textGET /topics?network_id=2741,59144
Response:
json{ "data": [ { "topic": "crypto", "marketCount": 42 }, { "topic": "sports", "marketCount": 31 } ] }
Topics are returned sorted by
marketCount descending, then topic ascending.Price Data
- Historical price data is built from on-chain events (
MarketOutcomeShares) and stored inprices.
- Outcome prices are derived from outcome shares.
- Liquidity price computation follows the contract logic; resolved markets use final shares/liquidity, otherwise
#outcomes / (liquidity * Ξ£(1/shares)).
Errors
Common errors:
401 Unauthorizedβ missing/invalid API key
429 Too Many Requestsβ rate limit exceeded
400 Bad Requestβ invalid query parameters
404 Not Foundβ resource not found
500 Internal Server Error
Networks
The Myriad Protocolβs main deployment is on BNB Smart Chain, where most markets will be denominated in USD1 and some markets are still denominated in USDT.
Some markets are also available on other EVM-compatible blockchains.
BNB Smart Chain
Order Book Contracts
Mainnet | Testnet | |
OBExchange | 0xa0b6f8ef8EdB64f395018D1933f2273Ce9f0f16A | |
OBConditionalTokens | 0x6413734f92248D4B29ae35883290BD93212654Dc | |
OBManager | 0xaB5591E280fF9Bf368DB60c3b775b5C7Ba5ea3dB | |
OBFeeModule | 0xc1BB36bb0BA236603b95544E809F2ab1893BBC0C | |
OBNegRiskAdapter | 0xd96F26703Ddbf7d1Cb6858640eca34cF1893d53A | |
OBWrappedCollateral | 0x9F124ce59D8De0274574949400640a2677067ACC |
AMM Contracts
Mainnet | Testnet | |
PredictionMarket | ||
PredictionMarketQuerier |
Tokens
Token | Mainnet | Testnet |
USD1 | ||
USDT |
Other chains
Abstract
AMM Contracts
Mainnet | Testnet | |
PredictionMarket | ||
PredictionMarketQuerier |
Tokens
Token | Mainnet | Testnet |
USDC.e | ||
PENGU | ||
PTS |
Linea
AMM Contracts
Mainnet | Testnet | |
PredictionMarket | ||
PredictionMarketQuerier |
Tokens
Token | Mainnet | Testnet |
USDC |
Celo
AMM Contracts
Mainnet | Testnet | |
PredictionMarket | Coming soon | |
PredictionMarketQuerier | Coming soon |
Tokens
Token | Mainnet | Testnet |
USDT | Coming soon |
Audits
Order Book
The Order Book contracts have been audited by Cyfrin:
- Reports per component and reviews:
- https://github.com/Cyfrin/cyfrin-audit-reports/blob/main/reports/2026-03-13-cyfrin-myriad-clob-v2.0.pdf
- https://github.com/Cyfrin/cyfrin-audit-reports/blob/main/reports/2026-04-08-cyfrin-myriad-realitio-oracle-v2.0.pdf
- https://github.com/Cyfrin/cyfrin-audit-reports/blob/main/reports/2026-04-07-cyfrin-myriad-pr145-v2.0.pdf
AMM
The AMM contracts have been audited by Cyfrin: https://github.com/Cyfrin/cyfrin-audit-reports/blob/main/reports/2025-07-25-cyfrin-myriad-v2.0.pdf
Changelog
V2.0.0
- Added API key authentication
- Added rate limiting
- Markets endpoints with keyword search and charts
- Market events and user events endpoints with timestamp filtering
- Historical prices ingestion + charting
V2.0.1
- Added portfolio endpoint
- Added market holders endpoint
V2.0.2
- Added market quote endpoint
V2.0.3
- Added market quote_with_fee endpoint
V2.0.4
- Made most API endpoints public