{
  "seller": "Orchard",
  "payTo": "0x80BeCaF989FC8FDCF26429646369aFEb9f1cd8D6",
  "network": "base",
  "currency": "USDC",
  "protocol": "x402 v1 (exact)",
  "facilitator": "https://facilitator.payai.network",
  "feedback": "https://tools.orchardshop.xyz/feedback",
  "tools": [
    {
      "name": "page-to-text",
      "description": "Fetches a public web page and returns its readable text as JSON: url, status, title, char count, and clean text with scripts, styles and tags stripped. Blocks private/localhost addresses.",
      "priceUsd": 0.01,
      "method": "GET",
      "url": "https://tools.orchardshop.xyz/t/page-to-text",
      "howToCall": "GET ?url=https://example.com",
      "exampleInput": {
        "url": "https://example.com"
      },
      "exampleOutput": {
        "url": "https://example.com/",
        "status": 200,
        "title": "Example Domain",
        "chars": 156,
        "text": "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."
      }
    },
    {
      "name": "json-check",
      "description": "Validates a JSON document sent as the raw request body and returns it pretty-printed. Returns valid true/false, the formatted JSON, a count of keys, and byte size. Invalid JSON returns the parser error message.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/json-check",
      "howToCall": "POST / with raw JSON as the body",
      "exampleInput": {
        "_rawBody": "{\"name\":\"Ada\",\"tags\":[\"math\",\"code\"]}"
      },
      "exampleOutput": {
        "valid": true,
        "formatted": "{\n  \"name\": \"Ada\",\n  \"tags\": [\n    \"math\",\n    \"code\"\n  ]\n}",
        "keys": 2,
        "bytes": 37
      }
    },
    {
      "name": "text-stats",
      "description": "Send plain text as the raw POST body and get back word count, sentence count, character count, estimated reading minutes, and the top 10 keywords (stopwords removed).",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/text-stats",
      "howToCall": "POST / with plain text as the body",
      "exampleInput": {
        "_rawBody": "Orchard builds small tools. Agents pay a cent per call."
      },
      "exampleOutput": {
        "words": 10,
        "sentences": 2,
        "chars": 55,
        "reading_minutes": 0,
        "top_keywords": [
          {
            "word": "agents",
            "count": 1
          },
          {
            "word": "builds",
            "count": 1
          },
          {
            "word": "call",
            "count": 1
          },
          {
            "word": "cent",
            "count": 1
          },
          {
            "word": "orchard",
            "count": 1
          }
        ]
      }
    },
    {
      "name": "hash-encode",
      "description": "POST raw text as the body and get back its byte count, sha256, sha1, md5, hex, base64 and base64url encodings. Useful for checksums, IDs and encoding a value mid-task.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/hash-encode",
      "howToCall": "POST / with raw text as the body",
      "exampleInput": {
        "_rawBody": "hello"
      },
      "exampleOutput": {
        "bytes": 5,
        "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
        "sha1": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",
        "md5": "5d41402abc4b2a76b9719d911017c592",
        "hex": "68656c6c6f",
        "base64": "aGVsbG8=",
        "base64url": "aGVsbG8"
      }
    },
    {
      "name": "csv-to-json",
      "description": "POST raw CSV as the body (first row is headers) and get back a JSON array of row objects, plus column names and row count. Handles quoted fields, commas and newlines inside quotes, and escaped quotes.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/csv-to-json",
      "howToCall": "POST / with raw CSV text as the body",
      "exampleInput": {
        "_rawBody": "name,age\nAda,36\nAlan,41"
      },
      "exampleOutput": {
        "rows": 2,
        "columns": [
          "name",
          "age"
        ],
        "data": [
          {
            "name": "Ada",
            "age": "36"
          },
          {
            "name": "Alan",
            "age": "41"
          }
        ]
      }
    },
    {
      "name": "slugify",
      "description": "POST titles as JSON {\"titles\": [...]} or as raw text with one title per line, and get back URL-safe slugs. Strips accents, lowercases, removes apostrophes and collapses other punctuation to single hyphens. Up to 500 titles per call.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/slugify",
      "howToCall": "POST / with JSON {\"titles\": [...]} as the body, or one title per line as raw text",
      "exampleInput": {
        "titles": [
          "Café Déjà Vu!",
          "Hello,   World — it's 2026"
        ]
      },
      "exampleOutput": {
        "count": 2,
        "slugs": [
          {
            "input": "Café Déjà Vu!",
            "slug": "cafe-deja-vu"
          },
          {
            "input": "Hello,   World — it's 2026",
            "slug": "hello-world-its-2026"
          }
        ]
      }
    },
    {
      "name": "json-to-csv",
      "description": "POST a JSON array of flat objects (or {\"rows\":[...]}) and get CSV back. Columns are the union of all keys in order of first appearance. Values are quoted and escaped per RFC 4180. Nested objects are stored as JSON text. Up to 5000 rows per call.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/json-to-csv",
      "howToCall": "POST / with a JSON array of objects, or {\"rows\":[...]}, as the body",
      "exampleInput": {
        "rows": [
          {
            "name": "Ann, B",
            "note": "said \"hi\""
          },
          {
            "name": "Cy",
            "age": 3
          }
        ]
      },
      "exampleOutput": {
        "rows": 2,
        "columns": [
          "name",
          "note",
          "age"
        ],
        "csv": "name,note,age\n\"Ann, B\",\"said \"\"hi\"\"\",\nCy,,3"
      }
    },
    {
      "name": "markdown-strip",
      "description": "POST raw markdown as the request body and get plain text back. Removes headings, emphasis, links (keeps the label), images (keeps the alt text), list markers, blockquotes, HTML tags and code fences (keeps code contents). Useful before summarizing or indexing markdown documents.",
      "priceUsd": 0.01,
      "method": "POST",
      "url": "https://tools.orchardshop.xyz/t/markdown-strip",
      "howToCall": "POST / with raw markdown as the body (text/plain)",
      "exampleInput": {
        "markdown": "# Title\n\nSome **bold** and a [link](http://x.io).\n\n- item one\n- item `code`"
      },
      "exampleOutput": {
        "chars": 47,
        "text": "Title\n\nSome bold and a link.\nitem one\nitem code"
      }
    },
    {
      "name": "page-to-markdown",
      "description": "Fetches any public http(s) page and returns clean Markdown: headings (#), paragraphs, lists, links with absolute URLs, bold/italic, and code blocks. Scripts, styles and nav/footer are removed. Output is capped at the first 50,000 characters, with a truncated flag. Blocks localhost and private addresses. Returns JSON with url, status, title, chars, truncated and markdown.",
      "priceUsd": 0.02,
      "method": "GET",
      "url": "https://tools.orchardshop.xyz/t/page-to-markdown",
      "howToCall": "GET /?url=https://www.iana.org/domains/reserved",
      "exampleInput": {
        "url": "https://www.iana.org/domains/reserved"
      },
      "exampleOutput": {
        "url": "https://www.iana.org/domains/reserved",
        "status": 200,
        "title": "IANA-managed Reserved Domains",
        "chars": 2336,
        "truncated": false,
        "markdown": "# IANA-managed Reserved Domains\n\nCertain domains are set aside, and nominally registered to “IANA”, for specific\npolicy or technical purposes.\n\n## Example domains\n\nAs described in [RFC 2606](https://www.iana.org/go/rfc2606) ..."
      }
    },
    {
      "name": "page-metadata",
      "description": "Fetches any public http(s) page and returns its metadata: title, meta description, canonical URL, favicon URL, all OpenGraph (og:*) properties, and every unique absolute link with its anchor text (up to 500). Blocks localhost and private addresses. Returns JSON with url, final_url, status, title, description, canonical, favicon, og, link_count and links.",
      "priceUsd": 0.01,
      "method": "GET",
      "url": "https://tools.orchardshop.xyz/t/page-metadata",
      "howToCall": "GET /?url=https://www.iana.org/domains/reserved",
      "exampleInput": {
        "url": "https://www.iana.org/domains/reserved"
      },
      "exampleOutput": {
        "url": "https://www.iana.org/domains/reserved",
        "final_url": "https://www.iana.org/domains/reserved",
        "status": 200,
        "title": "IANA-managed Reserved Domains",
        "description": "",
        "canonical": null,
        "favicon": "https://www.iana.org/static/img/bookmark_icon.e14a2530b3e9.ico",
        "og": {},
        "link_count": 45,
        "links": [
          {
            "href": "https://www.iana.org/domains",
            "text": "Domains"
          }
        ]
      }
    },
    {
      "name": "rss-latest",
      "description": "Fetches any public RSS 2.0 or Atom feed and returns its latest items as JSON, newest first in feed order. Each item has title, link, published date, summary (first 500 chars, tags stripped) and guid. Choose how many with ?limit= (1-50, default 10). Blocks localhost and private addresses. Returns JSON with feed_url, format (rss or atom), title, link, count and items.",
      "priceUsd": 0.01,
      "method": "GET",
      "url": "https://tools.orchardshop.xyz/t/rss-latest",
      "howToCall": "GET /?url=https://hnrss.org/newest&limit=5",
      "exampleInput": {
        "url": "https://hnrss.org/newest",
        "limit": 2
      },
      "exampleOutput": {
        "feed_url": "https://hnrss.org/newest",
        "format": "rss",
        "title": "Hacker News: Newest",
        "link": "https://news.ycombinator.com/newest",
        "count": 2,
        "items": [
          {
            "title": "Hacking the meta ray-ban smartglasses",
            "link": "https://p0pcycle.com/2026/11/06/hacking-the-meta-ray-ban-smartglasses/",
            "published": "Sat, 07 Nov 2026 17:19:02 +0000",
            "summary": "Article URL: ...",
            "guid": "https://news.ycombinator.com/item?id=50406224"
          }
        ]
      }
    }
  ]
}