Swift Bot Labs
62 utility APIs, pay per call
Small, deterministic tools for scripts and agents: DNS and e-mail security checks, web page to clean Markdown, EVM calldata and transaction decoding, x402 endpoint checks, IP/CIDR math, JSON and CSV, hashing, unit / time zone / currency conversion. No sign-up and no API key: each call costs $0.003-$0.02 in USDC on Base (eip155:8453), paid with the x402 protocol.
How it works
402 Payment Required with a PAYMENT-REQUIRED header naming the price, asset and pay-to address.transferWithAuthorization for exactly that amount and resends the request with PAYMENT-SIGNATURE. No gas needed.PAYMENT-RESPONSE.# Node, with the official x402 client packages
import { wrapFetchWithPayment } from "@x402/fetch"; // + a signer from @x402/evm
const pay = wrapFetchWithPayment(fetch, client);
const r = await pay("https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/mx?domain=example.com");
console.log(await r.json()); // { ok: true, tool: "dns-mx", result: {...}, payment: {...} }
Machine-readable: /openapi.json · /llms.txt · /catalog.json · MCP (streamable HTTP): https://x402-toolbox.swiftbotlab.workers.dev/mcp
DNS & e-mail 8
GET/v1/dns/lookupDNS lookup for any record type over DNS-over-HTTPS$0.005
Resolve A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, SRV, PTR, DS, DNSKEY, HTTPS, SVCB, TLSA or NAPTR records for a name. Returns answers with TTLs, the DNS status and whether DNSSEC validated. TXT strings are joined.
| Parameter | Type | Notes |
|---|---|---|
name required | string | Domain name (IDN allowed), e.g. example.com |
type | "A" | "NS" | "CNAME" | "SOA" | "PTR" | "MX" | "TXT" | "AAAA" | "SRV" | "NAPTR" | "DS" | "DNSKEY" | "HTTPS" | "SVCB" | "CAA" | "TLSA" | Record type Default "A". |
MCP tool name dns_lookup. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/lookup?name=example.com&type=MX"
Example result
{
"ok": true,
"tool": "dns-lookup",
"result": {
"name": "example.com",
"type": "MX",
"status": "NOERROR",
"dnssecValidated": true,
"answers": [
{
"name": "example.com",
"type": "MX",
"ttl": 3600,
"data": "0 ."
}
]
}
}GET/v1/dns/mxMail servers (MX) of a domain, sorted, with the mail provider$0.005
MX records sorted by priority, null-MX detection (RFC 7505), the implicit-MX fallback (A/AAAA) when no MX exists, and the detected mail provider (Google Workspace, Microsoft 365, Zoho, Proton, ...).
| Parameter | Type | Notes |
|---|---|---|
domain required | string | Domain, e.g. example.com |
MCP tool name dns_mx. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/mx?domain=github.com"
Example result
{
"ok": true,
"tool": "dns-mx",
"result": {
"domain": "github.com",
"acceptsMail": true,
"nullMx": false,
"provider": "Google Workspace",
"mx": [
{
"priority": 1,
"host": "aspmx.l.google.com",
"ttl": 3600
}
]
}
}GET/v1/dns/reverseReverse DNS (PTR) for an IPv4 or IPv6 address, with forward confirmation$0.005
Looks up the PTR name of an IP address and checks forward-confirmed reverse DNS (FCrDNS): whether the PTR hostname resolves back to the same IP.
| Parameter | Type | Notes |
|---|---|---|
ip required | string | IPv4 or IPv6 address |
MCP tool name dns_reverse. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/reverse?ip=8.8.8.8"
Example result
{
"ok": true,
"tool": "dns-reverse",
"result": {
"ip": "8.8.8.8",
"ptrName": "8.8.8.8.in-addr.arpa",
"hostnames": [
"dns.google"
],
"forwardConfirmed": true
}
}GET/v1/dns/spfSPF record check: full include tree, DNS lookup count, problems$0.008
Fetches the SPF record, expands include: and redirect= recursively, counts DNS-querying mechanisms against the RFC 7208 limit of 10, lists ip4/ip6 ranges and flags problems (multiple records, +all, ?all, missing includes, ptr, loops, void lookups).
| Parameter | Type | Notes |
|---|---|---|
domain required | string |
MCP tool name dns_spf. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/spf?domain=github.com"
Example result
{
"ok": true,
"tool": "dns-spf",
"result": {
"domain": "github.com",
"found": true,
"record": "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com ~all",
"policy": "softfail",
"dnsLookups": 8,
"lookupLimitExceeded": false,
"issues": []
}
}GET/v1/dns/dmarcDMARC record check and parsed policy$0.005
Reads _dmarc.<domain> (falling back to the organizational domain), parses p, sp, pct, rua, ruf, adkim, aspf and fo, and lists weaknesses (p=none, pct<100, no reporting address, duplicates).
| Parameter | Type | Notes |
|---|---|---|
domain required | string |
MCP tool name dns_dmarc. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/dns/dmarc?domain=paypal.com"
Example result
{
"ok": true,
"tool": "dns-dmarc",
"result": {
"domain": "paypal.com",
"found": true,
"policy": "reject",
"pct": 100,
"alignment": {
"dkim": "relaxed",
"spf": "relaxed"
},
"issues": []
}
}GET/v1/email/validateE-mail address check: syntax, MX, disposable, role, free provider, typos$0.005
Validates an address without sending mail: RFC syntax, normalized IDN domain, MX (or implicit A) records, null-MX, disposable-domain list, role accounts (info@, admin@), free providers and typo suggestions (gmial.com -> gmail.com). Verdict: deliverable, risky, undeliverable or invalid.
| Parameter | Type | Notes |
|---|---|---|
email required | string |
MCP tool name email_validate. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/email/validate?email=jane.doe%40gmial.com"
Example result
{
"ok": true,
"tool": "email-validate",
"result": {
"email": "jane.doe@gmial.com",
"verdict": "risky",
"syntaxValid": true,
"domain": "gmial.com",
"hasMx": false,
"disposable": false,
"role": false,
"freeProvider": false,
"suggestion": "jane.doe@gmail.com",
"reasons": [
"domain has no mail servers"
]
}
}GET/v1/email/securityE-mail security audit of a domain: MX, SPF, DMARC, DKIM, MTA-STS, TLS-RPT, BIMI, grade$0.02
One call audits a domain's mail setup: MX + provider, SPF tree and lookup count, DMARC policy, DKIM keys at common selectors, MTA-STS record and policy file, TLS-RPT, BIMI. Returns a 0-100 score, a letter grade and a prioritized list of fixes.
| Parameter | Type | Notes |
|---|---|---|
domain required | string | |
dkimSelectors | string | Optional comma-separated extra DKIM selectors to check (max 5) |
MCP tool name email_security. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/email/security?domain=github.com"
Example result
{
"ok": true,
"tool": "email-security",
"result": {
"domain": "github.com",
"score": 85,
"grade": "B",
"mx": {
"provider": "Google Workspace"
},
"spf": {
"found": true,
"policy": "softfail"
},
"dmarc": {
"found": true,
"policy": "reject"
},
"dkim": {
"found": [
"google"
]
},
"mtaSts": {
"found": false
},
"fixes": [
"Publish an MTA-STS policy"
]
}
}GET/v1/domain/rdapDomain registration data (RDAP/WHOIS): registrar, created, expires, age, status$0.01
Looks up the registry RDAP server for the TLD (IANA bootstrap) and returns the registrar, registration / expiry / last-changed dates, domain age in days, days until expiry, EPP status codes, nameservers and DNSSEC delegation. Useful for fraud and phishing checks (young domains).
| Parameter | Type | Notes |
|---|---|---|
domain required | string |
MCP tool name domain_rdap. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/domain/rdap?domain=example.com"
Example result
{
"ok": true,
"tool": "domain-rdap",
"result": {
"domain": "example.com",
"registrar": "RESERVED-Internet Assigned Numbers Authority",
"created": "1995-08-14T04:00:00Z",
"expires": "2026-08-13T04:00:00Z",
"ageDays": 11397,
"status": [
"client delete prohibited"
],
"nameservers": [
"a.iana-servers.net"
],
"dnssec": true
}
}Web 8
GET/v1/web/extractFetch a web page and return clean main text and Markdown plus title and metadata$0.01
Fetches a public URL (redirects followed and re-checked) and converts the HTML to clean text and Markdown: main/article content first, navigation/footers/scripts removed, links made absolute. Also returns title, description, language, canonical URL, headings and word count. Plain-text and JSON responses are returned as-is.
| Parameter | Type | Notes |
|---|---|---|
url required | string | |
format | "markdown" | "text" | "both" | Default "markdown". |
mode | "main" | "all" | "main" keeps the article/main region and drops nav/header/footer Default "main". |
maxChars | integer | Default 40000. |
MCP tool name web_extract. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/extract?url=https%3A%2F%2Fexample.com&format=markdown"
Example result
{
"ok": true,
"tool": "web-extract",
"result": {
"url": "https://example.com/",
"status": 200,
"title": "Example Domain",
"lang": "en",
"words": 25,
"markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes."
}
}GET/v1/web/metadataPage metadata for link previews and SEO: title, description, OpenGraph, Twitter card, JSON-LD, favicon$0.008
Fetches a URL and returns title, meta description, canonical, language, robots, OpenGraph and Twitter-card tags, JSON-LD blocks, favicon, RSS/Atom feeds, hreflang alternates and a short SEO checklist (title/description length, canonical, h1 count).
| Parameter | Type | Notes |
|---|---|---|
url required | string |
MCP tool name web_metadata. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/metadata?url=https%3A%2F%2Fgithub.com"
Example result
{
"ok": true,
"tool": "web-metadata",
"result": {
"url": "https://github.com/",
"title": "GitHub · Build and ship software on a single, collaborative platform",
"og": {
"title": "GitHub",
"image": "https://github.githubassets.com/assets/home24-5939032587c9.jpg"
},
"favicon": "https://github.githubassets.com/favicons/favicon.svg",
"seo": {
"titleLength": 71,
"h1Count": 1
}
}
}GET/v1/web/linksAll links on a page, absolute, de-duplicated, split into internal and external$0.008
Fetches a page and returns every <a href> as an absolute URL with its anchor text and rel, de-duplicated, marked internal or external (same registrable host), plus counts of nofollow links, mailto/tel links and images.
| Parameter | Type | Notes |
|---|---|---|
url required | string | |
filter | "all" | "internal" | "external" | Default "all". |
limit | integer | Default 500. |
MCP tool name web_links. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/links?url=https%3A%2F%2Fnews.ycombinator.com&filter=external&limit=5"
Example result
{
"ok": true,
"tool": "web-links",
"result": {
"url": "https://news.ycombinator.com/",
"total": 197,
"internal": 163,
"external": 33,
"returned": 5,
"links": [
{
"href": "https://www.ycombinator.com/",
"text": "",
"rel": null,
"internal": false,
"scheme": "https",
"nofollow": false
}
]
}
}GET/v1/web/headersHTTP status, response headers, redirect chain, timing and a security-header audit$0.005
Requests a URL (HEAD or GET) and returns the final status, every redirect hop, response headers, latency and an audit of security headers (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, COOP/CORP) with a grade, plus cookie flags (Secure, HttpOnly, SameSite) without cookie values.
| Parameter | Type | Notes |
|---|---|---|
url required | string | |
method | "HEAD" | "GET" | Default "GET". |
MCP tool name web_headers. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/headers?url=http%3A%2F%2Fgithub.com"
Example result
{
"ok": true,
"tool": "web-headers",
"result": {
"url": "https://github.com/",
"status": 200,
"redirects": [
{
"status": 301,
"from": "http://github.com/",
"to": "https://github.com/"
}
],
"ms": 180,
"security": {
"grade": "A",
"present": [
"strict-transport-security",
"content-security-policy"
],
"missing": []
}
}
}GET/v1/web/robotsIs a URL allowed for a crawler by robots.txt? Rules, crawl-delay and sitemaps$0.005
Fetches the site's /robots.txt and evaluates a URL path for a user-agent with RFC 9309 matching (longest match wins, * and $ wildcards). Returns allowed/disallowed, the deciding rule, crawl-delay, declared sitemaps and the agent groups present.
| Parameter | Type | Notes |
|---|---|---|
url required | string | Page URL (its origin's robots.txt is read) |
userAgent | string | Default "*". |
MCP tool name web_robots. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/robots?url=https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3Dx&userAgent=GPTBot"
Example result
{
"ok": true,
"tool": "web-robots",
"result": {
"robotsUrl": "https://www.google.com/robots.txt",
"path": "/search?q=x",
"userAgent": "GPTBot",
"allowed": false,
"matchedRule": "Disallow: /search",
"sitemaps": [
"https://www.google.com/sitemap.xml"
]
}
}GET/v1/web/sitemapRead a sitemap.xml (or a site's default sitemap): URLs with lastmod, child sitemaps$0.008
Fetches a sitemap URL, or for a bare site URL tries the sitemaps declared in robots.txt and then /sitemap.xml. Returns page URLs with lastmod/changefreq/priority, or the child sitemaps of a sitemap index. Up to 5,000 entries; gzip sitemaps are not decoded.
| Parameter | Type | Notes |
|---|---|---|
url required | string | |
limit | integer | Default 1000. |
MCP tool name web_sitemap. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/web/sitemap?url=https%3A%2F%2Fwww.cloudflare.com%2Fsitemap.xml&limit=3"
Example result
{
"ok": true,
"tool": "web-sitemap",
"result": {
"sitemapUrl": "https://www.cloudflare.com/sitemap.xml",
"type": "urlset",
"total": 4211,
"urls": [
{
"loc": "https://www.cloudflare.com/",
"lastmod": "2026-10-20"
}
]
}
}POST/v1/html/extractConvert HTML you already have to clean text / Markdown and extract its metadata and links$0.005
Same engine as web-extract, without fetching: send up to 2 MB of HTML (and an optional base URL for resolving links) and get Markdown and/or plain text, title, description, OpenGraph, headings, links and images.
| Parameter | Type | Notes |
|---|---|---|
html required | string | |
baseUrl | string | |
format | "markdown" | "text" | "both" | Default "markdown". |
mode | "main" | "all" | Default "all". |
maxChars | integer | Default 40000. |
MCP tool name html_extract. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/html/extract \
-H 'content-type: application/json' \
-d '{"html":"<h1>Hi</h1><p>Read <a href=\"/docs\">the docs</a>.</p>","baseUrl":"https://example.com"}'
Example result
{
"ok": true,
"tool": "html-extract",
"result": {
"title": null,
"words": 4,
"markdown": "# Hi\n\nRead [the docs](https://example.com/docs).",
"links": [
{
"href": "https://example.com/docs",
"text": "the docs"
}
]
}
}GET/v1/url/parseParse, normalize and clean a URL (components, query params, punycode, tracking params removed)$0.003
Splits a URL into scheme, host (Unicode and punycode), port, path, query parameters and fragment; returns a normalized form (lowercase host, default port dropped, sorted query) and a clean form with tracking parameters (utm_*, fbclid, gclid, ...) removed. No network access.
| Parameter | Type | Notes |
|---|---|---|
url required | string |
MCP tool name url_parse. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/url/parse?url=HTTPS%3A%2F%2FExample.COM%3A443%2Fa%2F..%2Fb%2F%3Futm_source%3Dx%26id%3D7%26fbclid%3Dabc%23top"
Example result
{
"ok": true,
"tool": "url-parse",
"result": {
"valid": true,
"scheme": "https",
"host": "example.com",
"path": "/b/",
"query": {
"utm_source": "x",
"id": "7",
"fbclid": "abc"
},
"normalized": "https://example.com/b/?fbclid=abc&id=7&utm_source=x#top",
"clean": "https://example.com/b/?id=7#top",
"removedTracking": [
"utm_source",
"fbclid"
]
}
}EVM 14
GET/v1/evm/addressValidate an EVM address and return its EIP-55 checksum form$0.003
Checks the 0x + 40 hex format, verifies a mixed-case EIP-55 checksum (flags typos), and returns the checksummed and lowercase forms and whether it is the zero address. No network access.
| Parameter | Type | Notes |
|---|---|---|
address required | string |
MCP tool name evm_address. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/address?address=0x2481e29895b43e87e547a50fb0bb5aa1e70585eb"
Example result
{
"ok": true,
"tool": "evm-address",
"result": {
"valid": true,
"checksummed": "0x2481E29895b43e87e547a50fB0BB5aa1E70585EB",
"lowercase": "0x2481e29895b43e87e547a50fb0bb5aa1e70585eb",
"hadChecksum": false,
"isZero": false
}
}GET/v1/evm/contractIs an address a contract or a wallet? Code size, EIP-1967 proxy implementation/admin/beacon, EIP-7702 delegation$0.005
Reads the bytecode of an address on a chain: EOA vs contract, code size and hash, EIP-7702 delegated EOAs, minimal-proxy (EIP-1167) targets, EIP-1967 implementation/admin/beacon slots and legacy ZeppelinOS proxies (e.g. USDC). Also returns the native balance and nonce.
| Parameter | Type | Notes |
|---|---|---|
address required | string | |
chain | string | One of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum". |
MCP tool name evm_contract. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/contract?address=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&chain=base"
Example result
{
"ok": true,
"tool": "evm-contract",
"result": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"chain": "base",
"type": "contract",
"codeSize": 1852,
"proxy": {
"standard": "ZeppelinOS (legacy unstructured storage)",
"implementation": "0x2Ce6311ddAE708829bc0784C967b7d77D19FD779"
}
}
}GET/v1/evm/selectorFunction selector and event topic for a Solidity signature$0.003
Normalizes a function/event/error signature (drops parameter names, expands uint to uint256, handles tuples and arrays) and returns the 4-byte selector and the 32-byte event topic. No network access.
| Parameter | Type | Notes |
|---|---|---|
signature required | string | e.g. transfer(address to, uint256 amount) |
MCP tool name evm_selector. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/selector?signature=function+transfer%28address+to%2C+uint+amount%29+external+returns+%28bool%29"
Example result
{
"ok": true,
"tool": "evm-selector",
"result": {
"canonical": "transfer(address,uint256)",
"selector": "0xa9059cbb",
"topic": "0x..."
}
}GET/v1/evm/selector-lookupReverse-lookup 4-byte function selectors and 32-byte event topics to signatures$0.005
Looks up up to 20 selectors (0x + 8 hex) and event topics (0x + 64 hex) in the public openchain signature database (4byte.directory fallback) and returns candidate signatures, verified-contract ones first.
| Parameter | Type | Notes |
|---|---|---|
selectors required | array | string | Selectors/topics, comma separated or array |
MCP tool name evm_selector_lookup. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/selector-lookup?selectors=0xa9059cbb%2C0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
Example result
{
"ok": true,
"tool": "evm-selector-lookup",
"result": {
"functions": {
"0xa9059cbb": [
{
"signature": "transfer(address,uint256)",
"verified": true
}
]
},
"events": {
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef": [
{
"signature": "Transfer(address,address,uint256)",
"verified": true
}
]
}
}
}POST/v1/evm/abi-encodeABI-encode values (or full calldata for a function signature)$0.003
Encodes values per the Solidity ABI: all integer sizes (range-checked), address, bool, bytesN, bytes, string, fixed and dynamic arrays and tuples (nested). With a function signature, returns calldata with the selector. Integers may be decimal or 0x strings.
| Parameter | Type | Notes |
|---|---|---|
signature | string | Function signature, e.g. transfer(address,uint256) |
types | array | string | Alternatively a list of types |
values required | array | Values in order; tuples as arrays |
MCP tool name abi_encode. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/abi-encode \
-H 'content-type: application/json' \
-d '{"signature":"transfer(address,uint256)","values":["0x2481E29895b43e87e547a50fB0BB5aa1E70585EB","1000000"]}'
Example result
{
"ok": true,
"tool": "abi-encode",
"result": {
"selector": "0xa9059cbb",
"data": "0xa9059cbb0000000000000000000000002481e29895b43e87e547a50fb0bb5aa1e70585eb00000000000000000000000000000000000000000000000000000000000f4240",
"bytes": 68
}
}POST/v1/evm/abi-decodeABI-decode calldata, return data or log data with known types or a signature$0.003
Decodes hex data with a list of ABI types or a function signature (the 4-byte selector is stripped and checked when present). Strict: every offset and length is bounds-checked and dirty padding is rejected.
| Parameter | Type | Notes |
|---|---|---|
data required | string | |
signature | string | |
types | array | string |
MCP tool name abi_decode. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/abi-decode \
-H 'content-type: application/json' \
-d '{"data":"0xa9059cbb0000000000000000000000002481e29895b43e87e547a50fb0bb5aa1e70585eb00000000000000000000000000000000000000000000000000000000000f4240","signature":"transfer(address,uint256)"}'
Example result
{
"ok": true,
"tool": "abi-decode",
"result": {
"signature": "transfer(address,uint256)",
"selectorMatched": true,
"values": [
{
"type": "address",
"value": "0x2481E29895b43e87e547a50fB0BB5aa1E70585EB"
},
{
"type": "uint256",
"value": "1000000"
}
]
}
}POST/v1/evm/calldata-decodeDecode unknown transaction calldata: find the function signature and decode the arguments$0.005
Looks up the selector (built-in list, then openchain / 4byte), tries each candidate signature and keeps the first one that decodes and re-encodes to exactly the same bytes, so collisions are filtered out. Returns the function, arguments and the other candidates.
| Parameter | Type | Notes |
|---|---|---|
data required | string |
MCP tool name calldata_decode. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/calldata-decode \
-H 'content-type: application/json' \
-d '{"data":"0x095ea7b30000000000000000000000002481e29895b43e87e547a50fb0bb5aa1e70585ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}'
Example result
{
"ok": true,
"tool": "calldata-decode",
"result": {
"selector": "0x095ea7b3",
"decoded": {
"signature": "approve(address,uint256)",
"args": [
{
"type": "address",
"value": "0x2481E29895b43e87e547a50fB0BB5aa1E70585EB"
},
{
"type": "uint256",
"value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
}
]
},
"candidates": 1
}
}GET/v1/evm/txExplain an EVM transaction: status, fee, decoded method, ERC-20/721 transfers$0.01
Fetches a transaction and its receipt from a public RPC: from/to, value, status, block and time, gas used, effective gas price and fee in native currency, the decoded method call, and every Transfer event (ERC-20 amounts formatted with token decimals and symbols, ERC-721 token ids).
| Parameter | Type | Notes |
|---|---|---|
hash required | string | |
chain | string | One of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum". |
MCP tool name evm_tx. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/tx?hash=0x5e074b70af40164915a9e379c4b02e77267d56adc34cc8d924d39c4632b45710&chain=base-sepolia"
Example result
{
"ok": true,
"tool": "evm-tx",
"result": {
"hash": "0x5e07...",
"chain": "base-sepolia",
"status": "success",
"from": "0xD48e...",
"to": "0x036C...",
"method": {
"signature": "transferWithAuthorization(...)"
},
"fee": "0.0000012",
"transfers": [
{
"token": "0x036C...",
"symbol": "USDC",
"from": "0xD48e...",
"to": "0x2481...",
"amount": "0.02"
}
]
}
}GET/v1/evm/tokenERC-20 token metadata: name, symbol, decimals, total supply (on-chain)$0.005
Reads name(), symbol(), decimals() and totalSupply() directly from the token contract on the chosen chain (handles bytes32 names), and formats the supply with the token's decimals.
| Parameter | Type | Notes |
|---|---|---|
address required | string | |
chain | string | One of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum". |
MCP tool name evm_token. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/token?address=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&chain=base"
Example result
{
"ok": true,
"tool": "evm-token",
"result": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"chain": "base",
"name": "USD Coin",
"symbol": "USDC",
"decimals": 6,
"totalSupply": "4123456789.123456",
"isErc20": true
}
}GET/v1/evm/balanceNative and ERC-20 balances of an address$0.005
Native coin balance plus the balance of up to 10 ERC-20 tokens (raw and formatted with decimals and symbol) for an address on the chosen chain, read at the latest block.
| Parameter | Type | Notes |
|---|---|---|
address required | string | |
chain | string | One of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum". |
tokens | array | string | Token contract addresses (optional) |
MCP tool name evm_balance. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/balance?address=0x2481E29895b43e87e547a50fB0BB5aa1E70585EB&chain=base&tokens=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
Example result
{
"ok": true,
"tool": "evm-balance",
"result": {
"address": "0x2481E29895b43e87e547a50fB0BB5aa1E70585EB",
"chain": "base",
"native": {
"symbol": "ETH",
"balance": "0.0012"
},
"tokens": [
{
"token": "0x8335...",
"symbol": "USDC",
"balance": "1.25"
}
]
}
}GET/v1/evm/gasCurrent gas price, base fee and priority fee on an EVM chain$0.003
Latest block number, base fee, suggested priority fee and gas price in gwei, plus the cost in native currency of a 21,000-gas transfer and a 65,000-gas ERC-20 transfer at the current price.
| Parameter | Type | Notes |
|---|---|---|
chain | string | One of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum". |
MCP tool name evm_gas. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/gas?chain=base"
Example result
{
"ok": true,
"tool": "evm-gas",
"result": {
"chain": "base",
"block": 37512345,
"baseFeeGwei": "0.0052",
"priorityFeeGwei": "0.001",
"gasPriceGwei": "0.0062",
"costs": {
"nativeTransfer": "0.000000130",
"erc20Transfer": "0.000000403"
}
}
}GET/v1/evm/ensENS: resolve a name to an address, or an address to its primary name (verified)$0.005
Give "name" (vitalik.eth) to get its Ethereum address, resolver and namehash; give "address" to get its primary ENS name via reverse resolution, verified by resolving the name forward again. Reads the ENS registry on Ethereum mainnet.
| Parameter | Type | Notes |
|---|---|---|
name | string | |
address | string |
MCP tool name ens_resolve. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/ens?name=vitalik.eth"
Example result
{
"ok": true,
"tool": "ens-resolve",
"result": {
"name": "vitalik.eth",
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"resolver": "0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63",
"namehash": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835"
}
}GET/v1/evm/unitsExact conversion between wei, gwei, ether or any token decimals$0.003
Converts an amount between wei / gwei / ether (or any decimals 0-36, e.g. 6 for USDC) with exact integer arithmetic (no floating-point rounding), and refuses conversions that would drop digits.
| Parameter | Type | Notes |
|---|---|---|
value required | string | |
from | string | wei, gwei, ether, or a number of decimals Default "ether". |
to | string | Default "wei". |
MCP tool name evm_units. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/units?value=1.5&from=ether&to=gwei"
Example result
{
"ok": true,
"tool": "evm-units",
"result": {
"value": "1.5",
"from": "ether",
"to": "gwei",
"result": "1500000000",
"wei": "1500000000000000000"
}
}POST/v1/evm/verify-messageRecover the signer of an EIP-191 personal_sign message and check it against an address$0.003
Computes the EIP-191 message hash and recovers the signing address from a 65-byte signature (v = 27/28 or 0/1), optionally comparing it with an expected address. Works for Sign-In-With-Ethereum messages and wallet login challenges. Contract (EIP-1271) wallets are not checked.
| Parameter | Type | Notes |
|---|---|---|
message required | string | |
signature required | string | |
address | string | |
messageEncoding | "utf8" | "hex" | Default "utf8". |
MCP tool name evm_verify_message. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/evm/verify-message \
-H 'content-type: application/json' \
-d '{"message":"hello","signature":"0xababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab"}'
Example result
{
"ok": true,
"tool": "evm-verify-message",
"result": {
"recovered": "0x...",
"matches": true,
"messageHash": "0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750"
}
}x402 2
GET/v1/x402/checkProbe an x402 endpoint: alive? what does it charge, on which chain, to whom? Is its 402 valid?$0.01
Calls a paid URL without paying and inspects the 402 challenge: x402 version, every accepted payment option (scheme, network, asset, USDC price in dollars, payTo, timeout), resource description, Bazaar discovery metadata, latency, and a list of spec problems that break clients. Nothing is paid.
| Parameter | Type | Notes |
|---|---|---|
url required | string | |
method | "GET" | "POST" | "HEAD" | Default "GET". |
MCP tool name x402_check. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/x402/check?url=https%3A%2F%2Fapi.bitrefill.com%2Fx402%2Fgift-cards%2Fsearch"
Example result
{
"ok": true,
"tool": "x402-check",
"result": {
"url": "https://api.bitrefill.com/x402/gift-cards/search",
"alive": true,
"status": 402,
"isX402": true,
"x402Version": 2,
"latencyMs": 210,
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"chain": "Base",
"assetSymbol": "USDC",
"priceUsd": 0.002,
"payTo": "0x..."
}
],
"bazaar": true,
"issues": []
}
}GET/v1/x402/searchSearch the x402 Bazaar catalogs for paid APIs by keyword, with prices$0.01
Searches the public discovery catalogs of the Coinbase CDP facilitator and the PayAI facilitator, merges and de-duplicates the results and returns each resource URL with its description, method, network and USD price. Filter by network or maximum price.
| Parameter | Type | Notes |
|---|---|---|
query required | string | |
network | string | e.g. eip155:8453 or base |
maxPriceUsd | number | |
limit | integer | Default 20. |
MCP tool name x402_search. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/x402/search?query=weather+forecast&network=base&maxPriceUsd=0.05"
Example result
{
"ok": true,
"tool": "x402-search",
"result": {
"query": "weather forecast",
"count": 2,
"results": [
{
"url": "https://api.example.com/weather",
"description": "Weather forecast by city",
"priceUsd": 0.01,
"network": "eip155:8453",
"sources": [
"cdp"
]
}
]
}
}IP & CIDR 6
GET/v1/ip/infoParse and classify an IPv4/IPv6 address (private, loopback, CGNAT, documentation, ...)$0.003
Canonical and expanded forms, integer and hex values, version, scope per the IANA special-purpose registries (private, loopback, link-local, CGNAT, multicast, documentation, 6to4, NAT64, IPv4-mapped with the embedded address), whether it is globally routable, and the reverse-DNS name.
| Parameter | Type | Notes |
|---|---|---|
ip required | string |
MCP tool name ip_info. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/info?ip=%3A%3Affff%3A192.168.1.10"
Example result
{
"ok": true,
"tool": "ip-info",
"result": {
"input": "::ffff:192.168.1.10",
"version": 6,
"canonical": "::ffff:c0a8:10a",
"scope": "ipv4-mapped",
"global": false,
"embeddedIPv4": "192.168.1.10",
"embeddedScope": "private"
}
}GET/v1/ip/cidrSubnet calculator for an IPv4/IPv6 CIDR block$0.003
Network and broadcast addresses, first/last usable host, netmask and wildcard, number of addresses and usable hosts, address class and scope. Notes when the input had host bits set.
| Parameter | Type | Notes |
|---|---|---|
cidr required | string | e.g. 10.0.0.0/22 or 2001:db8::/48 |
MCP tool name cidr_info. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/cidr?cidr=192.168.10.77%2F26"
Example result
{
"ok": true,
"tool": "cidr-info",
"result": {
"cidr": "192.168.10.64/26",
"network": "192.168.10.64",
"broadcast": "192.168.10.127",
"firstUsable": "192.168.10.65",
"lastUsable": "192.168.10.126",
"netmask": "255.255.255.192",
"addresses": "64",
"usableHosts": "62",
"hostBitsWereSet": true
}
}POST/v1/ip/containsWhich of these IPs fall inside which CIDR ranges (allowlist / blocklist check)$0.003
Checks up to 1,000 IPs against up to 1,000 CIDR blocks (IPv4 and IPv6) and returns, per IP, every matching range. Invalid entries are reported, not fatal.
| Parameter | Type | Notes |
|---|---|---|
cidrs required | array | string | CIDR blocks (JSON array, or a comma/space separated string) |
ips required | array | string | IP addresses (JSON array, or a comma/space separated string) |
MCP tool name cidr_contains. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/contains \
-H 'content-type: application/json' \
-d '{"cidrs":["10.0.0.0/8","192.168.0.0/16"],"ips":["10.1.2.3","8.8.8.8"]}'
Example result
{
"ok": true,
"tool": "cidr-contains",
"result": {
"results": [
{
"ip": "10.1.2.3",
"matches": [
"10.0.0.0/8"
],
"contained": true
},
{
"ip": "8.8.8.8",
"matches": [],
"contained": false
}
],
"invalidCidrs": [],
"invalidIps": []
}
}GET/v1/ip/splitSplit a CIDR block into smaller subnets$0.003
Lists the subnets of a given prefix length inside a parent block (e.g. a /16 into /24s), up to 4,096 per call, with the total count.
| Parameter | Type | Notes |
|---|---|---|
cidr required | string | |
newPrefix required | integer | |
limit | integer | Default 256. |
MCP tool name cidr_split. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/split?cidr=10.0.0.0%2F22&newPrefix=24"
Example result
{
"ok": true,
"tool": "cidr-split",
"result": {
"parent": "10.0.0.0/22",
"newPrefix": 24,
"total": "4",
"returned": 4,
"truncated": false,
"subnets": [
"10.0.0.0/24",
"10.0.1.0/24",
"10.0.2.0/24",
"10.0.3.0/24"
]
}
}POST/v1/ip/aggregateMerge / summarize a list of CIDRs into the smallest equivalent set$0.003
Collapses overlapping and adjacent IPv4/IPv6 ranges (route summarization), returning the minimal CIDR list that covers exactly the same addresses.
| Parameter | Type | Notes |
|---|---|---|
cidrs required | array | string | CIDR blocks or single IPs (JSON array, or a comma/space separated string) |
MCP tool name cidr_aggregate. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/aggregate \
-H 'content-type: application/json' \
-d '{"cidrs":["10.0.0.0/24","10.0.1.0/24","10.0.2.0/23","192.168.1.5"]}'
Example result
{
"ok": true,
"tool": "cidr-aggregate",
"result": {
"input": 4,
"output": 2,
"cidrs": [
"10.0.0.0/22",
"192.168.1.5/32"
],
"invalid": []
}
}GET/v1/ip/rangeConvert an IP range (start - end) to the minimal list of CIDR blocks$0.003
Exact conversion of an inclusive address range to CIDR blocks, IPv4 or IPv6, up to 1,000 blocks.
| Parameter | Type | Notes |
|---|---|---|
start required | string | |
end required | string |
MCP tool name ip_range_to_cidr. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/ip/range?start=10.0.0.5&end=10.0.0.20"
Example result
{
"ok": true,
"tool": "ip-range-to-cidr",
"result": {
"start": "10.0.0.5",
"end": "10.0.0.20",
"cidrs": [
"10.0.0.5/32",
"10.0.0.6/31",
"10.0.0.8/29",
"10.0.0.16/30",
"10.0.0.20/32"
],
"truncated": false
}
}Data & text 9
POST/v1/json/validateValidate JSON data against a JSON Schema (draft 2020-12 / draft-07)$0.003
Checks data against a schema: types, enum/const, numeric and string limits, patterns, formats (email, date-time, uri, uuid, ipv4/6, hostname), arrays, objects, $ref (same document), allOf/anyOf/oneOf/not, if/then/else. Returns every error with its JSON Pointer path. Remote $ref is not fetched.
| Parameter | Type | Notes |
|---|---|---|
schema required | JSON | JSON Schema (a JSON value, or a string containing JSON) |
data required | JSON | Data to validate (any JSON value; a string is parsed as JSON when it is valid JSON, otherwise validated as a plain string) |
formats | boolean | Assert "format" keywords Default true. |
MCP tool name json_validate. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/json/validate \
-H 'content-type: application/json' \
-d '{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","minimum":1},"email":{"type":"string","format":"email"}}},"data":{"id":0,"email":"nope"}}'
Example result
{
"ok": true,
"tool": "json-validate",
"result": {
"valid": false,
"errorCount": 2,
"errors": [
{
"path": "/id",
"keyword": "minimum",
"message": "must be >= 1"
},
{
"path": "/email",
"keyword": "format",
"message": "must be a valid email"
}
]
}
}POST/v1/json/formatParse, pretty-print, minify or canonicalize JSON (sorted keys); locate syntax errors$0.003
Parses JSON and returns it pretty-printed (2/4 spaces or tabs), minified, or canonical with sorted keys, plus size, node count and depth. On invalid JSON, reports the error position with line and column.
| Parameter | Type | Notes |
|---|---|---|
json required | string | JSON text |
mode | "pretty" | "minify" | "canonical" | Default "pretty". |
indent | 0 | 2 | 4 | 8 | Default 2. |
sortKeys | boolean | Default false. |
MCP tool name json_format. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/json/format \
-H 'content-type: application/json' \
-d '{"json":"{\"b\":1,\"a\":[1,2,{\"c\":null}]}","mode":"canonical"}'
Example result
{
"ok": true,
"tool": "json-format",
"result": {
"valid": true,
"result": "{\"a\":[1,2,{\"c\":null}],\"b\":1}",
"bytes": 27,
"nodes": 6,
"depth": 3
}
}POST/v1/json/queryExtract values from JSON with a JSON Pointer or a dotted path (a.b[0].c, items[*].id)$0.003
Reads one value by RFC 6901 JSON Pointer (/a/b/0) or a dotted path with [index] and [*] wildcards. Up to 20 paths per call.
| Parameter | Type | Notes |
|---|---|---|
json required | JSON | Document (a JSON value, or a string containing JSON) |
path | string | |
paths | array |
MCP tool name json_query. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/json/query \
-H 'content-type: application/json' \
-d '{"json":{"items":[{"id":1},{"id":2}],"meta":{"next":null}},"paths":["items[*].id","/meta/next"]}'
Example result
{
"ok": true,
"tool": "json-query",
"result": {
"results": [
{
"path": "items[*].id",
"found": true,
"value": [
1,
2
],
"multiple": true
},
{
"path": "/meta/next",
"found": true,
"value": null
}
]
}
}POST/v1/json/diffStructural diff of two JSON documents as JSON-Patch-style operations$0.003
Compares two JSON values key by key and index by index and returns add / remove / replace operations with JSON Pointer paths and old and new values (up to 2,000 operations).
| Parameter | Type | Notes |
|---|---|---|
a required | JSON | Original (a JSON value, or a string containing JSON) |
b required | JSON | Changed (a JSON value, or a string containing JSON) |
MCP tool name json_diff. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/json/diff \
-H 'content-type: application/json' \
-d '{"a":{"name":"x","tags":["a"],"v":1},"b":{"name":"x","tags":["a","b"],"v":2}}'
Example result
{
"ok": true,
"tool": "json-diff",
"result": {
"equal": false,
"count": 2,
"operations": [
{
"op": "add",
"path": "/tags/1",
"value": "b"
},
{
"op": "replace",
"path": "/v",
"old": 1,
"value": 2
}
]
}
}POST/v1/csv/to-jsonCSV / TSV to JSON (RFC 4180 quoting, delimiter auto-detect, type inference)$0.003
Parses CSV with quoted fields, embedded newlines and doubled quotes; auto-detects comma, semicolon, tab or pipe. Returns an array of objects (using the header row) or of arrays, optionally inferring numbers, booleans and nulls. Up to 50,000 rows.
| Parameter | Type | Notes |
|---|---|---|
csv required | string | |
delimiter | "auto" | "," | ";" | "\t" | "|" | Default "auto". |
header | boolean | Default true. |
inferTypes | boolean | Default true. |
MCP tool name csv_to_json. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/csv/to-json \
-H 'content-type: application/json' \
-d '{"csv":"name,age,active\n\"Doe, Jane\",34,true\nBob,,false"}'
Example result
{
"ok": true,
"tool": "csv-to-json",
"result": {
"rows": 2,
"columns": [
"name",
"age",
"active"
],
"delimiter": ",",
"data": [
{
"name": "Doe, Jane",
"age": 34,
"active": true
},
{
"name": "Bob",
"age": null,
"active": false
}
]
}
}POST/v1/json/to-csvJSON array of objects to CSV (nested objects flattened to dot.keys)$0.003
Converts an array of objects (or arrays) to CSV with a header row built from the union of keys. Nested objects become dot.separated columns, arrays are JSON-encoded, and cells starting with = + - @ are escaped against spreadsheet formula injection.
| Parameter | Type | Notes |
|---|---|---|
json required | JSON | Array of objects (a JSON value, or a string containing JSON) |
delimiter | "," | ";" | "\t" | "|" | Default ",". |
flatten | boolean | Default true. |
MCP tool name json_to_csv. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/json/to-csv \
-H 'content-type: application/json' \
-d '{"json":[{"id":1,"user":{"name":"Ann"}},{"id":2,"user":{"name":"Bo"},"tags":["x"]}]}'
Example result
{
"ok": true,
"tool": "json-to-csv",
"result": {
"rows": 2,
"columns": [
"id",
"user.name",
"tags"
],
"csv": "id,user.name,tags\r\n1,Ann,\r\n2,Bo,\"[\"\"x\"\"]\"\r\n"
}
}POST/v1/text/statsText statistics: words, sentences, reading time, readability, top keywords$0.003
Counts characters, graphemes, words, sentences, paragraphs and lines; estimates reading and speaking time; computes Flesch reading ease and Flesch-Kincaid grade (English) and the most frequent keywords without stop words.
| Parameter | Type | Notes |
|---|---|---|
text required | string | |
top | integer | Default 10. |
MCP tool name text_stats. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/text/stats \
-H 'content-type: application/json' \
-d '{"text":"The quick brown fox jumps over the lazy dog. It barked."}'
Example result
{
"ok": true,
"tool": "text-stats",
"result": {
"characters": 55,
"words": 11,
"sentences": 2,
"readingTimeSeconds": 3,
"fleschReadingEase": 94.3,
"topKeywords": [
{
"word": "quick",
"count": 1
}
]
}
}POST/v1/text/diffLine diff of two texts as a unified diff with added/removed counts$0.003
Computes a minimal line-based diff (LCS) between two texts and returns unified-diff hunks with configurable context, plus counts of added and removed lines. Up to 5,000 lines per side.
| Parameter | Type | Notes |
|---|---|---|
a required | string | |
b required | string | |
context | integer | Default 3. |
MCP tool name text_diff. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/text/diff \
-H 'content-type: application/json' \
-d '{"a":"one\ntwo\nthree","b":"one\n2\nthree\nfour"}'
Example result
{
"ok": true,
"tool": "text-diff",
"result": {
"identical": false,
"added": 2,
"removed": 1,
"hunks": 1,
"unified": "@@ -1,3 +1,4 @@\n one\n-two\n+2\n three\n+four"
}
}POST/v1/text/transformSlugify and case conversion (camel, snake, kebab, title, constant ...), trim, dedupe lines$0.003
Transforms text: slug, camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Title Case, Sentence case, upper, lower, strip accents, collapse whitespace, sort or dedupe lines, remove HTML tags.
| Parameter | Type | Notes |
|---|---|---|
text required | string | |
op required | "slug" | "camel" | "pascal" | "snake" | "kebab" | "constant" | "title" | "sentence" | "upper" | "lower" | "strip-accents" | "collapse-whitespace" | "sort-lines" | "dedupe-lines" | "strip-html" |
MCP tool name text_transform. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/text/transform \
-H 'content-type: application/json' \
-d '{"text":"Héllo Wörld: API v2 & More!","op":"slug"}'
Example result
{
"ok": true,
"tool": "text-transform",
"result": {
"op": "slug",
"result": "hello-world-api-v2-and-more"
}
}Encode & hash 6
POST/v1/hashHash text or bytes: SHA-1/2/3, Keccak-256, MD5, RIPEMD-160, BLAKE2/3$0.003
Computes one or all of md5, sha1, sha224, sha256, sha384, sha512, sha3-256, sha3-512, keccak256, ripemd160, blake2b-256/512, blake2s-256, blake3. Input as UTF-8 text, hex, base64 or base58; output hex or base64. Up to 1 MB.
| Parameter | Type | Notes |
|---|---|---|
data required | string | |
inputEncoding | "utf8" | "hex" | "base64" | "base58" | Default "utf8". |
algorithm | "all" | "md5" | "sha1" | "sha224" | "sha256" | "sha384" | "sha512" | "sha3-256" | "sha3-512" | "keccak256" | "ripemd160" | "blake2b-512" | "blake2b-256" | "blake2s-256" | "blake3" | Default "sha256". |
outputEncoding | "hex" | "base64" | Default "hex". |
MCP tool name hash. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/hash \
-H 'content-type: application/json' \
-d '{"data":"hello","algorithm":"all"}'
Example result
{
"ok": true,
"tool": "hash",
"result": {
"bytes": 5,
"hashes": {
"sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
"keccak256": "1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"
}
}
}POST/v1/hmacHMAC (SHA-256/384/512/1, MD5), e.g. to check a webhook signature$0.003
Computes HMAC of a message with a key (text, hex or base64). Optionally compares against an expected signature in constant time and reports whether it matches. Keys are not stored or logged.
| Parameter | Type | Notes |
|---|---|---|
message required | string | |
key required | string | |
keyEncoding | "utf8" | "hex" | "base64" | Default "utf8". |
algorithm | "sha1" | "sha256" | "sha384" | "sha512" | "md5" | Default "sha256". |
expected | string | Optional signature to compare (hex or base64, optional "sha256=" prefix) |
MCP tool name hmac. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/hmac \
-H 'content-type: application/json' \
-d '{"message":"{\"event\":\"ping\"}","key":"whsec_test","algorithm":"sha256"}'
Example result
{
"ok": true,
"tool": "hmac",
"result": {
"algorithm": "sha256",
"hex": "6f0c0b5b...",
"base64": "bwwLW...",
"matches": null
}
}POST/v1/encodeConvert between UTF-8, hex, base64, base64url, base32, base58; URL and HTML escaping$0.003
Re-encodes data from one encoding to another (utf8, hex, base64, base64url, base32, base58), or applies url-encode / url-decode / html-escape / html-unescape. Reports invalid UTF-8 instead of guessing.
| Parameter | Type | Notes |
|---|---|---|
data required | string | |
from | "utf8" | "hex" | "base64" | "base64url" | "base32" | "base58" | "url" | "html" | Default "utf8". |
to | "utf8" | "hex" | "base64" | "base64url" | "base32" | "base58" | "url" | "html" | Default "base64". |
MCP tool name encode. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/encode \
-H 'content-type: application/json' \
-d '{"data":"hello world","from":"utf8","to":"base58"}'
Example result
{
"ok": true,
"tool": "encode",
"result": {
"from": "utf8",
"to": "base58",
"result": "StV1DL6CwTryKyV",
"bytes": 11
}
}GET/v1/uuidGenerate UUIDs (v4 random, v7 time-ordered) or parse/validate one$0.003
With no "uuid" parameter: generates up to 100 UUIDs of version 4 or 7 using a CSPRNG. With "uuid": validates it and returns the canonical form, version, variant and embedded timestamp (v1, v6, v7).
| Parameter | Type | Notes |
|---|---|---|
uuid | string | UUID to parse (optional) |
version | 4 | 7 | Default 4. |
count | integer | Default 1. |
MCP tool name uuid. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/uuid?version=7&count=2"
Example result
{
"ok": true,
"tool": "uuid",
"result": {
"version": 7,
"uuids": [
"019a2a5e-7c1b-7f3e-9d2a-4b8c1e0f5a6d",
"019a2a5e-7c1b-7a10-8e55-0c9d2b7f1e33"
]
}
}POST/v1/jwt/decodeDecode a JWT and check its times; optionally verify an HS256/384/512 signature$0.003
Decodes header and payload, converts exp/iat/nbf to ISO dates, reports whether the token is expired or not yet valid, and flags alg=none. If a shared secret is given, verifies HMAC signatures (HS256/384/512) in constant time. Secrets are not stored or logged.
| Parameter | Type | Notes |
|---|---|---|
token required | string | |
secret | string | Optional HMAC secret to verify the signature |
secretEncoding | "utf8" | "base64" | "hex" | Default "utf8". |
MCP tool name jwt_decode. JSON body; simple fields can also go in the query string.
curl -i -X POST https://x402-toolbox.swiftbotlab.workers.dev/v1/jwt/decode \
-H 'content-type: application/json' \
-d '{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","secret":"your-256-bit-secret"}'
Example result
{
"ok": true,
"tool": "jwt-decode",
"result": {
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
},
"times": {
"iat": "2018-01-18T01:30:22.000Z"
},
"expired": false,
"signatureVerified": true
}
}GET/v1/randomCryptographically secure random bytes, tokens and passwords$0.003
Generates random bytes (hex/base64/base64url/base58), passwords with chosen character classes, or numeric PINs, from a CSPRNG. Reports the entropy in bits. Nothing is stored.
| Parameter | Type | Notes |
|---|---|---|
kind | "bytes" | "password" | "pin" | Default "bytes". |
length | integer | bytes for kind=bytes, characters otherwise Default 32. |
encoding | "hex" | "base64" | "base64url" | "base58" | Default "hex". |
symbols | boolean | Default true. |
count | integer | Default 1. |
MCP tool name random. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/random?kind=password&length=20"
Example result
{
"ok": true,
"tool": "random",
"result": {
"kind": "password",
"entropyBits": 130.1,
"values": [
"q7#Vt!pZ2m@Lx9$wR4kE"
]
}
}Convert 6
GET/v1/convert/unitsConvert between units: length, mass, volume, area, speed, time, data, pressure, energy, power, temperature, angle$0.003
Exact-factor conversion across 12 dimensions and 140+ units (SI, imperial, US customary, IEC binary data sizes). Temperature handles offsets (C, F, K, R). Pass to=all to get every unit of the same dimension.
| Parameter | Type | Notes |
|---|---|---|
value required | number | |
from required | string | |
to required | string | Target unit, or "all" |
MCP tool name unit_convert. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/convert/units?value=72&from=F&to=C"
Example result
{
"ok": true,
"tool": "unit-convert",
"result": {
"value": 72,
"from": "F",
"to": "C",
"result": 22.2222222222,
"dimension": "temperature"
}
}GET/v1/time/convertConvert a time between time zones and formats (ISO, unix, RFC 2822), with DST-aware offsets$0.003
Parses ISO 8601, unix seconds/ms or "now" (a bare local time is read in the "from" zone) and returns it in UTC and in each target IANA zone with offsets, weekday, ISO week, day of year, unix seconds/ms and RFC 2822. Up to 20 target zones.
| Parameter | Type | Notes |
|---|---|---|
time | string | Default "now". |
from | string | IANA zone used to read a time without an offset Default "UTC". |
to | array | string | IANA zone(s), comma separated |
MCP tool name time_convert. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/time/convert?time=2026-03-29+09%3A30&from=Europe%2FBerlin&to=America%2FNew_York%2CAsia%2FKolkata"
Example result
{
"ok": true,
"tool": "time-convert",
"result": {
"utc": "2026-03-29T07:30:00.000Z",
"unix": 1774769400,
"zones": [
{
"zone": "America/New_York",
"local": "2026-03-29T03:30:00-04:00",
"offset": "-04:00",
"weekday": "Sun"
}
]
}
}GET/v1/time/diffDuration between two dates/times, calendar difference and business days$0.003
Exact duration (seconds, minutes, hours, days), calendar difference in years/months/days, and the number of weekdays (Mon-Fri) between two dates, evaluated in a chosen time zone. Optionally adds a duration to a date.
| Parameter | Type | Notes |
|---|---|---|
start required | string | |
end | string | Default "now". |
tz | string | Default "UTC". |
MCP tool name time_diff. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/time/diff?start=2026-01-15&end=2026-10-27&tz=UTC"
Example result
{
"ok": true,
"tool": "time-diff",
"result": {
"seconds": 24019200,
"days": 278,
"calendar": {
"years": 0,
"months": 9,
"days": 12
},
"businessDays": 198,
"human": "9 months, 12 days"
}
}GET/v1/cron/nextExplain a cron expression and list its next run times in any time zone$0.003
Parses a 5-field cron expression (lists, ranges, steps, month/day names, @daily/@hourly/... macros, Vixie day-of-month OR day-of-week rule) and returns the next N run times (up to 50) in UTC and in the given IANA zone, DST-aware.
| Parameter | Type | Notes |
|---|---|---|
expression required | string | |
tz | string | Default "UTC". |
count | integer | Default 5. |
from | string | Start time (default now) |
MCP tool name cron_next. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/cron/next?expression=30+9+*+*+mon-fri&tz=America%2FNew_York&count=3"
Example result
{
"ok": true,
"tool": "cron-next",
"result": {
"expression": "30 9 * * mon-fri",
"next": [
{
"utc": "2026-10-27T13:30:00.000Z",
"local": "2026-10-27T09:30:00-04:00"
}
]
}
}GET/v1/colorColour conversion (hex, RGB, HSL) and WCAG contrast ratio between two colours$0.003
Parses hex, rgb(), hsl() or CSS names and returns hex, RGB, HSL and relative luminance. With a second colour, returns the WCAG 2.x contrast ratio and AA / AAA pass/fail for normal and large text.
| Parameter | Type | Notes |
|---|---|---|
color required | string | |
against | string | Optional second colour for a contrast check |
MCP tool name color. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/color?color=%231e90ff&against=white"
Example result
{
"ok": true,
"tool": "color",
"result": {
"hex": "#1e90ff",
"rgb": {
"r": 30,
"g": 144,
"b": 255
},
"hsl": {
"h": 209.6,
"s": 100,
"l": 55.9
},
"contrast": {
"ratio": 3.24,
"AA": false,
"AALarge": true,
"AAA": false
}
}
}GET/v1/convert/currencyCurrency conversion with official ECB euro reference rates (30 fiat currencies)$0.005
Converts an amount between USD, EUR, GBP, JPY, CHF, CNY, INR, BRL, CAD, AUD and the other currencies the European Central Bank publishes daily (cross rates via EUR). Returns the rate, its date and source. Reference rates, not trading quotes.
| Parameter | Type | Notes |
|---|---|---|
amount | number | Default 1. |
from required | string | |
to required | string | Currency code(s), comma separated, or "all" |
MCP tool name currency_convert. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/convert/currency?amount=100&from=USD&to=EUR%2CINR"
Example result
{
"ok": true,
"tool": "currency-convert",
"result": {
"amount": 100,
"from": "USD",
"date": "2026-10-26",
"results": {
"EUR": 89.381,
"INR": 8418.31
},
"source": "European Central Bank euro reference rates"
}
}Validate & parse 3
GET/v1/semverSemantic versions: parse, compare, sort, and check against npm-style ranges$0.003
Parses SemVer 2.0 versions; compares two (a vs b); sorts a list (invalid ones reported); checks versions against npm range syntax (^, ~, x-ranges, hyphen ranges, comparators, ||) with correct prerelease rules; returns the highest version satisfying the range.
| Parameter | Type | Notes |
|---|---|---|
versions required | array | string | One or more versions, comma separated |
range | string | Optional npm-style range, e.g. ^1.2.0 || >=2.1 <3 |
compareTo | string |
MCP tool name semver. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/semver?versions=1.2.3%2C1.10.0%2C2.0.0-rc.1%2C1.2.10&range=%5E1.2.0"
Example result
{
"ok": true,
"tool": "semver",
"result": {
"sorted": [
"1.2.3",
"1.2.10",
"1.10.0",
"2.0.0-rc.1"
],
"range": "^1.2.0",
"satisfying": [
"1.2.3",
"1.2.10",
"1.10.0"
],
"maxSatisfying": "1.10.0",
"invalid": []
}
}GET/v1/iban/validateValidate an IBAN: country length, mod-97 check digits, formatted output$0.003
Validates International Bank Account Numbers for 80+ countries: structure, country-specific length and the ISO 13616 mod-97 checksum. Returns the normalized and print-formatted IBAN, BBAN and (for DE/GB) the bank code / sort code. Offline; nothing is stored.
| Parameter | Type | Notes |
|---|---|---|
iban required | string |
MCP tool name iban_validate. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/iban/validate?iban=GB82+WEST+1234+5698+7654+32"
Example result
{
"ok": true,
"tool": "iban-validate",
"result": {
"valid": true,
"normalized": "GB82WEST12345698765432",
"country": "GB",
"formatted": "GB82 WEST 1234 5698 7654 32",
"sortCode": "12-34-56",
"issues": []
}
}GET/v1/user-agentParse a User-Agent: browser, engine, OS, device type, and known bots / AI crawlers$0.003
Identifies browser and version, rendering engine, OS and version, device class (desktop, mobile, tablet, tv) and 35+ known bots: search engines, AI crawlers (GPTBot, ClaudeBot, PerplexityBot, CCBot, ...), social preview fetchers, SEO tools, monitors and HTTP libraries.
| Parameter | Type | Notes |
|---|---|---|
ua required | string |
MCP tool name user_agent. Query parameters; POST with the same fields as a JSON body also works.
curl -i "https://x402-toolbox.swiftbotlab.workers.dev/v1/user-agent?ua=Mozilla%2F5.0+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%3B+compatible%3B+GPTBot%2F1.2%3B+%2Bhttps%3A%2F%2Fopenai.com%2Fgptbot%29"
Example result
{
"ok": true,
"tool": "user-agent",
"result": {
"isBot": true,
"bot": "GPTBot",
"botCategory": "ai-crawler",
"browser": null,
"os": null,
"device": "bot"
}
}Rules
- You pay only for a successful result (HTTP 200). Bad input (400), unreachable targets, upstream errors and timeouts are not charged.
- Limits per IP: 120 price quotes and 60 paid calls per minute. Bodies up to 64 KB (2 MB for HTML/text tools).
- URL tools fetch only public http(s) addresses on ports 80/443/8080/8443 and re-check every redirect; private, loopback and link-local targets are refused.
- Inputs are processed in memory and not stored. Logs keep the tool name, status, payer address and settlement hash only.
- Pay-to address
0x2481E29895b43e87e547a50fB0BB5aa1E70585EB. Payments are verified and settled by the PayAI facilitator. - Questions, bulk use or a tool you need: @SwiftBotLabsBot on Telegram.