API reference

filecoin.plus's public read-only API: chain, network, miner, address and ranking data as JSON.

Contents

Conventions

Every endpoint is a GET at https://filecoin.plus/api/<name>/<object>; parameters may also be given as query parameters. Replies look like:

{"code": 200, "msg": "", "data": { … }}
  • Amounts are attoFIL (1 FIL = 10¹⁸) and power is bytes, both as decimal strings so large numbers keep their precision.
  • Heights are numbers (one every 30 seconds), times are unix seconds and dates are UTC unless noted. Unknown values are null.
  • Malformed parameters: HTTP 400 with code 400 and msg naming the parameter (e.g. miner error, limit error).
  • Well-formed but nothing found (e.g. a miner this site does not index, a block that does not exist): HTTP 200 with code 501 and msg giving the reason (e.g. miner error, block not found).
  • Upstream failures: HTTP 502/503/504 with msg such as lotus node unavailable or service unavailable; retry later.
  • Most endpoints are cached (see each one). Endpoints marked “live” query a Lotus node and have limited concurrency slots; when they are full the reply is 503. Please call them sensibly and do not poll rapidly.
  • Rate limit: 5 requests per second per source IP on average, with bursts of up to 40; beyond that you get HTTP 429 (code 429, msg too many requests). Wait a moment and retry.
  • This site serves curated data, not Lotus's native JSON-RPC; for the native API use a public node such as Glif: https://api.node.glif.io/rpc/v1
curl -s https://filecoin.plus/api/minerInfo/f01518369

Chain

GET/api/chainHead

Latest height

The newest height this site has indexed, usually 1–2 epochs behind the live head (the live head is in /api/network).

IndexedCache 5 s

data fields

heightnumberheight (epoch)
timestampnumberunix seconds
blocksnumberblocks at this height, 0 for a null round
messagesnumber | nullmessage count; null for heights backfilled from headers only
GET/api/blocks?after={height}&limit={n}&miners={miner,miner…}

Blocks

Blocks since genesis, orphans excluded. With miners, only those miners' blocks. Without after, the newest limit blocks, newest height first (order within a height is unspecified).

IndexedCache 10 s / 30 s

Parameters

afterqueryoldest first, only blocks above this height (not with from or page)
fromqueryold form: only blocks above this height, newest first, default 0
limitquery1–2000, default 500
minersquerycomma-separated miner IDs, up to 50 (or miner= or /api/blocks/<miner> for one)
pagequerypage number (limit rows a page), newest first, for a single miner only; for the network or several miners continue with after

data fields

cidstringblock CID
heightnumberheight
timestampnumberunix seconds (from the height)
minerstringthe miner
winCountnumberwins (election win count)
messageCountnumber | nullmessage count; null when only the header was backfilled
parentBaseFeestringparent base fee, attoFIL
rewardstring | nullestimated reward (the hour's network reward per win × winCount), attoFIL, tips excluded; null without reward data
rewardEstimatedbooleanalways true

To follow on completely (e.g. syncing blocks), use after: limit blocks with height > after, oldest first, the last height always complete (possibly a few over limit); the next page uses after=this page's last height, and fewer than limit means the end for now, so resume later from the same after. after only goes up to the height this site has indexed contiguously (at least about 10 minutes behind the head, further while backfilling after an outage), so no block is skipped.

from is the old form (the newest limit blocks above from, skipping the middle when there are more than limit); kept for compatibility, do not page with it.

GET/api/block/{cid}

Block

One block by CID. Same fields as /api/blocks plus orphan (true for orphaned blocks).

IndexedCache 1 min

Parameters

cidrequiredpathblock CID
GET/api/height/{height}

Height details

A height's overview and all its blocks (this site's index, complete from genesis, orphans excluded).

IndexedCache 30 s / 1 h

Parameters

heightrequiredpathheight

data fields

height, timestampnumberheight, unix seconds
nullRoundbooleana null round (no blocks at this height)
messagesnumber | nulldeduplicated message count; null for heights backfilled from headers only
parentBaseFeestring | nullattoFIL
blocks[]arrayitems as in /api/blocks
GET/api/blockInfo/{cid}

Block details

/api/block's fields plus the header from the node: parents, parent weight, parent state root, header time. header is null when the node cannot answer right now.

LiveCache 1 min / 24 h

Parameters

cidrequiredpathblock CID

data fields

cid … rewardEstimated, orphanas in /api/block
headerobject | null{timestamp, parents[], parentWeight, parentStateRoot, messages}
GET/api/tipset/{height}

Tipset

