{
  "openapi": "3.0.1",
  "info": {
    "title": "Crawl Integrity Verifier (Anti-Cloaking)",
    "description": "Fetches the same URL under several identities - real browser, declared AI crawlers, anonymous client, datacenter proxy - and returns a semantic divergence score, a cloaking verdict and the diff. Filters timestamps, session ids, nonces, ads and element reordering so only meaningful differences count.",
    "version": "0.1",
    "x-build-id": "F46Qvki5Wx1TfC9Ip"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ernestmarza~crawl-integrity-verifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ernestmarza-crawl-integrity-verifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/ernestmarza~crawl-integrity-verifier/runs": {
      "post": {
        "operationId": "runs-sync-ernestmarza-crawl-integrity-verifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/ernestmarza~crawl-integrity-verifier/run-sync": {
      "post": {
        "operationId": "run-sync-ernestmarza-crawl-integrity-verifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "URLs to verify",
            "type": "array",
            "description": "The pages to check. Each one is fetched once per route and scored independently. Up to 200 per run. Verifying the exact page an agent will act on - a product page, an article, a listing - tells you far more than verifying a homepage, which is usually a static CDN shell with nothing to differentiate.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "routes": {
            "title": "Routes (identities to compare)",
            "uniqueItems": true,
            "type": "array",
            "description": "Which identities to fetch each URL under. 'browser' is always included: it is the reference every other route is measured against. Keep 'browser-control' enabled unless you have a reason not to - it is a second fetch under the identical browser identity, and its divergence is the page's own noise floor, which every other score is corrected against. Without it, scores are measured against zero and any page with a live element looks suspicious.",
            "items": {
              "type": "string",
              "enum": [
                "browser",
                "browser-control",
                "claudebot",
                "gptbot",
                "perplexitybot",
                "meta-externalagent",
                "googlebot",
                "no-user-agent",
                "generic-client",
                "automation-tells",
                "datacenter-proxy",
                "residential-proxy"
              ],
              "enumTitles": [
                "Real browser (reference, always on)",
                "Real browser again (control, measures the noise floor)",
                "ClaudeBot",
                "GPTBot",
                "PerplexityBot",
                "Meta external agent",
                "Googlebot",
                "No user agent",
                "Generic HTTP client (curl)",
                "Browser with automation tells (headless)",
                "Browser via datacenter proxy",
                "Browser via residential proxy (paid plans only)"
              ]
            },
            "default": [
              "browser",
              "browser-control",
              "claudebot",
              "gptbot",
              "no-user-agent",
              "automation-tells",
              "datacenter-proxy"
            ]
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for each individual fetch before giving up on that route.",
            "default": 30
          },
          "delayBetweenRoutesMs": {
            "title": "Delay between routes (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Pause between the fetches for one URL. Routes run sequentially on purpose: firing six simultaneous requests at one URL is itself an automation signal and would change the thing being measured. Raise this on rate-limited sites.",
            "default": 500
          },
          "maxDiffsReported": {
            "title": "Maximum route pairs detailed per URL",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many route comparisons to include in full in semanticDiffs, worst first. The verdict and the score always consider every route regardless of this setting.",
            "default": 10
          },
          "includeBlockText": {
            "title": "Include the text of differing blocks",
            "type": "boolean",
            "description": "Include the actual text that differs, truncated to 200 characters per block. Turn this off for a smaller, quotation-free result when you only need the score and the verdict.",
            "default": true
          },
          "failOnCloaked": {
            "title": "Fail the run if any URL is cloaked",
            "type": "boolean",
            "description": "Exit with a failed run when any URL returns a 'cloaked' verdict. For wiring this into a pipeline that should stop rather than proceed on data it cannot trust. Results are still written in full before the run fails.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}