API documentation

Read-only access to Pearl transactions, addresses, blocks and mining data.

https://api.prlscan.com/v2OpenAPI ↗
On this page

Quickstart

  1. Create an account, verify your email and create an API key.
  2. Store the key in a server-side environment variable and send it with each request.
cURL · authenticated 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.

DataMeaning
Identity & feesPool name, website, mining address and current reported/configured fee.
Reported capacityPool-reported hashrate, workers and miners, with source, upstream timestamp and last-fetch status. These are self-reports.
Observed chain activityBlocks, rewards, payouts, balance, latest block and mining share derived from indexed activity and pool-address attribution.
Hashrate & luckAveraged reported hashrate, hashrate implied by observed block wins, block luck, confidence and sample coverage where available. These estimates are distinct.
Yield windowsyield_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.

Examples · supply the bearer header on each request
/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=100

Market 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.

cURL · incremental address history
# 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:

API account allowances and limits
PlanMonthly requestsPer 10 secondsPer minuteDaily safety cap
Free1,0005101,000
Standard250,00020120250,000
Pro1,000,000503001,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

HeaderMeaning
X-Request-IDIdentifier to include when reporting a failed request.
X-Quota-Remaining-MonthMonthly units left after admission, for monthly accounts.
X-Quota-Reset-MonthExclusive period end in Unix seconds. Paid renewal still depends on payment.
X-Quota-Remaining-DayDaily units left after admission.
X-Quota-Reset-DayDaily reset in Unix seconds.
Retry-AfterMinimum 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 statusCode / action
400invalid_query — fix the query; do not retry unchanged.
401invalid_api_key — supply a valid key. Do not retry revoked credentials indefinitely.
403allowance_inactive — check the paid period/subscription, not a tight retry loop.
410market_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 / 405Check the endpoint or identifier, and use GET. CORS preflight is supported.
429quota_exceeded or ip_rate_limited — wait at least Retry-After when provided and add jitter.
503api_unavailable means the API is disabled. Other admission/capacity failures may be retryable; respect Retry-After and use capped backoff.
500 / 504Use 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 requestSupported replacementMigration notes
/v1/status/v2/statusAdd bearer authentication.
/v1/blocks/v2/blocksDefault 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}/txsDefault 25, maximum 100; follow the returned cursor.
/v1/holders/v2/addressesIncludes zero balances and all indexed addresses. Seven supported sorts; opaque cursors.
/v1/transfers/v2/transfersCanonical classified transfers with category/day filters and latest/amount ordering. Restart with an opaque cursor.
/v1/analytics/summary/v2/analytics/summaryOnly the documented block-window presets are supported.
/v1/pools/v2/poolsAggregated pool metrics, not arbitrary historical queries.
/v1/miners/top/v2/miners/topRecent 24/168/720-hour rankings. Use /v2/addresses?sort=mined for cumulative indexed mined rewards.
/v1/market/prlNo supported price feedThe 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

  1. Create an account and API key. No plan purchase or billing change happens automatically.
  2. Match each request against the map and OpenAPI contract. Add Authorization: Bearer <your-api-key> server-side.
  3. Cache data where appropriate, respect account quotas, and use capped backoff for retryable failures. Keys share one account allowance.
  4. 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.