{
  "openapi": "3.0.1",
  "info": {
    "title": "Technical SEO Audit Tool - Website SEO Checker & Site Audit",
    "description": "SEO crawler for technical SEO audits, JS sites too: 0-100 SEO score and fix hints per page, site report (duplicate titles, broken pages, missing H1, meta, alt), optional Core Web Vitals. $5/1k pages.",
    "version": "0.1",
    "x-build-id": "lapbqyBHawyzEoTko"
  },
  "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": "Which discovered links to follow. \"Whole website\" includes subdomains such as blog. or shop.; \"Only this host\" stays on the start URL's host (www. and the bare domain count as one). Values: domain = Whole website (incl. subdomains, e.g. blog.example.com); host = Only this host (no other subdomains); path = Same folder as the start URL; 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)."
          },
          "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": "Skip pages that robots.txt disallows for crawlers (they are not charged). Every audited page also reports whether Googlebot is allowed to crawl it (blockedByRobotsTxt).",
            "default": false
          },
          "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."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}