API

The data behind PriFi.info as JSON under fixed addresses, at https://prifi.info/api/v1/. Any website or script may read it: no key, no sign-up, and every answer allows requests from any origin (CORS).

  • 1.0.0 version
  • 12 endpoints

Free for non-commercial use under CC BY-NC 4.0, with credit, as the Data page sets out. Information only, not investment advice.

How answers look

The envelope

Every answer is a JSON object with the same fields around the data, which is the site's own file, unchanged:

api
Always "PriFi.info API".
version
The API version, now 1.0.0. Also sent as the X-API-Version header.
endpoint
The endpoint, such as summary or protocol/<id>; id is added for the latter.
source
The file on prifi.info that the data comes from.
modifiedAt
When that file was last written, ISO 8601 in UTC.
licence, docs
The licence of the data and the address of this page.
data
The file's contents, described under each endpoint below.

Headers and caching

Answers carry Access-Control-Allow-Origin: *, an ETag and Last-Modified. Send If-None-Match or If-Modified-Since to get 304 Not Modified when nothing has changed. Cache-Control follows the file: 60 seconds for the summary, 10 minutes for the daily history, and revalidation every time for the live files.

The files change at most every five minutes, and the live files every few seconds, so asking more often than the cache time gains nothing. An unknown endpoint or a file not written yet gets 404 with a JSON error. GET, HEAD and OPTIONS are answered.

Stability

The addresses and the envelope stay as they are within version 1. The fields inside data are those of the site's files: new fields can appear, and a field that is renamed or removed will be listed in the changelog below, with a new version number.

Endpoints

Each endpoint with what it holds, how often it changes, its fields and an example taken from the current data.

Summary

GET

/api/v1/summary

Everything the overview shows: the headline figures, each protocol with its TVL and status, the coin basket, the events and when each source was last fetched.

