Reports liveness of the API server process and the upstream Datahub endpoints it depends on. Suitable as a Kubernetes liveness probe.
Response
{
"status": "ok",
"datahub_urls": [
{ "url": "https://...", "healthy": true }
]
}
A high-throughput, callback-driven gateway for submitting BSV transactions, tracking their lifecycle, and streaming status updates to subscribers in real time.
Click any endpoint to expand its full request / response contract, headers, and examples. The defaults below cover the everyday submit-and-track flow.
Reports liveness of the API server process and the upstream Datahub endpoints it depends on. Suitable as a Kubernetes liveness probe.
{
"status": "ok",
"datahub_urls": [
{ "url": "https://...", "healthy": true }
]
}
Indicates that the process has finished start-up and is ready to accept traffic. Suitable as a Kubernetes readiness probe.
{
"status": "ready"
}
Returns the current lifecycle state of a previously submitted transaction, including its merkle path once mined.
| Header | Requirement | Description |
|---|---|---|
| Accept | Optional | application/json (default). |
{
"txid": "<hex>",
"txStatus": "SEEN_ON_NETWORK",
"status": "SEEN_ON_NETWORK",
"timestamp": "2026-05-20T12:00:00Z",
"blockHash": "<hex|null>",
"blockHeight": 870123,
"merklePath": "<BUMP hex|null>",
"extraInfo": "",
"competingTxs": []
}
Long-lived Server-Sent Events stream that pushes lifecycle updates for every transaction submitted under the supplied callback token. Hosted by Arcade's standalone SSE service — a separate listener from the main API (default port 8082, fronted by its own Kubernetes Service in production). CORS is permissive on this endpoint so browsers can connect directly with the EventSource API.
| Header | Requirement | Description |
|---|---|---|
| Accept | Recommended | text/event-stream |
| Last-Event-ID | Optional | Nanosecond timestamp returned by Arcade as the id of the last event the client received. Triggers a catchup replay of every status update that occurred strictly after this timestamp. Omit on first connect to receive the current persisted status of every txid registered under the token. |
?callbackToken=<token> the same opaque token sent as X-CallbackToken when submitting transactions. Scopes the stream to that token's transactions.
GET /events?callbackToken=my-token
Open a stream from JavaScript. Last-Event-ID is handled automatically by the browser on reconnect.
const es = new EventSource(
"https://arcade.example.com/events?callbackToken=my-token"
);
es.addEventListener("status", (e) => {
const status = JSON.parse(e.data);
console.log(status.txid, status.txStatus);
});
Tail the stream from a shell.
curl -N "https://arcade.example.com/events?callbackToken=my-token"
id: 1716205200123456789
event: status
data: {"txid":"<hex>","txStatus":"SEEN_ON_NETWORK","timestamp":"2026-05-20T12:00:00Z"}
id: 1716205260987654321
event: status
data: {"txid":"<hex>","txStatus":"MINED","timestamp":"2026-05-20T12:01:00Z"}
: keepalive
Submits one Bitcoin SV transaction for validation, propagation, and lifecycle tracking. Synchronous policy validation runs before the 202 is returned; fee and script checks are delegated to the network. Pick the body encoding that matches your client — raw bytes are the most efficient.
| Header | Requirement | Description |
|---|---|---|
| Content-Type | Required | One of application/octet-stream, text/plain (hex), or application/json — see the request body tabs below. |
| X-CallbackUrl | Optional | Webhook URL Arcade should POST status events to as this transaction progresses through the network. Must be a public HTTPS endpoint; private/loopback hosts are rejected unless the deployment is configured to allow them. |
| X-CallbackToken | Recommended | Opaque bearer token. Sent on every outbound webhook as Authorization: Bearer <token>, and used to scope Server-Sent Events streams when the client subscribes via SSE. |
| X-FullStatusUpdates | Optional | Set to "true" to receive every status transition (RECEIVED, SEEN_ON_NETWORK, SEEN_ON_MULTIPLE_NODES, MINED, IMMUTABLE). Default behavior delivers only terminal/notable transitions. |
Raw serialized transaction bytes. Most efficient — no encoding overhead. Supports Extended Format; the canonical txid is derived from the parsed transaction structure, not from a hash of the wire bytes.
<binary raw transaction bytes>
Hex-encoded serialized transaction as a UTF-8 string. Whitespace is trimmed before decoding.
0100000001abc...def00000000
JSON envelope carrying the hex-encoded transaction. Useful for clients that cannot easily send a raw or text/plain body.
{
"rawTx": "0100000001abc...def00000000"
}
{
"status": "submitted"
}
// Idempotent re-submit of a txid Arcade has already seen:
{
"status": "already submitted",
"txid": "<hex>",
"state": "SEEN_ON_NETWORK"
}
Submits a batch of concatenated raw transactions in a single HTTP request. Each transaction is parsed, validated, dedup-CAS'd, and published as part of one fan-out. Bodies are capped at 256 MiB.
| Header | Requirement | Description |
|---|---|---|
| Content-Type | Required | application/octet-stream — the only encoding accepted for batches. |
| X-CallbackUrl | Optional | Webhook URL Arcade should POST status events to as this transaction progresses through the network. Must be a public HTTPS endpoint; private/loopback hosts are rejected unless the deployment is configured to allow them. |
| X-CallbackToken | Recommended | Opaque bearer token. Sent on every outbound webhook as Authorization: Bearer <token>, and used to scope Server-Sent Events streams when the client subscribes via SSE. |
| X-FullStatusUpdates | Optional | Set to "true" to receive every status transition (RECEIVED, SEEN_ON_NETWORK, SEEN_ON_MULTIPLE_NODES, MINED, IMMUTABLE). Default behavior delivers only terminal/notable transitions. |
Concatenated raw transaction bytes. No length prefixes or separators — each transaction is parsed sequentially using the stream parser.
<binary raw tx 1><binary raw tx 2>...<binary raw tx N>
{
"submitted": 42,
"duplicates": 3,
"total": 45
}
Internal endpoint used by the Merkle Service to deliver SEEN_ON_NETWORK, SEEN_ON_MULTIPLE_NODES, STUMP and BLOCK_PROCESSED events. Bearer authentication is mandatory; the deployment refuses to start without a configured callback token.
| Header | Requirement | Description |
|---|---|---|
| Authorization | Required | Bearer <callback_token>. Compared in constant time against the configured token. |
| Content-Type | Required | application/json |
CallbackMessage envelope; the type field discriminates the variant.
{
"type": "SEEN_ON_NETWORK",
"txid": "<hex>",
"txids": ["<hex>", "..."],
"blockHash": "<hex>",
"subtreeIndex": 0,
"stump": "<base64>"
}
(empty body)
Lists block processing milestones (header seen, BLOCK_PROCESSED received, compound BUMP built) in descending-height order. Paginates via a height-cursor; pass the lowest height returned from the previous page as before-height to fetch the next page.
| Header | Requirement | Description |
|---|---|---|
| Accept | Optional | application/json (default). |
?limit=<int> default 50, max 200. ?before-height=<int> cursor — pass the lowest height from the previous page.
GET /api/v1/blocks/processing-status?limit=50&before-height=870000
{
"blocks": [
{
"blockHash": "<hex>",
"blockHeight": 870123,
"headerSeenAt": "2026-05-20T12:00:00Z",
"processedAt": "2026-05-20T12:00:30Z",
"bumpBuiltAt": "2026-05-20T12:00:45Z",
"status": "compound-bump-built",
"orphanedAt": null,
"hasBlockProcessed": true,
"hasCompoundBUMP": true
}
],
"nextCursor": 870000
}
Returns the block processing milestones for one block, looked up by block hash.
{
"blockHash": "<hex>",
"blockHeight": 870123,
"headerSeenAt": "2026-05-20T12:00:00Z",
"processedAt": "2026-05-20T12:00:30Z",
"bumpBuiltAt": "2026-05-20T12:00:45Z",
"status": "compound-bump-built",
"orphanedAt": null,
"hasBlockProcessed": true,
"hasCompoundBUMP": true
}
Requests that the upstream Merkle Service re-emit STUMP and BLOCK_PROCESSED callbacks for the given block hash. Useful for healing a deployment whose callback stream missed a block.
{
"status": "accepted",
"blockHash": "<hex>"
}