Your next integration.
Powered by BitTools.
Crypto market data and Bitcoin tools, with clear endpoints, predictable responses and access you control.
/v1/prices?ids=bitcoin// Illustrative response { "success": true, "data": { "bitcoin": { "price": 81000, "change_24h": 1.25 } } }
Your developer workspace
API access is available by request. Tell us about your application and expected usage; our team will create your key after review.
Request an API keyYour first request, in three steps.
https://www.bittools.net/api/v1 curl "https://www.bittools.net/api/v1/prices?ids=bitcoin,ethereum&fiat=USD" \ -H "Authorization: Bearer $BITTOOLS_API_KEY"
Keys belong in request headers, never in URLs. Documentation is public; data requests require authentication.
One key. Clear access.
Send Authorization: Bearer YOUR_API_KEY with every API request. Alternatively, use X-BT-API-Key: YOUR_API_KEY. If both are provided, X-BT-API-Key takes priority. Use server-side requests so your secret stays private.
New keys begin with btd_live_. Revoked or expired keys stop working immediately. Keys tied to an account stop working when that account is disabled. A valid key also needs permission for the endpoint you call.
Responses use success, data and meta; failed requests include error.message and error.status.
{
"success": true,
"data": {
"bitcoin": {
"price": 81000,
"change_24h": 1.25,
"market_cap": 1600000000000,
"last_updated": "2026-10-09T00:00:00Z"
}
},
"meta": {
"api_version": "v1",
"source": "BitTools",
"generated_at": "2026-10-09T00:00:00Z",
"response_time_ms": 8,
"fiat": "USD"
}
} Example values are illustrative. Cached market data can be older than the response generation time; inspect last_updated.
Explore the endpoints.
Use cryptocurrency IDs such as bitcoin or ethereum, not ticker symbols. Fiat defaults to the site's configured currency. Unsupported fiat values fall back to that default. Lists accept 1–250 items per page.
GETAPI directory/api/v1/
API identity and available endpoint URLs.
GETService status/api/v1/status
Data platform readiness, coin and exchange counts, and latest market update.
GETGlobal market/api/v1/global
Market capitalization, 24h volume, dominance and active cryptocurrency counts.
| Parameter | Location / type | Description |
|---|---|---|
fiat | query / string | Configured fiat currency, e.g. USD. Unsupported values fall back to the configured default. |
GETCoin market list/api/v1/coins
Paginated locally stored market data. Meta includes page, limit and has_more.
| Parameter | Location / type | Description |
|---|---|---|
fiat | query / string | Configured fiat currency, e.g. USD. Unsupported values fall back to the configured default. |
page | query / integer | One-based page number; default 1. |
limit | query / integer | Items per page, default 100; values are clamped to 1–250. |
search | query / string | Search the stored coin names and symbols. |
order | query / string | Sort order; default market_cap_desc. |
GETCoin details/api/v1/coins/{id}
Identity, categories, description, market metrics, supply, highs/lows and links. Returns 404 when no stored coin exists.
| Parameter | Location / type | Description |
|---|---|---|
id · required | path / string | Coin ID, for example bitcoin. |
fiat | query / string | Configured fiat currency, e.g. USD. Unsupported values fall back to the configured default. |
GETCoin price history/api/v1/coins/{id}/history
Cached market_chart data. If the requested range is missing, the stored 365-day payload may be returned. Meta.days echoes the requested range, not a guarantee of the stored data span.
| Parameter | Location / type | Description |
|---|---|---|
id · required | path / string | Coin ID, for example bitcoin. |
fiat | query / string | Configured fiat currency, e.g. USD. Unsupported values fall back to the configured default. |
days | query / integer | Requested history range; default 365. |
GETSelected prices/api/v1/prices
Map keyed by coin ID. Unknown or uncached IDs are omitted; a missing price is not fabricated. Accepts up to 100 comma-separated IDs.
| Parameter | Location / type | Description |
|---|---|---|
fiat | query / string | Configured fiat currency, e.g. USD. Unsupported values fall back to the configured default. |
ids · required | query / string | Comma-separated coin IDs, e.g. bitcoin,ethereum. |
GETExchange list/api/v1/exchanges
Paginated locally stored exchange data.
| Parameter | Location / type | Description |
|---|---|---|
page | query / integer | One-based page number; default 1. |
limit | query / integer | Items per page, default 100; values are clamped to 1–250. |
GETExchange details/api/v1/exchanges/{id}
Stored exchange identity, description, public notice and up to 100 markets.
| Parameter | Location / type | Description |
|---|---|---|
id · required | path / string | Exchange ID, for example binance. |
The downloadable OpenAPI specification describes the response fields and can be imported into API clients.
Transaction accelerator
Discuss an accelerator API partnership
/api/v1/accelerator Send a Bitcoin transaction ID in a JSON object. A transaction ID is 64 hexadecimal characters. This endpoint submits an existing transaction; it does not request private keys or wallet seed phrases.
curl -X POST "https://www.bittools.net/api/v1/accelerator" \
-H "Authorization: Bearer $BITTOOLS_API_KEY" \
-H "Content-Type: application/json" \
--data '{"txid":"REPLACE_WITH_YOUR_64_CHARACTER_TRANSACTION_ID"}' When a connected accelerator accepts the submission, the response is HTTP 202 with data.txid and data.status: submitted. Submitted does not mean confirmed; confirmation depends on the Bitcoin network. Requests can return 403 when accelerator access is disabled and 503 when the backend is unavailable.
Request body limit: 2 KB. Do not retry a submission automatically unless your integration knows it is safe to repeat.
Use your preferred language.
<?php
$key = getenv('BITTOOLS_API_KEY');
$ch = curl_init('https://www.bittools.net/api/v1/prices?ids=bitcoin&fiat=USD');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => ['Authorization: Bearer '.$key]
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($body === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
$response = json_decode($body, true);
if ($status !== 200 || empty($response['success'])) {
throw new RuntimeException('API request failed: '.$status);
}
print_r($response['data']); const response = await fetch('https://www.bittools.net/api/v1/prices?ids=bitcoin&fiat=USD', {
headers: { Authorization: `Bearer ${process.env.BITTOOLS_API_KEY}` }
});
const body = await response.json();
if (!response.ok || !body.success) throw new Error(body.error?.message || 'API request failed');
console.log(body.data); import os, json
from urllib.request import Request, urlopen
from urllib.error import HTTPError
request = Request('https://www.bittools.net/api/v1/prices?ids=bitcoin&fiat=USD',
headers={'Authorization': 'Bearer ' + os.environ['BITTOOLS_API_KEY']})
try:
with urlopen(request, timeout=15) as response:
body = json.load(response)
if not body['success']:
raise RuntimeError(body.get('error'))
print(body['data'])
except HTTPError as error:
raise RuntimeError(f'API request failed: {error.code}') from error Know your limits.
Your assigned limits apply across market and accelerator requests. Default limits for new keys: 30 per minute and 1000 per day. Administrators may assign different limits.
Authenticated requests consume quota, including validation errors. Minute and day windows reset at UTC boundaries. Inspect X-RateLimit-Limit-Minute, X-RateLimit-Remaining-Minute, X-RateLimit-Limit-Day and X-RateLimit-Remaining-Day. A rate-limited response includes Retry-After for new portal keys.
| HTTP | Meaning | Next step |
|---|---|---|
| 200 | Success | Read data. |
| 202 | Accepted | Submission accepted; not confirmation. |
| 400 | Invalid request | Check identifiers and JSON. |
| 401 | Authentication failed | Check, regenerate or request your key. |
| 403 | Access unavailable | Check account status and endpoint permissions. |
| 404 | No data found | Check the identifier or cached historical data. |
| 405 | Wrong method | Use GET for market data, POST for accelerator. |
| 413 | Body too large | Keep accelerator JSON under 2 KB. |
| 429 | Quota reached | Wait for the quota window to reset. |
| 503 | Service unavailable | Retry later for reads or contact support. |
Browser keys and public URL query tokens are not supported. CORS availability does not make a key safe to expose. Existing legacy market keys retain their original configured limits and windows.
