Use the API with your key
Authenticate with your key, read the response format, page through lists, and handle errors and rate limits.
-
Your key
The API lives at /api/v1 and every request needs a key. Keys are issued by BlockBoard: there is no self-service sign-up yet. A key looks like
bb_ab12cd34_…: the first part,bb_ab12cd34, is its public name; the rest is the secret. You see the whole key once, when it is handed to you. Keep it like a password: we only store a fingerprint of it and cannot show it again. If it leaks, ask for it to be revoked and for a new one.Send it in a header, never in the address:
Authorization: Bearer <key>, orX-API-Key: <key>. A key in the address is ignored. -
First request
curl https://blockboard.net/api/v1/status \ -H "Authorization: Bearer $BB_KEY"/api/v1 lists every endpoint, and /api/v1/openapi.json describes them all in OpenAPI 3, for tools that generate a client. Both need the key too.
-
What comes back
Every answer is JSON with the same shape:
{ "data": [ … ], "meta": { "as_of": "2026-11-14T09:30:00Z", "count": 50, "next_cursor": "eyJz…" } }data is a list, or one object. as_of is how fresh the data is, count is how many items are in data, and next_cursor is there when more pages follow. Times are ISO 8601 in UTC (ending in
Z), numbers come unformatted (1234567.89, not «1.2M») and field names are in snake_case. Answers are never cached: ask again for fresh data. -
Pages, filters and order
Lists come in pages.
limitsets the size, from 1 to 500 (50 by default). To get the next page, send thenext_cursoryou received ascursor, with the same filters and order; whennext_cursorisnullyou have everything. Pages stay consistent while new items arrive.sorttakes a field name, or the name with a minus sign for descending order (sort=-updated_at). Each endpoint lists the fields it can sort by and the filters it takes. A parameter the endpoint does not know is an error rather than being ignored, so a typo never returns everything. -
Errors
An error comes with its HTTP status and a body like
{"error": {"code": "invalid_parameter", "message": "…", "details": …}}. The codes:- unauthorized (401): no key, or a key that is not valid. It does not say which.
- account_required, account_inactive (403): the endpoint is about an account and the key has none, or that account is no longer active.
- invalid_parameter, unknown_parameter, invalid_cursor (400): fix the request; details says what is wrong and what is allowed.
- not_found (404), method_not_allowed (405): that method does not exist for that path. Almost everything is GET; the few actions say POST or DELETE.
- rate_limited, live_quota_exceeded (429): see Limits.
- internal_error (500): our side; try again later.
-
Limits
Each key may make a set number of requests a minute. Every answer carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset(seconds until the next minute). Past the limit the answer is 429 withRetry-After: wait that many seconds. The API is for programs on a server: browsers on other sites cannot call it.A few endpoints work out their answer live when you call them, such as a calculation read from the chain, a route quote for an amount, or a fresh recheck. They also count against a second, lower quota per minute and per day (UTC). The index at /api/v1 marks them in
live_quota(always, orwhen_livewhen only some calls count), and /api/v1/status shows your quota. Their answers carryX-Live-Quota-Limit-Minute,X-Live-Quota-Limit-DayandX-Live-Quota-Remaining-Day. Past it the answer is 429 live_quota_exceeded withRetry-After; everything else keeps working. -
Your own data
A key can be linked to a BlockBoard account. Then the endpoints under /api/v1/me return that account's own data, and only that account's. A key without an account reads public data only, and /me answers 403 account_required. If the account is suspended or closed, /me answers 403 account_inactive for that key, while public data keeps working. Nothing in a request can point the key at another account.
All data comes from BlockBoard. Identifiers are BlockBoard's own and stay the same between calls, so you can store them.
-
Narratives
Everything on the Narratives pages: story threads, the overview, the bubbles by sector, the emerging-narratives radar with its rounds, funds and projects, and the topic catalogue. Story links are site paths such as
/story/<key>.- /narratives/threads: live threads (one protagonist and what is told about it), paged. Fields:
entity_id,label,kind,stories,newsrooms(most in one story),news_media(distinct in the thread),pieces,first_at,last_at,days,recentandprevious(stories this week and the week before),direction(up,down,flat, ornewwhile the archive is too short),momentum,attention_pct,price_change_7d,price_pct,gap(attention minus price rank),comparable,companions,also(merged twin entities),top_storiesandrecent_stories(key,title,url,at,newsrooms,event_type),narratives(slug,label,stories,category) anddaily(new stories per day, 21 days). Filters:kind,direction. Sort:momentum(default, descending),stories,recent,newsrooms,news_media,attention_pct,price_change_7d,last_at,label. - /narratives/threads/{entity_id}: one thread with the same fields plus
canonical_entity_id(a merged twin answers with the thread it joined),stand(now,before,newsrooms,pieces,price_change,companions,biggest,pace,coverage,price,verdict,meaning;nullwhile the archive is short),asset(id,symbol,name),activity(day,stories,price_usd),newsrooms_top(name,stories), each narrative'sstate,state_label,toneandwhythis week, andwindow_days. 404 when there is no live thread. - /narratives/threads/{entity_id}/series: new stories per day and the coin's daily price.
days(1 to 365, 21 by default), orfrom/to. - /narratives/overview: the overview panel:
threads,stories,week,last_week,week_change,daily,rising,fading,top,gaining,falling(eachentity_id,label,recent,previous,change,delta),points(attention against price),tonesandtone_total,mix,pairs,share,talk_ahead,move_ahead,widest,week_widest,symbols,tiles,digest(label,name,detail,href),radarcounts,window_days,archive_days,comparable. A change carriesrecent,previous,pct(null under five stories),sign,rank,strength,textandshort. - /narratives/bubbles: narratives by sector in three windows (24h, 7d, 30d). Each view:
window,total_stories,market_perf,search_snaps,search_snaps_before,covered,links(a,b,stories) andreadings:slug,label,family,sector,stories,stories_before,stories_change,share,search_interest,search_interest_before,market_cap,perf,vs_market,cap_change,volume,volume_change,tvl,tvl_change_7d,coins,headlines(title,url,newsrooms),daily,related,state,state_label,tone,score,why,threadsandradar(its radar categories with rounds, projects to watch and sales). Filters:window,state,family. /narratives/bubbles/{slug} gives one narrative in the three windows. - /narratives/radar: the emerging-narratives radar:
generated_at,computed_at,window_days,readings,climateandmovement(gaining,steady,fading,span). A reading:slug,label,bubble,excluded,coin_sector,rounds,rounds_before,is_new,quality_rounds,quality_funds,amount,growth,news,news_before,share,reference_viewsandreference_views_change(encyclopedia page views),social(casts,video,searchand their_change),vs_market,volume_change,tvl,tvl_change,category_cap_change,presales,watch,parts,score,state,state_label,tone,sentence,weekly_rounds,weekly_news,since,history,stage,stage_label,stage_since,weeks. The climate:investment_activity,investment_trend,fear_greed,mood,altcoin_index,season,btc_dominance,market_cap_change,sentence. Filters:state,stage,include_excluded. - /narratives/radar/{slug}: one narrative:
reading,sentence,brief,window,listed_share,rounds,window_rounds(round keys),funds,groups(funds that invest together),projects,outcomes(what happened after each round),valuations,climate,new_coins. - /narratives/radar/{slug}/history: one reading per day (
day,score,state,stage,rounds,quality_rounds,news,amount,share,parts,reconstructed,computed_at), paged,from/to, sortday. - /narratives/radar/{slug}/signals: the raw daily signals behind a category:
reference_views,casts,video,search,category_cap_change,category_projects, each a list ofdayandvalue.metricpicks one;from/to(90 days by default). - /narratives/projects/{slug}: a project that raised a round:
project(slug,name,category,raised,last_at,quality,funds,listed,symbol,token,match,news,news_items,social,noise,presale_href,open_sale,sales,valuation,outcome,rounds),sentence,funds,outcomes,rank_money,rank_noise,peers,narrative. - /narratives/rounds: funding rounds, paged:
total,rows,facets(categories, stages, amounts, funds) andcategories_top. A round:id,key,project,project_slug,project_url,presale_project_id,asset_id,at,precision,amount_usd,valuation_usd,stage,stage_group,category,category_label,investors(slug,name,lead,quality),leads,quality,headline,story_id,story_url,origin(story,presalesorboth),evidence_url,href,source_count. Filters:category,stage,amount(lt5,5-25,25-100,gt100, in millions),fund,days(30,90,all),from/to. Sort:at(default, descending),amount,valuation,project. /narratives/rounds/biggest: the largest rounds,daysandlimit. - /narratives/funds: funds behind the rounds, paged:
slug,name,url,score,curated,quality,rounds,leads,rounds_window,leads_window,amount_window,categories,perf,perf_n,tier,tier_info,projects_count. Filters:quality,active,category. Sort:score(default),rounds,leads,rounds_window,amount_window,perf,name. /narratives/funds/{slug} addsintro,co_investorsand its rounds inprojects. /narratives/funds/top-month: what top funds bought this month, each withround_list. /narratives/funds/first-entries: top funds entering a narrative for the first time this month (category,round). - /narratives/catalog: the fixed vocabulary:
narratives,windows,bubble_states,radar_states,radar_stages,radar_categories,round_stages,round_amounts,signal_metrics. - /narratives/topics: topics and sectors stories are filed under, paged:
slug,label,kind,parent,asset_id,description,active,sort,stories. Filters:kind,include_inactive; sortsort,label,slug. /narratives/topics/{slug}: the topic, itsassetsand itsstories(story_id,key,title,url,confidence,because,at), paged,from/to, sortatorconfidence.
- /narratives/threads: live threads (one protagonist and what is told about it), paged. Fields:
-
Alerts
The public alerts of BlockBoard: four fixed rules, each with its threshold in the open. Alerts you set up yourself are under /api/v1/me.
- /alerts: what fired in the last
days(7 by default, up to 30), paged. Each row:rule(service_down,big_theft,unexplained_move,fast_consensus),section(market,security,news),level,title,detail,at,link(a big theft links to its incident in this API),subject,subject_kind, and as on the pagekind,name,rule_label,badge,badge_tone,meta,figure,figure_tone,under,pinned,repeatsandfirst. Filters:section,rule,level,from/to;dedupe=falsegives every firing instead of one row per thing. meta addswindow_days,totalandshown. - /alerts/summary: this week by category (
key,label,lead,rules,count,daysper day,lastrow),day_labelsand the sixhighlights. - /alerts/rules: each rule with
name,watches,condition,measured(why that number),section,firedanddaily; meta hastheft_threshold_usd(the live 90th percentile),theft_percentileandconsensus(newsrooms and minutes).
- /alerts: what fired in the last
-
Security
The archive of thefts, exploits and frauds, and the hacks of DeFi protocols.
- /security/incidents: every incident, paged. Records of the same theft (same victim within two days) are merged into one row, as in the alert;
merge=falsegives each record. Fields:id,day,entity,summary,technique,chains,amount_usd,amount_text(as written, sometimes in coins),no_loss,percentile(place of the amount in the archive),above_alert_threshold,other_amounts(the other records of the same theft),records,reference_url(the news or statement, when there is one),first_seen_at,updated_at. Filters:from/to(day of the incident),min_amount,q,chain,technique,include_no_loss. Sort:day(default-day),amount_usd,first_seen_at,entity. - /security/incidents/{id}: one incident with the same fields and
funds: what was recovered, returned or frozen (kind,amount_text,scope), ornull. Funds are fetched once and kept an hour; a fetch counts against the live quota. - /security/incidents/stats:
count,with_amount,total_usd,median_usd,p90_usd,alert_threshold_usd,since,by_yearandby_technique, forfrom/to. - /security/protocol-hacks: hacks of DeFi protocols:
id,name,day,amount_usd,returned_usd,classification,techniqueandprotocol_slug(the protocol in Yields). Filters:from/to,q,protocol,min_amount,classification. Sort:day,amount_usd,returned_usd,name.
- /security/incidents: every incident, paged. Records of the same theft (same victim within two days) are merged into one row, as in the alert;
-
Presales
Token sales, presales, public sales, auctions, airdrops and funding rounds, as on the Presales pages. Where a sale happens (an exchange, a launchpad, a sale read from the chain) is named in
platform. Every figure says how we know it inprovenance:basisison_chain,platform(both verified),registry(a regulatory filing, with the link to the document) ordeclared(what the project announced, with no name and no link). If the Presales section is switched off, every endpoint here answers 404.- GET /api/v1/presales/sales: the sales table.
stateopen (default), upcoming, ended, all or stale; filtersq,kind(presale, public_sale, auction, node_sale, airdrop, vc_round),platform,flag(a flag code),investor,cat(sector),raised(lt100k, 100k-1m, 1m-10m, 10m, none),ends(7, 30, 90, past30, none),ends_from/ends_to(YYYY-MM-DD),kyc(yes, no, unknown);sortclosing, date, amount, risk, sources or news. data hastotal,stateswith their counts,kinds,categories,sectors,kyc_counts,platforms,sortsandrows. Each row:sale_id,project(slug, name, ticker, logo, sector, chains),kind,kind_label,stage,phase,platform,status,status_raw,status_label,start_at,end_at,date_text,when,countdown,window_gone,is_stale,price_usd,price_is_auction_start,target_usd,raised_usd,committed_usd,amount,amount_kind,progress,participants,valuation_usd,fdv_usd,initial_mcap_usd,investors,multiple,thin_gain,impossible,cashable,compared(what today's price is compared with:basismarket or dex, price, pair, liquidity),reward,pools,risk_level,worst_tier,flags,stories,track,kyc,provenance,onchain(money seen reaching the sale wallet),link(where to take part),phases,confidence,source_count,first_seen_at,updated_at. - GET /api/v1/presales/upcoming: the same table for sales not open yet, plus
weeks(the next four weeks). - GET /api/v1/presales/sales/{sale_id}: one sale, the row plus
allocation,details(press, contract check, market),refs(what each source says, platform named or declared),date_changesandvalue_changes. …/snapshots: raised, committed and participants over time (from,to, paged). - GET /api/v1/presales/projects: every project (
q,sector,chain,has_token;sortname, first_seen_at, updated_at, sales, last_sale_at). …/projects/{slug}: the full sheet: project with links, contracts and chain check, KPIs,primary_link,checked,flags,history,checklist,faq, price steps and series, every sale, investors, stories, automaticchecksandfollowing(whether the key's account follows it; null without an account). …/prices: daily price (basismarket or dex) and each sale's price. …/changes: dates, figures and flags that changed (from,to). - GET /api/v1/presales/overview: what deserves attention and why, high risk, closing and opening soon, the figures of the top strip (
box) and four weeks. - GET /api/v1/presales/flags: red and green flags, one row per project (
sigrisk, info, all or a code). …/flags/feed: every flag, newest first, also retired ones (code,severity,active,from,to;sortdetected_at). …/flag-types: what every code, tier, check and basis means, and the values every filter takes. - GET /api/v1/presales/results: how sold tokens trade against their sale price (
perd30, d90, y1, all), by platform, ecosystem, sector, size and news. …/after: sold tokens that trade now (q,sortdate, best, worst). - GET /api/v1/presales/rounds: funding rounds (
q,sec=trueto include regulatory filings,sortdate, amount, news,from,to), with sector totals and weekly money. …/investors and …/platforms: who backs and who sells, with how their tokens trade. - GET /api/v1/presales/calendar: one month (
monthYYYY-MM;kind,cat,raised,kyc,q,from,to): days with what opens and closes and the money closing, bars andevents. - GET /api/v1/presales/launchpads/{category}/coins: the coins that came out of a launchpad, with price, market cap, highs and lows and their change (
sortrank, market_cap, change_1y, change_30d, symbol). - POST /api/v1/presales/projects/{slug}/recheck: ask for the project to be read and checked again on the next pass. Counts against the live quota. Answers
{slug, queued, state, requested_at}.
- GET /api/v1/presales/sales: the sales table.
-
Presales you follow
With a key linked to an account. Following a project is the same alert as the Follow button on the site: it is sent like your other alerts and managed in My alerts.
- GET /api/v1/me/presales/following: each followed project with
alert_id,project_slug,project,name,active,quiet_minutes,fired_count,last_fired_at,created_at. - POST /api/v1/me/presales/{slug}/follow: follow it (answers
{following, alert_id}; the same alert if it was already followed; 400 when the account already has the maximum number of alerts). - DELETE /api/v1/me/presales/{slug}/follow: stop following it (
{following: false}).
- GET /api/v1/me/presales/following: each followed project with
-
Yields
The Yields section: every pool with what it pays and where that comes from, our rating, a daily history per pool, the protocols, the deposit calculator, Find a pool and the exchange launchpools. Pool ids (
pool_…) are BlockBoard's own.- /yields/pools: the table, paged (up to 5,000 rows deep). Each pool:
id,protocol(slug,name,category,family,url,logo),chain,symbol,tokens,underlying_tokens,pool_meta,variant,pool_address,tvl_usd,tvl_unverified,tvl_check,tvl_note,apy(total,base,activitywhat real activity pays,rewardtoken emissions,emission_share,mean_30d,change_7d,change_7d_raw,mean_life,sigma,held_up_by,statecollateral/idle/unreported,doubtful,flagged_unusual,estimated),stablecoin,il_risk,exposure,history_days,years,pool_type,fee_pct,fee_dynamic,volume_1d_usd,pool_created_at,risk(level,reason,basis,at),score,grade,link(url,kind,label,exact),calc_format,calc_format_label,context(the news about the protocol:story_key,title,at,url,repeat),first_seen_at,updated_at,last_listed_at. meta.table has the totals and what each filter hides. Filters, as in the advanced filter:chain,tok,tokmode,xtok,wrap,t1/t2,apy_min/apy_max,real,tvl_min,vol_min,fee,proj,fam,age_min,risk,ptype,keep, the tabkind(stable, single, no-il) andzero=1for pools that pay (almost) nothing. Sort, always descending:-tvl,-apy,-base,-change. - /yields/pools/{id}: one pool with everything above plus
aka,protocol_tvl_usd_reported,app_url,app_url_status,facts(where each figure comes from:pool_list,market_indexer,protocol_api,onchain,rule, and when),score_parts,badges,rank(class and position),context_stories,hacksand the protocol's audits, age, oracles and TVL. - /yields/pools/{id}/history: one point per day since the daily snapshot started:
day,tvl_usd,apy_base,apy_reward,apy_total,apy_mean_30d,score,grade,tvl_unverified.from/to, paged, oldest first. - /yields/count and /yields/facets: how many pools a filter returns (
count,tvl_usd,zero,active,hidden), and what the filter offers (networks, protocols, protocol families, tokens, token families). /yields/reference: the fixed vocabularies (pool types, fee buckets, ages, grades, classes, calculator formats, thresholds). - /yields/overview: capital, pools, protocols and networks, stablecoin yield against
fed_funds_rateandtreasury_10y, real vs emissions, buckets, top networks and protocols, risers and fallers. - /yields/ranking: our rating, top pools of a
class(stable, eth, btc, other, pairs or all;limitup to 100) withrank,moved,score,grade,blocks,badges; meta hasgrade_counts,class_counts,rated_total. /yields/ranking/history: the daily top 100 of each class (class,from/to), or one pool's position withpool_id. - /yields/protocols (filters
q,family,category,with_pools; sortname,tvl_usd,pools,pools_tvl_usd,updated_at) and /yields/protocols/{slug} (with its hacks, pools, news andbad_news). - /yields/calculator/pools?q= finds a pool for the calculator. /yields/calculator?pool= is the deposit calculator, live: pair pools we can read are read on-chain. Without
amountit gives the form data (format, tokens, current price, 90-day pair history); withamount(unitusd or a token index,lo/hifor a concentrated range,inv) the split per token (legs),in_rangeandearningsat today's APY over 1 month, 3 months and 1 year. - /yields/match: Find a pool.
amt,hold(stable, eth, btc, sol, other),risk,watch(passive, active),chain; up to five pools withreal_apy,risk,linkandreasons. Not advice. - /yields/launchpools: exchange launchpools, paged:
id,exchange,product,token,reward_total,state, dates,days_left,url,best_apr,best_clean_apr,staked_usdand per coinoptions(stake,apr,staked,staked_usd, limits per user,reward,participants,only,doubts). Filtersstate(live, open, upcoming, ended, all),exchange,stake,earn,min_apr,trust,q;sortend, apr, staked or start. /yields/launchpools/{id}: one.
- /yields/pools: the table, paged (up to 5,000 rows deep). Each pool:
-
Bridges
Bridges & Swaps: the bridge catalog, networks and tokens, which bridges cover a crossing and live route quotes.
- /bridges/providers (also /bridges): every bridge, paged:
slug,name,kind,kind_label,domain,url,link_template,link_proof,link_proof_url,link_ok(whether its link is shown now),status,status_note,chains,tokens,typical_seconds,typical_time,return_note,security,about,incidents,live_quotes,logo,position,domain_watch(last check, last good check, hidden, expiry, certificate issuers),reviewed_at,updated_at. Filterskind,chain,token,status; sortname,slug,position,typical_seconds,updated_at. - /bridges/providers/{slug}: one bridge with its last
domain_checks. /bridges/providers/{slug}/domain-checks: the whole history of the domain watch, paged:checked_at,verdict(ok, rotated, suspicious, error),reasons(dns, cert, redirect),cert_issuer,cert_not_after,domain_expires,final_host; filtersverdict,from/to. - /bridges/chains: networks (
key,name,chain_id,family,gas_symbol,logo,notes), and the closed ones inmeta.sunset. /bridges/chains/{chain}/tokens: its tokens by relevance, paged, withq:address,symbol,name,decimals,rank,market_cap,volume_24h,native,core,listed_in_count. - /bridges/coverage: with
from,token,toand optionallyreceive, which bridges cover the crossing, with their link and typical time. No quote is asked. - /bridges/routes: the same plus
amount: every bridge on the crossing is asked for a live quote, and the routes come by what you receive:receive,cost,gas_usd,fixed_fees,seconds,time_text,link,about,badges(Best, Fastest),mode,estimated_via_third_party; withform,asked,notesand thedisclaimer. Only a call with an amount and a complete crossing counts against the live quota. Information, not advice.
- /bridges/providers (also /bridges): every bridge, paged:
Last updated Nov 14, 2026