Open API
WBTC exposes a set of public, read-only REST APIs for transparency data, supported chains, mint and burn history, participants, providers, and ecosystem projects. All endpoints are free to use, require no API key, and support CORS.
1. Common - Network & Auth
| Item | Value |
|---|---|
| Base URL | https://openapi.wbtc.network |
| API prefix | /public/v1 |
| Method | GET only |
| Authentication | None - all endpoints are public, no API key |
| Content-Type | application/json |
| CORS | Enabled - callable directly from browsers |
| Rate limit | Best-effort public service. Cache where possible and avoid unnecessary polling |
| OpenAPI schema | GET /public/v1/openapi.json |
All request examples below use the absolute Base URL, so they are copy-pasteable without consulting this table.
2. Common - Conventions
2.1 Response format
All API endpoints return the following JSON format:
{
"data": { },
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}| Field | Type | Existence | Description |
|---|---|---|---|
data | object | always | Returned data. The structure depends on the endpoint |
meta | object | always | Response information |
meta.updatedAt | string | always | ISO-8601 UTC timestamp associated with the returned data. When the data source does not provide an update time, this may be the response generation time |
meta.version | string | always | Public API version. Current value is v1 |
2.2 Data conventions
| Topic | Convention |
|---|---|
| Number types | Financial amounts and decimal values are returned as strings to preserve precision. Use a decimal library instead of JavaScript Number for calculations |
| Amount scale | Supply, mint, burn, and reserve amounts are human-readable decimal strings. WBTC and BTC values use BTC-style decimal precision, up to 8 decimal places |
| Timestamps | Date and time fields are ISO-8601 UTC strings when present |
| Chain keys | chainKey is a stable lowercase identifier, for example eth, bsc, sol, trx, base, kava, or osmo |
| Field stability | Published field names are not renamed within a version. New fields may be added in a backward-compatible way |
| Examples | Response examples use illustrative values and do not represent live production balances or current WBTC state |
2.3 Response Field Meanings
The following response field units and meanings apply:
| Where it appears | Unit | How to read it |
|---|---|---|
circulatingSupply, supply, amount | WBTC | Human-readable WBTC decimal string, up to 8 decimal places |
nativeBtcReserve, balanceBtc | BTC | Human-readable native BTC decimal string, up to 8 decimal places |
btcPriceUsd, reserveValueUsd | USD | Human-readable US dollar decimal string |
reserveRatio | ratio | Reserve ratio as a decimal string. Precision is not fixed |
updatedAt, date | datetime | ISO-8601 UTC timestamp |
address, contractAddress | address | Blockchain address |
explorerUrl, website, url | url | Public URL |
type, role, action, status, network, category, chainKey | enum | One of the supported values documented for the field |
chain, name, description, merchantName | text | Human-readable text |
addressCount, pageIndex, pageSize, total | count | Integer count |
2.4 Existence column
Response field tables include an Existence column so clients can tell whether a missing or empty value is expected:
| Existence | Meaning |
|---|---|
always | The field is always present |
nullable | The field is always present, but its value may be null |
conditional | The field is present only when the stated condition holds |
2.5 Empty result is not an error
An empty array is a successful response, not an error.
Examples: /participants?tag=no-match may return an empty participants array; /providers?q=no-match may return an empty providers array. Do not treat these as failures or retry them aggressively.
2.6 Caching and conditional requests
Responses may include ETag and Cache-Control headers.
Clients should preserve and reuse ETag values where possible:
If-None-Match: "previous-etag-value"When the data has not changed, the API may return:
HTTP/1.1 304 Not ModifiedA 304 response has no response body. Continue using the cached representation from the previous 200 response.
3. Common - Errors
Error format. The WBTC Public API uses standard HTTP status codes for request and service errors. Error responses are JSON objects containing error.code, error.message, and error.requestId.
{
"error": {
"code": "INVALID_PARAM",
"message": "Invalid category. Expected defi, chains, wallet, or bridge.",
"requestId": "req_01HZY..."
}
}3.1 Error response fields
| Field | Type | Existence | Description |
|---|---|---|---|
error.code | string | always | Stable error code for client handling |
error.message | string | always | Human-readable error message |
error.requestId | string | always | Request identifier for troubleshooting |
3.2 Code table
| HTTP status | code | Meaning |
|---|---|---|
400 | INVALID_PARAM | A pagination parameter is malformed, for example a non-integer pageIndex or pageSize |
404 | NOT_FOUND | The requested public API resource does not exist |
405 | METHOD_NOT_ALLOWED | The HTTP method is not supported |
422 | INVALID_PARAM | One or more query parameters are invalid |
503 | UPSTREAM_UNAVAILABLE | The requested data is temporarily unavailable |
503 | INSTANCE_OVERLOADED | The service is temporarily busy or rate limited |
3.3 Common error cases
| Case | Trigger | Response |
|---|---|---|
| Unsupported parameter value | Unsupported type, role, or category | HTTP 422, code: "INVALID_PARAM" |
| Invalid pagination | Invalid pageIndex or pageSize on /mint-burn | HTTP 400 or 422, code: "INVALID_PARAM" |
| Unknown path | Request a public API path that does not exist | HTTP 404, code: "NOT_FOUND" |
| Data unavailable or service busy | The requested data is temporarily unavailable, or the service is busy | HTTP 503 |
4. Endpoint Index
| # | Group | Name | Path |
|---|---|---|---|
| 5.1 | Transparency | Proof of Reserve | GET /public/v1/proof-of-reserve |
| 5.2 | Transparency | Supported Chains | GET /public/v1/chains |
| 5.3 | Transparency | Mint and Burn History | GET /public/v1/mint-burn |
| 5.4 | Participants | Participants | GET /public/v1/participants |
| 5.5 | Ecosystem | Providers | GET /public/v1/providers |
| 5.6 | Ecosystem | Ecosystem Projects | GET /public/v1/ecosystem |
| 5.7 | Reference | OpenAPI Document | GET /public/v1/openapi.json |
5. Endpoint Reference
5.1 Proof of Reserve
Overview. WBTC transparency summary, including circulating supply by chain, native BTC reserve information, reserve addresses, and collateralization ratio.
Typical use. Build a transparency dashboard, show reserve ratio, or verify public reserve addresses.
When not to use. For mint and burn history, use section 5.3. For chain contract information only, use section 5.2.
Endpoint. GET /public/v1/proof-of-reserve - Base URL & auth see section 1.
Request parameters. None.
Request example.
curl "https://openapi.wbtc.network/public/v1/proof-of-reserve"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
supply | object | always | - | Supply summary |
supply.circulatingSupply | string | always | WBTC | Total circulating WBTC supply |
supply.byChain[] | array | always | - | Circulating supply grouped by chain |
supply.byChain[].chain | string | always | text | Chain display name |
supply.byChain[].chainKey | string | always | enum | Stable chain key |
supply.byChain[].supply | string | always | WBTC | Supply on the chain |
reserves | object | always | - | Native BTC reserve summary |
reserves.nativeBtcReserve | string | always | BTC | Total native BTC reserve balance |
reserves.btcPriceUsd | string | always | USD | BTC price in USD used for reserve valuation |
reserves.reserveValueUsd | string | always | USD | Native BTC reserve value in USD |
reserves.addressCount | integer | always | count | Number of reserve addresses returned |
reserves.addresses[] | array | always | - | Public reserve address details |
reserves.addresses[].address | string | always | address | BTC reserve address |
reserves.addresses[].balanceBtc | string | always | BTC | BTC balance for the address |
reserves.addresses[].explorerUrl | string | always | url | Block explorer URL for the address |
collateralization | object | always | - | Collateralization summary |
collateralization.reserveRatio | string | always | ratio | Reserve ratio. Precision is not fixed |
Response example.
{
"data": {
"supply": {
"circulatingSupply": "155000.00000000",
"byChain": [
{
"chain": "Ethereum",
"chainKey": "eth",
"supply": "100000.00000000"
},
{
"chain": "BNB Chain",
"chainKey": "bsc",
"supply": "55000.00000000"
}
]
},
"reserves": {
"nativeBtcReserve": "155010.00000000",
"btcPriceUsd": "65000.00",
"reserveValueUsd": "10075650000.00",
"addressCount": 1,
"addresses": [
{
"address": "bc1qwbtcreserveexample0000000000000000000",
"balanceBtc": "155010.00000000",
"explorerUrl": "https://mempool.space/address/bc1qwbtcreserveexample0000000000000000000"
}
]
},
"collateralization": {
"reserveRatio": "1.000064516129032258064516129"
}
},
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}Errors. See section 3. This endpoint takes no parameters, so errors are generally limited to an unknown path, rate limiting, temporary data unavailability, or a service error.
5.2 Supported Chains
Overview. Native and bridge chain support information for WBTC, including token contract and explorer links.
Typical use. Display supported networks, contract addresses, or chain availability.
When not to use. For circulating supply by chain, use section 5.1.
Endpoint. GET /public/v1/chains - Base URL & auth see section 1.
Request parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | No | Filter by support type. Allowed values: native, bridge |
Request example.
curl "https://openapi.wbtc.network/public/v1/chains"
curl "https://openapi.wbtc.network/public/v1/chains?type=native"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
natives[] | array | conditional | - | Native WBTC chain entries. Returned when type is omitted or type=native |
bridges[] | array | conditional | - | Bridge chain entries. Returned when type is omitted or type=bridge |
chain | string | always | text | Chain display name |
chainKey | string | always | enum | Stable chain key |
type | string | always | enum | Chain support type: native or bridge |
isNew | boolean | always | - | Whether the chain is marked as newly supported |
contract.contractType | string | always | text | Token or contract standard for native chains; bridge technology name for bridge chains |
contract.contractAddress | string | always | address | Public token or contract address |
contract.explorerUrl | string | always | url | Explorer URL for the contract |
deployment | string | conditional | text | Bridge solution name, returned for bridge chains when available |
Response example.
The example below shows a type=native response.
{
"data": {
"natives": [
{
"chain": "BNB Chain",
"chainKey": "bsc",
"type": "native",
"isNew": true,
"contract": {
"contractType": "BEP-20",
"contractAddress": "0x39665e85a68a4d7328b8799135E2ff301a0Ca86f",
"explorerUrl": "https://bscscan.com/token/0x39665e85a68a4d7328b8799135E2ff301a0Ca86f"
}
}
]
},
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}Errors. See section 3. Invalid type values return an INVALID_PARAM error.
5.3 Mint and Burn History
Overview. Paginated WBTC mint and burn records.
Typical use. Build a mint/burn activity table or filter recent records by action, network, status, or merchant.
When not to use. For aggregate supply and reserves, use section 5.1.
Endpoint. GET /public/v1/mint-burn - Base URL & auth see section 1.
Request parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
pageIndex | integer | No | Page index, starting from 1. Default: 1 |
pageSize | integer | No | Number of records per page. Default: 20; minimum: 1; values above 200 are capped to 200 |
action | string | No | Filter by action. Supported values: mint, burn |
status | string | No | Filter by record status. Supported values: pending, canceled, rejected, completed |
network | string | No | Filter by chain key. Supported values: eth, sol, trx, bsc, base, kava, osmo. Common aliases such as tron, bnb, and osmosis are also supported |
merchantName | string | No | Filter by merchant name. Maximum length: 128 characters |
Request example.
curl "https://openapi.wbtc.network/public/v1/mint-burn?pageIndex=1&pageSize=20"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
records[] | array | always | - | Mint and burn records |
records[].action | string | always | enum | Record action |
records[].status | string | always | enum | Current record status |
records[].network | string | always | enum | Network or chain key |
records[].amount | string | always | WBTC | Amount of WBTC minted or burned |
records[].merchantName | string | always | text | Merchant display name |
records[].date | string | always | datetime | Record timestamp |
records[].txHash | string | always | text | Public transaction hash. May be an empty string when no transaction hash is available |
pagination.pageIndex | integer | always | count | Current page index |
pagination.pageSize | integer | always | count | Current page size |
pagination.total | integer | always | count | Total number of matching records |
Response example.
{
"data": {
"records": [
{
"action": "mint",
"status": "pending",
"network": "eth",
"amount": "10.00000000",
"merchantName": "Unknown",
"date": "2026-06-23T07:05:25.168000Z",
"txHash": "0xfe830751bd2bb181595258a1948752436c4ba9b85b2d839483d93276f4855156"
}
],
"pagination": {
"pageIndex": 1,
"pageSize": 20,
"total": 1666
}
},
"meta": {
"updatedAt": "2026-06-22T15:20:48Z",
"version": "v1"
}
}Errors. See section 3. Invalid pagination parameters return INVALID_PARAM. Use the supported filter values listed above for consistent results.
5.4 Participants
Overview. Public WBTC participants, such as custodians and merchants.
Typical use. Display WBTC participant lists or filter participants by role or tag.
When not to use. For exchanges, wallets, bridges, DeFi integrations, and other service providers, use sections 5.5 and 5.6.
Endpoint. GET /public/v1/participants - Base URL & auth see section 1.
Request parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
role | string | No | Filter by participant role. Allowed values: merchant, custodian |
tag | string | No | Filter by participant tag. Maximum length: 64 characters |
Request example.
curl "https://openapi.wbtc.network/public/v1/participants"
curl "https://openapi.wbtc.network/public/v1/participants?role=custodian"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
participants[] | array | always | - | Public participant entries |
participants[].role | string | always | enum | Participant role |
participants[].name | string | always | text | Participant name |
participants[].description | string | always | text | Public participant description |
participants[].tags[] | array | always | text | Public participant tags |
participants[].website | string | always | url | Participant website |
Response example.
{
"data": {
"participants": [
{
"role": "custodian",
"name": "BitGo",
"description": "BitGo is the market leader in institutional cryptocurrency financial services, providing security, compliance, and custodial solutions.",
"tags": ["Custodian"],
"website": "https://www.bitgo.com/"
}
]
},
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}Errors. See section 3. Invalid filter parameters return INVALID_PARAM.
5.5 Providers
Overview. Public Get WBTC providers, such as centralized and decentralized exchanges.
Typical use. Show where users can access or trade WBTC.
When not to use. For protocol participants such as custodians and merchants, use section 5.4.
Endpoint. GET /public/v1/providers - Base URL & auth see section 1.
Request parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | No | Filter by provider type. Allowed values: cex, dex |
network | string | No | Filter by supported network display name, for example Ethereum. Maximum length: 64 characters |
q | string | No | Case-insensitive text search by provider name. Maximum length: 64 characters |
Request example.
curl "https://openapi.wbtc.network/public/v1/providers"
curl "https://openapi.wbtc.network/public/v1/providers?type=cex"
curl "https://openapi.wbtc.network/public/v1/providers?network=Ethereum&q=binance"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
providers[] | array | always | - | Public provider entries |
providers[].name | string | always | text | Provider name |
providers[].type | string | always | enum | Provider category or type |
providers[].networks[] | array | always | text | Supported networks |
providers[].url | string | always | url | Provider URL |
Response example.
{
"data": {
"providers": [
{
"name": "Binance",
"type": "CEX",
"networks": ["Ethereum", "KAVA"],
"url": "https://www.binance.com"
}
]
},
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}Errors. See section 3. Invalid filter parameters return INVALID_PARAM.
5.6 Ecosystem Projects
Overview. Ecosystem projects that integrate or support WBTC.
Typical use. Display WBTC integrations grouped by category or network.
When not to use. For provider-oriented listings such as exchanges and wallets, use section 5.5.
Endpoint. GET /public/v1/ecosystem - Base URL & auth see section 1.
Request parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | No | Filter by project category. Allowed values: defi, chains, wallet, bridge |
network | string | No | Filter by supported network display name, for example Ethereum. Maximum length: 64 characters |
Request example.
curl "https://openapi.wbtc.network/public/v1/ecosystem"
curl "https://openapi.wbtc.network/public/v1/ecosystem?category=defi"
curl "https://openapi.wbtc.network/public/v1/ecosystem?network=Ethereum"Response fields.
| Field | Type | Existence | Unit | Description |
|---|---|---|---|---|
projects[] | array | always | - | Public ecosystem project entries |
projects[].name | string | always | text | Project name |
projects[].category | string | always | enum | Project category |
projects[].networks[] | array | always | text | Supported networks |
projects[].url | string | always | url | Project URL |
Response example.
{
"data": {
"projects": [
{
"name": "AAVE",
"category": "DeFi",
"networks": ["Ethereum", "Arbitrum", "Polygon", "Optimism"],
"url": "https://app.aave.com/reserve-overview/?underlyingAsset=0x2260fac5e5542a773aa44fbcfedf7c193bc2c599&marketName=proto_mainnet_v3"
}
]
},
"meta": {
"updatedAt": "2026-06-24T04:00:49.863904Z",
"version": "v1"
}
}Errors. See section 3. Invalid filter parameters return INVALID_PARAM.
5.7 OpenAPI Document
Overview. An OpenAPI JSON document describing the WBTC Public API.
Typical use. Generate API clients or inspect request and response definitions.
When not to use. For live WBTC data, call the relevant endpoint directly.
Endpoint. GET /public/v1/openapi.json - Base URL & auth see section 1.
Request parameters. None.
Request example.
curl "https://openapi.wbtc.network/public/v1/openapi.json"Response. OpenAPI JSON document.
Errors. See section 3.