Skip to content

Hopr API Endpoints

8 endpoints across 8 resources. Generated from the dbt manifest — edits inside this block will be overwritten. Regenerate with python scripts/update_docs.py --only api.

gnosisvpn_exit_activity

GnosisVPN traffic by exit node and country, per day -- the SUPPLY side of the product. Works because the exit-node roster is committed to git (gnosis/gnosis_vpn linux/resources/config-jura.toml) with an address, city and country per destination. Scoped to jura, which carries no cover traffic. The...

Path Methods Tier Filters Pagination Sort
/v1/hopr/gnosisvpn_exit_activity/daily GET tier3 -- -- --
GET /v1/hopr/gnosisvpn_exit_activity/daily

GnosisVPN traffic by exit node and country, per day -- the SUPPLY side of the product. Works because the exit-node roster is committed to git (gnosis/gnosis_vpn linux/resources/config-jura.toml) with an address, city and country per destination. Scoped to jura, which carries no cover traffic. The...

Model: api_gnosisvpn_exit_activity_daily — table dbt.api_gnosisvpn_exit_activity_daily

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
date Date Day of the relayed activity. Named date, not activity_date, because a served granularity:daily endpoint must expose its grain under that name.
country_code LowCardinality(String) ISO-3166 alpha-2 of the exit node's advertised location.
location_city String City the exit advertises. Product metadata, not verified geography.
exit_label String Human label for the exit from the GnosisVPN client config.
tickets_redeemed UInt64 Redeemed tickets on channels terminating at this exit. The usage series -- proportional to relayed traffic in expectation, not a byte count.
redeemed_wxhopr Decimal(38, 18) wxHOPR paid out to this exit, from channel balance decreases.
channels_opened UInt64 Channels opened toward this exit. Tracks clients running, NOT demand -- the client auto-maintains channels toward target_open_channels.
channels_closed UInt64 Channels closed toward this exit on this day.
unique_counterparty_nodes UInt64 Distinct nodes funding channels toward this exit. An upper bound on running clients, not a user count -- one operator can run many nodes, and this is per-exi...
channels_seen UInt64 Distinct channels observed toward this exit on this day.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/gnosisvpn_exit_activity/daily" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_channel_activity

Daily payment-channel activity per network, SPLIT BY is_cover_traffic. The split is the contract: on dufour nearly every event is HOPR paying its own node runners in proportion to stake, so a total across the split presents a rewards schedule as user demand. Consumers must split or filter. ticket...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_channel_activity/daily GET tier1 -- -- --
GET /v1/hopr/hopr_channel_activity/daily

Daily payment-channel activity per network, SPLIT BY is_cover_traffic. The split is the contract: on dufour nearly every event is HOPR paying its own node runners in proportion to stake, so a total across the split presents a rewards schedule as user demand. Consumers must split or filter. ticket...

Model: api_hopr_channel_activity_daily — table dbt.api_hopr_channel_activity_daily

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network. rotsee is excluded, so dufour or jura.
date Date Calendar day, UTC. Named date rather than activity_date so the daily endpoint exposes its grain under the required name, and so it joins api_hopr_network...
is_cover_traffic UInt8 1 where the channel source is a known HOPR cover-traffic node. A DIMENSION, never a measure -- always split or filter on it.
channels_opened UInt64 Channels opened.
channels_closed UInt64 Channels closed.
closures_initiated UInt64 Outgoing closures initiated but not yet final.
tickets_redeemed UInt64 Ticket redemptions. The trustworthy, time-stable volume metric.
fundings UInt64 Channel balance increases.
redeemed_wxhopr Decimal(38, 18) wxHOPR paid to relayers, reconstructed from channel balance diffs.
funded_wxhopr Decimal(38, 18) wxHOPR pushed into channels.
active_channels UInt64 Distinct channels seen that day. A per-day distinct count, so max not sum.
unique_source_nodes UInt64 Distinct paying nodes.
unique_destination_nodes UInt64 Distinct relaying nodes.
events UInt64 Total decoded channel events.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_channel_activity/daily" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_gnosisvpn_users