The tipset at a height. A null round returns the nearest earlier tipset with nullRound true.

LiveCache 30 s / 24 h

Parameters

heightrequiredpathheight, not above the head

data fields

heightnumberthe actual tipset height
requestednumberthe height asked for
nullRoundbooleanthe height asked for was a null round
timestampnumberunix seconds (block header time)
parentBaseFeestringattoFIL
blocks[]array{cid, miner, winCount}
GET/api/message/{cid | 0x hash}

Message result

A message's execution result, searching back 7 days. replaced is true when the message found replaced it (same nonce, higher gas).

LiveCache 30 s / 24 h

Parameters

cidrequiredpathmessage CID, or an Ethereum transaction hash (0x…)

data fields

cidstringmessage CID (the resolved CID when asked by a 0x hash)
ethHashstring | nullthe message's Ethereum transaction hash (every message has one; null when the node cannot tell)
replacedbooleanwhether it was replaced
foundCidstringthe message CID found
executedHeightnumberthe tipset holding the receipt (the first tipset after inclusion)
exitCodenumber0 means success
gasUsednumbergas used
returnstring | nullreturn value, base64
returnTooLargebooleantrue when the return value exceeds 64 KiB and return is null

Messages older than 7 days answer 501 message not found.

GET/api/messageInfo/{cid | 0x hash}

Message details (decoded)

A message in full: from, to, value, gas, the method name, decoded params and the receipt. Params are decoded against the destination actor's version at execution. Searches back 7 days.

LiveCache 30 s / 24 h

Parameters

cidrequiredpathmessage CID, or an Ethereum transaction hash (0x…)

data fields

cid, ethHash, replaced, foundCidas in /api/message
from, tostringthe addresses as in the message
valuestringvalue, attoFIL
nonce, methodIdnumbernonce, method number
methodstring | nullmethod name (e.g. SubmitWindowedPoSt); null for Send or unknown
paramsobject | string | nulldecoded params; "raw:<hex>" when not decodable; null without params
paramsTooLargebooleantrue when params exceed 64 KiB and are left out
gasLimit, gasFeeCap, gasPremiumgas settings (the last two attoFIL strings)
executedHeight, exitCode, gasUsed, return, returnTooLargethe receipt, as in /api/message

/api/message is the light, undecoded version.

GET/api/ethTx/{hash}

Ethereum tx → message CID

The Filecoin message CID of an Ethereum transaction hash (for the execution result use /api/message/0x… directly).

LiveCache 24 h

Parameters

hashrequiredpath0x-prefixed 32-byte hash

data fields

hashstringthe hash, lower case
cidstringmessage CID

The node keeps messages for roughly the last 2–3 weeks; older transactions may not be found.

Network

GET/api/network

Network overview

Live head, network power, 24-hour rewards, pledge, and power expiring, expired, extended and added over 24 hours / 7 days. Items that cannot be computed are null.

LiveCache 1 min

data fields

height, timestampnumberthe live head
qualityAdjPower, rawBytePowerstringbytes, decimal string
reward24hstring | nullminer rewards over the last 2880 epochs, attoFIL
serviceReward24hstring | nullthe service reward stream over the same span, attoFIL
rewardPerTiB24hstring | null24-hour reward per TiB QA power, attoFIL
blockRewardstring | nullaverage reward per win, attoFIL
pledgePerTiBstring | nullinitial pledge for 1 TiB of CC sectors, attoFIL
expiring24h, expiring7dstring | nullQA power expiring ahead, bytes
expired24h/7d, extended24h/7d, added24h/7dstring | nullQA power expired, extended and added, bytes
powerSince, addedSincenumberheights these statistics began; windows reaching earlier are incomplete
GET/api/networkExpire

Network expiry by month

Sector expiry of all powered miners from today (UTC) on, summed by month.

IndexedCache 10 min

data fields

minersnumberminers with expiry data
updatedFrom, updatedTonumberoldest / newest per-miner snapshot, unix seconds
months[]array{month: YYYY-MM, sectors, rawPowerTiB, qaPowerCCTiB, qaPowerDCTiB (DC as QA ×10), pledgeCCFIL, pledgeDCFIL}, numbers; same names as /api/minerExpire

Unit exception: monthly chart data, with power in TiB and pledge in FIL as numbers rather than byte / attoFIL strings.

powerCC, powerDC, pledgeCC and pledgeDC are the pre-rename fields (same values) and will be removed.

Miners

GET/api/minerInfo/{miner}

Miner overview

Everything at the top of the miner page: power and rank, balances, sectors, addresses, totals and the four block-statistics windows. minerAccount and minerStats combined.

