wardcrest
On this page

API reference

Two ways in: keyless endpoints for widgets and light scripts, and the keyed REST API at https://wardcrest.com/api/v1 for everything else. The keyed API is described in OpenAPI 3.1 at /api/v1/openapi.json.

Two ways in

KeylessWith a key
Address/api/public/…/api/v1/…
KeyNoneA workspace key, sent as a bearer token
DataPrices, rates, Bitcoin fees, gas, charts and comparisonsMarkets and network data, price alerts, your monitors and alerts, screening and address risk
LimitsCached answers; the chart endpoint has a limit of its own1,000–1,000,000 requests a day by plan, 120 a minute per key
ChangesNone: read onlyPro and above, with a key that allows changes

Keyless API

No account and no key. These endpoints serve our own pages and widgets, and you may call them too. Every answer may be cached, for 15 seconds to 1 hour depending on the endpoint, so asking more often returns the same figures.

Fair use. There is no quota, but these endpoints are for widgets, pages and light scripts. To collect data on a schedule or in bulk, use the keyed API: every answer says how much of the day’s quota is left. Scripts on other sites can read /api/public/bitcoin/fees and /api/public/whales; call the others from your server. While we switch off the tool behind an endpoint, it answers 503 with the code tool_unavailable.

GET /api/public/rates
The US dollar value of one unit of every coin and currency the converter offers.Cached for 30 seconds.
GET /api/public/bitcoin/fees
Bitcoin fee rates in sat/vB, the size of the mempool and the next three blocks.Cached for 30 seconds. Readable from other sites.
GET /api/public/gas?chain=base
Gas in gwei, with what common actions cost in US dollars.chain (optional): one EVM chain; every chain we cover without it.Cached for 15 seconds.
GET /api/public/whales?chain=ethereum&min=5000000
Large transfers on Bitcoin and the EVM chains we follow, newest first, with public labels on both sides (whale watch).chain, asset and min (US dollars) filter; since: the latest of your last answer, to follow new transfers; before: its next, for older ones; limit: 1–100 (default 50).Cached for 15 seconds. Readable from other sites.
GET /api/public/ticker
The figures in the strip above our pages: the largest coins, Fear & Greed, the Bitcoin fee and Ethereum gas.Cached for 20 seconds.
GET /api/public/coins/bitcoin/chart?range=30d
Price history of one coin.range: 1d, 7d, 30d, 90d, 1y or max (default 7d).Cached for 1 minute or 5 minutes. Limit: 60 requests per 10 minutes from one address, for every range except 7d.
GET /api/public/compare?a=bitcoin&b=ethereum&range=90d
How two coins performed over the same period, from our daily prices.a and b: coin ids; range: 7d, 30d, 90d or 1y.Cached for 5 minutes or 1 hour.
GET /api/public/search?q=bitcoin
Coins, guides and glossary terms that match a query.q: up to 120 characters.Cached for 30 seconds.

curl

curl "https://wardcrest.com/api/public/bitcoin/fees"

JavaScript

const res = await fetch('https://wardcrest.com/api/public/bitcoin/fees');
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import requests

res = requests.get(
    "https://wardcrest.com/api/public/bitcoin/fees",
    timeout=10,
)
res.raise_for_status()
print(res.json())

Authentication

Create a key under Settings → API keys. Keys belong to a workspace, are read-only unless you allow changes, and can expire. Send the key as a bearer token, and keep it out of code you publish: every sample on this page reads it from the WARDCREST_KEY environment variable.

Check your key
curl https://wardcrest.com/api/v1/me \
  -H "Authorization: Bearer $WARDCREST_KEY"

Rate limits

Each workspace has a daily quota set by its plan, and each key may send 120 requests a minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (unix seconds) for the daily quota; a 429 carries Retry-After.

PlanRequests a dayPer keyChanges through the API
Free1,000120 a minuteRead only
Plus5,000120 a minuteRead only
Pro25,000120 a minuteYes
Team150,000120 a minuteYes
Business1,000,000120 a minuteYes

Endpoints

Open an endpoint for its parameters and a request that runs as written, in curl, JavaScript or Python. The samples use real example values; names in angle brackets, such as <monitor id>, are yours to fill in.

Workspace

The workspace the key belongs to

GET/api/v1/meWorkspace, plan, usage and limits for this key

curl

curl "https://wardcrest.com/api/v1/me" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/me', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/me",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())

Monitors

What Wardcrest watches

GET/api/v1/monitorsList monitors
  • chain (query): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bsc
  • type (query): one of safe_guard, contract_admin, timelock, wallet_activity, btc_wallet, balance_threshold, token_flow, custom_event
  • enabled (query): boolean

