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
| Keyless | With a key | |
|---|---|---|
| Address | /api/public/… | /api/v1/… |
| Key | None | A workspace key, sent as a bearer token |
| Data | Prices, rates, Bitcoin fees, gas, charts and comparisons | Markets and network data, price alerts, your monitors and alerts, screening and address risk |
| Limits | Cached answers; the chart endpoint has a limit of its own | 1,000–1,000,000 requests a day by plan, 120 a minute per key |
| Changes | None: read only | Pro 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.
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.
| Plan | Requests a day | Per key | Changes through the API |
|---|---|---|---|
| Free | 1,000 | 120 a minute | Read only |
| Plus | 5,000 | 120 a minute | Read only |
| Pro | 25,000 | 120 a minute | Yes |
| Team | 150,000 | 120 a minute | Yes |
| Business | 1,000,000 | 120 a minute | Yes |
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, bsctype(query): one of safe_guard, contract_admin, timelock, wallet_activity, btc_wallet, balance_threshold, token_flow, custom_eventenabled(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, resolvedseverity(query): one of info, warning, criticalmonitorId(query): stringchain(query): one of bitcoin, ethereum, base, arbitrum, optimism, polygon, bscsince(query): string. ISO 8601 timestamplimit(query): integercursor(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,ethereumvs(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 codeto(query, required): string. Coin id, ticker or fiat codeamount(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): integerper_page(query): integersort(query): one of rank, price, change1h, change24h, change7d, marketCap, volume, namesparkline(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 chainasset(query): string. Only this asset: BTC or a token symbol such as USDT, in any casemin(query): number. Only transfers worth at least this many US dollarssince(query): integer. Only transfers recorded after this `id`. Send the `latest` of your last answer to follow new transfersbefore(query): string. The `next` value of an earlier answer, for the page after itlimit(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 chainasset(query): string. Only this asset: BTC or a token symbol such as USDT, in any casemin(query): number. Only transfers worth at least this many US dollarssince(query): integer. Only transfers recorded after this `id`. Send the `latest` of your last answer to follow new transfersbefore(query): string. The `next` value of an earlier answer, for the page after itlimit(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 Ethereumaddress(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:
| Code | HTTP status | Meaning |
|---|---|---|
| unauthenticated | 401 | No bearer key was sent. |
| invalid_key | 401 | The key is unknown, expired or revoked. |
| insufficient_scope | 403 | A read-only key was used for a write. |
| plan_required | 403 | The workspace plan does not include API write access. |
| workspace_suspended | 403 | The workspace is suspended. Its owners were emailed why. |
| plan_limit | 403 | Creating or resuming the monitor or price alert would exceed a plan limit. |
| not_found | 404 | No such monitor, alert, price alert or coin. |
| invalid_parameter | 400 | A query parameter is malformed. |
| invalid_json | 400 | The body is not a JSON object. |
| payload_too_large | 413 | The body is over 64 KB. |
| unsupported_media_type | 415 | The body was not sent as application/json. |
| validation_failed | 422 | Input was rejected; error.details lists each field. |
| config_required | 422 | Bitcoin monitors with xpubs need the full config to be edited. |
| rate_limited | 429 | More than 120 requests a minute with one key. |
| quota_exceeded | 429 | The workspace used its daily request quota. |
| internal | 500 | Our fault; the error was logged. |
| unavailable | 503 | A live figure (fees, gas) has not been refreshed recently; retry shortly. |
| tool_unavailable | 503 | We have temporarily switched off the tool behind this endpoint (market data, conversion, fees, gas, screening or address risk); retry later. It costs no quota. |