Reference
Faucet API
Check whether an address can get test tLIB, request a drip, and follow the live block and drip feed.
Base URL: https://faucet.libchain.tech. JSON in and out, CORS open. Addresses are 0x; convert lib1 first.
#GET /api/v1/status
Whether an address can request now.
curl -s "https://faucet.libchain.tech/api/v1/status?address=0xYourAddress&chainId=54210"{
"chainId": 54210,
"available": false,
"nextAvailableAt": "2026-11-06T04:12:09.000Z",
"cooldownSeconds": 86400,
"drips": [{ "symbol": "tLIB", "amount": "10000000000000000000", "decimals": 18, "token": null }]
}#POST /api/v1/drip
Send 10 tLIB to an address.
curl -s -X POST https://faucet.libchain.tech/api/v1/drip \
-H 'content-type: application/json' \
-d '{"address":"0xYourAddress","chainId":54210}'{ "txHashes": ["0x…"] }The transaction is sent at once and is usually final within two seconds.
#Errors
| Status | When |
|---|---|
400 | Invalid JSON, invalid address, or a chainId other than 54210 |
413 | Request body over 4 KB |
429 | The address or IP received coins in the last 24 hours, the faucet's hourly cap was reached, or more than 6 calls a minute. The body has retryAfterSeconds |
503 | The faucet is low on funds and is waiting for a refill |
Errors look like {"error": "Already received testnet coins recently. Try again later.", "retryAfterSeconds": 80122}.
#GET /api/v1/live
A server-sent events stream: one snapshot, then an event for each new block, drip and stats update. LibChain's own sites use it for their live block counters.
const live = new EventSource('https://faucet.libchain.tech/api/v1/live')
live.addEventListener('snapshot', (e) => {
const s = JSON.parse(e.data)
// { chainId, symbol, dripAmount, cooldownSeconds, blockPeriodSeconds,
// emptyBlockPeriodSeconds, faucetBalance, blocks: [...], drips: [...], stats, serverTime }
})
live.addEventListener('block', (e) => {
const { block, faucetBalance } = JSON.parse(e.data)
// block: { number, hash, timestamp, baseFeePerGas, txCount, txs }
})
live.addEventListener('drip', (e) => console.log(JSON.parse(e.data))) // { to, hash, at }
live.addEventListener('stats', (e) => console.log(JSON.parse(e.data))) // { totalTransactions, totalAddresses }The stream is shared by everyone, so it's lighter on the network than polling the RPC yourself. It caps at 1,000 open viewers.