{
  "openapi": "3.0.1",
  "info": {
    "title": "PageSpeed Lighthouse Audit - Bulk Core Web Vitals & SEO Score",
    "description": "For SEO agencies and site owners: Lighthouse 13 performance, accessibility, best-practices and SEO scores, Core Web Vitals (LCP, CLS, TBT) and top fixes per URL. No API key, no PageSpeed quota. Monitor reports only real moves (scores drift 10-16 points on their own). Unauditable pages are free.",
    "version": "0.1",
    "x-build-id": "THF8uGV7K5NgoJBaD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~pagespeed-lighthouse-audit/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-pagespeed-lighthouse-audit",
        "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/neverempty~pagespeed-lighthouse-audit/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-pagespeed-lighthouse-audit",
        "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/neverempty~pagespeed-lighthouse-audit/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-pagespeed-lighthouse-audit",
        "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 to audit",
            "type": "array",
            "description": "Page URLs to audit with Google Lighthouse, one per line (1 to 500 per run). A URL without http:// or https:// is read as https://. The same URL given twice (also when only the #fragment differs) is audited and charged once. Pages are audited one at a time (about 10 to 65 seconds each), so for long lists raise the run timeout. If this is empty, the example URL https://github.com/apify/crawlee is audited.",
            "items": {
              "type": "string"
            }
          },
          "strategy": {
            "title": "Device (PageSpeed Insights strategy)",
            "enum": [
              "mobile",
              "desktop",
              "both"
            ],
            "type": "string",
            "description": "mobile = Lighthouse's default mobile run (Moto G Power screen, slow 4G and 4x CPU slowdown, simulated), the same settings PageSpeed Insights uses for its mobile tab. desktop = Lighthouse's desktop settings. both = two rows per URL (one mobile, one desktop), each charged as one audit.",
            "default": "mobile"
          },
          "categories": {
            "title": "Lighthouse categories",
            "type": "array",
            "description": "Which Lighthouse categories to score (0-100). performance includes the Core Web Vitals lab metrics (LCP, CLS, TBT) and the list of improvements; accessibility, best-practices and seo list the checks that failed. agentic-browsing is Lighthouse 13's newer category (llms.txt, agent accessibility tree, WebMCP). Asking for fewer categories does not change the price.",
            "items": {
              "type": "string",
              "enum": [
                "performance",
                "accessibility",
                "best-practices",
                "seo",
                "agentic-browsing"
              ],
              "enumTitles": [
                "Performance",
                "Accessibility",
                "Best Practices",
                "SEO",
                "Agentic Browsing"
              ]
            },
            "default": [
              "performance",
              "accessibility",
              "best-practices",
              "seo"
            ]
          },
          "maxOpportunities": {
            "title": "Improvements to list per page",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "How many performance improvements (Lighthouse insights and diagnostics that did not pass, largest estimated saving first) to include in the opportunities column. 0 leaves the column empty.",
            "default": 10
          },
          "pageLoadTimeoutSecs": {
            "title": "Page load time limit (seconds)",
            "minimum": 15,
            "maximum": 90,
            "type": "integer",
            "description": "Lighthouse's maxWaitForLoad: how long Lighthouse waits for the page to finish loading before it scores what it has (it then adds a run warning). 45 is Lighthouse's default.",
            "default": 45
          },
          "onlyChanges": {
            "title": "Monitor mode: only pages whose score moved",
            "type": "boolean",
            "description": "Compare each page with its usual score (the median of up to 8 earlier audits under the same watchName) and return only pages where a category score moved by its threshold or more, and by more than the range that page has shown before. A move is only reported when a second audit, run straight away, moved the same way too, so normal Lighthouse score noise is not reported as a change. The first run audits each page twice (to learn its usual score and range) and returns it once as first-check. Pages that did not move come back as free no-change rows and are charged as one url-checked event each (the Lighthouse run itself), not as an audit.",
            "default": false
          },
          "watchName": {
            "title": "Watch name",
            "type": "string",
            "description": "Optional name for this watch list (letters, digits, dot, dash, underscore; up to 40). Use a different name for each separate schedule so their remembered scores do not mix. When set without monitor mode, every page is returned with its changeType against the remembered scores."
          },
          "performanceChangeThreshold": {
            "title": "Performance change threshold (points)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "In monitor mode, how many points (0-100 scale) the performance score has to move from its usual score to count as a change. The performance score moves on its own between runs: in our own runs the same page ranged 10 to 16 points over 5 to 6 audits (for example 64 to 76). 10 keeps most of that noise out; a page that has shown a wider range needs a correspondingly bigger move.",
            "default": 10
          },
          "changeThreshold": {
            "title": "Other categories change threshold (points)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "In monitor mode, how many points the accessibility, best-practices, SEO (and agentic-browsing) scores have to move to count as a change. These scores only move when the page itself changes (or a third-party script behaves differently), so a smaller threshold works.",
            "default": 5
          },
          "resetMonitoringState": {
            "title": "Forget the remembered scores for this watch",
            "type": "boolean",
            "description": "Start this watch from scratch: every page is returned again as first-check.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}