{"x402Version":2,"service":{"name":"toolbelt402","description":"Deterministic utilities for AI agents, paid per call with x402. No account or API key.","url":"https://toolbelt402.tpoborne.workers.dev","openapi":"https://toolbelt402.tpoborne.workers.dev/openapi.json","index":"https://toolbelt402.tpoborne.workers.dev/"},"payment":{"scheme":"exact","network":"eip155:8453","asset":"USDC","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15","note":"Authoritative payment requirements are returned in the PAYMENT-REQUIRED header of each 402 response; the prices here are informational."},"resources":[{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/json/repair","method":"POST","description":"Fix invalid, malformed, or truncated JSON — repairs trailing commas, single quotes, unquoted keys, and cut-off LLM output; returns the parsed object plus corrected JSON text. Deterministic, no LLM."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.005","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"text":"{'a': 1, 'b': [1, 2,], }"}},"output":{"type":"json","example":{"alreadyValid":false,"repaired":true,"data":{"a":1,"b":[1,2]},"repairedText":"{\"a\": 1, \"b\": [1, 2]}"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Possibly-broken JSON as a string"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/json/validate","method":"POST","description":"Validate JSON data against a JSON Schema (draft-07, 2019-09, 2020-12) — returns exact error locations, keywords, and messages for programmatic handling. Deterministic schema validation."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}},"data":{"age":3}}},"output":{"type":"json","example":{"valid":false,"errors":[{"location":"#","keyword":"required","error":"Instance does not have required property \"name\"."}]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["schema","data"],"properties":{"schema":{"type":"object","description":"JSON Schema to validate against"},"data":{"description":"Instance to validate"},"draft":{"type":"string","description":"Optional: 7, 2019-09 or 2020-12 (default)"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/regex/test","method":"POST","description":"Test and debug a regular expression against up to 50 sample strings — real match results, capture groups, named groups, and pass/fail against expectations. Deterministic regex testing."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"pattern":"^(?<user>[\\w.]+)@(?<host>[\\w.]+)$","flags":"","cases":[{"input":"a.b@example.com","expectMatch":true}]}},"output":{"type":"json","example":{"allPassed":true,"results":[{"input":"a.b@example.com","matched":true,"match":"a.b@example.com","namedGroups":{"user":"a.b","host":"example.com"},"passed":true}]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["pattern","cases"],"properties":{"pattern":{"type":"string"},"flags":{"type":"string","description":"Any of g i m s u y v d"},"cases":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"expectMatch":{"type":"boolean"}}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/cron/next","method":"GET","description":"Parse and validate a cron expression — returns the next N run times as ISO timestamps in any IANA timezone. Cron schedule checker."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"expr":"*/15 * * * *","n":"3","tz":"Europe/London"}},"output":{"type":"json","example":{"expr":"*/15 * * * *","timezone":"Europe/London","count":3,"nextRuns":["2026-07-30T09:15:00.000Z","2026-07-30T09:30:00.000Z","2026-07-30T09:45:00.000Z"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","required":["expr"],"properties":{"expr":{"type":"string","description":"Cron expression"},"n":{"type":"string","description":"How many runs (default 5, max 100)"},"tz":{"type":"string","description":"IANA timezone (default UTC)"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/url/preflight","method":"GET","description":"Check a URL before fetching it: is it alive, final URL after redirects, HTTP status, content type, HTML title, and whether robots.txt allows your user-agent. Link checker and fetch preflight for agents."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.005","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"url":"https://example.com/","ua":"my-agent/1.0"}},"output":{"type":"json","example":{"requestedUrl":"https://example.com/","finalUrl":"https://example.com/","alive":true,"status":200,"redirects":[],"contentType":"text/html; charset=UTF-8","title":"Example Domain","robots":{"fetched":true,"allowed":true,"matchedRule":null,"group":"*"},"timingMs":350}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Absolute http(s) URL to check"},"ua":{"type":"string","description":"User-agent to evaluate robots.txt against"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/html/to-markdown","method":"POST","description":"Convert HTML to clean Markdown — turn scraped web pages into LLM-ready text. Handles headings, lists, tables, links, code blocks. Deterministic, no LLM."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.005","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"html":"<h1>Title</h1><p>Some <b>bold</b> text and a <a href=\"https://example.com\">link</a>.</p>"}},"output":{"type":"json","example":{"markdown":"# Title\n\nSome **bold** text and a [link](https://example.com).","inputBytes":89,"outputBytes":58}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["html"],"properties":{"html":{"type":"string","description":"HTML to convert (max 256 KB)"},"options":{"type":"object","properties":{"bulletMarker":{"type":"string","enum":["-","*"]},"linkReferences":{"type":"boolean"}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/text/diff","method":"POST","description":"Compare two texts — unified diff patch plus added/removed/unchanged counts, by lines, words, or characters. Verify edits and detect changes deterministically."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"a":"the quick brown fox\njumps high\n","b":"the quick red fox\njumps high\n","mode":"lines"}},"output":{"type":"json","example":{"mode":"lines","identical":false,"stats":{"added":1,"removed":1,"unchanged":1,"unit":"lines"},"unifiedPatch":"--- a\n+++ b\n@@ -1,2 +1,2 @@\n-the quick brown fox\n+the quick red fox\n jumps high\n"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","description":"Original text (max 128 KB)"},"b":{"type":"string","description":"Changed text (max 128 KB)"},"mode":{"type":"string","enum":["lines","words","chars"],"description":"Diff granularity (default lines)"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/time/math","method":"GET","description":"Date and time arithmetic done right: difference between two datetimes, add or subtract ISO-8601 durations, convert an instant into any IANA timezone with UTC offset and weekday."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"op":"diff","from":"2026-07-30T09:00:00Z","to":"2026-08-02T15:30:00Z"}},"output":{"type":"json","example":{"op":"diff","from":"2026-07-30T09:00:00.000Z","to":"2026-08-02T15:30:00.000Z","milliseconds":282600000,"seconds":282600,"minutes":4710,"hours":78.5,"days":3.270833,"humanized":"3d 6h 30m 0s"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","required":["op"],"properties":{"op":{"type":"string","enum":["diff","add","subtract","convert"],"description":"diff needs from+to; add/subtract need start+duration (ISO-8601, e.g. P1DT2H30M); convert needs time+tz"},"from":{"type":"string"},"to":{"type":"string"},"start":{"type":"string"},"duration":{"type":"string"},"time":{"type":"string"},"tz":{"type":"string","description":"IANA timezone, e.g. Europe/London"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/jwt/decode","method":"POST","description":"Decode a JWT — header, payload, and timing analysis (issued/not-before/expiry as ISO timestamps, expired flag, seconds until expiry). Decode only; signature is NOT verified."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}},"output":{"type":"json","example":{"verified":false,"note":"Decode only — the signature is NOT verified.","header":{"alg":"HS256","typ":"JWT"},"payload":{"sub":"1234567890","name":"John Doe","iat":1516239022},"timing":{"iat":"2018-01-18T01:30:22.000Z","nbf":null,"exp":null,"expired":null,"notYetValid":null,"secondsUntilExpiry":null}}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["token"],"properties":{"token":{"type":"string","description":"JWS compact JWT (max 16 KB). Decode only — signature is NOT verified."}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/validate/checksum","method":"POST","description":"Validate identifiers by checksum: IBAN (mod-97), card numbers (Luhn), EAN-13, ISBN-10/13, UUID (RFC-4122), ULID. Batch up to 100 per call with per-item reasons."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"items":[{"type":"iban","value":"GB82 WEST 1234 5698 7654 32"},{"type":"luhn","value":"4242 4242 4242 4242"},{"type":"uuid","value":"550e8400-e29b-41d4-a716-446655440000"}]}},"output":{"type":"json","example":{"supported":["luhn","iban","ean13","isbn10","isbn13","uuid","ulid"],"results":[{"index":0,"type":"iban","value":"GB82 WEST 1234 5698 7654 32","valid":true,"normalized":"GB82WEST12345698765432"},{"index":1,"type":"luhn","valid":true,"normalized":"4242424242424242"},{"index":2,"type":"uuid","valid":true,"version":4}]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["items"],"properties":{"items":{"type":"array","maxItems":100,"items":{"type":"object","required":["type","value"],"properties":{"type":{"type":"string","enum":["iban","luhn","ean13","isbn10","isbn13","uuid","ulid"]},"value":{"type":"string","maxLength":256}}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/csv/to-json","method":"POST","description":"Parse CSV into JSON rows — auto-detects the delimiter, handles quoted fields and headers, optional type coercion. Returns columns, row count, and per-row parse errors."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.003","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"csv":"name,age\nAda,36\nGrace,45\n","options":{"typed":true}}},"output":{"type":"json","example":{"rowCount":2,"truncated":false,"columns":["name","age"],"delimiter":",","rows":[{"name":"Ada","age":36},{"name":"Grace","age":45}],"errors":[]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["csv"],"properties":{"csv":{"type":"string","description":"CSV text (max 256 KB); delimiter auto-detected"},"options":{"type":"object","properties":{"headers":{"type":"boolean","description":"first row is headers (default true)"},"delimiter":{"type":"string"},"typed":{"type":"boolean","description":"coerce numbers/booleans"}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/json/to-csv","method":"POST","description":"Convert an array of JSON objects into CSV — column union across rows or explicit column order; nested values are JSON-stringified into cells."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"rows":[{"name":"Ada","age":36},{"name":"Grace","age":45,"city":"NYC"}]}},"output":{"type":"json","example":{"csv":"name,age,city\nAda,36,\nGrace,45,NYC","columns":["name","age","city"],"rowCount":2}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["rows"],"properties":{"rows":{"type":"array","maxItems":5000,"items":{"type":"object"},"description":"Array of objects; column union across rows"},"options":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"},"description":"Explicit column order"}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/json/query","method":"POST","description":"Query JSON with a JMESPath expression — extract, filter, project, and reshape nested data with the AWS-standard query language. Deterministic JSON extraction."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.003","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"data":{"users":[{"name":"Ada","active":true},{"name":"Bob","active":false}]},"query":"users[?active].name"}},"output":{"type":"json","example":{"query":"users[?active].name","result":["Ada"]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["data","query"],"properties":{"data":{"description":"Any JSON document"},"query":{"type":"string","description":"JMESPath expression"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/json/diff","method":"POST","description":"Structural diff of two JSON documents — add/remove/change operations with JSON-Pointer paths, before/after values, and an identical flag. Compare API responses and configs."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.003","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"a":{"name":"Ada","age":36},"b":{"name":"Ada","age":37,"city":"London"}}},"output":{"type":"json","example":{"identical":false,"opCount":2,"truncated":false,"ops":[{"path":"/age","op":"change","before":36,"after":37},{"path":"/city","op":"add","after":"London"}],"note":"arrays are compared positionally; paths use JSON-Pointer escaping"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["a","b"],"properties":{"a":{"description":"Original JSON document"},"b":{"description":"Changed JSON document"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/xml/to-json","method":"POST","description":"Parse XML into JSON — validates first with line-numbered errors, preserves attributes, optional type coercion. Works for RSS feeds, sitemaps, and SOAP-ish payloads."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.003","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"xml":"<rss><channel><title>Feed</title><item id=\"1\">Hello</item></channel></rss>"}},"output":{"type":"json","example":{"json":{"rss":{"channel":{"title":"Feed","item":{"#text":"Hello","@_id":1}}}}}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["xml"],"properties":{"xml":{"type":"string","description":"XML text (max 256 KB); validated before parsing"},"options":{"type":"object","properties":{"attributes":{"type":"boolean","description":"keep attributes as @_ keys (default true)"},"typed":{"type":"boolean","description":"coerce numeric tag values (default true)"}}}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/markdown/to-html","method":"POST","description":"Render Markdown to HTML — CommonMark with autolinking; raw HTML in the input is escaped, not executed. The inverse of /html/to-markdown."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.003","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"markdown":"# Title\n\nSome **bold** text and a [link](https://example.com)."}},"output":{"type":"json","example":{"html":"<h1>Title</h1>\n<p>Some <strong>bold</strong> text and a <a href=\"https://example.com\">link</a>.</p>\n","note":"raw HTML in the input is escaped (not executed); sanitize downstream if rendering untrusted content","inputBytes":58,"outputBytes":94}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string","description":"CommonMark text (max 256 KB); raw HTML is escaped, not executed"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/hash","method":"POST","description":"Hash a string or bytes with multiple algorithms in one call: SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, and keccak-256 (Ethereum). Input as UTF-8, base64, or hex; hex digests out."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.002","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"input":"hello world","algorithms":["sha-256","keccak-256"]}},"output":{"type":"json","example":{"inputBytes":11,"digests":{"sha-256":"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9","keccak-256":"47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"}}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["input"],"properties":{"input":{"type":"string"},"algorithms":{"type":"array","items":{"type":"string","enum":["sha-1","sha-256","sha-384","sha-512","sha3-256","keccak-256"]},"description":"default [\"sha-256\"]"},"inputEncoding":{"type":"string","enum":["utf8","base64","hex"],"description":"how to read input bytes (default utf8)"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/encode","method":"POST","description":"Encode or decode text: base64, base64url (padding handled), hex, URL percent-encoding, and HTML entities. The conversions agents most often get wrong."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"op":"decode","format":"base64url","input":"aGVsbG8gd29ybGQ"}},"output":{"type":"json","example":{"output":"hello world"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","required":["op","format","input"],"properties":{"op":{"type":"string","enum":["encode","decode"]},"format":{"type":"string","enum":["base64","base64url","hex","url","html"]},"input":{"type":"string"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/url/parse","method":"GET","description":"Parse a URL into parts — host, path, query params as JSON, fragment, origin — or resolve a relative reference against a base URL correctly."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"url":"https://user@example.com:8443/a/b?x=1&y=2&y=3#frag"}},"output":{"type":"json","example":{"mode":"parse","href":"https://user@example.com:8443/a/b?x=1&y=2&y=3#frag","protocol":"https","host":"example.com:8443","hostname":"example.com","port":"8443","path":"/a/b","query":{"x":"1","y":["2","3"]},"fragment":"frag","origin":"https://example.com:8443","credentialsPresent":true}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL to parse"},"base":{"type":"string","description":"Resolve mode: base URL"},"ref":{"type":"string","description":"Resolve mode: relative reference to resolve against base"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/cron/describe","method":"GET","description":"Translate a cron expression into plain English (e.g. \"Every 15 minutes, weekdays\") — the companion to /cron/next."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"expr":"*/15 9-17 * * 1-5"}},"output":{"type":"json","example":{"expr":"*/15 9-17 * * 1-5","description":"Every 15 minutes, between 09:00 and 17:59, Monday through Friday"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","required":["expr"],"properties":{"expr":{"type":"string","description":"Cron expression to translate to plain English"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/web/extract","method":"POST","description":"Read a web page for me: fetches up to 5 URLs and returns the main article content as clean Markdown (nav, ads, and footers stripped) plus title, author, published date, canonical URL, links, images, word count and reading time. Typically 15-30x smaller than the raw HTML, so it saves far more in context tokens than it costs. Honors robots.txt by default. No browser or network access needed on your side."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.02","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","bodyType":"json","body":{"urls":["https://example.com/article"],"format":"markdown"}},"output":{"type":"json","example":{"requested":1,"succeeded":1,"failed":0,"robotsRespected":true,"results":[{"url":"https://example.com/article","finalUrl":"https://example.com/article","ok":true,"status":200,"format":"markdown","metadata":{"title":"How Widgets Work","description":"A deep dive into widgets.","siteName":"Example","author":"Ada Lovelace","publishedAt":"2026-07-01T09:00:00Z","modifiedAt":null,"lang":"en","canonicalUrl":"https://example.com/article","image":"https://example.com/hero.jpg","schemaType":"NewsArticle"},"content":"# How Widgets Work\n\nWidgets are small components that…","stats":{"htmlBytes":184320,"contentChars":7412,"compressionRatio":24.9,"wordCount":1183,"readingTimeMinutes":5,"truncated":false,"extraction":"scored:article","linkDensity":0.06},"links":[{"url":"https://example.com/widgets/spec","text":"the widget spec"}],"images":[{"url":"https://example.com/hero.jpg","alt":"A widget"}],"timingMs":512}]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST","PUT","PATCH"]},"bodyType":{"type":"string","enum":["json","form-data","text"]},"body":{"type":"object","properties":{"url":{"type":"string","description":"Single URL to extract (or use urls)"},"urls":{"type":"array","maxItems":5,"items":{"type":"string"},"description":"Up to 5 absolute http(s) URLs"},"format":{"type":"string","enum":["markdown","text"],"description":"Output format (default markdown)"},"respectRobots":{"type":"boolean","description":"Honor robots.txt for the given user-agent (default true)"},"userAgent":{"type":"string","description":"User-agent to send and to evaluate robots.txt against"},"includeLinks":{"type":"boolean","description":"Include links found in the article body (default true)"},"includeImages":{"type":"boolean","description":"Include images found in the article body (default true)"},"maxBytes":{"type":"integer","description":"Cap HTML read per page (default 524288)"}}}},"required":["type","method","bodyType","body"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}},{"resource":{"url":"https://toolbelt402.tpoborne.workers.dev/ping","method":"GET","description":"Test your x402 client end to end at the minimum possible price. Returns a pong with the payer address the server actually saw, your echoed nonce, and server time — the safest way to verify wallet, payment signing, settlement and retry all work before you point your agent at anything expensive. Deterministic, idempotent, no side effects, no rate limit, no signup."},"accepts":[{"scheme":"exact","network":"eip155:8453","price":"$0.001","payTo":"0x06b40bf8Dfdc45049ea7f600c84301E227a2Ca15"}],"extensions":{"bazaar":{"info":{"input":{"type":"http","queryParams":{"nonce":"my-test-123"}},"output":{"type":"json","example":{"pong":true,"paymentVerified":true,"payer":"0xAC02f881881135a24Ec83808897Ec9a69918D2BD","nonce":"my-test-123","price":"$0.001","network":"eip155:8453","serverTime":"2026-07-30T14:05:00.000Z","note":"Your x402 client works: it read the 402, signed a payment, and retried successfully."}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["GET","HEAD","DELETE"]},"queryParams":{"type":"object","properties":{"nonce":{"type":"string","description":"Optional value echoed back so you can correlate the response with your request"}}}},"required":["type","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}}]}