{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk PageSpeed Insights & Core Web Vitals Checker",
    "description": "Google PageSpeed Insights (Lighthouse) for many URLs: performance, accessibility, SEO scores, LCP, CLS, TBT, real-user Core Web Vitals (CrUX), top fixes, budgets and regression alerts. No API key needed. $2 per 1,000 measurements, failed free.",
    "version": "0.1",
    "x-build-id": "BbS5P1x3vGx4dwYz7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~pagespeed-insights-bulk/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-pagespeed-insights-bulk",
        "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~pagespeed-insights-bulk/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-pagespeed-insights-bulk",
        "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~pagespeed-insights-bulk/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-pagespeed-insights-bulk",
        "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",
            "type": "array",
            "description": "Pages to measure, one per line (full URLs or bare domains like example.com). Up to 10,000 per run. You can also paste text or upload a list file below. Each URL x strategy is one measurement.",
            "items": {
              "type": "string"
            }
          },
          "urlsText": {
            "title": "Paste URLs as text",
            "type": "string",
            "description": "Optional: paste URLs separated by new lines, commas, tabs or spaces (e.g. a column copied from a spreadsheet)."
          },
          "urlSources": {
            "title": "URL list files",
            "type": "array",
            "description": "Optional: upload a .txt or .csv file, or link to one (e.g. a published Google Sheet CSV). Every http(s) URL in the file is measured.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "strategy": {
            "title": "Device",
            "enum": [
              "mobile",
              "desktop",
              "both"
            ],
            "type": "string",
            "description": "mobile = Lighthouse's emulated mid-range phone on a slow 4G connection (what Google uses for ranking); desktop = desktop emulation; both = two measurements per URL (two rows, two charges).",
            "default": "mobile"
          },
          "categories": {
            "title": "Lighthouse categories",
            "type": "array",
            "description": "Scores to return besides performance (always included). Extra categories cost nothing more. Default: all four.",
            "items": {
              "type": "string",
              "enum": [
                "performance",
                "accessibility",
                "best-practices",
                "seo"
              ],
              "enumTitles": [
                "Performance",
                "Accessibility",
                "Best practices",
                "SEO"
              ]
            },
            "default": [
              "performance",
              "accessibility",
              "best-practices",
              "seo"
            ]
          },
          "includeOpportunities": {
            "title": "Top opportunities",
            "type": "boolean",
            "description": "Add the biggest fixes Lighthouse suggests (e.g. \"Reduce unused JavaScript\", \"Render blocking requests\") with the estimated time saved. Free.",
            "default": true
          },
          "csvExport": {
            "title": "CSV file",
            "type": "boolean",
            "description": "Also save PAGESPEED.csv (one row per measurement, the main columns) in the run's key-value store, ready for Sheets or Excel. Free.",
            "default": true
          },
          "minPerformanceScore": {
            "title": "Minimum performance score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Fail rows whose Lighthouse performance score (0-100) is below this, e.g. 90 (Google's \"good\" band) or 50."
          },
          "maxLcpMs": {
            "title": "Maximum LCP (ms, lab)",
            "minimum": 0,
            "type": "integer",
            "description": "Fail rows whose Largest Contentful Paint in the Lighthouse test is above this many milliseconds, e.g. 2500."
          },
          "maxCls": {
            "title": "Maximum CLS (lab)",
            "type": "string",
            "description": "Fail rows whose Cumulative Layout Shift in the Lighthouse test is above this value, e.g. 0.1."
          },
          "maxTbtMs": {
            "title": "Maximum TBT (ms, lab)",
            "minimum": 0,
            "type": "integer",
            "description": "Fail rows whose Total Blocking Time in the Lighthouse test is above this many milliseconds, e.g. 200."
          },
          "maxInpMs": {
            "title": "Maximum INP (ms, real users)",
            "minimum": 0,
            "type": "integer",
            "description": "Fail rows whose real-user Interaction to Next Paint (Chrome UX Report p75) is above this, e.g. 200. Pages without real-user data are not checked."
          },
          "requireCoreWebVitals": {
            "title": "Require passing Core Web Vitals (real users)",
            "type": "boolean",
            "description": "Fail rows whose real-user Core Web Vitals assessment is FAILED (LCP, INP and CLS p75 not all \"good\"). Pages without real-user data are not checked.",
            "default": false
          },
          "minAccessibilityScore": {
            "title": "Minimum accessibility score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Fail rows whose Lighthouse accessibility score is below this (needs the accessibility category)."
          },
          "minBestPracticesScore": {
            "title": "Minimum best-practices score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Fail rows whose Lighthouse best-practices score is below this (needs the best-practices category)."
          },
          "minSeoScore": {
            "title": "Minimum SEO score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Fail rows whose Lighthouse SEO score is below this (needs the seo category)."
          },
          "compareWithPrevious": {
            "title": "Compare with the previous run",
            "type": "boolean",
            "description": "Remember each URL's score and report change (new, stable, improved, regressed), previousScore and scoreChange against the previous run of the same monitor. Use it with an Apify schedule to catch slow releases. Free.",
            "default": false
          },
          "onlyRegressions": {
            "title": "Only output regressions",
            "type": "boolean",
            "description": "Output only rows that got worse (score down by the regression threshold, LCP 50% and 1 s slower, or Core Web Vitals PASSED -> FAILED). Every URL is still measured and charged; the stable ones are listed in SUMMARY.comparison.notShown. The first run of a monitor outputs everything (the baseline). Turns on comparison.",
            "default": false
          },
          "regressionPoints": {
            "title": "Regression threshold (score points)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "A drop of at least this many performance points counts as regressed (a rise as improved). Lighthouse scores vary by about 5 points between runs, so 10 avoids noise.",
            "default": 10
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the saved state (letters, digits, dashes). Use one name per schedule; empty = derived from the first URL, the device and the number of URLs.",
            "default": ""
          },
          "googleApiKey": {
            "title": "Your Google API key (optional)",
            "type": "string",
            "description": "Optional. Not needed: measurements run on our capacity by default. With your own free key (Google Cloud console, enable \"PageSpeed Insights API\", 25,000 measurements per day) Google is called directly with it; the price per measurement is the same. Stored encrypted, never written to the output."
          },
          "source": {
            "title": "Where to measure",
            "enum": [
              "auto",
              "google",
              "lighthouse",
              "lighthouse-tw",
              "lighthouse-us"
            ],
            "type": "string",
            "description": "auto = Google PageSpeed Insights (with real-user Chrome UX Report data), falling back to our own Lighthouse servers if Google's capacity runs out; google = Google only; lighthouse / lighthouse-tw / lighthouse-us = our own Lighthouse servers only (Taiwan residential network or Phoenix, US; slower, about 1 minute per page, no real-user data, at most 2 pages at a time).",
            "default": "auto"
          },
          "maxUrls": {
            "title": "Maximum URLs",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop reading the input after this many distinct URLs (the rest are not measured and not charged).",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Measurements in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many pages are measured at the same time. A Google measurement takes 10-30 s, so 4 does about 10-20 per minute. Our own Lighthouse servers always take at most 2.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}