Api Endpoint

DiffiCat

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. Priced on the pages it compares (the urls list, or the pages discovery finds, at most the optional maxPages ceiling), no page limit: 0.02 USD per page for the first 1000, 0.01 USD beyond, charged upfront.

Open interactive test console

Offering

Provider
app.difficat.com
Method
POST
Offering type
Api Endpoint
Transport type
http
Category
Infrastructure
Delivery
Not provided
Pricing model
Not provided
x402 version
2

Endpoint context

URL
https://app.difficat.com/api/v1/jobs
MIME type
Not provided
First seen
2026-10-16T01:50:24.663Z
Last seen
Tags
migration, visual-regression, testing

Payment pricing

x402 payment terms are the authoritative price for calling this endpoint.

Payment option 1
0.1 USDC
Atomic price: 100000 · Network: eip155:8453 · Asset: USDC · Scheme: exact
Raw x402 terms
[
  {
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "100000",
    "payTo": "0x91805ccDcB0aF529FFa510Efc494786f19d4c257"
  }
]

Observed health

Status
Healthy
Latest latency
152 ms
Average latency
437 ms
HTTP status
204
Last checked
Reachability
100% over 15 checks

Latency is measured to the first response headers. A reachable result does not verify response accuracy or merchant identity.

Input schema

{
  "additionalProperties": false,
  "properties": {
    "body": {
      "anyOf": [
        {
          "required": [
            "sourceUrl"
          ]
        },
        {
          "required": [
            "urls"
          ]
        }
      ],
      "properties": {
        "callbackUrl": {
          "description": "Optional https URL (port 443) that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job.",
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        },
        "checkMode": {
          "description": "What each page is checked on: full (existence, content and visual, the default), text-only (existence and content, no screenshots) or existence-only (only that every page exists and answers, as for a site translated into another language; content and visual are reported as skipped with reason not-requested).",
          "enum": [
            "full",
            "text-only",
            "existence-only"
          ],
          "type": "string"
        },
        "dryRun": {
          "description": "Quote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free allowance is not used and no job starts; the same body without dryRun is priced from the retained result.",
          "type": "boolean"
        },
        "maxPages": {
          "description": "Optional ceiling on the pages compared and charged for. The job is priced on the pages it compares: the urls list, or the pages discovery finds, at most this many. There is no page limit. maxPages: 1 without sitemapUrl compares exactly the given sourceUrl and targetUrl, with no discovery.",
          "minimum": 1,
          "type": "integer"
        },
        "maxPriceUsd": {
          "description": "Optional spend cap in USD. A job priced above it is refused before any challenge, so an auto-paying client is never asked for more.",
          "exclusiveMinimum": 0,
          "type": "number"
        },
        "sitemapUrl": {
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        },
        "sourceAuth": {
          "properties": {
            "password": {
              "description": "Password for HTTP basic auth.",
              "type": "string"
            },
            "username": {
              "description": "Username for HTTP basic auth.",
              "type": "string"
            }
          },
          "required": [
            "username",
            "password"
          ],
          "type": "object"
        },
        "sourceUrl": {
          "description": "Site A, the reference site (full URL). Required unless urls is given.",
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        },
        "targetAuth": {
          "properties": {
            "password": {
              "description": "Password for HTTP basic auth.",
              "type": "string"
            },
            "username": {
              "description": "Username for HTTP basic auth.",
              "type": "string"
            }
          },
          "required": [
            "username",
            "password"
          ],
          "type": "object"
        },
        "targetUrl": {
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        },
        "threshold": {
          "description": "Visual diff tolerance as a fraction from 0 (exact) to 1: 0.05 means 5%. The web app takes a percentage; the API does not.",
          "maximum": 1,
          "minimum": 0,
          "type": "number"
        },
        "urls": {
          "description": "Explicit page pairs to compare (at most 50000); skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl.",
          "items": {
            "properties": {
              "source": {
                "description": "Page URL on Site A.",
                "format": "uri",
                "maxLength": 2048,
                "type": "string"
              },
              "target": {
                "description": "The same page's URL on Site B.",
                "format": "uri",
                "maxLength": 2048,
                "type": "string"
              }
            },
            "required": [
              "source",
              "target"
            ],
            "type": "object"
          },
          "maxItems": 50000,
          "minItems": 1,
          "type": "array"
        },
        "viewportWidth": {
          "maximum": 2560,
          "minimum": 320,
          "type": "integer"
        }
      },
      "type": "object"
    },
    "bodyType": {
      "enum": [
        "json"
      ],
      "type": "string"
    },
    "method": {
      "enum": [
        "POST"
      ],
      "type": "string"
    },
    "type": {
      "const": "http",
      "type": "string"
    }
  },
  "required": [
    "type",
    "method",
    "bodyType",
    "body"
  ],
  "type": "object"
}

Output schema

{
  "properties": {
    "example": {
      "type": "object"
    },
    "type": {
      "type": "string"
    }
  },
  "required": [
    "type"
  ],
  "type": "object"
}