LiveCache 1 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

sectorSizestringbytes, decimal string
powerobjectqualityAdj, raw, network (bytes), networkShare (0–1), rank
balanceobject | nulltotal, available, initialPledge, vesting, preCommitDeposits, feeDebt (attoFIL); null when the node is unavailable
marketobject | nullmarket escrow and locked (attoFIL)
sectorsobjectlive, active, faulty, recovering; faulty is live at the head (this site's snapshot when Lotus is unavailable)
addressesobject | nullowner, worker, control, beneficiary as in /api/minerAccount
total, blocksobject, arraytotal and windows as in /api/minerStats
GET/api/minerStats/{miner}

Block statistics

Blocks, rewards, efficiency and luck over 24 hours, 7 days, 30 days and a year, plus totals since genesis. Rewards are estimated from the network reward per win of each hour and exclude tips.

IndexedCache 10 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

power, networkPowerstringbytes, decimal string
windows[].keystring24h / 7d / 30d / 1y
windows[].blocks, winsnumberblocks (no orphans), wins
windows[].rewardstringestimated rewards, attoFIL
windows[].efficiencystring | nullreward per TiB of current QA power, attoFIL; null without power
windows[].efficiencyAvgPowerstring | nullreward per TiB of the window's mean QA power, attoFIL
windows[].lucknumber | nullluck, 1 = network average
windows[].qaPowerDeltastring | nullQA power change over the window, bytes, may be negative
windows[].completebooleanwhether reward data covers the whole window
totalobjectblocks, wins, reward, first (first block height)
GET/api/minerAccount/{miner}

Balances and addresses

The miner's live balances, recovering and faulty sectors, market escrow, and the Owner, Worker, Control and Beneficiary addresses with their balances.

LiveCache 1 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

balance, available, initialPledge, vesting, preCommitDeposits, feeDebtstringattoFIL string
recoveringnumberrecovering sectors
faultynumberfaulty sectors (live at the head)
marketobject | nullescrow, locked, attoFIL
owner, worker, beneficiaryobject{id, address, balance}; address or balance null when unknown
control[]array{id, address, balance}
newWorkerobjectpending worker (only during a change)
beneficiaryTermobjectquota, usedQuota (attoFIL), expiration (height); when the beneficiary is not the owner
GET/api/minerExpire/{miner}

Sector expiry

Sectors, power and pledge expiring each day from today (UTC).

IndexedCache 1 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

updatedAtnumberwhen the snapshot was taken, unix seconds
days[]array{date: YYYY-MM-DD, sectors, rawPowerTiB, qaPowerCCTiB, qaPowerDCTiB (DC as QA ×10), pledgeCCFIL, pledgeDCFIL}, numbers

Unit exception: daily chart data, with power in TiB and pledge in FIL as numbers.

GET/api/minerWdpost/{miner}

WindowPoSt (48 deadlines)

Each deadline's latest window: state, partitions and proof messages.

IndexedCache 30 s

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

deadlines[].deadlinenumber0–47
deadlines[].openHeight, openTimenumberwindow opening height and time
deadlines[].statestringok / wait / part (some late) / late / new / idle
deadlines[].partitions[]array{index, live, faulty, state, txid, txHeight, round}; the last three null without a proof message
GET/api/minerWdpostCurrent?miners={miner,miner…}

Current WindowPoSt window

The current deadline's partitions and proof messages for several miners (up to 200), all on one head. Miners that could not be fetched are listed in missing.

Live

Parameters

minersrequiredquerycomma-separated miner IDs

data fields

heightnumberthe head used
miners[]array{miner, deadline, openHeight, updatedAt, partitions[{index, live, faulty, txid, txHeight}]}; txid is null until this window's proof lands
missingstring[]miners unknown to this site or not fetched this time

Not cached and has few concurrency slots; please do not poll it rapidly.

GET/api/minerFaulty/{miner}

Faulty sectors

The miner's faulty sector numbers (ascending).

LiveCache 1 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)

data fields

countnumbernumber of faulty sectors
sectorsnumber[]sector numbers

Whenever the node's answer is uncertain the reply is a 5xx, never an empty list; bad parameters answer HTTP 400.

GET/api/minerSector/{miner}/{sector}

Sector info

A sector's on-chain info. code 202 sector precommitted when it is precommitted but not proven yet; 501 sector not found when it is absent, expired or terminated.

LiveCache 5 min / 1 min

Parameters

minerrequiredpathMiner ID starting with f0, e.g. f01518369 (or ?miner=)
sectorrequiredpathsector number