Served GnosisVPN client activity per network per day -- the demand side. Exposes BOTH user definitions: active_users_ (HOPR-comparable; redemption OR first key-binding) and using_users_ (redemptions only). They are not interchangeable and the difference between them is the deployed-but-never-us...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_gnosisvpn_users/daily/30d GET tier3 -- -- --
GET /v1/hopr/hopr_gnosisvpn_users/daily/30d

Served GnosisVPN client activity per network per day -- the demand side. Exposes BOTH user definitions: active_users_ (HOPR-comparable; redemption OR first key-binding) and using_users_ (redemptions only). They are not interchangeable and the difference between them is the deployed-but-never-us...

Model: api_hopr_gnosisvpn_users_daily — table dbt.api_hopr_gnosisvpn_users_daily

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
date Date Day of the rolling window's right edge.
network LowCardinality(String) HOPR network. rotsee (testnet) is excluded upstream.
active_users_30d UInt64 HOPR-comparable rolling-30d active clients (31 days inclusive): redeemed a ticket OR first key-bound. This is the figure to compare with HOPR's published MAU.
active_users_7d UInt64 HOPR-comparable rolling-7d active clients. Compare with HOPR's WAU.
active_users_1d UInt64 Clients active on this day alone, same definition.
using_users_30d UInt64 Rolling-30d clients that actually redeemed a ticket, excluding install-only clients. The "is it being used" series.
using_users_7d UInt64 Rolling-7d clients that actually redeemed a ticket.
using_users_1d UInt64 Clients that redeemed on this day alone.
new_clients UInt64 Clients whose first key-binding fell on this day.
tickets_redeemed UInt64 Tickets redeemed by clients on this day.
redeemed_wxhopr Decimal(38, 18) wxHOPR paid by clients on this day.
channels_active UInt64 Distinct channels clients transacted on this day.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_gnosisvpn_users/daily/30d" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_network_health

Daily nodes-ever-registered versus nodes-actually-online per network. The two are not interchangeable: registration is cumulative and never expires, so the registry figure runs several times the live network and the gap has widened every year. Never label either "network size" without saying whic...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_network_health/daily GET tier1 -- -- --
GET /v1/hopr/hopr_network_health/daily

Daily nodes-ever-registered versus nodes-actually-online per network. The two are not interchangeable: registration is cumulative and never expires, so the registry figure runs several times the live network and the gap has widened every year. Never label either "network size" without saying whic...

Model: api_hopr_network_health_daily — table dbt.api_hopr_network_health_daily

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network; dufour, or jura for registration counts only.
date Date Calendar day, UTC.
nodes_registered_new UInt64 Nodes whose first on-chain KeyBinding fell on this date.
nodes_registered_cumulative UInt64 Running total of nodes ever registered. Never decrements -- abandonment is invisible to it. NOT the live network size.
nodes_online_avg Nullable(Float64) Mean of the dashboard's hourly online count across observed hours. The live network size. NULL where no hours were recorded.
nodes_online_min Nullable(UInt32) Lowest hourly online count that day.
nodes_online_max Nullable(UInt32) Highest hourly online count that day.
hours_observed UInt64 Distinct hours actually recorded, 0-24. Load-bearing: a day can rest on one observation or twenty-four, so thin days are not comparable to full ones.
nodes_probed Nullable(UInt64) Nodes the prober attempted. NULL before the ingestor started, and for jura.
nodes_reachable Nullable(UInt64) Nodes the prober actually reached.
nodes_high_availability Nullable(UInt64) Nodes up at least 90% of the last 24 hours.
avg_latency_ms Nullable(Float64) Mean round-trip time across reachable nodes, milliseconds.
p50_latency_ms Nullable(Float64) Median round-trip time. Materially below the mean -- a tail of slow nodes pulls the average up, so prefer this as the headline.
avg_availability_24h Nullable(Float64) Mean 24-hour availability across probed nodes, in [0,1].

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_network_health/daily" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_node_locations