Updated
Every 5 minutes
Fields in data 11
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
methodologyVersionThe version of the method behind the figures.
tilesThe headline figures, as in live.json.
compositionThe bars on the overview and protocols pages: current TVL by type and the float by coin, in US dollars.
protocolsOne object per protocol with the fields of protocols.csv except until and exclude (observedAt in Unix seconds, chains as a list), plus spark, the TVL values behind its 90-day trend line, logo, and profile, the address of its profile page on PriFi.info or null.
assetsThe coin basket: symbol, name, privacy, mcap (US dollars), observedAt and share (percent).
assetRuleWhich coins the basket includes, and why.
countsProtocols tracked, counted, over $100K in TVL, and new listings awaiting review.
eventsEvery date on the Calendar page, from which the overview shows the next five: id (its entry on /calendar/ is #ev-<id>), date, endDate (the last day of an event over several days, or null), dateCertainty (fixed, expected or targeted), type, jurisdiction, title and source, the first of its sources.
sourcesEach data source with its cadence, when it was last fetched and whether it is delayed.
dexvolumeFor private DEX volume, each venue (id and name) with the first and last day it had volume (firstDay, lastActiveDay; 00:00 UTC in Unix seconds, or null).
Example

/api/v1/summary, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "summary",
  "source": "https://prifi.info/data/summary.json",
  "modifiedAt": "2026-10-29T06:12:42.649Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:42.000Z",
    "methodologyVersion": "0.1 (9 Oct 2026)",
    "tiles": {
      "tvl": {
        "value": 263594007.96595562,
        "inclTornado": 1068493830.5047122,
        "change30d": 30.229576428631955,
        "observedAt": 1793254344
      },
      "float": {
        "value": 32830268937.187496,
        "assetCount": 7,
        "zecXmrShare": 98.76578012973792,
        "change30d": -4.445267096167416,
        "observedAt": 1793254076
      },
      "shielded": {
        "zec": 4956793.179183,
        "pct": 29.136795803356552,
        "usd": 6199907340.590304,
        "change30dZec": 66305.95453158021,
        "observedAt": 1793254077,
        "source": "ZecStats"
      },
      "penetration": {
        "value": 0.8028993258333545,
        "change30dPts": 0.21377945972738,
        "observedAt": 1793254344
      },
      "share": {
        "value": 0.3007091491565148,
        "inclTornado": 1.218942240491125,
        "total": 87657461938,
        "totalObservedAt": 1793252362,
        "change30dPts": 0.08845263858177405,
        "observedAt": 1793252362
      },
      "dexvolume": {
        "value": 703823,
        "share": 0.010096893719361476,
        "total": 6970688407.37,
        "day": 1793145600,
        "sum30d": 25847160.030323308,
        "change30d": 60.754558248014725
      }
    },
    "composition": {
      "tvl": [
        {
          "label": "Tornado Cash",
          "value": 804899822.5387566,
...

Daily history

GET

/api/v1/history

The daily series behind the charts: private DeFi TVL, the privacy-asset float, the shielded Zcash supply, penetration and the private share of DeFi.

Updated
Daily, after 01:20 UTC
Fields in data 4
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
unitsThe units of the series: millions of US dollars, ZEC and percent.
daysThe date axis: each day at 00:00 UTC, in Unix seconds.
seriesThe 14 series of history.csv, each a list in step with days, with null where there is no value.
Example

/api/v1/history, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "history",
  "source": "https://prifi.info/data/history.json",
  "modifiedAt": "2026-10-29T01:23:58.425Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T01:23:58.000Z",
    "units": {
      "usd": "millions of US dollars",
      "zec": "ZEC",
      "pct": "percent"
    },
    "days": [
      1400544000,
      1400630400
    ],
    "series": {
      "tvlExTornado": [
        null,
        null
      ],
      "tvlTotal": [
        null,
        null
      ],
      "floatTotal": [
        2.255,
        1.397
      ],
      "floatZEC": [
        null,
        null
      ],
      "floatXMR": [
        2.255,
        1.397
      ],
      "floatOther": [
        null,
        null
      ],
      "shieldedZec": [
        null,
        null
      ],
      "shieldedPct": [
        null,
        null
      ],
      "shieldedUsd": [
        null,
        null
      ],
      "penetration": [
        null,
        null
      ],
...

Protocols

GET

/api/v1/protocols

One record per tracked protocol, with the same fields and values as protocols.csv.

Updated
Hourly
Fields in data 16
FieldMeaning
slugDefiLlama's identifier for the protocol.
nameProtocol name.
typePriFi.info's classification: mixer, shielded-pool, confidential-tokens, private-dex-lending or unclassified.
statuslive, alpha, unconfirmed, unknown (not yet reviewed), inactive, sunset, deprecated, exploited or no-reliable-data.
countedtrue when the protocol counts in the current private DeFi TVL total.
tvlTVL in US dollars, from DefiLlama: refreshed hourly for counted protocols, otherwise the last daily value.
observedAtWhen that TVL was observed, ISO 8601 in UTC.
change7dChange in TVL over 7 days, in percent. Empty when not counted or with too little history.
change30dChange in TVL over 30 days, in percent.
chainsChains where DefiLlama tracks it, largest first, separated by semicolons.
untilLast day its history counts in the totals, YYYY-MM-DD. Empty for no end date.
excludetrue for a protocol that is never counted.
websiteThe project's own website. Empty where the domain is dead or parked.
notePriFi.info's note on the protocol.
noteSourceA link supporting the note.
reviewedWhen PriFi.info last reviewed the entry, YYYY-MM-DD.
Example

/api/v1/protocols, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "protocols",
  "source": "https://prifi.info/data/protocols.json",
  "modifiedAt": "2026-10-29T06:12:43.822Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": [
    {
      "slug": "tornado-cash",
      "name": "Tornado Cash",
      "type": "mixer",
      "status": "live",
      "counted": true,
      "tvl": 804899823,
      "observedAt": "2026-10-29T06:12:15.000Z",
      "change7d": -3.12,
      "change30d": 3.97,
      "chains": "Ethereum; Binance; Arbitrum; xDai; Avalanche; Polygon; Optimism; EthereumClassic",
      "until": null,
      "exclude": false
    },
    {
      "slug": "railgun",
      "name": "Railgun",
      "type": "shielded-pool",
      "status": "live",
      "counted": true,
      "tvl": 111318556,
      "observedAt": "2026-10-29T06:12:15.000Z",
      "change7d": -3.52,
      "change30d": 14.65,
      "chains": "Ethereum; Arbitrum; Binance; Polygon",
      "until": null,
      "exclude": false
    }
  ]
}

One protocol profile

GET

/api/v1/protocol/<id>

The series behind a protocol profile's chart. The id is the profile's, as in its address: /protocols/railgun/ is protocol/railgun.

Updated
Hourly
Fields in data 9
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
idThe profile: its page is /protocols/<id>/.
nameThe project.
measuretvl (total value locked, from DefiLlama) or mcap (market cap); null when the site holds no series for it.
coinFor a privacy coin, its symbol in the basket, such as XMR; otherwise null.
unitsThe unit of every series: US dollars.
daysThe date axis: each day at 00:00 UTC, in Unix seconds.
seriesOne object per line on the chart: key (tvl, mcap or shieldedUsd), label, source, and values, whole US dollars in step with days, with null where there is no value.
nowThe current values, in the order of series, and observedAt, when they were observed, in Unix seconds; null when there are none, as for a protocol no longer counted.
Example

/api/v1/protocol/aleo, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "protocol/<id>",
  "id": "aleo",
  "source": "https://prifi.info/data/protocol-aleo.json",
  "modifiedAt": "2026-10-29T06:12:43.690Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:42.000Z",
    "id": "aleo",
    "name": "Aleo",
    "measure": null,
    "coin": null,
    "units": "US dollars",
    "days": [],
    "series": [],
    "now": null
  }
}

Exchange listings

GET

/api/v1/access

One record per exchange and coin, with the same fields and values as access.csv.

Updated
Hourly; entries change when re-checked
Fields in data 28
FieldMeaning
exchangeExchange identifier.
exchangeNameExchange name.
coinZEC, XMR, DCR, ZANO, ARRR, XVG or FIRO.
statuslisted, listed-restricted (not offered everywhere), delisted, never-listed or unknown.
sinceWhen the current status began, YYYY-MM-DD. Empty when not known.
regionsWhere a restricted listing is or is not offered.
shieldedFor ZEC, whether the exchange handles shielded Zcash addresses: supported, transparent-only, tex-only or unknown. Empty for other coins.
notePriFi.info's note on the listing.
confidenceconfirmed, reported or unconfirmed, as for the country rules.
checkedOnWhen the listing was checked, YYYY-MM-DD.
sourcesLinks to the market data and notices it rests on, separated by spaces.
perpetualtrue when a perpetual contract on the coin (settled in USDT, USDC or US dollars) trades on the exchange.
perpetualSymbolThe perpetual's symbol on the exchange, such as ZECUSDT. Empty when none trades.
perpetualSettlementWhat the perpetual is settled in: USDT, USDC or USD.
perpetualOnlytrue when the coin has no spot market on the exchange (never-listed or delisted) but a perpetual trades: shown as Perp only.
nativeChainWhether deposits or withdrawals use the coin's own chain: yes, wrapped-only (only a token on another chain), none or unknown.
wrappedOnlyFor a wrapped-only cell, the chains of the tokens offered, separated by semicolons.
withdrawalsFrozentrue when spot trades but every withdrawal network is suspended; empty when the live wallet status needs a logged-in account.
depositNetworksNetworks for deposits, separated by semicolons, each with its status (open, suspended or unknown) and "token" for a token on another chain.
withdrawalNetworksNetworks for withdrawals, in the same form.
networkNotePriFi.info's note on the perpetual and the networks.
networksCheckedOnWhen the perpetual and the networks were checked, YYYY-MM-DD.
zecShieldedDepositsFor ZEC on an exchange with a ZEC market: whether deposits sent from shielded addresses are credited, not-credited, returned or unknown. Empty otherwise.
zecShieldedWithdrawalsFor ZEC: whether withdrawals can go to shielded addresses: supported, transparent-only, tex-only or unknown. The shielded column above holds the same answer.
zecAddressRuleFor ZEC: the withdrawal address pattern in the exchange's public API, where it publishes one.
zecCheckedOnFor ZEC: when the shielded address rules were checked, YYYY-MM-DD.
usStatesOn an exchange checked for US state limits: the states and territories it does not serve for this coin, as USPS codes separated by spaces, ALL when it serves no US state, or none when no exclusion was found. Empty where not checked.
newSourcesLinks to the documents behind the perpetual, the networks, the shielded address rules and the US state limits, separated by spaces.
Example

/api/v1/access, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "access",
  "source": "https://prifi.info/data/access.json",
  "modifiedAt": "2026-10-29T06:12:43.826Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": [
    {
      "exchange": "binance",
      "exchangeName": "Binance",
      "coin": "ZEC",
      "status": "listed-restricted",
      "since": "2025-04-25",
      "regions": "Not offered to Dubai users, who are moved to the separate Binance Dubai (FZE) exchange",
      "shielded": "transparent-only",
      "note": "ZEC trades against BTC, ETH, USDT, USDC, USD1 and U but has not been offered to Dubai users since th...",
      "confidence": "confirmed",
      "checkedOn": "2026-10-13",
      "sources": "https://api.binance.com/api/v3/exchangeInfo https://www.binance.com/bapi/capital/v1/public/capital/g...",
      "perpetual": true
    },
    {
      "exchange": "binance",
      "exchangeName": "Binance",
      "coin": "XMR",
      "status": "delisted",
      "since": "2024-02-20",
      "regions": null,
      "shielded": null,
      "note": "Trading on all XMR pairs ceased at 2024-02-20 03:00 UTC, deposits stopped being credited after 2024-...",
      "confidence": "confirmed",
      "checkedOn": "2026-10-13",
      "sources": "https://www.binance.com/bapi/composite/v1/public/cms/article/detail/query?articleCode=f73b083ba68347...",
      "perpetual": true
    }
  ]
}

Country rules

GET

/api/v1/rules

One record per jurisdiction, with the same fields and values as rules.csv.

Updated
Hourly; entries change when re-checked
Fields in data 22
FieldMeaning
codeTwo-letter country code (ISO 3166-1 alpha-2).
nameJurisdiction.
levelStrongest rule found: crypto-ban, exchange-ban, scheduled-ban, delisted-under-pressure, mixers-targeted or no-restriction-found.
summaryThe rule in one sentence.
holdingWhether individuals may hold privacy coins: legal, restricted, banned (shown as Barred) or unknown.
exchangesWhether exchanges may list them: allowed, barred, barred-from-date, effectively-barred or unknown.
mixersHow mixers are treated: no-specific-rule, sanctioned-or-prosecuted, banned (shown as Barred by rule) or unknown.
effectiveFromWhen the rule took effect, YYYY-MM-DD. Empty when no date applies.
instrumentThe law, rule or decision it rests on.
detailThe full entry.
groupeu for EU member states, otherwise empty.
inheritedtrue for an EU member that follows the EU entry and was not reviewed separately.
confidenceconfirmed (a primary source states it), reported (secondary sources only) or unconfirmed (not verified).
checkedOnWhen the entry was checked, YYYY-MM-DD.
sourcesLinks to the documents the entry rests on, separated by spaces.
selfHostedThe rule on transfers to and from self-hosted wallets: ownership-proof (the customer shows they control the wallet), declaration (the firm obtains the owner's details from its customer), whitelist (withdrawals only to registered addresses) or none (no specific rule). EU members take the EU-wide rule. Empty where not checked.
selfHostedThresholdThe amount above which that rule applies, such as EUR 1,000. Empty when it applies to any amount or was not checked.
selfHostedSinceWhen that rule took effect, YYYY-MM-DD, where known.
selfHostedRuleThat rule in one sentence.
selfHostedCheckedOnWhen that rule was checked, YYYY-MM-DD.
selfHostedSourcesLinks to the documents behind that rule, separated by spaces.
statesFor the United States only: the state-level note, on the NYDFS Greenlist and New York access.
Example

/api/v1/rules, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "rules",
  "source": "https://prifi.info/data/rules.json",
  "modifiedAt": "2026-10-29T06:12:43.822Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": [
    {
      "code": "AF",
      "name": "Afghanistan",
      "level": "crypto-ban",
      "summary": "Afghanistan's central bank ordered a halt to crypto trading in August 2022 and Herat police arrested...",
      "holding": "restricted",
      "exchanges": "barred",
      "mixers": "no-specific-rule",
      "effectiveFrom": null,
      "instrument": "Da Afghanistan Bank order halting cryptocurrency trading, August 2022 (not published)",
      "detail": "A Bloomberg report republished on 27 August 2022 said Afghanistan's central bank had that month orde...",
      "group": null,
      "inherited": false
    },
    {
      "code": "DZ",
      "name": "Algeria",
      "level": "crypto-ban",
      "summary": "Algeria bans buying, selling, using or holding any cryptocurrency, privacy coins included, and a Jul...",
      "holding": "banned",
      "exchanges": "barred",
      "mixers": "no-specific-rule",
      "effectiveFrom": "2017-12-28",
      "instrument": "Finance Law for 2018 (Law 17-11 of 27 December 2017), art. 117; Law 25-10 of 24 July 2025 adding art...",
      "detail": "Article 117 of the Finance Law for 2018 (Law 17-11 of 27 December 2017, published in Official Journa...",
      "group": null,
      "inherited": false
    }
  ]
}

Changes

GET

/api/v1/changes

Every dated change on the Changes page, newest first, with the same fields and values as changes.csv.

Updated
Hourly
Fields in data 10
FieldMeaning
dateWhen it happened, or for a change found by the hourly comparison or the daily exchange check when it was found, YYYY-MM-DD.
kindexchange, rule, protocol, listing or site.
eventThe badge on the Changes page: an exchange event (listed, delisted, restricted, relisted, shielded-support, changed, added, removed), a difference found by the daily check of the exchanges' market data (check-listed, check-missing), a rule level, a protocol change (added, removed, status, counted, uncounted) or where a new listing stands (review, tracked, ignored, gone).
subjectThe exchange, jurisdiction, protocol or page concerned.
coinsFor exchange changes, the coins concerned, separated by spaces.
titleOne-line headline.
textWhat changed.
linkWhere to read more on PriFi.info.
sourcesLinks to the sources, separated by spaces.
idA stable identifier, also used in the RSS feed.
Example

/api/v1/changes, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "changes",
  "source": "https://prifi.info/data/changes.json",
  "modifiedAt": "2026-10-29T06:12:43.826Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": [
    {
      "date": "2026-10-26",
      "kind": "listing",
      "event": "review",
      "subject": "DARKPOOL",
      "coins": null,
      "title": "New DefiLlama Privacy listing: DARKPOOL",
      "text": "DefiLlama added DARKPOOL to its Privacy category on 2026-10-25, tracking it on Solana and Robinhood ...",
      "link": "https://prifi.info/changes/#c-listing-darkpool",
      "sources": "https://defillama.com/protocol/darkpool",
      "id": "listing-darkpool"
    },
    {
      "date": "2026-10-23",
      "kind": "site",
      "event": null,
      "subject": "Summary of the 23 October 2026 release",
      "coins": null,
      "title": "Summary of the 23 October 2026 release",
      "text": "This release adds 15 protocol profiles (23 in all) and pages for Legal cases, Incidents, Audits, Net...",
      "link": "https://prifi.info/this-week/",
      "sources": null,
      "id": "site-2026-10-23-summary-of-the-23-october-2026-release"
    }
  ]
}

