---
title: Sablebolt for developers and agents: REST API, MCP endpoint, agent skills | Sablebolt
description: The REST API, the MCP endpoint with eight tools, the skills index and the agent card. No account, no key: the numbers the swap form shows, read by a machine.
url: https://sablebolt.io/developers
---

# For developers and agents

Everything the swap form knows can be read by a machine: the catalogue, limits, live quotes, address checks and swap status. No account, no key. An agent that controls a wallet can also create a swap and pay the instruction it gets back.

## The files and endpoints

| Address | Format | What it is for |
|---|---|---|
| [https://api.sablebolt.io/mcp](https://api.sablebolt.io/mcp) | MCP, Streamable HTTP | Eight tools: seven read-only and create_swap |
| [/openapi.json](https://sablebolt.io/openapi.json) | OpenAPI 3.1 | The REST API at api.sablebolt.io: assets, routes, limits, quotes, address check, swaps, webhooks, market data |
| [/.well-known/agent-skills/index.json](https://sablebolt.io/.well-known/agent-skills/index.json) | JSON | Eight skills, each mapped to endpoints and a documentation page |
| [/.well-known/agent-card.json](https://sablebolt.io/.well-known/agent-card.json) | JSON | The A2A agent card: interfaces, skills with example questions, the hand-off rule |
| [/llms.txt](https://sablebolt.io/llms.txt) | Markdown | The index for assistants; every page has a markdown twin at its own path plus .md |
| [/feed.xml](https://sablebolt.io/feed.xml) | RSS 2.0 | The blog, one item per post |

## The MCP endpoint

`https://api.sablebolt.io/mcp`

- Transport: Streamable HTTP, protocol version 2025-06-18, stateless: no session to open, no stream to keep. GET answers 405, DELETE 405.
- Authentication: none. Rate: 60 requests a minute per IP on the endpoint; swap creation 10 a minute per IP, shared with the REST route.
- One JSON-RPC request per HTTP call. A batch is refused with 400.
- Every tool carries a title and annotations: readOnlyHint on the seven read tools; create_swap is marked as not read-only and not destructive.

| Tool | Input | Returns | Kind |
|---|---|---|---|
| `list_assets` | — | every asset the form knows: slug, ticker, network, confirmations, extra-id name, availability | read-only |
| `list_routes` | — | every route with its own page, and whether both sides are available right now | read-only |
| `get_limits` | from, to | minimum and maximum for the route, in the asset you send | read-only |
| `get_quote` | from, to, amount | amountTo, networkFee (taken out of the payout), receiveAmount, rate; the final amount is set when the deposit confirms | read-only |
| `validate_address` | asset, address | whether the address has the right format for the asset; not who owns it, not whether an exchange needs a memo | read-only |
| `get_swap_status` | id | stage (1 waiting … 5 done), both addresses, amounts, both transaction hashes; the payment instruction while the deposit is awaited | read-only |
| `swap_page_link` | from, to, amount (optional) | the page where a person completes the swap, with the amount prefilled | read-only |
| `create_swap` | from, to, amount, fromAddress, toAddress; extraId and fromExtraId when a chain needs them | the swap id, the status page and the payment instruction | creates a swap |

## Connect a client

### Claude Code

One command adds the endpoint as an HTTP server:

```
`claude mcp add --transport http sablebolt https://api.sablebolt.io/mcp`
```

### Claude.ai and Claude Desktop

Settings → Connectors → Add custom connector, then paste the endpoint URL. There is no sign-in step: the server asks for no credentials.

### Cursor

In .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project:

```
`{ "mcpServers": { "sablebolt": { "url": "https://api.sablebolt.io/mcp" } } }`
```

### ChatGPT

Settings → Connectors → Developer mode → Create, then name the connector and paste the endpoint URL.

### Any other client

A Streamable HTTP client that sends initialize, then tools/list and tools/call, works as is. Send Accept: application/json, text/event-stream; the answer comes back as JSON or as one SSE message.

## The hand-off rule

A swap for a person is completed by that person on the page: the assistant hands over swap_page_link, the person checks the amount, both addresses and the memo on screen, then sends the deposit from their own wallet.

create_swap is for an agent that controls the sending wallet itself. The sender address is required on every swap. The form has no refund address: a swap that cannot be completed is handled by support.

The rate floats until the deposit confirms. A quote is an estimate; the payout is set at confirmation.

## The payment instruction

create_swap (and POST /v1/swaps) returns a payment instruction next to the deposit address, so an agent with a wallet pays without guessing:

| Field | Meaning |
|---|---|
| `asset, chain, chainId` | the asset slug, the chain it moves on and, on EVM chains, the numeric chain id (1 Ethereum, 56 BNB Smart Chain, 137 Polygon, 8453 Base); null elsewhere |
| `tokenContract, decimals` | the token contract or mint and the precision as the liquidity partner lists them; no contract for a chain's own coin |
| `address, extraId, extraIdName` | the one-time deposit address and, when the chain needs one, the memo or destination tag under its own name; without it the deposit is not matched |
| `amount, amountBaseUnits` | the exact amount to send, in the asset and in base units (satoshi, wei, sun); the base-unit value is rounded up at the last unit, never down |
| `uri, uriStandard` | a wallet URI where a standard exists: BIP-21 for Bitcoin-like coins, ERC-681 for EVM coins and tokens, Solana Pay, monero:, ton://transfer; null where none applies |
| `note` | the one rule in words: send exactly this amount in one transaction from the sending address given |
| `statusUrl (on the swap)` | the status page; get_swap_status and GET /v1/swaps/{id} return the same stages |

## The REST API

Described in [/openapi.json](https://sablebolt.io/openapi.json). Every answer is JSON under data, every error under error with a code. 200 requests a minute per IP across the API, with tighter caps per route:

| Endpoint | What it returns |
|---|---|
| `GET /v1/assets` | every asset, with canSend and canReceive |
| `GET /v1/routes` | every published route |
| `GET /v1/limits?from=&to=` | min and max for the route; 60 a minute |
| `GET /v1/quote?from=&to=&amount=` | the estimate, also as POST with a JSON body; 60 a minute |
| `POST /v1/address/validate` | the address format check; 30 a minute |
| `POST /v1/swaps` | creates a swap and returns the payment instruction; 10 a minute, shared with create_swap |
| `GET /v1/swaps/{id}` | status, stage, both addresses, both transaction hashes; 60 a minute |
| `POST /v1/swaps/{id}/notify` | registers an https URL and a secret for signed swap.status notifications (HMAC-SHA256 over timestamp and body); DELETE removes it; 10 a minute |
| `GET /v1/network/{chain}, /v1/market/prices, /v1/market/chart/{id}` | chain statistics and market data for the pages, cached |

## Changelog

- **2026-11-03:** This page. Listed in the official MCP Registry (registry.modelcontextprotocol.io) as io.sablebolt/swaps.

- **2026-11-02:** create_swap and the payment instruction (base units, token contract, decimals, wallet URI); signed swap.status webhooks; canSend and canReceive on every asset; the A2A agent card; payment links at /pay; JSON-RPC batches refused; one creation cap for REST and MCP.

- **2026-10-28:** Launch: REST API v1 described in OpenAPI 3.1, the MCP endpoint with the read tools, llms.txt and markdown twins, the agent-skills index, RSS.

## Contact

Questions and bug reports: [support@sablebolt.io](mailto:support@sablebolt.io), or [@sablebolt_bot](https://t.me/sablebolt_bot) on Telegram.

Security reports: [security@sablebolt.io](mailto:security@sablebolt.io). The same address, with the disclosure policy, is in [/.well-known/security.txt](https://sablebolt.io/.well-known/security.txt).
