# Sentinel dVPN On-Chain API
> Live on-chain data from the Sentinel Hub (sentinelhub-2), the Cosmos-SDK chain behind the decentralized VPN (dVPN) marketplace. Read the dVPN node registry (each hosting node's address, per-gigabyte and per-hour bandwidth prices, advertised remote address and active/inactive status), the registered dVPN providers, the staking pool with bonded ratio and validator set, the total DVPN supply and the latest block. The Sentinel / dVPN / bandwidth-marketplace layer for explorers, node dashboards and staking tools.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/sentinel-api/..."
```

## Pricing
- **Free** (Free) — 2,000 calls/Mo, 2 req/s
- **Basic** ($13/Mo) — 55,000 calls/Mo, 5 req/s
- **Pro** ($38/Mo) — 220,000 calls/Mo, 15 req/s
- **Business** ($85/Mo) — 880,000 calls/Mo, 40 req/s

## Endpoints

### dVPN

#### `GET /v1/nodes` — dVPN node registry

**Parameters:**
- `status` (query, optional, string) — Filter: active or inactive Example: `active`
- `limit` (query, optional, string) — Number of nodes (1-100) Example: `20`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/nodes?status=active&limit=20"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "count": 20,
        "nodes": [
            {
                "status": "active",
                "address": "sentnode1qqywpumwtxxgffqqr9eg94w72tlragzjg0zxs4",
                "status_at": "2026-06-15T02:06:27.698375887Z",
                "inactive_at": "2026-06-15T03:06:27.698375887Z",
                "remote_addrs": [
                    "185.47.255.36:52618"
                ],
                "hourly_prices": [
                    {
                        "denom": "ibc/A8C2D23A1E6F95DA4E48BA349667E322BD7A6C996D8A4AAE8BA72E190F3D1477",
                        "value": 2525,
                        "base_value": 0.007
                    },
                    {
                        "denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518",
                        "value": 98050,
                        "base_value": 0.007
                    },
                    {
                        "denom": "udvpn",
                        "value": 50,
                        "base_value": 0.005
                    }
                ],
                "gigabyte_prices": [
                    {
                        "denom": "ibc/A8C2D23A1E6F95DA4E48BA349667E322BD7A6C996D8A4AAE8BA72E190F3D1477",
                        "value": 2525,
                        "base_value": 0.005
                    },
                    {
                        "denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/providers` — Registered dVPN providers

**Parameters:**
- `limit` (query, optional, string) — Number of providers (1-200) Example: `20`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/providers?limit=20"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "count": 20,
        "providers": [
            {
                "name": "阿什本",
                "status": "active",
                "address": "sentprov1zfu2zfdf9a0tcjf5y0f3mxp0j45e9unf2vex4y",
                "website": null,
                "identity": null,
                "status_at": "2026-05-26T06:12:01.884031131Z",
                "description": null
            },
            {
                "name": "dVPN Application",
                "status": "active",
                "address": "sentprov1r9shmfdk0285xgpseulqsxjs9yqke7lgch4npy",
                "website": null,
                "identity": null,
                "status_at": "2026-04-25T02:50:26.353143334Z",
                "description": null
            },
            {
                "name": "Test 33",
                "status": "active",
                "address": "sentprov19df0lg5pnmpd56muyuqwdffaxk68w9vs098r09",
                "website": null,
                "identity": null,
                "status_at": "2026-04-26T01:05:54.039346377Z",
                "description": null
            },
            {
                "name": "gg",
                "status": "active",
                "address": "sentprov197ezwa9qw7naxvkm54mw04jrpt5tp70jslqu26",
                "website": null,
                "identity": null,
                "status_at": "2026-05-19T05:59:34.001674547Z",
                "description": null
            },
            {
          
…(truncated, see openapi.json for full schema)
```

### Staking

#### `GET /v1/staking` — Staking pool, bonded ratio & params

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/staking"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "denom": "DVPN",
        "params": {
            "bond_denom": "udvpn",
            "max_validators": 64,
            "unbonding_time": "1209600s",
            "min_commission_rate": "0.050000000000000000"
        },
        "bonded_ratio": 0.945227,
        "bonded_tokens": 19885373219.996075,
        "not_bonded_tokens": 1152298194.944483
    },
    "meta": {
        "timestamp": "2026-06-15T02:10:20.714Z",
        "request_id": "5516087a-b757-44e5-9c8d-4545a8ec7262"
    },
    "status": "ok",
    "message": "Staking retrieved successfully",
    "success": true
}
```

#### `GET /v1/validators` — Bonded validator set by voting power

**Parameters:**
- `limit` (query, optional, string) — Number of validators (1-200) Example: `20`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/validators?limit=20"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "count": 20,
        "validators": [
            {
                "jailed": false,
                "status": "BOND_STATUS_BONDED",
                "moniker": "Cosmostation",
                "website": "https://www.cosmostation.io",
                "voting_power": 1240207904.494854,
                "commission_rate": 0.05,
                "operator_address": "sentvaloper18tmu0lrfsdvke8e3a3jsd7fq2rs29krf43yj25"
            },
            {
                "jailed": false,
                "status": "BOND_STATUS_BONDED",
                "moniker": "polkachu.com",
                "website": "https://polkachu.com",
                "voting_power": 761909531.861446,
                "commission_rate": 0.05,
                "operator_address": "sentvaloper1zys59g4hh8g26jg4a0pl6f2c6rngfm89ktx3pz"
            },
            {
                "jailed": false,
                "status": "BOND_STATUS_BONDED",
                "moniker": "Stakecito Labs",
                "website": "https://www.stakecito.com",
                "voting_power": 677584808.825854,
                "commission_rate": 0.1,
                "operator_address": "sentvaloper1qe8uuf5x69c526h4nzxwv4ltftr73v7qytddn2"
            },
            {
                "jailed": false,
                "status": "BOND_STATUS_BONDED",
                "moniker": "🐹 Quokka Stake",
                "website": "https://quokkastake.io",
                "voting_power": 567931350.3
…(truncated, see openapi.json for full schema)
```

### Chain

#### `GET /v1/block` — Latest block

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/block"
```

**Response:**
```json
{
    "data": {
        "time": "2026-06-15T02:10:13.782813140Z",
        "chain": "sentinelhub-2",
        "height": 29172768,
        "num_txs": 10,
        "proposer_address": "vwjg95eXaRg4OyoAtkoYNujdqMQ="
    },
    "meta": {
        "timestamp": "2026-06-15T02:10:21.015Z",
        "request_id": "917f2a85-1458-4b04-88a4-3e64ab4558cd"
    },
    "status": "ok",
    "message": "Block retrieved successfully",
    "success": true
}
```

#### `GET /v1/supply` — Total DVPN supply

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/supply"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "denom": "DVPN",
        "micro_denom": "udvpn",
        "total_supply": 34741054073.57512,
        "total_supply_micro": "34741054073575117"
    },
    "meta": {
        "timestamp": "2026-06-15T02:10:21.113Z",
        "request_id": "a7605737-e92c-427f-9b09-1a8e26813831"
    },
    "status": "ok",
    "message": "Supply retrieved successfully",
    "success": true
}
```

### Meta

#### `GET /v1/meta` — Chain metadata & endpoint guide

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/sentinel-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "chain": "sentinelhub-2",
        "token": "DVPN",
        "source": "Sentinel public Cosmos REST/LCD, keyless (3-mirror)",
        "network": "Sentinel Hub",
        "decimals": 6,
        "examples": {
            "nodes": "/v1/nodes?status=active&limit=20",
            "providers": "/v1/providers?limit=20",
            "validators": "/v1/validators?limit=20"
        },
        "endpoints": {
            "/v1/block": "latest block (height, time, chain_id)",
            "/v1/nodes": "dVPN node registry (status=active|inactive, limit) — per-GB & hourly bandwidth prices, remote address",
            "/v1/supply": "total DVPN supply",
            "/v1/staking": "staking pool, bonded ratio and params",
            "/v1/providers": "registered dVPN providers (name, website, status)",
            "/v1/validators": "bonded validator set ranked by voting power (limit)"
        },
        "micro_denom": "udvpn",
        "cache_ttl_ms": 20000
    },
    "meta": {
        "timestamp": "2026-06-15T02:10:21.178Z",
        "request_id": "9972b105-a9c8-4210-827d-9bd5adc2a625"
    },
    "status": "ok",
    "message": "Meta",
    "success": true
}
```


---
Marketplace page: https://www.oanor.com/api/sentinel-api
OpenAPI spec: https://www.oanor.com/api/sentinel-api/openapi.json
