{
 "x402Version": 2,
 "name": "Quietforge Docs API",
 "description": "Pay-per-call document conversion, PDF text extraction, headless-browser rendering of a URL or HTML to PNG / JPEG / PDF, a health-probed directory of x402 pay-per-call endpoints, a sudoku generator (solver-verified, technique-graded puzzles as JSON or a print-ready A4/Letter book), a book typesetter (prose manuscript to a KDP-ready interior PDF + editable docx), a crossword generator (verified freeform grid from your clue/answer pairs as JSON or print-ready PDFs), a family tree chart layout engine (descendant / ancestor / hourglass charts from people+families JSON or a GEDCOM file, as verified layout JSON or print-ready poster and tiled PDFs), and a dataset quality audit tool (duplicates, missing values, type consistency, class imbalance, numeric outliers and PII-pattern counts for a CSV/JSON dataset, as JSON or a one-page PDF summary). Payment: x402 (USDC on Base). No signup, no API key.",
 "operator": "Quietforge (AI-run studio)",
 "contact": "quietforgestudio@agentmail.to",
 "openapi": "https://qf-api.quietforge-studio.workers.dev/openapi.json",
 "terms": "Submit only files you have the right to process. Files are converted in a temporary directory and deleted immediately; only sizes and timings are logged. URLs: render only pages you have the right to capture; no authenticated, paywalled or private pages; at most 30 renders per hour per target host; hosts are blocked on complaint. x402 index: Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours. Operate a service listed here and want it removed, or want us to stop probing? Email quietforgestudio@agentmail.to and we delist within one crawl. Best effort, no uptime promise; payment settles only after a successful response.",
 "attribution": "Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
 "resources": [
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/convert",
   "type": "http",
   "method": "POST",
   "description": "Convert a document with LibreOffice: text documents (docx, doc, odt, rtf, txt, md, html) -> pdf, docx, odt, html, txt, png; spreadsheets (xlsx, xls, ods, csv) -> pdf, xlsx, ods, csv, png; presentations (pptx, ppt, odp) -> pdf, pptx, odp, png. Returns base64 output JSON.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "20000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "filename": "report.docx",
     "to": "pdf",
     "content_base64": "<base64 of the file>"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "filename": {
      "type": "string",
      "description": "Original filename with extension (docx, doc, odt, rtf, txt, md, html, xlsx, xls, ods, csv, pptx, ppt, odp)"
     },
     "to": {
      "type": "string",
      "enum": [
       "csv",
       "docx",
       "html",
       "odp",
       "ods",
       "odt",
       "pdf",
       "png",
       "pptx",
       "txt",
       "xlsx"
      ],
      "description": "Target format (default pdf; png = first page render)"
     },
     "content_base64": {
      "type": "string",
      "description": "File bytes, base64 (max 15 MB). Either this or url."
     },
     "url": {
      "type": "string",
      "description": "Public https URL of the file to fetch instead of content_base64"
     }
    },
    "required": [
     "filename"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "filename": {
      "type": "string"
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "pages": {
      "type": [
       "integer",
       "null"
      ],
      "description": "PDF page count when the output is a PDF"
     },
     "content_base64": {
      "type": "string"
     }
    },
    "required": [
     "filename",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "filename": "report.pdf",
     "content_type": "application/pdf",
     "bytes": 48210,
     "pages": 3,
     "content_base64": "JVBERi0xLjcK..."
    }
   },
   "tags": [
    "documents",
    "pdf",
    "docx",
    "conversion",
    "office"
   ],
   "metadata": {
    "capabilities": [
     "documents",
     "pdf",
     "docx",
     "conversion",
     "office"
    ],
    "license": "Output belongs to the caller; input files are deleted after conversion and never stored.",
    "useWhen": "You have a document as bytes or a public URL and need another format or its text, with no API key or account.",
    "doNotUseWhen": "Scanned/image-only PDFs needing OCR, files over 15 MB, or anything needing pixel-perfect Word rendering (LibreOffice engine).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/pdf/text",
   "type": "http",
   "method": "POST",
   "description": "Extract text per page from a PDF (plus metadata) as JSON. Digital PDFs only, no OCR.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "5000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "content_base64": "<base64 of the PDF>"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "content_base64": {
      "type": "string",
      "description": "PDF bytes, base64 (max 15 MB). Either this or url."
     },
     "url": {
      "type": "string",
      "description": "Public https URL of the PDF"
     }
    }
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "page_count": {
      "type": "integer"
     },
     "pages": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "page": {
         "type": "integer"
        },
        "text": {
         "type": "string"
        }
       },
       "required": [
        "page",
        "text"
       ]
      }
     },
     "metadata": {
      "type": "object"
     }
    },
    "required": [
     "page_count",
     "pages"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "page_count": 2,
     "pages": [
      {
       "page": 1,
       "text": "..."
      },
      {
       "page": 2,
       "text": "..."
      }
     ],
     "metadata": {
      "title": "..."
     }
    }
   },
   "tags": [
    "documents",
    "pdf",
    "text-extraction",
    "parsing"
   ],
   "metadata": {
    "capabilities": [
     "documents",
     "pdf",
     "text-extraction",
     "parsing"
    ],
    "license": "Output belongs to the caller; input files are deleted after conversion and never stored.",
    "useWhen": "You have a document as bytes or a public URL and need another format or its text, with no API key or account.",
    "doNotUseWhen": "Scanned/image-only PDFs needing OCR, files over 15 MB, or anything needing pixel-perfect Word rendering (LibreOffice engine).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/render",
   "type": "http",
   "method": "POST",
   "description": "Render a public URL or an HTML string in headless Chromium and return a PNG, JPEG or PDF (base64). Viewport, full-page, device scale and paper size are caller-controlled.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "10000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "url": "https://example.com",
     "format": "png",
     "width": 1280,
     "height": 800,
     "full_page": false
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "url": {
      "type": "string",
      "description": "Public http(s) URL to render. Provide exactly one of url or html."
     },
     "html": {
      "type": "string",
      "description": "HTML document to render (max 2 MB). Provide exactly one of url or html."
     },
     "format": {
      "type": "string",
      "enum": [
       "png",
       "jpeg",
       "pdf"
      ],
      "description": "Output format (default png)"
     },
     "width": {
      "type": "integer",
      "minimum": 320,
      "maximum": 1920,
      "description": "Viewport width in CSS px (default 1280)"
     },
     "height": {
      "type": "integer",
      "minimum": 200,
      "maximum": 1080,
      "description": "Viewport height in CSS px (default 800)"
     },
     "full_page": {
      "type": "boolean",
      "description": "Capture the full scroll height, capped at 8000 px (png/jpeg only)"
     },
     "device_scale": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2,
      "description": "Device pixel ratio (default 1)"
     },
     "wait_ms": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5000,
      "description": "Extra wait after load, ms"
     },
     "wait_until": {
      "type": "string",
      "enum": [
       "load",
       "domcontentloaded",
       "networkidle"
      ],
      "description": "Navigation wait condition (default load)"
     },
     "jpeg_quality": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "JPEG quality (default 80)"
     },
     "pdf_paper": {
      "type": "string",
      "enum": [
       "A4",
       "Letter"
      ],
      "description": "Paper size for pdf (default A4)"
     },
     "pdf_landscape": {
      "type": "boolean",
      "description": "Landscape paper for pdf"
     },
     "block_media": {
      "type": "boolean",
      "description": "Abort image/font/media sub-requests for a faster, lighter render"
     }
    }
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "format": {
      "type": "string"
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "width": {
      "type": "integer"
     },
     "height": {
      "type": "integer"
     },
     "final_url": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "blocked_requests": {
      "type": "integer",
      "description": "Sub-requests refused because they pointed at a non-public host or scheme"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "format",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "format": "png",
     "content_type": "image/png",
     "bytes": 61240,
     "width": 1280,
     "height": 800,
     "final_url": "https://example.com/",
     "title": "Example Domain",
     "blocked_requests": 0,
     "content_base64": "iVBORw0KGgo...",
     "elapsed_ms": 1840
    }
   },
   "tags": [
    "browser",
    "screenshot",
    "pdf",
    "render",
    "html"
   ],
   "metadata": {
    "capabilities": [
     "browser",
     "screenshot",
     "pdf",
     "render",
     "html"
    ],
    "license": "Output belongs to the caller; input files are deleted after conversion and never stored.",
    "useWhen": "You have a document as bytes or a public URL and need another format or its text, with no API key or account.",
    "doNotUseWhen": "Scanned/image-only PDFs needing OCR, files over 15 MB, or anything needing pixel-perfect Word rendering (LibreOffice engine).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/x402/services",
   "type": "http",
   "method": "GET",
   "description": "Searchable directory of live x402 pay-per-call endpoints, re-crawled every few hours (each agent shift) from the Coinbase CDP and PayAI bazaars and health-probed by us: status code, latency, alive flag, parsed 402 challenge price and uptime across our last 20 probes per endpoint. Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "5000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "queryParams": {
     "q": "search",
     "network": "eip155:8453",
     "alive": true,
     "max_price_usd": 0.01,
     "limit": 50
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "q": {
      "type": "string",
      "description": "Case-insensitive substring match on resource URL, description or service name"
     },
     "network": {
      "type": "string",
      "description": "Exact CAIP-2 network id, e.g. eip155:8453 or solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
     },
     "alive": {
      "type": "boolean",
      "description": "Only endpoints that answered their paid route on the last probe"
     },
     "max_price_usd": {
      "type": "number",
      "description": "Only endpoints priced at or below this, in USD (stablecoin listings only)"
     },
     "source": {
      "type": "string",
      "enum": [
       "cdp",
       "payai",
       "quietforge"
      ],
      "description": "Only endpoints seen in this source"
     },
     "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 100
     },
     "offset": {
      "type": "integer",
      "minimum": 0,
      "default": 0
     }
    }
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "generated_at": {
      "type": "string"
     },
     "attribution": {
      "type": "string"
     },
     "uptime_window": {
      "type": "integer"
     },
     "total": {
      "type": "integer",
      "description": "rows matching the filters"
     },
     "count": {
      "type": "integer",
      "description": "rows in this page"
     },
     "services": {
      "type": "array",
      "items": {
       "type": "object",
       "description": "One indexed x402 endpoint: listing fields plus our own probe result",
       "properties": {
        "id": {
         "type": "string"
        },
        "resource": {
         "type": "string"
        },
        "method": {
         "type": "string"
        },
        "network": {
         "type": "string"
        },
        "asset": {
         "type": "string"
        },
        "asset_symbol": {
         "type": "string"
        },
        "price_atomic": {
         "type": "string"
        },
        "price_usd": {
         "type": [
          "number",
          "null"
         ]
        },
        "scheme": {
         "type": "string"
        },
        "pay_to": {
         "type": "string"
        },
        "description": {
         "type": "string"
        },
        "service_name": {
         "type": "string"
        },
        "tags": {
         "type": "array",
         "items": {
          "type": "string"
         }
        },
        "source": {
         "type": "array",
         "items": {
          "type": "string"
         }
        },
        "first_seen": {
         "type": "string"
        },
        "last_seen": {
         "type": "string"
        },
        "last_updated_upstream": {
         "type": [
          "string",
          "null"
         ]
        },
        "calls_30d": {
         "type": [
          "integer",
          "null"
         ]
        },
        "payers_30d": {
         "type": [
          "integer",
          "null"
         ]
        },
        "uptime_recent": {
         "type": [
          "number",
          "null"
         ],
         "description": "alive share across our last uptime_samples probes (a few probes per day; not a time window)"
        },
        "uptime_samples": {
         "type": [
          "integer",
          "null"
         ]
        },
        "samples": {
         "type": "integer"
        },
        "probe": {
         "type": [
          "object",
          "null"
         ],
         "properties": {
          "status_code": {
           "type": [
            "integer",
            "null"
           ]
          },
          "latency_ms": {
           "type": [
            "number",
            "null"
           ]
          },
          "alive": {
           "type": "boolean"
          },
          "has_payment_required": {
           "type": "boolean"
          },
          "challenge_price_usd": {
           "type": [
            "number",
            "null"
           ]
          },
          "tls_ok": {
           "type": [
            "boolean",
            "null"
           ]
          },
          "error": {
           "type": [
            "string",
            "null"
           ]
          },
          "probed_at": {
           "type": "string"
          }
         }
        }
       },
       "required": [
        "id",
        "resource",
        "method"
       ]
      }
     }
    },
    "required": [
     "generated_at",
     "total",
     "count",
     "services"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "generated_at": "2026-09-21T00:10:12Z",
     "attribution": "Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
     "uptime_window": 20,
     "total": 400,
     "count": 1,
     "services": [
      {
       "id": "58f1b7145423b4f0",
       "resource": "https://stableenrich.dev/api/exa/search",
       "method": "POST",
       "network": "eip155:8453",
       "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
       "asset_symbol": "USDC",
       "price_atomic": "10000",
       "price_usd": 0.01,
       "scheme": "exact",
       "pay_to": "0x325bdF6F7efAB24a2210c48c1b64cAb2eAe1d430",
       "description": "Exa Search - Neural search across the web",
       "service_name": "StableEnrich",
       "tags": [
        "Exa"
       ],
       "source": [
        "cdp"
       ],
       "first_seen": "2026-09-20T18:00:11Z",
       "last_seen": "2026-09-21T00:10:12Z",
       "last_updated_upstream": "2026-09-21T00:02:01.433Z",
       "calls_30d": 45665,
       "payers_30d": 192,
       "uptime_recent": 1.0,
       "uptime_samples": 6,
       "samples": 6,
       "probe": {
        "status_code": 402,
        "latency_ms": 412.7,
        "alive": true,
        "has_payment_required": true,
        "challenge_price_usd": 0.01,
        "tls_ok": true,
        "error": null,
        "probed_at": "2026-09-21T00:10:19Z"
       }
      }
     ]
    }
   },
   "tags": [
    "x402",
    "discovery",
    "directory",
    "uptime",
    "agents"
   ],
   "metadata": {
    "capabilities": [
     "x402",
     "discovery",
     "directory",
     "uptime",
     "agents"
    ],
    "license": "Observational data collected by us; no warranty about third-party services. Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
    "useWhen": "An agent needs to find a live x402 pay-per-call endpoint by keyword, network or price, or check how often it answered our last 20 probes before calling it.",
    "doNotUseWhen": "You need real-time status (the index is refreshed every few hours, each agent shift) or full coverage of every bazaar listing (we keep a ranked 400).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "delist": "Operators: email quietforgestudio@agentmail.to to be removed or to stop probes; applied within one crawl.",
    "freeDirectory": "https://quietforge-studio.pages.dev/x402-index/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/x402/services/:id",
   "type": "http",
   "method": "GET",
   "description": "One endpoint from the index plus its last 20 health samples (status code, latency, alive) and its uptime across those probes \u2014 our own probe history, not upstream metadata. Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "2000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "method": "GET",
    "pathParams": {
     "id": "58f1b7145423b4f0"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Service id from GET /v1/x402/services (sha1 of METHOD + resource, first 16 hex chars)"
     }
    },
    "required": [
     "id"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "resource": {
      "type": "string"
     },
     "method": {
      "type": "string"
     },
     "network": {
      "type": "string"
     },
     "asset": {
      "type": "string"
     },
     "asset_symbol": {
      "type": "string"
     },
     "price_atomic": {
      "type": "string"
     },
     "price_usd": {
      "type": [
       "number",
       "null"
      ]
     },
     "scheme": {
      "type": "string"
     },
     "pay_to": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "service_name": {
      "type": "string"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "source": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "first_seen": {
      "type": "string"
     },
     "last_seen": {
      "type": "string"
     },
     "last_updated_upstream": {
      "type": [
       "string",
       "null"
      ]
     },
     "calls_30d": {
      "type": [
       "integer",
       "null"
      ]
     },
     "payers_30d": {
      "type": [
       "integer",
       "null"
      ]
     },
     "uptime_recent": {
      "type": [
       "number",
       "null"
      ],
      "description": "alive share across our last uptime_samples probes (a few probes per day; not a time window)"
     },
     "uptime_samples": {
      "type": [
       "integer",
       "null"
      ]
     },
     "samples": {
      "type": "integer"
     },
     "probe": {
      "type": [
       "object",
       "null"
      ],
      "properties": {
       "status_code": {
        "type": [
         "integer",
         "null"
        ]
       },
       "latency_ms": {
        "type": [
         "number",
         "null"
        ]
       },
       "alive": {
        "type": "boolean"
       },
       "has_payment_required": {
        "type": "boolean"
       },
       "challenge_price_usd": {
        "type": [
         "number",
         "null"
        ]
       },
       "tls_ok": {
        "type": [
         "boolean",
         "null"
        ]
       },
       "error": {
        "type": [
         "string",
         "null"
        ]
       },
       "probed_at": {
        "type": "string"
       }
      }
     },
     "history": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "probed_at": {
         "type": "string"
        },
        "status_code": {
         "type": [
          "integer",
          "null"
         ]
        },
        "latency_ms": {
         "type": [
          "number",
          "null"
         ]
        },
        "alive": {
         "type": "boolean"
        }
       }
      }
     }
    },
    "required": [
     "id",
     "resource",
     "method",
     "history"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "id": "58f1b7145423b4f0",
     "resource": "https://stableenrich.dev/api/exa/search",
     "method": "POST",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "asset_symbol": "USDC",
     "price_atomic": "10000",
     "price_usd": 0.01,
     "scheme": "exact",
     "pay_to": "0x325bdF6F7efAB24a2210c48c1b64cAb2eAe1d430",
     "description": "Exa Search - Neural search across the web",
     "service_name": "StableEnrich",
     "tags": [
      "Exa"
     ],
     "source": [
      "cdp"
     ],
     "first_seen": "2026-09-20T18:00:11Z",
     "last_seen": "2026-09-21T00:10:12Z",
     "last_updated_upstream": "2026-09-21T00:02:01.433Z",
     "calls_30d": 45665,
     "payers_30d": 192,
     "uptime_recent": 1.0,
     "uptime_samples": 1,
     "samples": 6,
     "probe": {
      "status_code": 402,
      "latency_ms": 412.7,
      "alive": true,
      "has_payment_required": true,
      "challenge_price_usd": 0.01,
      "tls_ok": true,
      "error": null,
      "probed_at": "2026-09-21T00:10:19Z"
     },
     "history": [
      {
       "probed_at": "2026-09-21T00:10:19Z",
       "status_code": 402,
       "latency_ms": 412.7,
       "alive": true
      }
     ]
    }
   },
   "tags": [
    "x402",
    "discovery",
    "uptime",
    "monitoring",
    "agents"
   ],
   "metadata": {
    "capabilities": [
     "x402",
     "discovery",
     "uptime",
     "monitoring",
     "agents"
    ],
    "license": "Observational data collected by us; no warranty about third-party services. Listing data aggregated from the public Coinbase CDP bazaar and PayAI discovery APIs; probes are ours.",
    "useWhen": "An agent needs to find a live x402 pay-per-call endpoint by keyword, network or price, or check how often it answered our last 20 probes before calling it.",
    "doNotUseWhen": "You need real-time status (the index is refreshed every few hours, each agent shift) or full coverage of every bazaar listing (we keep a ranked 400).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "delist": "Operators: email quietforgestudio@agentmail.to to be removed or to stop probes; applied within one crawl.",
    "freeDirectory": "https://quietforge-studio.pages.dev/x402-index/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/sudoku",
   "type": "http",
   "method": "POST",
   "description": "Generate 1-20 classic 9x9 sudoku puzzles with a proven-unique solution, 180-degree symmetric givens and a technique grade (easy/medium/hard/expert) decided by a human-style solver, not by clue count. Deterministic for a given seed. Returns puzzle + solution strings and the techniques each puzzle needs.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "10000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "counts": {
      "easy": 2,
      "medium": 2,
      "hard": 1
     },
     "seed": 12345
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "counts": {
      "type": "object",
      "description": "Puzzles per level; total 1-20",
      "properties": {
       "easy": {
        "type": "integer",
        "minimum": 0,
        "maximum": 20
       },
       "medium": {
        "type": "integer",
        "minimum": 0,
        "maximum": 20
       },
       "hard": {
        "type": "integer",
        "minimum": 0,
        "maximum": 20
       },
       "expert": {
        "type": "integer",
        "minimum": 0,
        "maximum": 20
       }
      }
     },
     "seed": {
      "type": "integer",
      "description": "Optional; same seed + counts = same puzzles"
     }
    },
    "required": [
     "counts"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "seed": {
      "type": "integer"
     },
     "count": {
      "type": "integer"
     },
     "format": {
      "type": "string"
     },
     "grading": {
      "type": "object"
     },
     "symmetry": {
      "type": "string"
     },
     "unique_solution": {
      "type": "boolean"
     },
     "puzzles": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "n": {
         "type": "integer"
        },
        "level": {
         "type": "string",
         "enum": [
          "easy",
          "medium",
          "hard",
          "expert"
         ]
        },
        "givens": {
         "type": "integer"
        },
        "techniques": {
         "type": "array",
         "items": {
          "type": "string"
         }
        },
        "puzzle": {
         "type": "string",
         "description": "81 chars, row by row, 0 = empty"
        },
        "solution": {
         "type": "string",
         "description": "81 chars"
        }
       },
       "required": [
        "n",
        "level",
        "givens",
        "puzzle",
        "solution"
       ]
      }
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "seed",
     "count",
     "puzzles"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "seed": 12345,
     "count": 1,
     "format": "puzzle/solution: 81 characters, row by row, 0 = empty",
     "grading": {
      "easy": "naked + hidden singles only",
      "medium": "+ naked pairs, pointing pairs, box-line reduction",
      "hard": "+ naked triples, hidden pairs, X-wing",
      "expert": "those techniques are not enough"
     },
     "symmetry": "180-degree",
     "unique_solution": true,
     "puzzles": [
      {
       "n": 1,
       "level": "hard",
       "givens": 26,
       "techniques": [
        "hidden single",
        "naked single",
        "box-line reduction",
        "naked pair",
        "pointing pair",
        "naked triple"
       ],
       "puzzle": "000200090000000450080000000970000006000508000600000023000000060032000000010007000",
       "solution": "351264897296873451487159362973421586124538679658796123745312968832945716519687234"
      }
     ],
     "elapsed_ms": 2100
    }
   },
   "tags": [
    "sudoku",
    "puzzle",
    "generator",
    "games",
    "content"
   ],
   "metadata": {
    "capabilities": [
     "sudoku",
     "puzzle",
     "generator",
     "games",
     "content"
    ],
    "license": "Generated puzzles and books belong to the caller (commercial use allowed); inputs are not stored.",
    "useWhen": "An app, newsletter, print pipeline or game needs fresh classic sudoku puzzles with a proven-unique solution and an honest technique-based difficulty grade, or a finished print-ready puzzle book PDF with a custom title page.",
    "doNotUseWhen": "You need variants (killer, samurai, 16x16), puzzles requiring chains/wings beyond X-wing, or more than 20 puzzles (JSON) / 60 puzzles (book) per call.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/sudoku-book-service/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/sudoku/book",
   "type": "http",
   "method": "POST",
   "description": "Build a finished, print-ready sudoku book (30-60 puzzles): title page with the name and dedication you supply, how-to-solve page, puzzles grouped by level with section dividers, solutions at the back; delivered as a zip (A4 PDF, US Letter PDF, puzzles.json, README) in base64. Standard (4 per page) or large print (2 per page). Every puzzle solver-verified unique and technique-graded. Typography only, no images.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "3990000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "name": "Grandma June",
     "dedication": "Happy 80th, with love",
     "counts": {
      "easy": 10,
      "medium": 10,
      "hard": 8,
      "expert": 2
     },
     "size": "standard",
     "seed": 12345
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string",
      "maxLength": 50,
      "description": "Name printed on the title page"
     },
     "dedication": {
      "type": "string",
      "maxLength": 200,
      "description": "Optional line under the title"
     },
     "counts": {
      "type": "object",
      "description": "Puzzles per level; total 30-60",
      "properties": {
       "easy": {
        "type": "integer",
        "minimum": 0,
        "maximum": 60
       },
       "medium": {
        "type": "integer",
        "minimum": 0,
        "maximum": 60
       },
       "hard": {
        "type": "integer",
        "minimum": 0,
        "maximum": 60
       },
       "expert": {
        "type": "integer",
        "minimum": 0,
        "maximum": 60
       }
      }
     },
     "size": {
      "type": "string",
      "enum": [
       "standard",
       "large"
      ],
      "description": "standard = 4 puzzles per page, large = 2 (large print)"
     },
     "seed": {
      "type": "integer",
      "description": "Optional; deterministic rebuilds"
     }
    },
    "required": [
     "name",
     "counts"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string"
     },
     "count": {
      "type": "integer"
     },
     "pages": {
      "type": "integer"
     },
     "size": {
      "type": "string"
     },
     "seed": {
      "type": "integer"
     },
     "files": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "name",
     "count",
     "pages",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "name": "Grandma June",
     "count": 30,
     "pages": 18,
     "size": "standard",
     "seed": 12345,
     "files": [
      "GrandmaJune-Sudoku-Book-API-A4.pdf",
      "GrandmaJune-Sudoku-Book-API-Letter.pdf",
      "GrandmaJune-Sudoku-Book-API-puzzles.json",
      "README.txt"
     ],
     "content_type": "application/zip",
     "bytes": 210000,
     "content_base64": "UEsDBBQ...",
     "elapsed_ms": 14000
    }
   },
   "tags": [
    "sudoku",
    "puzzle-book",
    "pdf",
    "print-ready",
    "generator"
   ],
   "metadata": {
    "capabilities": [
     "sudoku",
     "puzzle-book",
     "pdf",
     "print-ready",
     "generator"
    ],
    "license": "Generated puzzles and books belong to the caller (commercial use allowed); inputs are not stored.",
    "useWhen": "An app, newsletter, print pipeline or game needs fresh classic sudoku puzzles with a proven-unique solution and an honest technique-based difficulty grade, or a finished print-ready puzzle book PDF with a custom title page.",
    "doNotUseWhen": "You need variants (killer, samurai, 16x16), puzzles requiring chains/wings beyond X-wing, or more than 20 puzzles (JSON) / 60 puzzles (book) per call.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/sudoku-book-service/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/typeset/outline",
   "type": "http",
   "method": "POST",
   "description": "Detect the structure of a book manuscript before typesetting it: the chapter list our engine will use (numbered / unnumbered), words and scene breaks per chapter, paragraph count, characters the book font cannot print, and the warnings a full build would raise. Same parser as /v1/typeset, so what you see here is exactly how the book will be divided.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "10000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "manuscript": "Chapter One\n\nIt was a bright cold day in April...\n\n* * *\n\nLater that day...\n\nChapter Two\n\n...",
     "format": "txt"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "manuscript": {
      "type": "string",
      "maxLength": 1200000,
      "description": "The whole manuscript as plain text or markdown. Chapters: 'Chapter N', 'CHAPTER N', '# Title', a roman numeral line ('IV.') or a bare Prologue/Epilogue line; scene breaks: '* * *' or '#'; *italic* and **bold**; one blank line between paragraphs (hard-wrapped lines are joined)."
     },
     "format": {
      "type": "string",
      "enum": [
       "txt",
       "md"
      ],
      "description": "txt (default) or md"
     }
    },
    "required": [
     "manuscript"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "words": {
      "type": "integer"
     },
     "chapters": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "paragraphs": {
      "type": "integer"
     },
     "scene_breaks": {
      "type": "integer"
     },
     "missing_glyphs": {
      "type": "string"
     },
     "warnings": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "words",
     "chapters"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "words": 32310,
     "chapters": [
      {
       "n": 1,
       "title": "Introduction",
       "numbered": true,
       "words": 1680,
       "scenes": 0,
       "sections": 0
      }
     ],
     "paragraphs": 306,
     "scene_breaks": 0,
     "missing_glyphs": "",
     "warnings": [],
     "elapsed_ms": 400
    }
   },
   "tags": [
    "typesetting",
    "books",
    "manuscript",
    "kdp",
    "publishing"
   ],
   "metadata": {
    "capabilities": [
     "typesetting",
     "books",
     "manuscript",
     "kdp",
     "publishing"
    ],
    "license": "The typeset files belong to the caller (any use, commercial included); manuscripts are processed in a temporary directory and not stored.",
    "useWhen": "A publishing pipeline, author tool or agent needs a print-ready paperback interior (KDP/IngramSpark trim + gutter rules, running heads, chapter openers on recto pages, contents) from a prose manuscript, plus an editable docx twin and a layout report.",
    "doNotUseWhen": "The manuscript has images, footnotes, tables, verse with fixed line breaks, lists or non-Latin scripts, or you need a cover, an EPUB, or editing of the text.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/book-interior-service/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/typeset",
   "type": "http",
   "method": "POST",
   "description": "Typeset a prose manuscript into a print-ready book interior. Returns a zip (base64) with: the interior PDF at your trim size (5x8, 5.25x8, 5.5x8.5, 6x9 or A5) with mirrored margins and the inside gutter chosen from the final page count per KDP's minimums, running heads (author on left pages, chapter title or book title on right pages), page numbers, every chapter opening on a right-hand page with automatic blank versos, half title / title page / copyright page / optional dedication / contents with page numbers / optional epigraph and About the Author, justified and hyphenated body text in Crimson Text (embedded, open licence), widows and orphans suppressed, smart quotes; an editable .docx twin with the same trim, mirrored margins, odd-page chapter sections and running-head fields; and LAYOUT-REPORT.md (page count, spine-width estimate, margin table against KDP minimums, chapter start pages, warnings). Text is never rewritten. Prose only: no images, footnotes, tables, verse, lists or non-Latin scripts.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "7990000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "manuscript": "Chapter One\n\nIt was a bright cold day in April...",
     "format": "txt",
     "title": "The Long Field",
     "author": "A. N. Author",
     "trim": "6x9",
     "chapter_numbers": "words",
     "toc": true,
     "copyright": {
      "year": 2026,
      "holder": "A. N. Author",
      "fiction": true
     },
     "dedication": "For M."
    },
    "method": "POST"
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "manuscript": {
      "type": "string",
      "maxLength": 1200000,
      "description": "The whole manuscript as plain text or markdown. Chapters: 'Chapter N', 'CHAPTER N', '# Title', a roman numeral line ('IV.') or a bare Prologue/Epilogue line; scene breaks: '* * *' or '#'; *italic* and **bold**; one blank line between paragraphs (hard-wrapped lines are joined)."
     },
     "format": {
      "type": "string",
      "enum": [
       "txt",
       "md"
      ],
      "description": "txt (default) or md"
     },
     "title": {
      "type": "string",
      "maxLength": 200
     },
     "subtitle": {
      "type": "string",
      "maxLength": 200
     },
     "author": {
      "type": "string",
      "maxLength": 200
     },
     "trim": {
      "type": "string",
      "enum": [
       "5x8",
       "5.25x8",
       "5.5x8.5",
       "6x9",
       "A5"
      ],
      "description": "default 6x9"
     },
     "font_size": {
      "type": "number",
      "minimum": 9.5,
      "maximum": 13,
      "description": "body size in pt, default 11"
     },
     "chapter_numbers": {
      "type": "string",
      "enum": [
       "words",
       "roman",
       "arabic",
       "none"
      ],
      "description": "'Chapter One' / 'I' / '1' / none"
     },
     "chapter_label": {
      "type": "string",
      "maxLength": 20,
      "description": "word before the number, default 'Chapter'; '' for none"
     },
     "running_head_recto": {
      "type": "string",
      "enum": [
       "chapter",
       "title"
      ]
     },
     "toc": {
      "type": "boolean",
      "description": "include a contents page (default true)"
     },
     "copyright": {
      "type": "object",
      "properties": {
       "year": {
        "type": "integer"
       },
       "holder": {
        "type": "string",
        "maxLength": 200
       },
       "fiction": {
        "type": "boolean"
       },
       "extra": {
        "type": "string",
        "maxLength": 400
       },
       "public_domain": {
        "type": "boolean"
       },
       "first_published": {
        "type": "string",
        "maxLength": 20
       }
      }
     },
     "dedication": {
      "type": "string",
      "maxLength": 200
     },
     "epigraph": {
      "type": "string",
      "maxLength": 400
     },
     "epigraph_source": {
      "type": "string",
      "maxLength": 100
     },
     "about_author": {
      "type": "string",
      "maxLength": 2000
     },
     "also_by": {
      "type": "array",
      "items": {
       "type": "string",
       "maxLength": 120
      },
      "maxItems": 12
     },
     "include_docx": {
      "type": "boolean",
      "description": "default true"
     },
     "smart_quotes": {
      "type": "boolean",
      "description": "default true"
     }
    },
    "required": [
     "manuscript",
     "title",
     "author"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "trim": {
      "type": "string"
     },
     "pages": {
      "type": "integer"
     },
     "words": {
      "type": "integer"
     },
     "chapters": {
      "type": "integer"
     },
     "inside_margin_in": {
      "type": "number"
     },
     "outside_margin_in": {
      "type": "number"
     },
     "fonts_embedded": {
      "type": "boolean"
     },
     "warnings": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "chapter_starts": {
      "type": "array"
     },
     "files": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "pages",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "title": "The Long Field",
     "trim": "6x9",
     "pages": 98,
     "words": 32310,
     "chapters": 17,
     "inside_margin_in": 0.5,
     "outside_margin_in": 0.625,
     "fonts_embedded": true,
     "warnings": [],
     "chapter_starts": [
      [
       "I. Introduction",
       9
      ],
      [
       "II. The Machine",
       15
      ]
     ],
     "files": [
      "The-Long-Field-interior-6x9.pdf",
      "The-Long-Field-interior.docx",
      "LAYOUT-REPORT.md",
      "build.json"
     ],
     "content_type": "application/zip",
     "bytes": 380000,
     "content_base64": "UEsDBBQ...",
     "elapsed_ms": 2600
    }
   },
   "tags": [
    "typesetting",
    "books",
    "pdf",
    "kdp",
    "print-ready",
    "publishing"
   ],
   "metadata": {
    "capabilities": [
     "typesetting",
     "books",
     "pdf",
     "kdp",
     "print-ready",
     "publishing"
    ],
    "license": "The typeset files belong to the caller (any use, commercial included); manuscripts are processed in a temporary directory and not stored.",
    "useWhen": "A publishing pipeline, author tool or agent needs a print-ready paperback interior (KDP/IngramSpark trim + gutter rules, running heads, chapter openers on recto pages, contents) from a prose manuscript, plus an editable docx twin and a layout report.",
    "doNotUseWhen": "The manuscript has images, footnotes, tables, verse with fixed line breaks, lists or non-Latin scripts, or you need a cover, an EPUB, or editing of the text.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/book-interior-service/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/crossword",
   "type": "http",
   "method": "POST",
   "description": "Lay out 8-30 clue/answer pairs into one connected freeform crossword (no black squares) and return it as JSON: the letter grid, every slot with row/col/direction, standard row-major crossword numbering, Across and Down clue lists and the stats. A verifier proves every run of letters is exactly one supplied answer and every answer appears once. Deterministic per seed. For personalised puzzle gifts, newsletters, classroom sheets and games.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "20000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "title": "Dana's 40th Birthday Crossword",
     "entries": [
      {
       "answer": "Pancakes",
       "clue": "Your Sunday breakfast speciality"
      },
      {
       "answer": "Lisbon",
       "clue": "City where you turned thirty"
      },
      {
       "answer": "Biscuit",
       "clue": "The dog who ate the birthday cake"
      },
      {
       "answer": "...",
       "clue": "... (8-30 pairs)"
      }
     ],
     "seed": 40
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 40,
      "description": "Printed above the grid"
     },
     "subtitle": {
      "type": "string",
      "maxLength": 90,
      "description": "Optional line under the title"
     },
     "entries": {
      "type": "array",
      "minItems": 8,
      "maxItems": 30,
      "description": "8-30 clue/answer pairs; answers 3-15 letters (spaces, hyphens and accents are dropped in the grid, kept in the key); clues up to 110 characters; no duplicate answers",
      "items": {
       "type": "object",
       "properties": {
        "answer": {
         "type": "string"
        },
        "clue": {
         "type": "string"
        }
       },
       "required": [
        "answer",
        "clue"
       ]
      }
     },
     "style": {
      "type": "string",
      "enum": [
       "classic",
       "elegant"
      ],
      "description": "classic = sans-serif, elegant = serif with a gold rule (PDF only)"
     },
     "sizes": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "8x10",
        "a4",
        "letter"
       ]
      },
      "description": "PDF page sizes to build (PDF route only; default all three)"
     },
     "seed": {
      "type": "integer",
      "description": "Optional; same seed + entries = same grid"
     }
    },
    "required": [
     "title",
     "entries"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "subtitle": {
      "type": "string"
     },
     "seed": {
      "type": "integer"
     },
     "entries": {
      "type": "integer"
     },
     "rows": {
      "type": "integer"
     },
     "cols": {
      "type": "integer"
     },
     "crossings": {
      "type": "integer"
     },
     "grid": {
      "type": "array",
      "items": {
       "type": "array"
      },
      "description": "rows of cells; letter or null"
     },
     "slots": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "numbering": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "clues": {
      "type": "object",
      "properties": {
       "across": {
        "type": "array"
       },
       "down": {
        "type": "array"
       }
      }
     },
     "verified": {
      "type": "boolean"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "title",
     "entries",
     "grid",
     "slots",
     "numbering",
     "clues"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "title": "Dana's 40th Birthday Crossword",
     "seed": 40,
     "entries": 18,
     "rows": 19,
     "cols": 16,
     "crossings": 17,
     "grid": [
      "........P.......",
      "..."
     ],
     "numbering": [
      {
       "n": 1,
       "row": 0,
       "col": 8,
       "across": "PANCAKES",
       "down": null
      }
     ],
     "clues": {
      "across": [
       {
        "n": 1,
        "clue": "Your Sunday breakfast speciality",
        "len": 8
       }
      ],
      "down": []
     },
     "verified": true,
     "elapsed_ms": 400
    }
   },
   "tags": [
    "crossword",
    "puzzle",
    "generator",
    "games",
    "content"
   ],
   "metadata": {
    "capabilities": [
     "crossword",
     "puzzle",
     "generator",
     "games",
     "content"
    ],
    "license": "Generated crosswords belong to the caller (commercial use allowed); inputs are processed in a temporary directory and not stored.",
    "useWhen": "An app, gift shop, newsletter, classroom tool or agent needs a verified freeform crossword laid out from its own clue/answer pairs, as data or as print-ready PDFs with an answer key.",
    "doNotUseWhen": "You need a newspaper-style black-square grid with full symmetry, clue writing, more than 30 answers, digits in the grid, or non-Latin scripts.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/crossword-gift/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/crossword/pdf",
   "type": "http",
   "method": "POST",
   "description": "The same verified crossword as print-ready PDFs: puzzle page (title, subtitle, numbered grid, Across/Down clues) plus an answer-key page, in 8x10 in (frame-ready, 0.6 in margins), A4 and US Letter, classic or elegant typography, zipped together with puzzle.json and returned as base64. Typography and a grid only, no images.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "3990000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "title": "Dana's 40th Birthday Crossword",
     "subtitle": "Happy 40th, Dana!",
     "style": "elegant",
     "sizes": [
      "8x10",
      "letter"
     ],
     "entries": [
      {
       "answer": "Pancakes",
       "clue": "Your Sunday breakfast speciality"
      },
      {
       "answer": "Lisbon",
       "clue": "City where you turned thirty"
      },
      {
       "answer": "Biscuit",
       "clue": "The dog who ate the birthday cake"
      },
      {
       "answer": "...",
       "clue": "... (8-30 pairs)"
      }
     ],
     "seed": 40
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 40,
      "description": "Printed above the grid"
     },
     "subtitle": {
      "type": "string",
      "maxLength": 90,
      "description": "Optional line under the title"
     },
     "entries": {
      "type": "array",
      "minItems": 8,
      "maxItems": 30,
      "description": "8-30 clue/answer pairs; answers 3-15 letters (spaces, hyphens and accents are dropped in the grid, kept in the key); clues up to 110 characters; no duplicate answers",
      "items": {
       "type": "object",
       "properties": {
        "answer": {
         "type": "string"
        },
        "clue": {
         "type": "string"
        }
       },
       "required": [
        "answer",
        "clue"
       ]
      }
     },
     "style": {
      "type": "string",
      "enum": [
       "classic",
       "elegant"
      ],
      "description": "classic = sans-serif, elegant = serif with a gold rule (PDF only)"
     },
     "sizes": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "8x10",
        "a4",
        "letter"
       ]
      },
      "description": "PDF page sizes to build (PDF route only; default all three)"
     },
     "seed": {
      "type": "integer",
      "description": "Optional; same seed + entries = same grid"
     }
    },
    "required": [
     "title",
     "entries"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "entries": {
      "type": "integer"
     },
     "rows": {
      "type": "integer"
     },
     "cols": {
      "type": "integer"
     },
     "crossings": {
      "type": "integer"
     },
     "seed": {
      "type": "integer"
     },
     "style": {
      "type": "string"
     },
     "files": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "pages": {
      "type": "object"
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "title",
     "entries",
     "files",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "title": "Dana's 40th Birthday Crossword",
     "entries": 18,
     "rows": 19,
     "cols": 16,
     "crossings": 17,
     "seed": 40,
     "style": "elegant",
     "files": [
      "Danas40thBirthdayCrossword-Crossword-8x10.pdf",
      "Danas40thBirthdayCrossword-Crossword-Letter.pdf",
      "puzzle.json"
     ],
     "pages": {
      "8x10": 2,
      "letter": 2
     },
     "content_type": "application/zip",
     "bytes": 60000,
     "content_base64": "UEsDBBQ...",
     "elapsed_ms": 900
    }
   },
   "tags": [
    "crossword",
    "pdf",
    "print-ready",
    "gift",
    "generator"
   ],
   "metadata": {
    "capabilities": [
     "crossword",
     "pdf",
     "print-ready",
     "gift",
     "generator"
    ],
    "license": "Generated crosswords belong to the caller (commercial use allowed); inputs are processed in a temporary directory and not stored.",
    "useWhen": "An app, gift shop, newsletter, classroom tool or agent needs a verified freeform crossword laid out from its own clue/answer pairs, as data or as print-ready PDFs with an answer key.",
    "doNotUseWhen": "You need a newspaper-style black-square grid with full symmetry, clue writing, more than 30 answers, digits in the grid, or non-Latin scripts.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/crossword-gift/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/familytree",
   "type": "http",
   "method": "POST",
   "description": "Lay out a family tree as a descendant, ancestor (pedigree) or hourglass chart from people+families JSON or a GEDCOM file (up to 400 people, 10 generations) and return the computed chart as JSON: every person box with generation, x/y/width/height, formatted dates (living people privatised by default), spouse and parent edges, and the chart bounds. A verifier proves no boxes overlap, every child is linked to its parents and every person in the requested subtree appears exactly once. Draw it in any renderer, or use the PDF route.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "20000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "title": "The Alvarez Family",
     "chart": "descendant",
     "root": "I1",
     "generations": 5,
     "people": [
      {
       "id": "I1",
       "name": "Tom\u00e1s Alvarez",
       "sex": "M",
       "birth": "1888",
       "death": "1961"
      },
      {
       "id": "I2",
       "name": "Rosa Delgado",
       "sex": "F",
       "birth": "1892",
       "death": "1970"
      },
      {
       "id": "I3",
       "name": "Elena Alvarez",
       "sex": "F",
       "birth": "1915",
       "death": "1998"
      },
      {
       "id": "I4",
       "name": "Mateo Alvarez",
       "sex": "M",
       "birth": "1918"
      },
      {
       "id": "...",
       "name": "... (3-400 people)"
      }
     ],
     "families": [
      {
       "id": "F1",
       "husband": "I1",
       "wife": "I2",
       "children": [
        "I3",
        "I4"
       ]
      }
     ]
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 60,
      "description": "Printed above the chart"
     },
     "subtitle": {
      "type": "string",
      "maxLength": 90,
      "description": "Optional line under the title"
     },
     "chart": {
      "type": "string",
      "enum": [
       "descendant",
       "ancestor",
       "hourglass"
      ],
      "description": "descendant (default): root and everyone below; ancestor: pedigree of the root; hourglass: both"
     },
     "root": {
      "type": "string",
      "description": "Person id the chart is built from; omitted = chosen automatically (earliest founder with the most descendants, or the person with the most ancestors)"
     },
     "generations": {
      "type": "integer",
      "minimum": 2,
      "maximum": 10,
      "description": "Generations to include (default 5; hourglass counts each direction, max 5 each)"
     },
     "style": {
      "type": "string",
      "enum": [
       "classic",
       "elegant"
      ],
      "description": "classic = sans-serif, elegant = serif (PDF only)"
     },
     "sizes": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "letter",
        "a4",
        "24x36",
        "a3"
       ]
      },
      "description": "PDF page sizes to build (PDF route only; default all four)"
     },
     "privatize_living": {
      "type": "boolean",
      "description": "Show 'living' instead of dates for people with no death date born within the last 100 years (default true)"
     },
     "people": {
      "type": "array",
      "minItems": 3,
      "maxItems": 400,
      "description": "3-400 people; birth/death are years or GEDCOM-style dates ('abt 1850', '12 MAR 1901'); use with families",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "name": {
         "type": "string"
        },
        "sex": {
         "type": "string"
        },
        "birth": {
         "type": "string"
        },
        "death": {
         "type": "string"
        }
       },
       "required": [
        "id",
        "name"
       ]
      }
     },
     "families": {
      "type": "array",
      "maxItems": 300,
      "description": "Couples and their children (GEDCOM FAM model); husband/wife optional, children a list of person ids",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "husband": {
         "type": "string"
        },
        "wife": {
         "type": "string"
        },
        "children": {
         "type": "array",
         "items": {
          "type": "string"
         }
        }
       }
      }
     },
     "gedcom": {
      "type": "string",
      "maxLength": 2000000,
      "description": "Alternative to people/families: the text of a GEDCOM 5.5 / 5.5.1 / 7.0 file (as exported by Ancestry, FamilySearch, MyHeritage, Gramps); up to 2,000,000 characters and 400 people in the requested subtree"
     }
    },
    "required": [
     "title"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "chart": {
      "type": "string"
     },
     "root": {
      "type": "string"
     },
     "generations": {
      "type": "integer"
     },
     "people": {
      "type": "integer"
     },
     "couples": {
      "type": "integer"
     },
     "nodes": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "edges": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "width": {
      "type": "number"
     },
     "height": {
      "type": "number"
     },
     "warnings": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "verified": {
      "type": "boolean"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "title",
     "chart",
     "people",
     "nodes",
     "edges"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "title": "The Alvarez Family",
     "chart": "descendant",
     "root": "I1",
     "root_name": "Tom\u00e1s Alvarez",
     "generations": 5,
     "people": 55,
     "couples": 21,
     "widest_row": 25,
     "nodes": [
      {
       "i": 0,
       "id": "I1",
       "name": "Tom\u00e1s Alvarez",
       "full": "Tom\u00e1s Alvarez",
       "dates": "1888 \u2013 1961",
       "gen": 1,
       "x": 1432.0,
       "y": 0.0,
       "w": 100.0,
       "h": 41.0,
       "role": "person"
      },
      {
       "i": 1,
       "id": "I2",
       "name": "Rosa Delgado",
       "dates": "1892 \u2013 1970",
       "gen": 1,
       "x": 1536.0,
       "y": 0.0,
       "w": 100.0,
       "h": 41.0,
       "role": "spouse"
      },
      "..."
     ],
     "edges": [
      {
       "kind": "child",
       "family": "F1",
       "from": 0,
       "to": 2,
       "pts": [
        [
         240.0,
         356.0
        ],
        [
         240.0,
         388.0
        ],
        [
         130.0,
         388.0
        ],
        [
         130.0,
         420.0
        ]
       ]
      },
      "..."
     ],
     "width": 3002.0,
     "height": 463.0,
     "warnings": [],
     "verified": true,
     "elapsed_ms": 350
    }
   },
   "tags": [
    "genealogy",
    "family-tree",
    "gedcom",
    "layout",
    "chart"
   ],
   "metadata": {
    "capabilities": [
     "genealogy",
     "family-tree",
     "gedcom",
     "layout",
     "chart"
    ],
    "license": "Generated charts belong to the caller (commercial use allowed); the tree data is processed in a temporary directory and not stored.",
    "useWhen": "A genealogy app, print shop, family-history pipeline or agent needs a descendant, ancestor or hourglass chart laid out from its own people/families data or a GEDCOM file, as verified layout JSON or as print-ready poster and tiled PDFs.",
    "doNotUseWhen": "You need genealogical research, record matching, photos, fan/circular charts, more than 400 people or 10 generations in one chart, or non-Latin scripts.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/family-chart/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/familytree/pdf",
   "type": "http",
   "method": "POST",
   "description": "The same verified chart as print-ready PDFs: 24x36 in and A3 single-sheet posters (chart scaled to fill, generation labels, footer), plus US Letter and A4 files with a one-page overview, readable tiles with crop marks and overlap for taping, and an index of every person; classic or elegant typography; zipped with chart.json and returned as base64. Typography, boxes and lines only, no images.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "4990000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "title": "The Alvarez Family",
     "subtitle": "Descendants of Tom\u00e1s and Rosa",
     "chart": "descendant",
     "generations": 5,
     "style": "elegant",
     "sizes": [
      "24x36",
      "letter"
     ],
     "people": [
      {
       "id": "I1",
       "name": "Tom\u00e1s Alvarez",
       "sex": "M",
       "birth": "1888",
       "death": "1961"
      },
      {
       "id": "I2",
       "name": "Rosa Delgado",
       "sex": "F",
       "birth": "1892",
       "death": "1970"
      },
      {
       "id": "I3",
       "name": "Elena Alvarez",
       "sex": "F",
       "birth": "1915",
       "death": "1998"
      },
      {
       "id": "I4",
       "name": "Mateo Alvarez",
       "sex": "M",
       "birth": "1918"
      },
      {
       "id": "...",
       "name": "... (3-400 people)"
      }
     ],
     "families": [
      {
       "id": "F1",
       "husband": "I1",
       "wife": "I2",
       "children": [
        "I3",
        "I4"
       ]
      }
     ]
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 60,
      "description": "Printed above the chart"
     },
     "subtitle": {
      "type": "string",
      "maxLength": 90,
      "description": "Optional line under the title"
     },
     "chart": {
      "type": "string",
      "enum": [
       "descendant",
       "ancestor",
       "hourglass"
      ],
      "description": "descendant (default): root and everyone below; ancestor: pedigree of the root; hourglass: both"
     },
     "root": {
      "type": "string",
      "description": "Person id the chart is built from; omitted = chosen automatically (earliest founder with the most descendants, or the person with the most ancestors)"
     },
     "generations": {
      "type": "integer",
      "minimum": 2,
      "maximum": 10,
      "description": "Generations to include (default 5; hourglass counts each direction, max 5 each)"
     },
     "style": {
      "type": "string",
      "enum": [
       "classic",
       "elegant"
      ],
      "description": "classic = sans-serif, elegant = serif (PDF only)"
     },
     "sizes": {
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "letter",
        "a4",
        "24x36",
        "a3"
       ]
      },
      "description": "PDF page sizes to build (PDF route only; default all four)"
     },
     "privatize_living": {
      "type": "boolean",
      "description": "Show 'living' instead of dates for people with no death date born within the last 100 years (default true)"
     },
     "people": {
      "type": "array",
      "minItems": 3,
      "maxItems": 400,
      "description": "3-400 people; birth/death are years or GEDCOM-style dates ('abt 1850', '12 MAR 1901'); use with families",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "name": {
         "type": "string"
        },
        "sex": {
         "type": "string"
        },
        "birth": {
         "type": "string"
        },
        "death": {
         "type": "string"
        }
       },
       "required": [
        "id",
        "name"
       ]
      }
     },
     "families": {
      "type": "array",
      "maxItems": 300,
      "description": "Couples and their children (GEDCOM FAM model); husband/wife optional, children a list of person ids",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "husband": {
         "type": "string"
        },
        "wife": {
         "type": "string"
        },
        "children": {
         "type": "array",
         "items": {
          "type": "string"
         }
        }
       }
      }
     },
     "gedcom": {
      "type": "string",
      "maxLength": 2000000,
      "description": "Alternative to people/families: the text of a GEDCOM 5.5 / 5.5.1 / 7.0 file (as exported by Ancestry, FamilySearch, MyHeritage, Gramps); up to 2,000,000 characters and 400 people in the requested subtree"
     }
    },
    "required": [
     "title"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "chart": {
      "type": "string"
     },
     "generations": {
      "type": "integer"
     },
     "people": {
      "type": "integer"
     },
     "style": {
      "type": "string"
     },
     "files": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "pages": {
      "type": "object"
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "title",
     "chart",
     "people",
     "files",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "title": "The Alvarez Family",
     "chart": "descendant",
     "root": "I1",
     "generations": 5,
     "people": 57,
     "couples": 21,
     "style": "elegant",
     "files": [
      "TheAlvarezFamily-Descendant-24x36.pdf",
      "TheAlvarezFamily-Descendant-Letter.pdf",
      "chart.json"
     ],
     "pages": {
      "24x36": 1,
      "letter": 9
     },
     "content_type": "application/zip",
     "bytes": 120000,
     "content_base64": "UEsDBBQ...",
     "elapsed_ms": 1800
    }
   },
   "tags": [
    "genealogy",
    "family-tree",
    "pdf",
    "print-ready",
    "gedcom"
   ],
   "metadata": {
    "capabilities": [
     "genealogy",
     "family-tree",
     "pdf",
     "print-ready",
     "gedcom"
    ],
    "license": "Generated charts belong to the caller (commercial use allowed); the tree data is processed in a temporary directory and not stored.",
    "useWhen": "A genealogy app, print shop, family-history pipeline or agent needs a descendant, ancestor or hourglass chart laid out from its own people/families data or a GEDCOM file, as verified layout JSON or as print-ready poster and tiled PDFs.",
    "doNotUseWhen": "You need genealogical research, record matching, photos, fan/circular charts, more than 400 people or 10 generations in one chart, or non-Latin scripts.",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/family-chart/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/dataset-audit",
   "type": "http",
   "method": "POST",
   "description": "Audit a CSV or JSON-array dataset (up to 5 MB, 50,000 rows, 200 columns and 2,000,000 cells \u2014 rows x columns, the binding limit on wide data) and return a structured data-quality report as JSON: exact duplicate row count and up to 20 duplicate row indexes, per-column missing-value counts and percentages, inferred column types with a mixed-type flag, class-imbalance ratio for low-cardinality categorical columns, IQR-based outlier counts for numeric columns, PII-pattern hit counts (email/phone-like/SSN-like/credit-card-like) per column, and one overall quality_score (0-100, documented heuristic). Row content is never echoed back \u2014 only counts, percentages and indexes. Your data is held only in a temporary file for the duration of the request, deleted immediately after, and never logged or retained. PII-pattern hits (email/phone/SSN/credit-card-like) lower the quality_score but the matched values themselves are never returned. Do not submit data you are not authorized to process; this is a diagnostic tool, not a compliance or legal service. This is a triage heuristic for ML/data pipelines, not a certified data-quality or compliance audit.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "30000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "data": "id,name,email,age\n1,Ana,ana@example.com,29\n2,Ben,ben@example.com,41\n2,Ben,ben@example.com,41\n3,Cy,not-an-email,\n",
     "format": "csv"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "data": {
      "type": "string",
      "description": "the dataset itself: CSV text, or a JSON array of flat objects. Max 5242880 bytes, 50000 rows, 200 columns, and 2000000 cells (rows x columns) \u2014 the cell cap binds first on wide datasets."
     },
     "format": {
      "type": "string",
      "enum": [
       "auto",
       "csv",
       "json"
      ],
      "description": "auto (default, sniffs '[' for JSON), csv, or json"
     }
    },
    "required": [
     "data"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "row_count": {
      "type": "integer"
     },
     "col_count": {
      "type": "integer"
     },
     "columns": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string"
        },
        "dtype": {
         "type": "string"
        },
        "missing_count": {
         "type": "integer"
        },
        "missing_pct": {
         "type": "number"
        },
        "mixed_type": {
         "type": "boolean"
        },
        "outlier_count": {
         "type": "integer"
        },
        "imbalance_ratio": {
         "type": "number"
        }
       },
       "required": [
        "name",
        "dtype",
        "missing_count",
        "missing_pct",
        "mixed_type"
       ]
      }
     },
     "duplicate_row_count": {
      "type": "integer"
     },
     "duplicate_row_indexes": {
      "type": "array",
      "items": {
       "type": "integer"
      }
     },
     "pii_flags": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "column": {
         "type": "string"
        },
        "pattern": {
         "type": "string"
        },
        "match_count": {
         "type": "integer"
        }
       }
      }
     },
     "quality_score": {
      "type": "integer"
     },
     "issues": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "row_count",
     "col_count",
     "columns",
     "duplicate_row_count",
     "quality_score"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "row_count": 4,
     "col_count": 4,
     "columns": [
      {
       "name": "id",
       "dtype": "int",
       "missing_count": 0,
       "missing_pct": 0.0,
       "mixed_type": false
      },
      {
       "name": "name",
       "dtype": "string",
       "missing_count": 0,
       "missing_pct": 0.0,
       "mixed_type": false
      },
      {
       "name": "email",
       "dtype": "string",
       "missing_count": 0,
       "missing_pct": 0.0,
       "mixed_type": false
      },
      {
       "name": "age",
       "dtype": "int",
       "missing_count": 1,
       "missing_pct": 25.0,
       "mixed_type": false,
       "outlier_count": 0
      }
     ],
     "duplicate_row_count": 1,
     "duplicate_row_indexes": [
      2
     ],
     "pii_flags": [
      {
       "column": "email",
       "pattern": "email",
       "match_count": 2
      }
     ],
     "quality_score": 79,
     "issues": [
      "1 duplicate row(s) (25.0% of rows)",
      "Column 'age' is 25.0% missing",
      "Column 'email' looks like it may contain email-pattern data (2 match(es))"
     ],
     "elapsed_ms": 3
    }
   },
   "tags": [
    "dataset",
    "data-quality",
    "csv",
    "json",
    "ml-tooling"
   ],
   "metadata": {
    "capabilities": [
     "dataset",
     "data-quality",
     "csv",
     "json",
     "ml-tooling"
    ],
    "license": "Your data is written to a temporary file for the duration of the request, deleted immediately after, and never logged or retained; only counts, percentages and row indexes are returned, never cell values. Do not submit data you are not authorized to process; this is a diagnostic tool, not a compliance or legal service.",
    "useWhen": "An ML/data pipeline, agent or engineer has a CSV/JSON dataset and needs a fast structured quality triage \u2014 duplicates, missingness, type consistency, class imbalance, numeric outliers, PII-pattern counts \u2014 before training or shipping it.",
    "doNotUseWhen": "You need a certified/compliance-grade data audit, PII redaction or remediation, nested/non-flat records, non-tabular data, or a dataset over any of the caps: 5 MB, 50,000 rows, 200 columns, or 2,000,000 cells (rows x columns \u2014 the binding limit on wide datasets, e.g. 200 columns caps out at 10,000 rows).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/docs-api/"
   }
  },
  {
   "url": "https://qf-api.quietforge-studio.workers.dev/v1/dataset-audit/pdf",
   "type": "http",
   "method": "POST",
   "description": "The same data-quality audit as a compact PDF summary (score, top issues, a per-column table, PII-pattern flags; usually one page, more for wide datasets) zipped with report.json and returned as base64. Your data is held only in a temporary file for the duration of the request, deleted immediately after, and never logged or retained. PII-pattern hits (email/phone/SSN/credit-card-like) lower the quality_score but the matched values themselves are never returned. Do not submit data you are not authorized to process; this is a diagnostic tool, not a compliance or legal service. Typography and a plain table only, no charts.",
   "mimeType": "application/json",
   "x402Version": 2,
   "accepts": [
    {
     "scheme": "exact",
     "network": "eip155:8453",
     "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
     "amount": "1990000",
     "payTo": "0x3F5115236f25618c16021E983acaAF2CAaa1A35e",
     "maxTimeoutSeconds": 300,
     "extra": {
      "name": "USD Coin",
      "version": "2"
     }
    }
   ],
   "input": {
    "type": "http",
    "bodyType": "json",
    "body": {
     "data": "id,name,email,age\n1,Ana,ana@example.com,29\n2,Ben,ben@example.com,41\n2,Ben,ben@example.com,41\n3,Cy,not-an-email,\n",
     "format": "csv"
    }
   },
   "inputSchema": {
    "type": "object",
    "properties": {
     "data": {
      "type": "string",
      "description": "the dataset itself: CSV text, or a JSON array of flat objects. Max 5242880 bytes, 50000 rows, 200 columns, and 2000000 cells (rows x columns) \u2014 the cell cap binds first on wide datasets."
     },
     "format": {
      "type": "string",
      "enum": [
       "auto",
       "csv",
       "json"
      ],
      "description": "auto (default, sniffs '[' for JSON), csv, or json"
     }
    },
    "required": [
     "data"
    ]
   },
   "outputSchema": {
    "type": "object",
    "properties": {
     "row_count": {
      "type": "integer"
     },
     "col_count": {
      "type": "integer"
     },
     "quality_score": {
      "type": "integer"
     },
     "duplicate_row_count": {
      "type": "integer"
     },
     "files": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "pages": {
      "type": "integer"
     },
     "content_type": {
      "type": "string"
     },
     "bytes": {
      "type": "integer"
     },
     "content_base64": {
      "type": "string"
     },
     "elapsed_ms": {
      "type": "integer"
     }
    },
    "required": [
     "row_count",
     "col_count",
     "quality_score",
     "files",
     "content_type",
     "bytes",
     "content_base64"
    ]
   },
   "output": {
    "type": "json",
    "example": {
     "row_count": 4,
     "col_count": 4,
     "quality_score": 79,
     "duplicate_row_count": 1,
     "files": [
      "report.json",
      "summary.pdf"
     ],
     "pages": 1,
     "content_type": "application/zip",
     "bytes": 9000,
     "content_base64": "UEsDBBQ...",
     "elapsed_ms": 40
    }
   },
   "tags": [
    "dataset",
    "data-quality",
    "pdf",
    "report",
    "ml-tooling"
   ],
   "metadata": {
    "capabilities": [
     "dataset",
     "data-quality",
     "pdf",
     "report",
     "ml-tooling"
    ],
    "license": "Your data is written to a temporary file for the duration of the request, deleted immediately after, and never logged or retained; only counts, percentages and row indexes are returned, never cell values. Do not submit data you are not authorized to process; this is a diagnostic tool, not a compliance or legal service.",
    "useWhen": "An ML/data pipeline, agent or engineer has a CSV/JSON dataset and needs a fast structured quality triage \u2014 duplicates, missingness, type consistency, class imbalance, numeric outliers, PII-pattern counts \u2014 before training or shipping it.",
    "doNotUseWhen": "You need a certified/compliance-grade data audit, PII redaction or remediation, nested/non-flat records, non-tabular data, or a dataset over any of the caps: 5 MB, 50,000 rows, 200 columns, or 2,000,000 cells (rows x columns \u2014 the binding limit on wide datasets, e.g. 200 columns caps out at 10,000 rows).",
    "operator": "Quietforge (AI-run studio, disclosed)",
    "docs": "https://qf-api.quietforge-studio.workers.dev/docs",
    "storefront": "https://quietforge-studio.pages.dev/docs-api/"
   }
  }
 ],
 "canonicalManifest": "https://quietforge-studio.pages.dev/.well-known/x402.json",
 "endpointPointer": "https://quietforge-studio.pages.dev/docs-api/endpoint.json"
}