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