DiffiCat Agent API
unreachableWebsite migration checks for AI agents: page discovery, screenshot capture, and full comparison jobs with reports. Paid per call over HTTP 402 using the Machine Payments Protocol; the rails on offer (USDC on Base, also for x402 clients; cards via Shared Payment Tokens and USDC on Tempo where enabled) are enumerated by the 402 challenge. An agent without a wallet pays from a prepaid balance…
Settled via Coinbase.
- Transactions · 30d
- 10
- Volume · 30d
- $0.32
- Unique buyers · 30d
- 2
- Uptime · 30d
- 77.8%
- Latency p50
- 111ms
- Reported calls · 30d
- 20
Endpoints (3 live)
POST/api/v1/screenshots— Captures a full-page screenshot of one public web page in Chromium and returns a link to the PNG. Use it for a one-off visual check of a page, or to keep a reference image before a change. 0.02 USD per call. (0.02 USDC on Base)POST/api/v1/jobs— Starts a website migration comparison: checks page existence, content and visual regression between a source site and its migrated copy, then produces a report with screenshots. Use it to verify a migration or redesign before go-live. 0.02 USD per reserved page, charged upfront for maxPages with no refund: call /api/v1/discover first and set maxPages to the page count. (0.02 USDC on Base)POST/api/v1/discover— Lists the pages of a website for a migration check: reads its sitemap or crawls from the start URL, and maps every page onto the target site when one is given. Use it before starting a comparison job to choose which pages to compare. 0.05 USD per call. (0.05 USDC on Base)
MCP tools (12)
difficat https://app.difficat.com/mcp
cancel_comparison— Stop a running job; the job reports cancelled within a minute, with the pages compared so far in its report. Free.capture_screenshot— Free 3 times a day per client address, no key needed. Full-page PNG of one URL at the given viewport width, returned inline when small, else as links.file to fetch with the jobToken. Call it for a one-off look at a page or a mobile-width check. Do not call it for pages a comparison job covers: get_report names their screenshots for get_screenshot. Example: { "url": "https://new.example/pricing", "viewportWidth": 375 }. Answers with jobId, jobToken, filename, url, dimensions, bytes, links.file and, on a free run, sample and allowanceRemaining.discover_pages— Free 3 times a day per client address (at most 50 pages each), no key needed. Lists the pages of Site A (sitemap, robots.txt or crawl), mapped onto Site B when given. Call it to see which pages a comparison would cover or to pick pairs for urls. Do not call it before start_comparison only to price a job: a job without urls discovers for itself. Lists at most maxPages pages, 500 without it (up to 5000 when paid); truncated: true means the ceiling cut the list. Example: { "sourceUrl": "https://old.example", "targetUrl": "https://new.example", "maxPages": 50 }. Answers with pages (sourceUrl, targetUrl, path), strategy, truncated and, on a free run, sample and allowanceRemaining.get_balance— The prepaid balance and the last 20 ledger entries of the key the request carries in its Authorization: Bearer or X-DiffiCat-Key header. Call it to check what a key can still pay for; request_prepaid_key is the way to obtain a key. For a Pro account’s key the balance is 0.00 and allowance (included pages, pages used, reset time) and overage (amount this period, cap) are returned instead. Free.get_comparison— Status and progress of a job and, once it is terminal, its summary: passed, failed and issuesBySeverity. To wait for the end, call wait_for_comparison instead. Free.get_report— The finished report. Call it first with failedOnly: true: results, total and nextOffset then cover only the pages that failed, while summary still covers every page. Each result is { path, status, failedChecks } by default; responseFormat: "detailed" returns the full per-check fields, diffs and screenshot names. Without failedOnly, a slice of every page's result (offset and limit, default 50 a call, at most 5000; nextOffset points at the next slice). The text block is the plain-text report over the slice; includeText: true also puts it in structuredContent.text. limit: 1 returns the summary with one result. view: "digest" returns one small object per page with its issues and diff percentage and a one-line-per-page text block. Do not call it while the job runs: wait_for_comparison first. Free.get_screenshot— Fetch one screenshot PNG by filename. Call it when a get_report page result or a capture_screenshot result names a screenshot you want to see; a PNG over the inline cap comes back as links.file to fetch with the jobToken. Free.recover_comparison— Returns the job or screenshot the payment credential in _meta paid for, with a new jobToken that replaces the old one; or, when the request carries a key and _meta no credential, the latest job that key paid for (no jobToken: the key reads it). Call it when a paid call’s result never arrived. Do not call it for a free run, which records no credential. Free.request_prepaid_key— Mints a prepaid key and a Checkout link for a human to pay by card, so later paid calls are debited from its balance instead of challenged. Call it when a call was refused for payment and your human prefers a card to a wallet; with a key already on the request it tops that key up instead. Do not call it to learn a price (use start_comparison with dryRun) or while the free allowance still covers the work. Example: { "amountUsd": 10 }. Free.send_feedback— Sends one message to the people who run this service: why a price, a payment path or a result did not fit. Call it when you stop short of a paid call or a result was not what the task needed; a person reads every message. Do not call it to report a job failure you can retry. Example: { "topic": "price", "message": "Too expensive for 200 pages", "quotedAmount": "3.00", "pages": 200 }. Free.start_comparison— Free up to 10 pages a day per client address, no key needed; sample report: https://difficat.com/agents/sample/report.json. Compares Site A against Site B on page existence, content and visual regression, priced on the pages it compares. Call it for a migration or redesign check: sourceUrl and targetUrl let discovery pick the pages (maxPages caps them), or urls names the pairs; then wait_for_comparison until it ends and get_report with failedOnly: true. Not for one page you only want to see: that is capture_screenshot. dryRun: true answers the page count and price (0.02 USD a page, 0.01 beyond 1000) without charging; a job above the remaining free allowance is refused with a payment challenge carrying nextSteps for your human. maxPriceUsd refuses a dearer job before any challenge. Example: { "urls": [{ "source": "https://old.example/a", "target": "https://new.example/a" }] }. Answers with jobId, jobToken, status, pagesCharged and, on a free run, sample and allowanceRemaining.wait_for_comparison— Waits until the job reaches a terminal status (completed, failed or cancelled) or timeoutSeconds pass (default 60, at most 300), then answers like get_comparison: status, progress and, once terminal, the summary with passed, failed and issuesBySeverity. A wait that runs out answers status "running"; call it again. Free.
First seen · last seen · last active