{
  "openapi": "3.0.1",
  "info": {
    "title": "SiteVerdict — Core Web Vitals, Dead Click & SEO Scanner",
    "description": "Real-browser scan on mobile (390px) and desktop: LCP, CLS with the exact elements that shift, TBT, TTFB, page weight, render-blocking files, oversized images, dead clicks, small tap targets, SEO basics and an optional revenue-impact estimate. Top 5 fixes ranked by impact + HTML report.",
    "version": "2.0",
    "x-build-id": "8i7cEZiyCzqKEhk9n"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-speed-revenue-scanner/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-speed-revenue-scanner",
        "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/siteverdict~siteverdict-speed-revenue-scanner/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-speed-revenue-scanner",
        "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/siteverdict~siteverdict-speed-revenue-scanner/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-speed-revenue-scanner",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Websites to scan",
            "type": "array",
            "description": "Home pages or landing pages to scan. One dataset item per URL. A missing https:// is added automatically. In competitor mode the FIRST URL is treated as your site.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "competitorUrls": {
            "title": "Competitors to compare against (optional, up to 5)",
            "type": "array",
            "description": "Adds a side-by-side 'you vs competitors' table: same device, same throttling, same run. Each competitor is billed as one scanned page. Leave empty for a normal audit.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxInternalPages": {
            "title": "Internal pages per site",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Also scan up to this many internal pages (taken from home-page links, same host, robots.txt respected). Scores are averaged across all scanned pages. Every scanned page is billed as one 'page-scanned' event.",
            "default": 0
          },
          "devices": {
            "title": "Devices",
            "enum": [
              "both",
              "mobile",
              "desktop"
            ],
            "type": "string",
            "description": "Mobile = 390x844 px phone with touch and throttling; desktop = 1366x768 px, no throttling.",
            "default": "both"
          },
          "mobileThrottling": {
            "title": "Mobile network & CPU throttling",
            "enum": [
              "slow-4g",
              "fast-4g",
              "none"
            ],
            "type": "string",
            "description": "Slow 4G is the PageSpeed Insights / Lighthouse mobile profile (150 ms RTT, 1.6 Mbps, 4x CPU) - pick it when your client compares with PageSpeed. Fast 4G is a realistic UK/EU 4G connection and gives faster numbers.",
            "default": "slow-4g"
          },
          "runsPerDevice": {
            "title": "Lab runs per device (median)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Load each page this many times per device and report the median (Google recommends 3-5 runs to smooth out lab noise; strongly recommended for monitoring). Each extra run is billed as 'extra-lab-run'.",
            "default": 1
          },
          "testInteractions": {
            "title": "Tap / click response test (INP proxy)",
            "type": "boolean",
            "description": "Taps up to 6 safe elements (menus, accordions, tabs, plain buttons) and times the next paint with Chrome's Event Timing API. Navigation and every non-GET request are blocked during the test, and anything that looks like buy / submit / sign in / consent is never clicked.",
            "default": true
          },
          "verifyDeadClicks": {
            "title": "Verify dead clicks by clicking them",
            "type": "boolean",
            "description": "Clicks each suspected dead click in the same sandbox and watches for any DOM, visual (CSS hover/focus menus), navigation or network reaction. Working elements are removed; confirmed ones are marked 'verifiedByClick'. Strongly reduces false positives.",
            "default": true
          },
          "saveScreenshots": {
            "title": "Save annotated screenshots",
            "type": "boolean",
            "description": "Stores a mobile screenshot with layout-shift elements (red), dead clicks (orange) and the LCP element (blue) outlined, plus close-up crops of the LCP element and the top 3 layout-shift culprits.",
            "default": true
          },
          "googleApiKey": {
            "title": "Google API key for real-user data (optional)",
            "type": "string",
            "description": "Your own Google Cloud API key with the free 'Chrome UX Report API' enabled. Adds real-user Core Web Vitals (LCP, INP, CLS, FCP, TTFB at p75, last 28 days) next to the lab numbers, and makes the revenue estimate use real-user LCP. Billed as 'field-data' only when Google returns data."
          },
          "monthlyVisitors": {
            "title": "Monthly visitors (optional)",
            "minimum": 1,
            "type": "integer",
            "description": "For the revenue-impact estimate. Leave empty for no money estimate."
          },
          "conversionRatePct": {
            "title": "Conversion rate (%)",
            "minimum": 0.01,
            "maximum": 100,
            "type": "number",
            "description": "Share of visits that convert, e.g. 2.1 for 2.1%."
          },
          "averageOrderValue": {
            "title": "Average order / lead value",
            "minimum": 0.01,
            "type": "number",
            "description": "Average revenue per conversion, in your currency."
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO currency code for the estimate, e.g. GBP, EUR, USD.",
            "default": "GBP"
          },
          "conversionLossPerSecondPct": {
            "title": "Conversion loss per extra second (%)",
            "minimum": 0,
            "maximum": 50,
            "type": "number",
            "description": "Benchmark used for the estimate. Default 4.42 (Portent 2019 site-speed study). Replace it with your own data if you have it.",
            "default": 4.42
          },
          "monitoringMode": {
            "title": "Monitoring mode",
            "type": "boolean",
            "description": "Remembers each site's last scan (in a named key-value store in your account) and reports regressions/improvements vs that scan. Schedule the Actor (e.g. daily) to get continuous monitoring.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Separate histories per client or project (e.g. 'client-a-weekly'). Same name = same history.",
            "default": "default"
          },
          "onlyChanged": {
            "title": "Only output sites that changed",
            "type": "boolean",
            "description": "In monitoring mode, sites whose numbers did not change meaningfully are left out of the dataset (they still appear in the SUMMARY record and are still billed, because they were scanned).",
            "default": false
          },
          "alertScoreDrop": {
            "title": "Alert when a score drops by (points)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Overall or performance score drop that counts as a regression.",
            "default": 5
          },
          "alertLcpIncreasePct": {
            "title": "Alert when LCP gets slower by (%)",
            "minimum": 5,
            "maximum": 200,
            "type": "integer",
            "description": "Relative LCP increase that counts as a regression (it must also be at least 300 ms).",
            "default": 20
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook (optional)",
            "type": "string",
            "description": "https://hooks.slack.com/services/... - a message is posted when a site regresses. Billed as 'regression-alert' only when delivered."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Public https:// endpoint (Zapier, Make, n8n, your API) that receives a JSON payload when a site regresses."
          },
          "pdfReport": {
            "title": "Client-ready PDF report",
            "type": "boolean",
            "description": "Saves an A4 PDF per site (not for competitors) with scores, prioritised fixes, screenshots, the LCP breakdown, third-party costs and the revenue estimate. Billed as 'pdf-report' per PDF.",
            "default": false
          },
          "agencyName": {
            "title": "Your agency / brand name",
            "type": "string",
            "description": "Shown in the report title and footer (white label)."
          },
          "agencyLogoUrl": {
            "title": "Logo URL (https)",
            "type": "string",
            "description": "Public https:// image shown at the top of the HTML and PDF report."
          },
          "reportAccentColor": {
            "title": "Accent colour",
            "type": "string",
            "description": "Hex colour for the report header line, e.g. #0f766e."
          },
          "aiProvider": {
            "title": "AI fix provider",
            "enum": [
              "none",
              "anthropic",
              "openai"
            ],
            "type": "string",
            "description": "Optional. Uses YOUR own API key to turn the top 5 findings into concrete code/config changes for the detected platform (WordPress, Shopify, Next.js...). Only scan evidence is sent (URLs, selectors, file names, metrics, a trimmed <head>). Billed as 'ai-fix-pack' per site only when fixes are returned; your LLM usage is billed by your provider.",
            "default": "none"
          },
          "aiApiKey": {
            "title": "AI API key",
            "type": "string",
            "description": "Your Anthropic or OpenAI API key. Never logged or stored in the output."
          },
          "aiModel": {
            "title": "AI model (optional)",
            "type": "string",
            "description": "Leave empty for the default (Anthropic: claude-sonnet-5-5; OpenAI: gpt-4.1-mini)."
          },
          "brokenLinkSample": {
            "title": "Internal links to check",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How many internal links from the home page to test for 4xx/5xx errors (light HEAD requests). 0 = skip.",
            "default": 15
          },
          "saveEvidence": {
            "title": "Save evidence pack",
            "type": "boolean",
            "description": "Stores a JSON evidence record per site (timestamps, user agents, HAR-lite request list with timings, screenshot links) in the key-value store.",
            "default": true
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages that robots.txt disallows for all user agents (not billed). Turn off only for sites you own or are authorised to test.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrent sites",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Sites scanned in parallel. Keep it low (1-2) for the most accurate timings; raise memory if you raise this.",
            "default": 2
          },
          "settleTimeSecs": {
            "title": "Wait after load (seconds)",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Extra time after the load event to catch late layout shifts and long tasks.",
            "default": 2
          },
          "navigationTimeoutSecs": {
            "title": "Page load timeout (seconds)",
            "minimum": 15,
            "maximum": 120,
            "type": "integer",
            "description": "Maximum time to wait for the load event.",
            "default": 45
          },
          "userAgent": {
            "title": "Custom user agent (optional)",
            "type": "string",
            "description": "Leave empty to use standard Chrome desktop / Android user agents with a 'SiteVerdict-SpeedScanner' token (like PageSpeed's 'Chrome-Lighthouse')."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Use Apify Proxy with a country to measure from your customers' region (proxies add latency, so timings will be a little slower).",
            "default": {
              "useApifyProxy": 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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}