curl

curl "https://wardcrest.com/api/v1/monitors?enabled=true" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/monitors?enabled=true', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/monitors",
    params={"enabled": "true"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
POST/api/v1/monitorsCreate a monitor (write)

curl

curl -X POST "https://wardcrest.com/api/v1/monitors" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Treasury Safe",
    "type": "safe_guard",
    "chain": "ethereum",
    "severity": "critical",
    "config": { "safe": "<safe address>", "pendingTransactions": true },
    "channelIds": ["<channel id>"]
  }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/monitors', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Treasury Safe',
    type: 'safe_guard',
    chain: 'ethereum',
    severity: 'critical',
    config: { safe: '<safe address>', pendingTransactions: true },
    channelIds: ['<channel id>'],
  }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.post(
    "https://wardcrest.com/api/v1/monitors",
    json={
        "name": "Treasury Safe",
        "type": "safe_guard",
        "chain": "ethereum",
        "severity": "critical",
        "config": {"safe": "<safe address>", "pendingTransactions": True},
        "channelIds": ["<channel id>"],
    },
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/monitors/{id}Get a monitor with its targets and channels
  • id (path, required): string. Monitor ID

curl

curl "https://wardcrest.com/api/v1/monitors/<monitor id>" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/monitors/<monitor id>', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/monitors/<monitor id>",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
PATCH/api/v1/monitors/{id}Pause, resume or edit a monitor (write)

Send `enabled` alone to pause or resume. Other fields replace the stored values; omitted fields keep them. Bitcoin wallet monitors with xpubs need the full `config` (keys included) when edited.

  • id (path, required): string. Monitor ID

curl

curl -X PATCH "https://wardcrest.com/api/v1/monitors/<monitor id>" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": false }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/monitors/<monitor id>', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ enabled: false }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.patch(
    "https://wardcrest.com/api/v1/monitors/<monitor id>",
    json={"enabled": False},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
DELETE/api/v1/monitors/{id}Delete a monitor and its alert history (write)
  • id (path, required): string. Monitor ID

curl

curl -X DELETE "https://wardcrest.com/api/v1/monitors/<monitor id>" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/monitors/<monitor id>', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);

Python

import os

import requests

res = requests.delete(
    "https://wardcrest.com/api/v1/monitors/<monitor id>",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()

Alerts

What Wardcrest found

GET/api/v1/alertsList alerts, newest first
  • status (query): one of open, acknowledged, resolved
  • severity (query): one of info, warning, critical
  • monitorId (query): string
  • chain (query): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bsc
  • since (query): string. ISO 8601 timestamp
  • limit (query): integer
  • cursor (query): string. Opaque `nextCursor` from the previous page

curl

curl "https://wardcrest.com/api/v1/alerts?status=open&severity=critical&limit=20" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/alerts?status=open&severity=critical&limit=20', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/alerts",
    params={"status": "open", "severity": "critical", "limit": "20"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/alerts/{id}Get an alert with its delivery history
  • id (path, required): string. Alert ID

curl

curl "https://wardcrest.com/api/v1/alerts/<alert id>" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/alerts/<alert id>', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/alerts/<alert id>",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
PATCH/api/v1/alerts/{id}Acknowledge, resolve or reopen an alert (write)
  • id (path, required): string. Alert ID

curl

curl -X PATCH "https://wardcrest.com/api/v1/alerts/<alert id>" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "acknowledged" }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/alerts/<alert id>', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ status: 'acknowledged' }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.patch(
    "https://wardcrest.com/api/v1/alerts/<alert id>",
    json={"status": "acknowledged"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())

Markets

Prices, conversion, rankings and large transfers

GET/api/v1/pricesCurrent prices for up to 100 coins, in up to 10 currencies
  • ids (query, required): string. Comma-separated coin ids, e.g. bitcoin,ethereum
  • vs (query): string. Comma-separated fiat codes (default usd)

curl

curl "https://wardcrest.com/api/v1/prices?ids=bitcoin,ethereum&vs=usd,eur" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/prices?ids=bitcoin,ethereum&vs=usd,eur', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/prices",
    params={"ids": "bitcoin,ethereum", "vs": "usd,eur"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/convertConvert an amount between any coin and any currency
  • from (query, required): string. Coin id, ticker or fiat code
  • to (query, required): string. Coin id, ticker or fiat code
  • amount (query): number. Default 1

curl

curl "https://wardcrest.com/api/v1/convert?from=eur&to=btc&amount=250" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/convert?from=eur&to=btc&amount=250', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/convert",
    params={"from": "eur", "to": "btc", "amount": "250"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/marketsRanked coin list with market caps, volume and changes
  • page (query): integer
  • per_page (query): integer
  • sort (query): one of rank, price, change1h, change24h, change7d, marketCap, volume, name
  • sparkline (query): boolean. Include 7-day hourly prices

curl

curl "https://wardcrest.com/api/v1/markets?per_page=10&sort=change24h" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/markets?per_page=10&sort=change24h', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/markets",
    params={"per_page": "10", "sort": "change24h"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/coins/{id}One coin: price, market data, supply, links
  • id (path, required): string. Coin id, e.g. bitcoin

curl

curl "https://wardcrest.com/api/v1/coins/bitcoin" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/coins/bitcoin', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/coins/bitcoin",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/whalesLarge transfers on Bitcoin and EVM chains, newest first

Bitcoin outputs and EVM token transfers at or above the operator’s thresholds, newest first by block time. Bitcoin amounts may include change: a block names who was paid, not who paid. EVM transfers are recorded once their block is past the chain’s confirmation depth, so they are never taken back; a Bitcoin transfer whose block is replaced disappears. Senders and receivers are named from public labels only, and an exchange only from an address list it published, given as the label’s `url`.

  • chain (query): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bsc. Only this chain
  • asset (query): string. Only this asset: BTC or a token symbol such as USDT, in any case
  • min (query): number. Only transfers worth at least this many US dollars
  • since (query): integer. Only transfers recorded after this `id`. Send the `latest` of your last answer to follow new transfers
  • before (query): string. The `next` value of an earlier answer, for the page after it
  • limit (query): integer

curl

curl "https://wardcrest.com/api/v1/whales?chain=ethereum&min=5000000" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/whales?chain=ethereum&min=5000000', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/whales",
    params={"chain": "ethereum", "min": "5000000"},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/public/whalesno keyLarge transfers, without a key

Bitcoin outputs and EVM token transfers at or above the operator’s thresholds, newest first by block time. Bitcoin amounts may include change: a block names who was paid, not who paid. EVM transfers are recorded once their block is past the chain’s confirmation depth, so they are never taken back; a Bitcoin transfer whose block is replaced disappears. Senders and receivers are named from public labels only, and an exchange only from an address list it published, given as the label’s `url`. The same answer as /whales, cached for 15 seconds and open to scripts on other sites (CORS).

  • chain (query): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bsc. Only this chain
  • asset (query): string. Only this asset: BTC or a token symbol such as USDT, in any case
  • min (query): number. Only transfers worth at least this many US dollars
  • since (query): integer. Only transfers recorded after this `id`. Send the `latest` of your last answer to follow new transfers
  • before (query): string. The `next` value of an earlier answer, for the page after it
  • limit (query): integer

curl

curl "https://wardcrest.com/api/public/whales?min=10000000"

JavaScript

const res = await fetch('https://wardcrest.com/api/public/whales?min=10000000');
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import requests

res = requests.get(
    "https://wardcrest.com/api/public/whales",
    params={"min": "10000000"},
    timeout=10,
)
res.raise_for_status()
print(res.json())

Network

Bitcoin fees and EVM gas

GET/api/v1/bitcoin/feesRecommended Bitcoin fee rates (sat/vB)

curl

curl "https://wardcrest.com/api/v1/bitcoin/fees" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/bitcoin/fees', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/bitcoin/fees",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/gas/{chain}Gas prices for an EVM chain (gwei)
  • chain (path, required): one of ethereum, base, arbitrum, optimism, polygon, bsc

curl

curl "https://wardcrest.com/api/v1/gas/base" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/gas/base', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/gas/base",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())

Price alerts

Price, 24-hour move, fee, gas and confirmation alerts

GET/api/v1/price-alertsList price, fee, gas and confirmation alerts

curl

curl "https://wardcrest.com/api/v1/price-alerts" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/price-alerts', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/price-alerts",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
POST/api/v1/price-alertsCreate a price alert (write)

curl

curl -X POST "https://wardcrest.com/api/v1/price-alerts" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "btc_fee_below",
    "threshold": 5,
    "channelIds": ["<channel id>"]
  }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/price-alerts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    kind: 'btc_fee_below',
    threshold: 5,
    channelIds: ['<channel id>'],
  }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.post(
    "https://wardcrest.com/api/v1/price-alerts",
    json={
        "kind": "btc_fee_below",
        "threshold": 5,
        "channelIds": ["<channel id>"],
    },
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/price-alerts/{id}Get a price alert
  • id (path, required): string. Price alert ID

curl

curl "https://wardcrest.com/api/v1/price-alerts/<price alert id>" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/price-alerts/<price alert id>', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/price-alerts/<price alert id>",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
PATCH/api/v1/price-alerts/{id}Pause, resume or edit a price alert (write)

Send `enabled` alone to pause or resume. Other fields replace the stored values; omitted fields keep them. Changing the condition re-arms the alert.

  • id (path, required): string. Price alert ID

curl

curl -X PATCH "https://wardcrest.com/api/v1/price-alerts/<price alert id>" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": false }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/price-alerts/<price alert id>', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ enabled: false }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.patch(
    "https://wardcrest.com/api/v1/price-alerts/<price alert id>",
    json={"enabled": False},
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
DELETE/api/v1/price-alerts/{id}Delete a price alert (write)
  • id (path, required): string. Price alert ID

curl

curl -X DELETE "https://wardcrest.com/api/v1/price-alerts/<price alert id>" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/price-alerts/<price alert id>', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);

Python

import os

import requests

res = requests.delete(
    "https://wardcrest.com/api/v1/price-alerts/<price alert id>",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()

Intelligence

Address risk and sanctions screening. Labels and scores are heuristics, not legal determinations.

POST/api/v1/screenScreen up to 100 addresses

Checks each address against the OFAC SDN list and Wardcrest’s labels and, unless `exposure` is false, one hop of counterparties for Bitcoin and EVM addresses. Each address counts once against the monthly screening allowance (Plus plan and above).

curl

curl -X POST "https://wardcrest.com/api/v1/screen" \
  -H "Authorization: Bearer $WARDCREST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": ["bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h", "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"]
  }'

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/screen', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    addresses: ['bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h', '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'],
  }),
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.post(
    "https://wardcrest.com/api/v1/screen",
    json={
        "addresses": ["bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h", "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"],
    },
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())
GET/api/v1/addresses/{chain}/{address}/riskRisk assessment of an address

The score, factors, labels and top counterparties behind an address report. Counts as one lookup against the daily allowance; repeat lookups of the same address on the same UTC day are free.

  • chain (path, required): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bsc, evm. `evm` is treated as Ethereum
  • address (path, required): string

curl

curl "https://wardcrest.com/api/v1/addresses/ethereum/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/risk" \
  -H "Authorization: Bearer $WARDCREST_KEY"

JavaScript

const res = await fetch('https://wardcrest.com/api/v1/addresses/ethereum/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/risk', {
  headers: {
    Authorization: `Bearer ${process.env.WARDCREST_KEY}`,
  },
});
if (!res.ok) throw new Error(`Wardcrest API: ${res.status}`);
console.log(await res.json());

Python

import os

import requests

res = requests.get(
    "https://wardcrest.com/api/v1/addresses/ethereum/0xd8da6bf26964af9d7eed9e03e53415d37aa96045/risk",
    headers={"Authorization": f"Bearer {os.environ['WARDCREST_KEY']}"},
    timeout=10,
)
res.raise_for_status()
print(res.json())

Market data

Prices, rankings and conversions cover the 500 largest coins and 50 fiat currencies. The top coins’ prices come from our own index of four exchanges and update every few seconds; the rest refresh every few minutes. Coins with a verified flag agree with an on-chain Chainlink feed. Market data is provided by CoinGecko; fiat conversions use European Central Bank reference rates (which are available free of charge from the ECB) and ExchangeRate-API. Bitcoin fees and gas are Wardcrest’s own readings; when a reading is stale the endpoint answers 503 rather than an old number.

Price alerts created through the API behave exactly like those made in the dashboard: they are checked every minute, re-arm after the value moves back (or fire once), and deliver to the channel ids you pass.

Errors

Errors return { "error": { "code", "message", "details"? } } with these codes:

CodeHTTP statusMeaning
unauthenticated401No bearer key was sent.
invalid_key401The key is unknown, expired or revoked.
insufficient_scope403A read-only key was used for a write.
plan_required403The workspace plan does not include API write access.
workspace_suspended403The workspace is suspended. Its owners were emailed why.
plan_limit403Creating or resuming the monitor or price alert would exceed a plan limit.
not_found404No such monitor, alert, price alert or coin.
invalid_parameter400A query parameter is malformed.
invalid_json400The body is not a JSON object.
payload_too_large413The body is over 64 KB.
unsupported_media_type415The body was not sent as application/json.
validation_failed422Input was rejected; error.details lists each field.
config_required422Bitcoin monitors with xpubs need the full config to be edited.
rate_limited429More than 120 requests a minute with one key.
quota_exceeded429The workspace used its daily request quota.
internal500Our fault; the error was logged.
unavailable503A live figure (fees, gas) has not been refreshed recently; retry shortly.
tool_unavailable503We have temporarily switched off the tool behind this endpoint (market data, conversion, fees, gas, screening or address risk); retry later. It costs no quota.