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.

x402 v2 · exact schemeUSDC on Base (eip155:8453)failed calls are freeMCP server at /mcpOpenAPI 3.1

How it works

1. Call any toolWithout payment you get 402 Payment Required with a PAYMENT-REQUIRED header naming the price, asset and pay-to address.
2. Sign and retryAn x402 client signs a USDC transferWithAuthorization for exactly that amount and resends the request with PAYMENT-SIGNATURE. No gas needed.
3. Get the resultThe payment is verified first, the tool runs, then it settles. Input errors and tool failures are never charged. The receipt is in 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.

ParameterTypeNotes
name requiredstringDomain 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, ...).

ParameterTypeNotes
domain requiredstringDomain, 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.

ParameterTypeNotes
ip requiredstringIPv4 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).

ParameterTypeNotes
domain requiredstring

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).

ParameterTypeNotes
domain requiredstring

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.

ParameterTypeNotes
email requiredstring

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.

ParameterTypeNotes
domain requiredstring
dkimSelectorsstringOptional 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).

ParameterTypeNotes
domain requiredstring

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.

ParameterTypeNotes
url requiredstring
format"markdown" | "text" | "both" Default "markdown".
mode"main" | "all""main" keeps the article/main region and drops nav/header/footer Default "main".
maxCharsinteger 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).

ParameterTypeNotes
url requiredstring

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/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.

ParameterTypeNotes
url requiredstring
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.

ParameterTypeNotes
url requiredstringPage URL (its origin's robots.txt is read)
userAgentstring 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.

ParameterTypeNotes
url requiredstring
limitinteger 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.

ParameterTypeNotes
html requiredstring
baseUrlstring
format"markdown" | "text" | "both" Default "markdown".
mode"main" | "all" Default "all".
maxCharsinteger 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.

ParameterTypeNotes
url requiredstring

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.

ParameterTypeNotes
address requiredstring

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.

ParameterTypeNotes
address requiredstring
chainstringOne 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.

ParameterTypeNotes
signature requiredstringe.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.

ParameterTypeNotes
selectors requiredarray | stringSelectors/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.

ParameterTypeNotes
signaturestringFunction signature, e.g. transfer(address,uint256)
typesarray | stringAlternatively a list of types
values requiredarrayValues 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.

ParameterTypeNotes
data requiredstring
signaturestring
typesarray | 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.

ParameterTypeNotes
data requiredstring

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).

ParameterTypeNotes
hash requiredstring
chainstringOne 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.

ParameterTypeNotes
address requiredstring
chainstringOne 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.

ParameterTypeNotes
address requiredstring
chainstringOne of ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, gnosis, base-sepolia, sepolia (or a chain id) Default "ethereum".
tokensarray | stringToken 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.

ParameterTypeNotes
chainstringOne 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.

ParameterTypeNotes
namestring
addressstring

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.

ParameterTypeNotes
value requiredstring
fromstringwei, gwei, ether, or a number of decimals Default "ether".
tostring 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.

ParameterTypeNotes
message requiredstring
signature requiredstring
addressstring
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.

ParameterTypeNotes
url requiredstring
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": []
  }
}

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.

ParameterTypeNotes
ip requiredstring

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.

ParameterTypeNotes
cidr requiredstringe.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.

ParameterTypeNotes
cidrs requiredarray | stringCIDR blocks (JSON array, or a comma/space separated string)
ips requiredarray | stringIP 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.

ParameterTypeNotes
cidr requiredstring
newPrefix requiredinteger
limitinteger 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.

ParameterTypeNotes
cidrs requiredarray | stringCIDR 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.

ParameterTypeNotes
start requiredstring
end requiredstring

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.

ParameterTypeNotes
schema requiredJSONJSON Schema (a JSON value, or a string containing JSON)
data requiredJSONData to validate (any JSON value; a string is parsed as JSON when it is valid JSON, otherwise validated as a plain string)
formatsbooleanAssert "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.

ParameterTypeNotes
json requiredstringJSON text
mode"pretty" | "minify" | "canonical" Default "pretty".
indent0 | 2 | 4 | 8 Default 2.
sortKeysboolean 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.

ParameterTypeNotes
json requiredJSONDocument (a JSON value, or a string containing JSON)
pathstring
pathsarray

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).

ParameterTypeNotes
a requiredJSONOriginal (a JSON value, or a string containing JSON)
b requiredJSONChanged (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.

ParameterTypeNotes
csv requiredstring
delimiter"auto" | "," | ";" | "\t" | "|" Default "auto".
headerboolean Default true.
inferTypesboolean 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.

ParameterTypeNotes
json requiredJSONArray of objects (a JSON value, or a string containing JSON)
delimiter"," | ";" | "\t" | "|" Default ",".
flattenboolean 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.

ParameterTypeNotes
text requiredstring
topinteger 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.

ParameterTypeNotes
a requiredstring
b requiredstring
contextinteger 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.

ParameterTypeNotes
text requiredstring
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.

ParameterTypeNotes
data requiredstring
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.

ParameterTypeNotes
message requiredstring
key requiredstring
keyEncoding"utf8" | "hex" | "base64" Default "utf8".
algorithm"sha1" | "sha256" | "sha384" | "sha512" | "md5" Default "sha256".
expectedstringOptional 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.

ParameterTypeNotes
data requiredstring
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).

ParameterTypeNotes
uuidstringUUID to parse (optional)
version4 | 7 Default 4.
countinteger 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.

ParameterTypeNotes
token requiredstring
secretstringOptional 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.

ParameterTypeNotes
kind"bytes" | "password" | "pin" Default "bytes".
lengthintegerbytes for kind=bytes, characters otherwise Default 32.
encoding"hex" | "base64" | "base64url" | "base58" Default "hex".
symbolsboolean Default true.
countinteger 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.

ParameterTypeNotes
value requirednumber
from requiredstring
to requiredstringTarget 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.

ParameterTypeNotes
timestring Default "now".
fromstringIANA zone used to read a time without an offset Default "UTC".
toarray | stringIANA 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.

ParameterTypeNotes
start requiredstring
endstring Default "now".
tzstring 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.

ParameterTypeNotes
expression requiredstring
tzstring Default "UTC".
countinteger Default 5.
fromstringStart 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.

ParameterTypeNotes
color requiredstring
againststringOptional 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.

ParameterTypeNotes
amountnumber Default 1.
from requiredstring
to requiredstringCurrency 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.

ParameterTypeNotes
versions requiredarray | stringOne or more versions, comma separated
rangestringOptional npm-style range, e.g. ^1.2.0 || >=2.1 <3
compareTostring

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.

ParameterTypeNotes
iban requiredstring

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.

ParameterTypeNotes
ua requiredstring

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