Current nodes aggregated to a plottable point: one row per (network, country, city) with coordinates. DELIBERATELY INCOMPLETE -- nodes without coordinates cannot be plotted and are excluded here, so a map built on this alone under-counts the network. Publish the 'UNKNOWN' residual from api_hopr_n...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_node_locations/latest GET tier1 -- -- --
GET /v1/hopr/hopr_node_locations/latest

Current nodes aggregated to a plottable point: one row per (network, country, city) with coordinates. DELIBERATELY INCOMPLETE -- nodes without coordinates cannot be plotted and are excluded here, so a map built on this alone under-counts the network. Publish the 'UNKNOWN' residual from api_hopr_n...

Model: api_hopr_node_locations_latest — table dbt.api_hopr_node_locations_latest

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network. rotsee is excluded, so dufour or jura.
as_of_date Date When this snapshot is current, anchored to the newest on-chain evidence it contains rather than to today() -- so a stale build cannot read as live. Point-in-...
country_code String ISO country code from ipinfo.
city String City name from ipinfo, or 'UNKNOWN_CITY' where only a country resolved.
latitude Nullable(Float64) City centroid latitude. Not the machine's position.
longitude Nullable(Float64) City centroid longitude. Not the machine's position.
nodes UInt64 Nodes at this point.
live_nodes UInt64 Of those, nodes the prober reached. dufour only.
distinct_hosts UInt64 Distinct announced IPs at this point.
distinct_operators UInt64 Distinct staking Safes at this point.
cover_traffic_nodes UInt64 Declared HOPR cover-traffic nodes at this point.
gnosisvpn_exit_nodes UInt64 Declared GnosisVPN exit nodes at this point.
top_hosting_provider Nullable(String) Most common provider at this point, for a map tooltip.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_node_locations/latest" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_nodes_by_country

Current node counts per network per country. Nodes with no resolvable IPv4 or no ipinfo row appear as country_code 'UNKNOWN' with geo_resolved = 0 -- they are a row, never a filter, because dropping them shrinks the denominator of every share a chart computes. live_nodes counts only prober-reache...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_nodes_by_country/latest GET tier1 -- -- --
GET /v1/hopr/hopr_nodes_by_country/latest

Current node counts per network per country. Nodes with no resolvable IPv4 or no ipinfo row appear as country_code 'UNKNOWN' with geo_resolved = 0 -- they are a row, never a filter, because dropping them shrinks the denominator of every share a chart computes. live_nodes counts only prober-reache...

Model: api_hopr_nodes_by_country_latest — table dbt.api_hopr_nodes_by_country_latest

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network. rotsee is excluded, so dufour or jura.
as_of_date Date When this snapshot is current, anchored to the newest on-chain evidence it contains rather than to today() -- so a stale build cannot read as live. Point-in-...
country_code String ISO country code from ipinfo, or 'UNKNOWN' for unresolved nodes.
geo_resolved UInt8 1 where the country came from ipinfo, 0 for the UNKNOWN bucket.
nodes UInt64 Nodes ever registered with this country.
live_nodes UInt64 Of those, nodes the prober reached. dufour only -- 0 for jura means unmeasured.
cover_traffic_nodes UInt64 Declared HOPR cover-traffic nodes here.
gnosisvpn_exit_nodes UInt64 Declared GnosisVPN exit nodes here.
distinct_operators UInt64 Distinct staking Safes -- the non-vanity decentralisation count.
distinct_hosts UInt64 Distinct announced IPs. Below nodes wherever nodes share a machine.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_nodes_by_country/latest" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_nodes_hosting

Current node counts per network per hosting provider, with the host-concentration figures. 'Unknown' means the org string matched no rule in the shared ipinfo classifier -- it is NOT residential and must not be folded into either side of a home-vs-datacenter split. 'NO_IPV4' and 'UNRESOLVED' are ...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_nodes_hosting/latest GET tier1 -- -- --
GET /v1/hopr/hopr_nodes_hosting/latest

