{
  "openapi": "3.0.1",
  "info": {
    "title": "Technical SEO Audit Crawler — Core Web Vitals & JS",
    "description": "Technical SEO audit of any site: crawl and score every page 0-100 with a fix for every issue. Real Chrome user Core Web Vitals including INP, meta tags, schema, broken links, images and accessibility. Renders JavaScript and gets past Cloudflare blocks that stop other SEO crawlers.",
    "version": "0.1",
    "x-build-id": "HozSFjYiVDDTa2WpA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/acebuilds~seo-audit-crawler/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-acebuilds-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/acebuilds~seo-audit-crawler/runs": {
      "post": {
        "operationId": "runs-sync-acebuilds-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/acebuilds~seo-audit-crawler/run-sync": {
      "post": {
        "operationId": "run-sync-acebuilds-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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "One or more URLs to audit. Include the scheme, e.g. https://example.com",
            "items": {
              "type": "string"
            }
          },
          "crawlPages": {
            "title": "Crawl additional pages",
            "type": "boolean",
            "description": "Follow internal links from the start URLs. Turn off to audit only the URLs you provide.",
            "default": true
          },
          "maxPages": {
            "title": "Max pages",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on pages analyzed. You are charged per page, so this is your budget control.",
            "default": 25
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Pages fetched in parallel. Lower this if a site rate-limits you.",
            "default": 5
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip URLs disallowed by the site's robots.txt. Skipped pages are never fetched and never charged.",
            "default": true
          },
          "excludeUrlPatterns": {
            "title": "Exclude URL patterns",
            "type": "array",
            "description": "Regular expressions or plain substrings. Matching URLs are never crawled or charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeSubdomains": {
            "title": "Include subdomains",
            "type": "boolean",
            "description": "Also follow links to subdomains of the start URL's domain.",
            "default": false
          },
          "fieldData": {
            "title": "Real-user Core Web Vitals",
            "type": "boolean",
            "description": "Look up what real Chrome users actually measured on this site over the last 28 days — LCP, INP, CLS, FCP and TTFB. This is field data, not a lab estimate from a single crawl.",
            "default": true
          },
          "fieldDataPages": {
            "title": "Field-data lookups per run",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many pages get their own real-user lookup. The quota is shared across everyone using this Actor, so it is capped rather than run on every page.",
            "default": 10
          },
          "useUnblocker": {
            "title": "Get past anti-bot blocks",
            "type": "boolean",
            "description": "When a site returns a Cloudflare challenge or a 403, retry through Apify Unblocker, which solves the JavaScript challenge and returns the real page. Most SEO crawlers simply fail here. Only used when a site actually blocks us, so ordinary pages cost nothing extra. Note: this defeats bot detection, NOT logins - pages behind a sign-in form cannot be audited.",
            "default": true
          },
          "renderJavaScript": {
            "title": "Render JavaScript",
            "enum": [
              "auto",
              "always",
              "off"
            ],
            "type": "string",
            "description": "Auto (recommended) renders only pages whose served HTML is an empty app shell, so server-rendered sites cost nothing extra. Always renders every page. Off audits the HTML exactly as the server sends it.",
            "default": "auto"
          },
          "renderTimeoutSecs": {
            "title": "Render timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long a single page may take to render before we fall back to auditing its served HTML. A page is never dropped for timing out.",
            "default": 30
          },
          "renderConcurrency": {
            "title": "Pages rendered in parallel",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Browser tabs open at once. Each one costs memory, so this is capped separately from the crawl's concurrency. Raise it only if you have also raised the run's memory.",
            "default": 2
          },
          "auditMetaTags": {
            "title": "Audit meta tags",
            "type": "boolean",
            "description": "Title, meta description, canonical, viewport, robots and Open Graph.",
            "default": true
          },
          "auditHeadings": {
            "title": "Audit headings",
            "type": "boolean",
            "description": "H1 presence and uniqueness, and skipped heading levels.",
            "default": true
          },
          "auditContent": {
            "title": "Audit content",
            "type": "boolean",
            "description": "Word count, thin content and language declaration.",
            "default": true
          },
          "auditTechnical": {
            "title": "Audit technical SEO",
            "type": "boolean",
            "description": "HTTPS, URL hygiene, DOM size and server response time.",
            "default": true
          },
          "auditPerformance": {
            "title": "Audit performance",
            "type": "boolean",
            "description": "Core Web Vitals from real user data.",
            "default": true
          },
          "auditSchema": {
            "title": "Audit structured data",
            "type": "boolean",
            "description": "JSON-LD presence, detected types and invalid blocks.",
            "default": true
          },
          "auditLinks": {
            "title": "Audit links",
            "type": "boolean",
            "description": "Internal/external counts, empty hrefs and unsafe target=_blank.",
            "default": true
          },
          "auditImages": {
            "title": "Audit images",
            "type": "boolean",
            "description": "Missing alt text and missing width/height, which causes layout shift.",
            "default": true
          },
          "auditAccessibility": {
            "title": "Audit accessibility",
            "type": "boolean",
            "description": "Unlabelled form inputs, unnamed buttons and missing main landmark.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}