API documentation
Read-only access to Pearl transactions, addresses, blocks and mining data.
https://api.prlscan.com/v2OpenAPI ↗On this page
Quickstart
- Create an account, verify your email and create an API key.
- Store the key in a server-side environment variable and send it with each request.
curl --fail-with-body --silent --show-error \
'https://api.prlscan.com/v2/status' \
-H "Authorization: Bearer ${PRLSCAN_API_KEY}"Authentication & key rotation
Send Authorization: Bearer <your-api-key> on every request. Never put a key in a URL, public frontend bundle, analytics event or source control. The key grants access to these read routes; it does not authorize profile changes, account management, chat or swaps.
Each account can have up to five active keys. All keys share the same quotas. To rotate, create a replacement, migrate your integration, then revoke the old key. Revocation prevents new admissions after it commits; already admitted requests may finish.
Official responses are private, no-store. Authentication and quota checks run even when the server can satisfy the request from its own data cache.
Endpoints
All plans include these twelve GET endpoints. Paths are relative to /v2. Unknown, duplicate and unsupported parameters return 400 before admission. Response schemas are in OpenAPI.
GET/statuschain status
Returns chain and indexer heights/hashes, mempool size, freshness and health. No query parameters. Optional node and lag fields may be present.
GET/blocksnewest blocks
limit: 1–100, default 25. cursor: the preceding response’s next_cursor. Returns {items, next_cursor?}, newest first.
GET/blocks/{id}block detail
id is a numeric height or block hash. No query parameters. Returns {block, transactions}.
GET/txsall confirmed transactions
A complete list of canonical confirmed transactions, including coinbase and transactions that have no classification yet. Order is block height descending, transaction index descending, then transaction ID ascending. Mempool and orphaned transactions are excluded.
limit: 1–100, default 25; cursor: opaque next_cursor; type: all (default), coinbase or non_coinbase; day: one past or current UTC date; category: a supported heuristic classification. Coinbase and category cannot be combined. Category filtering returns only transactions already classified.
Rows include transaction identifiers, confirmation data, coinbase status, fee/input/output/transfer amounts where available, and optional classification and label provenance. Missing classification means unknown, not routine or safe.
GET/txs/{txid}transaction detail
Look up a transaction by its ID. No query parameters. Returns {transaction, inputs, outputs}.
GET/addressesaddress discovery & rankings
Lists all indexed addresses, including fully spent addresses with zero balance. This is broader than the old positive-balance holders list. It does not represent people or identify common ownership.
sort: balance (default), mined, transfer_in, transfer_out, tx_count, last_activity or address. Numeric and activity rankings descend; address ties ascend. Address ordering itself is ascending. Missing ranking inputs sort last and remain pageable. limit: 1–100, default 25; cursor: opaque next_cursor.
Amounts and counts are cumulative indexed statistics. Mined rewards are not a recent mining leaderboard. Incoming/outgoing transfer statistics use external-transfer accounting rather than gross output totals including change. For a broad crawl, address order is more stable than changing balance rankings.
GET/addresses/{address}address summary
Returns public balance and address activity totals. URL-encode the address path segment. No query parameters.
GET/addresses/{address}/txsaddress history
limit: 1–100, default 25. cursor: the preceding next_cursor, URL-encoded. Returns {items, next_cursor?}, newest first.
GET/transfersclassified transfer discovery
The enriched, materialized transfer feed: categories, measured transfer volume, source/destination summaries, transaction labels with source/confidence, and peel-chain identifiers where available. It contains confirmed canonical positive-volume classified transfers; coinbase, unclassified and zero-volume transactions are excluded. Use /txs for the complete transaction list.
sort: latest (default) or amount; category: a supported classification; day: one past or current UTC date; limit: 1–100, default 25; cursor: opaque next_cursor. Amount means transfer_volume_grains, not total transaction outputs. See classification coverage.
GET/analytics/summarynetwork & mining summary
Returns difficulty, estimated network/pool hashrate, average block interval, latest block, and 24-hour block count, issued rewards and transfer volume. Useful for mining calculators, chain monitoring and dashboards; this is one summary object rather than an arbitrary analytics query.
window_blocks: 50 (default), 100, 200 or 500. The block-count window controls the block-time/hashrate estimate; fields named 24h retain a 24-hour window. The effective block window is returned. Unsupported values are rejected rather than silently rounded.
GET/poolspool comparison & yield aggregates
One cached collection of the supported pools, combining reported pool data with PRLScan’s indexed chain observations. A snapshot contains historical window aggregates as well as the latest reported values; it is not a time-series endpoint.
| Data | Meaning |
|---|---|
| Identity & fees | Pool name, website, mining address and current reported/configured fee. |
| Reported capacity | Pool-reported hashrate, workers and miners, with source, upstream timestamp and last-fetch status. These are self-reports. |
| Observed chain activity | Blocks, rewards, payouts, balance, latest block and mining share derived from indexed activity and pool-address attribution. |
| Hashrate & luck | Averaged reported hashrate, hashrate implied by observed block wins, block luck, confidence and sample coverage where available. These estimates are distinct. |
| Yield windows | yield_windows and network yield_benchmarks for supported windows from 12 hours through 21 days. Availability depends on observations and required samples. |
Hashrates are H/s. Yield is grains per PH/s-day: net yield uses observed block rewards divided by averaged reported hashrate and window duration, adjusted using the configured fee. It is not a measured individual payout rate or a future-return guarantee. One PRL is 100,000,000 grains.
updated_at and cache_max_age_sec describe the aggregate’s refresh; inspect each pool’s upstream_updated_at and coverage separately. Missing/nullable upstream fields are not zero. Failed upstream fetches do not erase the pool from the roster. Raw provider error text is omitted. No query parameters.
GET/miners/toprecent block-winning miners
Ranks mining addresses by observed canonical block wins in a fixed recent window. Rows include blocks, rewards and address statistics; the summary describes the whole window, independently of the returned row limit. An address is not necessarily one person or one physical miner.
hours: 24 (default), 168 or 720; limit: 1–100, default 25. All limits share a cached top-100 view per window. No pagination or all-time scan. Unlike /addresses?sort=mined, this is a recent block-win ranking rather than cumulative mined rewards.
Classifications
Supported categories: otc_settlement, private_otc, facilitated_transfer, bridge_withdrawal, bridge_deposit, pool_payout, compute_payout, batch_payout, peel_chain, wallet_churn, consolidation, large_direct and routine_transfer.
Categories are PRLScan interpretations from transaction structure, indexed labels and known activity patterns. They are not consensus types, ownership claims or proof of a payment’s purpose. The complete transaction feed returns classification source/method, heuristic confidence and update time; transaction-label source/confidence describe that label separately. Categories can change as evidence improves.
Classification is asynchronous and historical coverage can be incomplete. An empty classified page, or a missing classification, does not establish that no transfer occurred. Use the complete transaction feed and follow block confirmations/reorganizations when completeness matters.
/v2/txs?type=coinbase&limit=25
/v2/txs?category=pool_payout&day=2026-10-27
/v2/transfers?category=bridge_deposit&sort=amount
/v2/addresses?sort=transfer_out&limit=100Market data
The former /v2/market/prl CMC-backed price feed is unavailable pending documented redistribution rights. It returns 410 market_data_unavailable and does not consume your account allowance.
Market aggregation is not currently supported. The explorer’s website price display is separate.
Pagination, amounts & freshness
All pageable lists return items and, when another page is available, next_cursor. Treat the cursor as opaque. Send it URL-encoded in the next request, and stop when it is absent. Discovery cursors are bound to their endpoint, filters and sort; page size may change. Restart after changing filters. Do not create arbitrary offsets. The dataset remains live: reorgs, new transactions and changing balances can move rows between requests. Cursor pagination is not a frozen export.
# ADDRESS and NEXT_CURSOR come from your integration.
curl --fail-with-body --silent --show-error --get \
"https://api.prlscan.com/v2/addresses/${ADDRESS}/txs" \
-H "Authorization: Bearer ${PRLSCAN_API_KEY}" \
--data-urlencode 'limit=25' \
--data-urlencode "cursor=${NEXT_CURSOR}"- Integer monetary amounts are in grains. Use a JSON parser that preserves 64-bit integers. JavaScript’s default number parsing may lose precision.
- Empty arrays may be
null. Clients should accept additional response fields and handle chain reorganizations. - Snapshots may be stale while refreshing or after an upstream failure. Check observation timestamps and indexer status.
cache_max_age_sec, where present, is a refresh cadence, not a guaranteed maximum data age. - There is no streaming endpoint, arbitrary analytics interface or write operation in this API contract.
Limits & usage
All account keys share one monthly allowance and the same short-term limits. The account allowances are:
| Plan | Monthly requests | Per 10 seconds | Per minute | Daily safety cap |
|---|---|---|---|---|
| Free | 1,000 | 5 | 10 | 1,000 |
| Standard | 250,000 | 20 | 120 | 250,000 |
| Pro | 1,000,000 | 50 | 300 | 1,000,000 |
These are account ceilings. Independent IP/firewall limits and shared server capacity may reject a request earlier. These numbers are not reserved throughput.
Short windows are fixed: 10-second windows, UTC minutes and UTC days. Traffic can cluster around a boundary; these are not rolling-window guarantees. Free monthly allowances reset on UTC calendar-month boundaries. Paid allowances use confirmed billing-cycle dates and require a successful renewal. Unused requests do not roll over; there are no automatic overage charges.
What consumes an allowance?
Every admitted request consumes one unit, including cache hits and later handler errors. Invalid credentials, invalid queries, quota denials and other pre-admission rejections do not count. An uncertain network result may consume a unit without returning data; a retry is a new admission. These counters measure admissions, not successful responses.
Signing in, rotating keys or changing a tier does not replenish an already-used period. Returning to Free resumes its existing calendar-month usage.
Response headers
| Header | Meaning |
|---|---|
X-Request-ID | Identifier to include when reporting a failed request. |
X-Quota-Remaining-Month | Monthly units left after admission, for monthly accounts. |
X-Quota-Reset-Month | Exclusive period end in Unix seconds. Paid renewal still depends on payment. |
X-Quota-Remaining-Day | Daily units left after admission. |
X-Quota-Reset-Day | Daily reset in Unix seconds. |
Retry-After | Minimum seconds to wait when supplied on a retryable denial. |
Quota headers are sent on admitted responses. Concurrent requests may observe different remaining values; headers are not a replacement for the server’s shared account ledger.
Errors & retries
Admission errors have error, code and request_id fields. Handle HTTP status even when a firewall or proxy returns an empty or non-JSON body. Data-handler errors may use a simpler body.
| HTTP status | Code / action |
|---|---|
| 400 | invalid_query — fix the query; do not retry unchanged. |
| 401 | invalid_api_key — supply a valid key. Do not retry revoked credentials indefinitely. |
| 403 | allowance_inactive — check the paid period/subscription, not a tight retry loop. |
| 410 | market_data_unavailable — the CMC feed is retired pending redistribution rights; do not retry as a temporary outage. This route does not consume account quota. |
| 404 / 405 | Check the endpoint or identifier, and use GET. CORS preflight is supported. |
| 429 | quota_exceeded or ip_rate_limited — wait at least Retry-After when provided and add jitter. |
| 503 | api_unavailable means the API is disabled. Other admission/capacity failures may be retryable; respect Retry-After and use capped backoff. |
| 500 / 504 | Use capped exponential backoff for temporary server failures/timeouts. Report persistent failures with request IDs. |
Prefer incremental history reads and cache data in your application when appropriate. Avoid retry storms, particularly after a quota or capacity error.
Migration from v1
The anonymous /v1 API is deprecated. It continues returning its existing data during the notice period. Move integrations to the supported, authenticated /v2 API; create an account and key and start with the Free plan, or choose a paid allowance.
No shutdown date is announced. We will review usage after at least one week of notices. Deprecation does not turn off access or start charging existing requests. Successful responses keep their existing JSON format. A cutoff will be announced separately after the explorer has moved successfully.
Endpoint migration map
This is not a universal prefix replacement. Use the documented parameters for each supported endpoint and restart pagination using its returned cursors.
| Legacy request | Supported replacement | Migration notes |
|---|---|---|
/v1/status | /v2/status | Add bearer authentication. |
/v1/blocks | /v2/blocks | Default 25, maximum 100; follow next_cursor. |
/v1/blocks/{id} | /v2/blocks/{id} | Height or hash; add bearer authentication. |
/v1/txs/{txid} | /v2/txs/{txid} | Add bearer authentication. Use /v2/txs for complete confirmed transaction discovery. |
/v1/addresses/{address} | /v2/addresses/{address} | Add bearer authentication. |
/v1/addresses/{address}/txs | /v2/addresses/{address}/txs | Default 25, maximum 100; follow the returned cursor. |
/v1/holders | /v2/addresses | Includes zero balances and all indexed addresses. Seven supported sorts; opaque cursors. |
/v1/transfers | /v2/transfers | Canonical classified transfers with category/day filters and latest/amount ordering. Restart with an opaque cursor. |
/v1/analytics/summary | /v2/analytics/summary | Only the documented block-window presets are supported. |
/v1/pools | /v2/pools | Aggregated pool metrics, not arbitrary historical queries. |
/v1/miners/top | /v2/miners/top | Recent 24/168/720-hour rankings. Use /v2/addresses?sort=mined for cumulative indexed mined rewards. |
/v1/market/prl | No supported price feed | The CMC-backed /v2/market/prl is retired; see market availability. |
Website search, chart/history interfaces, mempool, news/signals, event streaming and interactive profile/chat/swap operations are not part of the twelve-read developer contract. Their presence on the explorer does not make them supported developer API endpoints. Do not move integrations onto undocumented website routes.
Migration checklist
- Create an account and API key. No plan purchase or billing change happens automatically.
- Match each request against the map and OpenAPI contract. Add
Authorization: Bearer <your-api-key>server-side. - Cache data where appropriate, respect account quotas, and use capped backoff for retryable failures. Keys share one account allowance.
- Remove the legacy calls after verifying the authenticated responses. Report missing integration capabilities before the cutoff is announced.
During the notice period, legacy responses include Deprecation, a Link to this guide and X-PRLScan-Legacy-API: deprecated. API-generated errors also carry migration instructions: JSON error objects add a migration object with signup, documentation and OpenAPI links; plain-text errors append signup and guide URLs. Existing error fields, HTTP status and retry headers remain unchanged. Successful responses and streams are unchanged. A future retirement response will use HTTP 410 with machine-readable signup and documentation links. There is no automatic cutoff timer.
Public website data remains scrapeable; API credentials provide supported, accountable access and do not reserve server capacity.
Questions or a persistent error? Email hi@prlscan.com with the endpoint, HTTP status and request ID. Never send an API key.