{
  "openapi": "3.0.1",
  "info": {
    "title": "SEO Audit Tool - SEO Checker, Site Audit & Core Web Vitals",
    "description": "SEO audit tool and site audit crawler for technical SEO, JavaScript sites too: 0-100 score and a fix hint per issue, site report (duplicate titles, broken pages, missing H1, meta, alt, sitemap, hreflang), optional Core Web Vitals. $5 per 1,000 pages; failed pages are free.",
    "version": "0.1",
    "x-build-id": "Ns6JTj8W8gOfimiPc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~seo-audit-crawler/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-seo-audit-crawler",
        "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/tidytools~seo-audit-crawler/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-seo-audit-crawler",
        "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/tidytools~seo-audit-crawler/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-seo-audit-crawler",
        "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",
        "properties": {
          "urls": {
            "title": "URLs or domains",
            "type": "array",
            "description": "Main input (fill this, or `startUrls`). Start pages to audit, one per line: full URLs or bare domains like example.com. Several sites (e.g. one per client) share Max pages fairly and are reported site by site. Up to 100 start URLs. Invalid lines become a row with errorType \"invalid_input\" (not charged) instead of failing the run.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URL list files or request list (optional)",
            "type": "array",
            "description": "Older start URL field, kept for existing API calls. Use it to upload or link a .txt/.csv file of start URLs. Full URLs only here: bare domains such as example.com go in \"URLs or domains\" above. Both fields are combined (up to 100 start URLs).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "crawlScope": {
            "title": "Crawl scope",
            "enum": [
              "domain",
              "host",
              "path",
              "page"
            ],
            "type": "string",
            "description": "Choose which links to follow. domain: whole website, including subdomains (e.g. blog.example.com). host: only the start URL's host; www and bare domain count as one. path: same folder as the start URL; if that folder has no linked pages (common on docs sites with one folder per page), use its parent folder, never the whole site. page: only the start URLs.",
            "default": "domain"
          },
          "maxPages": {
            "title": "Max pages",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop after auditing this many pages in total (all sites together). You pay only for pages audited.",
            "default": 100
          },
          "maxPagesPerSite": {
            "title": "Max pages per site",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "With several sites: audit at most this many pages of each site. Leave empty to share Max pages evenly between the sites (a site with fewer pages leaves its share to the others)."
          },
          "compareSites": {
            "title": "Compare sites side by side",
            "type": "boolean",
            "description": "For two or more sites, add a site comparison matrix and gaps versus the first input site to SUMMARY and REPORT. Scores use only audited pages; use similar page samples for a fair comparison. Adds no charge beyond audited pages.",
            "default": false
          },
          "branding": {
            "title": "White-label report branding (optional)",
            "type": "object",
            "description": "Customize REPORT_HTML only. agencyName overrides reportBrandName; logoUrl must be HTTPS; primaryColor must be #RRGGBB. No extra charge.",
            "properties": {
              "agencyName": {
                "title": "Agency name",
                "type": "string",
                "editor": "textfield",
                "description": "Agency name in the report title."
              },
              "logoUrl": {
                "title": "Logo URL",
                "type": "string",
                "editor": "textfield",
                "description": "Public HTTPS logo image URL. Referenced by the report; not embedded."
              },
              "primaryColor": {
                "title": "Primary color",
                "type": "string",
                "editor": "textfield",
                "description": "Accent color as #RRGGBB."
              },
              "footerText": {
                "title": "Footer text",
                "type": "string",
                "editor": "textfield",
                "description": "Additional footer text."
              },
              "hideTidyToolsCredit": {
                "title": "Hide TidyTools credit",
                "type": "boolean",
                "editor": "checkbox",
                "description": "Hide TidyTools attribution from the report."
              }
            }
          },
          "reportBrandName": {
            "title": "Client report brand name (optional)",
            "type": "string",
            "description": "Show your agency or client-facing brand in the downloadable HTML report title. Leave empty for the TidyTools title. Does not change audit results or price."
          },
          "reportLanguage": {
            "title": "Client report language",
            "enum": [
              "en",
              "zh-TW"
            ],
            "type": "string",
            "description": "Language of labels and explanations in REPORT_HTML. Issue IDs and fix hints stay as returned by the audit.",
            "default": "en"
          },
          "maxDepth": {
            "title": "Max link depth",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "How many clicks away from the start URL to go.",
            "default": 10
          },
          "mode": {
            "title": "Page fetching (HTTP or browser)",
            "enum": [
              "auto",
              "fast",
              "browser"
            ],
            "type": "string",
            "description": "\"Auto\" audits the raw HTML (what search engines fetch first) and uses a real browser only for sites that block plain requests. \"Browser\" always audits the JavaScript-rendered page. Values: auto = Auto (recommended); fast = Raw HTML only; browser = Browser (rendered page).",
            "default": "auto"
          },
          "includeUrlPatterns": {
            "title": "Include URL patterns",
            "type": "array",
            "description": "Optional glob patterns; only matching URLs are audited, e.g. https://example.com/blog/**",
            "items": {
              "type": "string"
            }
          },
          "excludeUrlPatterns": {
            "title": "Exclude URL patterns",
            "type": "array",
            "description": "Optional glob patterns to skip, e.g. **/tag/** or **?page=*",
            "items": {
              "type": "string"
            }
          },
          "useSitemap": {
            "title": "Also audit pages from the sitemap",
            "type": "boolean",
            "description": "Add the URLs listed in the site's XML sitemap to the crawl, so pages that are not linked from the navigation are audited too. The sitemap is always checked for the site report (missing sitemap, sitemap URLs that fail or redirect) even when this is off.",
            "default": false
          },
          "sitemapUrl": {
            "title": "Sitemap URL (optional)",
            "type": "string",
            "description": "Leave empty to find the sitemap automatically (robots.txt, then /sitemap.xml). Set it if your sitemap lives elsewhere."
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Off by default because this Actor is meant for sites you own or are allowed to audit (an audit has to see pages robots.txt may hide from crawlers). Use it only on sites you own or may audit. Turn it on to follow robots.txt: pages it disallows for crawlers are skipped (not charged). Every audited page also reports whether Googlebot is allowed to crawl it (blockedByRobotsTxt).",
            "default": false
          },
          "robotsUserAgent": {
            "title": "Follow robots.txt rules for",
            "enum": [
              "TidyTools",
              "Googlebot",
              "Bingbot"
            ],
            "type": "string",
            "description": "Only used when Respect robots.txt is on: whose rules in robots.txt to follow. TidyTools (default): the group for TidyTools, else the one for all crawlers (User-agent: *). Googlebot or Bingbot: the rules the site gives that search engine, so the audit covers the pages Google or Bing may crawl (desktop SEO crawlers offer the same choice). Many sites block all crawlers (*) but allow Googlebot. Pages are still requested with our own User-Agent.",
            "default": "TidyTools"
          },
          "checkImages": {
            "title": "Check images",
            "type": "boolean",
            "description": "Request every image (up to 30 per page, cached across pages) and report broken images and images larger than 200 KB. Makes the audit slower; no extra charge.",
            "default": false
          },
          "validateStructuredData": {
            "title": "Validate structured data (JSON-LD and Microdata)",
            "type": "boolean",
            "description": "Check JSON-LD and Microdata with the Schema Markup Validator rules and add a structuredData object (errors, eligible rich results, RDFa types) to every page. Does not change the score. No extra charge.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Parallel pages",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many pages are audited at the same time. Lower it for small or slow sites.",
            "default": 10
          },
          "pagespeed": {
            "title": "Measure Core Web Vitals (PageSpeed Insights)",
            "type": "boolean",
            "description": "Measure Core Web Vitals on the start URL(s) and the next pages audited, up to the limit below: performance score, LCP, CLS, TBT, FCP, Speed Index and time to interactive, plus real-user INP/LCP/CLS when Google has field data. Works without any setup: we run Google PageSpeed Insights for you (or our own Lighthouse server when Google's quota is busy; each page's result says which in `source`). Charged per page measured ($0.005); failed measurements are free.",
            "default": false
          },
          "pagespeedStrategy": {
            "title": "Device",
            "enum": [
              "mobile",
              "desktop"
            ],
            "type": "string",
            "description": "Lighthouse device profile for the measurement.",
            "default": "mobile"
          },
          "pagespeedSource": {
            "title": "Where to measure from",
            "enum": [
              "auto",
              "google",
              "lighthouse",
              "lighthouse-tw",
              "lighthouse-us"
            ],
            "type": "string",
            "description": "Lab results depend on where and on what hardware Lighthouse runs, so measure from close to your users: choose Taiwan for sites whose audience is in Asia. A single location is never swapped for another: if it is unavailable, the page is reported as not measured (not charged). Each result says what was used in `source` and `node`. Real-user field data (CrUX) only comes from Google. Your own Google API key below is used only with Automatic or Google.",
            "default": "auto"
          },
          "pagespeedMaxPages": {
            "title": "Max pages to measure",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cost cap: at most this many pages are measured (start URLs first). Each measurement takes 10-60 seconds.",
            "default": 5
          },
          "pagespeedApiKey": {
            "title": "Your own Google API key (optional)",
            "type": "string",
            "description": "Not needed: without a key, pages are measured through our servers. Add your free PageSpeed Insights API key from Google Cloud (APIs & Services > Credentials) only if you want the calls to use your own Google quota. Stored encrypted."
          },
          "compareWithPrevious": {
            "title": "Compare with the previous run",
            "type": "boolean",
            "description": "Monitoring: remember each page's score and issues, and report issues added or resolved per page, the score change, new broken pages and the average score change in SUMMARY and REPORT. Use with a schedule.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name are compared. Leave empty to use the start URL and crawl scope."
          },
          "weeklyChangesDigest": {
            "title": "Weekly regressions digest",
            "type": "boolean",
            "description": "Write WEEKLY_CHANGES (JSON) and WEEKLY_CHANGES_MD (Markdown) with only new issues, score drops and removed pages. Requires Compare with the previous run and an explicit, stable Monitor name. The first run and runs without regressions have count 0. A partial crawl never reports removed pages. No extra charge; a webhook still fires after every run, so downstream automation must check count > 0 before notifying.",
            "default": false
          },
          "httpVia": {
            "title": "Plain HTTP requests from",
            "enum": [
              "auto",
              "backend",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "Some sites block requests from data centers. Auto retries from a second network before falling back to a real browser. If both are refused, Auto also tries our second server (Oracle, different IP) before a real browser.",
            "default": "auto"
          },
          "pageTimeoutSecs": {
            "title": "Time limit per page (seconds)",
            "minimum": 0,
            "maximum": 900,
            "type": "integer",
            "description": "A page that takes longer to read (all retries and the browser fallback included) is reported with errorType \"timeout\" and not charged. 0 = no limit.",
            "default": 120
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}