data fields

sealProof, sealedCid, sectorKeyCidseal proof, CIDs; sectorKeyCid only after a SnapDeal
activation, expiration, powerBaseEpochnumberheights
dealIdsnumber[]deal IDs
dealWeight, verifiedDealWeightstringdeal weights
initialPledge, expectedDayReward, expectedStoragePledge, replacedDayReward, dailyFeestringattoFIL string

Only HTTP 200 with code 501 and msg "sector not found" means the sector is really gone (an explicit answer from a fresh node, no precommit either); precommitted but not proven answers code 202 (data: miner, sector, sealedCid, precommitEpoch, expiration), bad parameters HTTP 400 and node failures 5xx. Delete files on the first only.

Addresses

GET/api/addressInfo/{address}

Address details

Any address (f0–f4 or 0x): type, balance, nonce, multisig details, related miners and the balance of miners owned.

LiveCache 1 min

Parameters

addressrequiredpathan f0/f1/f2/f3/f4 or 0x address (or ?address=)

data fields

id, robust, ethstring | nullID, robust and 0x addresses (null when none)
actorstringtype: account, multisig, storageminer, evm, ethaccount, placeholder…
balancestringlive balance, attoFIL
nonce, heightnumbermessages sent, the head used
multisigobjectmultisigs only: signers, threshold, available, locked, startEpoch, unlockDuration
miners[]array{miner, roles (owner/worker/control), power (bytes), balance (attoFIL)}
ownedobjectminers owned: miners (count), balance, total (with its own), attoFIL
GET/api/addressId/{address}

Address → ID

The ID address (f0…) of any address.

LiveCache 10 min

Parameters

addressrequiredpathan f0–f4 or 0x address

data fields

addressstringthe address asked for
idstringID address

Rankings

GET/api/rankPower?page={n}&pageSize={n}

Power ranking

Miners with power, by quality-adjusted power.

IndexedCache 1 min

Parameters

pagequerypage, from 1
pageSizequery30 / 50 / 100 / 200, default 30

data fields

total, page, pageSizenumberpaging
list[].rank, minerrank, miner
list[].sectorSize, qualityAdjPower, rawBytePowerstringbytes, decimal string
list[].share, shareOfTopnumberof the network, relative to #1, 0–1
list[].blocks24h, wins24hnumberblocks and wins in the last 24 hours
GET/api/rankRich?page={n}&pageSize={n}&kind={kind}

Rich list

The top 1,000 addresses by balance; a miner's whole balance (pledge and vesting included) counts toward its owner and miners are not listed on their own. Balances come from this site's index (refreshed within 24 h). System addresses f00–f099 and payment channels are left out.

IndexedCache 10 min / 1 min

Parameters

page, pageSizequeryas in /api/rankPower
kindqueryall (default) / owner (owns miners) / plain (the rest); ranks are kept when filtering

data fields

list[].rank, id, address, actorrank, ID, robust address, type
list[].balance, ownBalance, minerBalancestringtotal, own, owned miners', attoFIL
list[].minersnumberowned miners with a balance
list[].powerstringthe owned miners' QA power, bytes
list[].sharenumberwealth share: the total balance as a fraction of the base, 0–1
list[].powerSharenumberpower share: the owned power as a fraction of the network QA power, 0–1
top, supply, updatedAtthe filtered #1's total, the share's base (attoFIL), when computed

Downloads

GET/export/MinerExpire?miner={miner}

Sector expiry sheet (Excel)

The miner's daily sector expiry as an .xlsx file, past dates included.

IndexedCache 1 min.xlsx

Parameters

minerrequiredqueryminer ID

Legacy endpoints

These are earlier endpoints with inconsistent names and formats. They still work but are deprecated (their replies carry a Deprecation header); please use the endpoint on the right. They will be removed once their callers have moved.

/api/NewHeight→ chainHead
/api/overview→ chainHead
/api/rank→ rankPower / rankRich
/api/ListBlocksHeight→ blocks
/api/ListBlocksCid→ block
/api/ChainGetTipSetByHeight→ tipset
/api/SectorExpire→ minerExpire
/api/miner→ minerAccount / minerInfo
/api/deadlines→ minerWdpostCurrent
/api/minerFaults→ minerFaulty
/api/StateSectorGetInfo→ minerSector
/api/StateSearchMsg→ message
/api/EthGetMessageCidByTransactionHash→ ethTx
/api/StateLookupID→ addressId
/api/minerBlocks→ blocks?miners=
/api/wdpostCurrent→ minerWdpostCurrent