Current node counts per network per hosting provider, with the host-concentration figures. 'Unknown' means the org string matched no rule in the shared ipinfo classifier -- it is NOT residential and must not be folded into either side of a home-vs-datacenter split. 'NO_IPV4' and 'UNRESOLVED' are ...

Model: api_hopr_nodes_hosting_latest — table dbt.api_hopr_nodes_hosting_latest

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network. rotsee is excluded, so dufour or jura.
as_of_date Date When this snapshot is current, anchored to the newest on-chain evidence it contains rather than to today() -- so a stale build cannot read as live. Point-in-...
hosting_provider String Provider bucket from stg_crawlers_data__ipinfo, plus 'NO_IPV4' (never announced an IPv4) and 'UNRESOLVED' (has one, ipinfo has no row). 'Unknown' is a real c...
nodes UInt64 Nodes ever registered on this provider.
live_nodes UInt64 Of those, nodes the prober reached. dufour only.
distinct_hosts UInt64 Distinct announced IPs on this provider.
distinct_operators UInt64 Distinct staking Safes on this provider.
cover_traffic_nodes UInt64 Declared HOPR cover-traffic nodes on this provider.
gnosisvpn_exit_nodes UInt64 Declared GnosisVPN exit nodes on this provider.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_nodes_hosting/latest" \
  -H "X-API-Key: YOUR_API_KEY"

hopr_protocol_params

Daily protocol parameters and staked/locked wxHOPR from blokli, HOPR's own v4 indexer. JURA ONLY -- blokli has no dufour endpoint, and rotsee is filtered out as a testnet. payout_per_winning_ticket_wxhopr is the figure worth showing: HOPR pays probabilistically, so ticket price alone means nothin...

Path Methods Tier Filters Pagination Sort
/v1/hopr/hopr_protocol_params/daily GET tier1 -- -- --
GET /v1/hopr/hopr_protocol_params/daily

Daily protocol parameters and staked/locked wxHOPR from blokli, HOPR's own v4 indexer. JURA ONLY -- blokli has no dufour endpoint, and rotsee is filtered out as a testnet. payout_per_winning_ticket_wxhopr is the figure worth showing: HOPR pays probabilistically, so ticket price alone means nothin...

Model: api_hopr_protocol_params_daily — table dbt.api_hopr_protocol_params_daily

Legacy endpoint — GET only, no query parameters, returns the full table.

Columns

Column Type Description
network String HOPR network; jura in practice (rotsee excluded as testnet).
date Date Snapshot date.
ticket_price_wxhopr Nullable(Float64) Price of a single ticket. Near-meaningless without the win probability.
min_ticket_winning_probability Float64 Minimum probability with which a ticket wins, in [0,1].
payout_per_winning_ticket_wxhopr Nullable(Float64) ticket_price / min_win_probability -- what a winning ticket is actually worth, and the only cross-network-comparable economic figure here.
key_binding_fee_wxhopr Nullable(Float64) Fee to bind a packet key to a chain key.
channel_closure_grace_period_s UInt32 Seconds a channel stays pending-to-close before it can be finalised.
account_count UInt32 Accounts (nodes) blokli knows on this network.
safes_count UInt32 Distinct staking Safes.
safes_balance_wxhopr Nullable(Float64) wxHOPR held in Safes -- staked but not yet in channels.
channels_total UInt32 Channels in any state.
channels_open UInt32 Channels currently open.
channels_open_balance_wxhopr Nullable(Float64) wxHOPR locked in open channels -- the network's working capital.
channels_pendingtoclose UInt32 Channels closing but still inside the grace period.
channels_pendingtoclose_balance_wxhopr Nullable(Float64) wxHOPR still locked in pending-to-close channels.
total_wxhopr_committed Nullable(Float64) safes_balance + channels_open_balance. The closest thing to a TVL for HOPR, and it needs no balance indexing.

Example

curl "https://api.analytics.gnosis.io/v1/hopr/hopr_protocol_params/daily" \
  -H "X-API-Key: YOUR_API_KEY"