Activity

GET

/api/v1/activity

The daily counts behind the Activity page: transactions, deposits and shields per project.

Updated
Hourly
Fields in data 9
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
unitsWhat the values count.
chartsOne object per chart, by id: monero, zcash, railgun, railgun-volume, tornado, privacy-pools, privacy-cash and aztec.
charts.*.unittransactions, deposits, events, or usd for US dollars.
charts.*.daysThe date axis: each complete UTC day at 00:00, in Unix seconds.
charts.*.seriesOne object per line: key, label and values, in step with days, with null where there is no figure (a day not yet read in full).
charts.*.marksDated events marked on the chart: at (Unix seconds) and label.
charts.*.latestThe newest day with a figure, and the values of every line that day.
checksFigures compared with a second source for the newest day both have: what, day, value, source and against (value and source).
Example

/api/v1/activity, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "activity",
  "source": "https://prifi.info/data/activity.json",
  "modifiedAt": "2026-10-29T06:12:43.719Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:43.000Z",
    "units": "Each series is a count per UTC day (transactions, deposits, withdrawals or events), except railgun-v...",
    "charts": {
      "monero": {
        "unit": "transactions",
        "days": [
          1397779200,
          1397865600
        ],
        "series": [
          {
            "key": "tx",
            "label": "Transactions",
            "values": []
          }
        ],
        "marks": [],
        "latest": {
          "day": 1793145600,
          "values": [
            29011
          ]
        }
      },
      "zcash": {
        "unit": "transactions",
        "days": [
          1477612800,
          1477699200
        ],
        "series": [
          {
            "key": "total",
            "label": "All transactions",
            "values": []
          },
          {
            "key": "shielded",
            "label": "Using a shielded pool",
            "values": []
          }
        ],
        "marks": [
          {
            "at": 1785247643,
            "label": "Ironwood"
          }
        ],
        "latest": {
          "day": 1793145600,
          "values": [
...

Anonymity sets

GET

/api/v1/anonymity

The pool sizes, deposits and note counts behind the Anonymity sets page.

Updated
Daily, after 01:20 UTC
Fields in data 9
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
pageThe page the file belongs to.
lastRunWhen the daily step last ran, ISO 8601 in UTC.
unitsWhat the values count.
creditsWhere the readings come from.
chartsOne object per chart: id, title and unit (deposits, notes, outputs, members or ZEC).
charts.*.daysThe date axis: each day with a reading, at 00:00 UTC, in Unix seconds.
charts.*.seriesOne object per line: key, label and values, in step with days, with null where there is no reading.
latestThe newest reading of every stored series, by series id: value, observedAt (Unix seconds) and source.
Example

/api/v1/anonymity, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "anonymity",
  "source": "https://prifi.info/data/anonymity.json",
  "modifiedAt": "2026-10-29T01:21:27.709Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T01:21:27.710Z",
    "page": "https://prifi.info/anonymity-sets/",
    "lastRun": "2026-10-29T01:21:23.927Z",
    "units": "Counts of deposits, notes, outputs or ring members, or whole units of the asset held (ZEC for the Zc...",
    "credits": "Contracts read through PublicNode and the Solana Foundation; Zcash trees from zec.rocks; Monero from...",
    "charts": [
      {
        "id": "tornado-unspent",
        "title": "Unspent notes in the ETH pools on Ethereum",
        "unit": "notes",
        "days": [
          1792108800,
          1792195200
        ],
        "series": [
          {
            "key": "tornado:ethereum:eth-0.1:unspent",
            "label": "0.1 ETH",
            "values": []
          },
          {
            "key": "tornado:ethereum:eth-1:unspent",
            "label": "1 ETH",
            "values": []
          }
        ]
      },
      {
        "id": "tornado-deposits",
        "title": "Deposits since launch, ETH pools on Ethereum",
        "unit": "deposits",
        "days": [
          1792108800,
          1792195200
        ],
        "series": [
          {
            "key": "tornado:ethereum:eth-0.1:deposits",
            "label": "0.1 ETH",
            "values": []
          },
          {
            "key": "tornado:ethereum:eth-1:deposits",
            "label": "1 ETH",
            "values": []
          }
        ]
      }
    ],
    "latest": {
      "monero:fcmp-closed": {
...

Live ticker: recent events

GET

/api/v1/live/recent

The newest events the live watcher has seen on each chain.

Updated
Every few seconds
Fields in data 13
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
eventsThe newest 300 events, newest first.
events.*.idA unique id: the time in milliseconds, the chain and the first 8 characters of the hash.
events.*.tsWhen the watcher saw the event (not the time of its block), ISO 8601 in UTC, to the millisecond.
events.*.chainethereum, monero, zcash, solana, liquid, aztec, polygon, bsc, arbitrum, optimism, base, firo, pirate, zano or namada.
events.*.protocoltornado-cash, railgun, privacy-pools, monero, zcash, privacy-cash, liquid, aztec, firo, pirate-chain, zano or namada.
events.*.kinddeposit, withdrawal, shield, unshield, transfer, transaction, shielded-transaction, transparent-transaction or block.
events.*.detailA short description, such as the pool ("10 ETH pool"), the number of shielded actions or the fee.
events.*.amountvalue and unit, for the fixed amount of a Tornado Cash pool or the total output of a fully transparent Zcash transaction; otherwise null. The variable amounts of Railgun, Privacy Pools and Privacy Cash are left out, since a deposit and a withdrawal of the same amount minutes apart are easy to pair.
events.*.hashThe transaction hash (or for a block, its hash).
events.*.urlThe transaction or block on a public block explorer, or null.
events.*.blockThe block number (on Solana, the slot), or null for a transaction not yet in a block.
events.*.sourceThe domain of the node or explorer it came from.
Example

/api/v1/live/recent, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "live/recent",
  "source": "https://prifi.info/data/live/recent.json",
  "modifiedAt": "2026-10-29T06:12:41.427Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:41.428Z",
    "events": [
      {
        "id": "1793254361429-monero-7fa3e068",
        "ts": "2026-10-29T06:12:41.429Z",
        "chain": "monero",
        "protocol": "monero",
        "kind": "transaction",
        "detail": "fee 0.0000308 XMR, 1 input, 2 outputs",
        "amount": null,
        "hash": "7fa3e068d8966beb8d58f6c843cdbd3ea34f3622c709c2b8f9d4cfa55cdcd7e3",
        "url": "https://xmrchain.net/tx/7fa3e068d8966beb8d58f6c843cdbd3ea34f3622c709c2b8f9d4cfa55cdcd7e3",
        "block": null,
        "source": "cakewallet.com"
      },
      {
        "id": "1793254361428-monero-4011ad15",
        "ts": "2026-10-29T06:12:41.428Z",
        "chain": "monero",
        "protocol": "monero",
        "kind": "transaction",
        "detail": "fee 0.0000446 XMR, 2 inputs, 2 outputs",
        "amount": null,
        "hash": "4011ad15c0029a6a9812ea0d4ea9ebe28314db2cf19646a889b63dbe1742fc30",
        "url": "https://xmrchain.net/tx/4011ad15c0029a6a9812ea0d4ea9ebe28314db2cf19646a889b63dbe1742fc30",
        "block": null,
        "source": "cakewallet.com"
      }
    ]
  }
}

Live ticker: status

GET

/api/v1/live/status

The live watcher's connection to each chain.

Updated
Every few seconds
Fields in data 14
FieldMeaning
generatedAtWhen the file was written, ISO 8601 in UTC.
watcherStartedAtWhen the watcher last started, ISO 8601 in UTC.
chainsOne object per chain source.
chains.*.chainethereum, monero, zcash, solana, liquid, aztec, polygon, bsc, arbitrum, optimism, base, firo, pirate, zano or namada.
chains.*.protocolThe protocols it follows there, separated by commas where one source serves several (on Ethereum, tornado-cash,railgun,privacy-pools).
chains.*.connectedtrue when its last request succeeded.
chains.*.lastEventAtWhen it last reported an event, ISO 8601 in UTC, or null.
chains.*.lastBlockThe newest block height it has seen (on Solana, the slot), or null.
chains.*.lag_sSeconds since the source last heard from its node or explorer, or null before the first answer.
chains.*.errorThe error of its last request, or null.
chains.*.methodwebsocket (news pushed by the node, on Ethereum and Solana) or poll (asked at an interval).
chains.*.interval_sHow often it asks when it has no websocket, in seconds.
chains.*.sourceThe domain of the node or explorer.
last10mThe private transactions of the last 10 minutes, behind the line on the overview: minutes (10), from and to (ISO 8601 in UTC), transactions, chains (the count for each chain with any) and complete (false while the watcher is still reading its log after a start). Blocks and fully transparent Zcash transactions are not counted.
Example

/api/v1/live/status, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "live/status",
  "source": "https://prifi.info/data/live/status.json",
  "modifiedAt": "2026-10-29T06:12:36.532Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:36.531Z",
    "watcherStartedAt": "2026-10-23T10:17:26.039Z",
    "chains": [
      {
        "chain": "ethereum",
        "protocol": "tornado-cash,railgun,privacy-pools",
        "connected": true,
        "lastEventAt": "2026-10-29T06:12:28.199Z",
        "lastBlock": 26296523,
        "lag_s": 0,
        "error": null,
        "method": "websocket",
        "interval_s": 12,
        "source": "publicnode.com"
      },
      {
        "chain": "monero",
        "protocol": "monero",
        "connected": true,
        "lastEventAt": "2026-10-29T06:12:36.341Z",
        "lastBlock": 3794474,
        "lag_s": 0,
        "error": null,
        "method": "poll",
        "interval_s": 5,
        "source": "cakewallet.com"
      }
    ],
    "last10m": {
      "minutes": 10,
      "from": "2026-10-29T06:02:36.531Z",
      "to": "2026-10-29T06:12:36.531Z",
      "transactions": 188,
      "chains": {
        "ethereum": 18,
        "monero": 131,
        "zano": 15,
        "solana": 7,
        "arbitrum": 1,
        "zcash": 13,
        "pirate": 2,
        "bsc": 1
      },
      "complete": true
    }
  }
}

Feed status

GET

/api/v1/status

Every collector and the live watcher, with its last success, last error, rows written today and hours since it last worked, as on the Feed status page.

Updated
Hourly
Fields in data 22
FieldMeaning
generatedAtWhen the status was worked out, ISO 8601 in UTC (with each hourly update).
dayThe UTC day the row counts cover, YYYY-MM-DD.
feeds[].idThe feed: a collector id (as in the run log), exchange-<id>, anonymity-<source>, watcher or live-<chain>.
feeds[].groupcollectors, exchanges, anonymity or live.
feeds[].nameThe source, in words.
feeds[].useWhat the site takes from it.
feeds[].jobThe job that runs it: live (every 5 minutes), hourly, daily or watcher (continuous).
feeds[].fallbacktrue for a source used only when another fails.
feeds[].lastOkIts last success, ISO 8601, or null.
feeds[].lastErrorIts last error message, or null.
feeds[].lastErrorAtWhen that error happened, ISO 8601, or null.
feeds[].consecutiveFailuresFailures since its last success, where the collector counts them, or null.
feeds[].rowsTodayDatabase rows it wrote or refreshed since 00:00 UTC (for a full daily history, the rows dated today; for the live watcher, events), or null where not counted.
feeds[].staleHoursHours from its last success to generatedAt, to one decimal place, or null.
feeds[].stateok, delayed (no success within the limit for its job), failing (its last attempt failed), fallback or not-run.
feeds[].connectedFor a live watcher chain only: whether its connection is up.
jobs[].jobThe job: live, hourly, daily, or one run by hand.
jobs[].scheduleWhen it runs.
jobs[].lastStart, lastOk, lastErrorAtWhen it last started, last finished without error and last failed, ISO 8601.
jobs[].lastErrorThe first line of its last error, or null.
jobs[].lastDurationSHow long its last successful run took, in seconds.
jobs[].runsToday, failedTodayIts runs since 00:00 UTC in the run log, and how many of them failed.
Example

/api/v1/status, as it answered at this update, with lists cut to two items and long texts shortened.

{
  "api": "PriFi.info API",
  "version": "1.0.0",
  "endpoint": "status",
  "source": "https://prifi.info/data/status.json",
  "modifiedAt": "2026-10-29T06:12:43.826Z",
  "licence": "CC BY-NC 4.0",
  "docs": "https://prifi.info/api/",
  "data": {
    "generatedAt": "2026-10-29T06:12:43.576Z",
    "day": "2026-10-29",
    "feeds": [
      {
        "id": "zecstats",
        "group": "collectors",
        "name": "ZecStats",
        "use": "Live Zcash shielded pools and ZEC price",
        "job": "live",
        "fallback": false,
        "lastOk": "2026-10-29T06:08:45.742Z",
        "lastError": "ZecStats: pool data flagged stale",
        "lastErrorAt": "2026-10-17T13:13:06.268Z",
        "consecutiveFailures": 0,
        "rowsToday": 3,
        "staleHours": 0.1
      },
      {
        "id": "zcashinfo",
        "group": "collectors",
        "name": "ZcashInfo",
        "use": "Live Zcash pools when ZecStats fails",
        "job": "live",
        "fallback": true,
        "lastOk": "2026-10-17T13:13:06.771Z",
        "lastError": null,
        "lastErrorAt": null,
        "consecutiveFailures": 0,
        "rowsToday": 0,
        "staleHours": 281
      }
    ],
    "jobs": [
      {
        "job": "hourly",
        "schedule": "Hourly, at 12 minutes past",
        "lastStart": "2026-10-29T06:12:15.426Z",
        "lastOk": "2026-10-29T05:12:45.308Z",
        "lastError": null,
        "lastErrorAt": null,
        "lastDurationS": 31,
        "runsToday": 6,
        "failedToday": 0
      },
      {
        "job": "live",
        "schedule": "Every 5 minutes",
        "lastStart": "2026-10-29T06:08:45.371Z",
        "lastOk": "2026-10-29T06:08:46.099Z",
        "lastError": null,
        "lastErrorAt": null,
...

API changelog

Changes to the data itself are on the Changes page.