{
  "openapi": "3.0.1",
  "info": {
    "title": "PageSpeed Insights & Core Web Vitals Monitor (Bulk, Alerts)",
    "description": "Bulk PageSpeed Insights checker, no coding: paste URLs and your free Google API key in the form, click Start, download Excel. Lighthouse scores and Core Web Vitals (LCP, INP, CLS, real-user CrUX data) with history and regression alerts.",
    "version": "0.1",
    "x-build-id": "n40C0VBaRFqUeOVhU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alpine-data~pagespeed-core-web-vitals-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alpine-data-pagespeed-core-web-vitals-monitor",
        "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/alpine-data~pagespeed-core-web-vitals-monitor/runs": {
      "post": {
        "operationId": "runs-sync-alpine-data-pagespeed-core-web-vitals-monitor",
        "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/alpine-data~pagespeed-core-web-vitals-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-alpine-data-pagespeed-core-web-vitals-monitor",
        "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": "1. Which pages?",
            "type": "array",
            "description": "Page addresses to check, one per line (with or without https://). Commas also work. Duplicates and invalid lines are skipped for free. You can also add a sitemap below.",
            "items": {
              "type": "string"
            }
          },
          "googleApiKey": {
            "title": "2. Your Google API key (free)",
            "type": "string",
            "description": "Your own free Google API key with the 'PageSpeed Insights API' enabled (and ideally the 'Chrome UX Report API' for real-user data). Takes 2 minutes: console.cloud.google.com -> new project -> APIs & Services -> Library -> enable 'PageSpeed Insights API' -> Credentials -> Create credentials -> API key. Step-by-step guide in the README. Looks like AIzaSy... (39 characters). Stored encrypted; without a valid key nothing runs and nothing is charged."
          },
          "strategy": {
            "title": "3. Device",
            "enum": [
              "mobile",
              "desktop",
              "both"
            ],
            "type": "string",
            "description": "Mobile is what Google uses for ranking. 'Both' checks every page twice (2 charged checks per URL).",
            "default": "mobile"
          },
          "mode": {
            "title": "4. Check type",
            "enum": [
              "full",
              "field"
            ],
            "type": "string",
            "description": "Full audit: Lighthouse scores + lab metrics + real-user Core Web Vitals + top opportunities ($0.006 per page). Field data only: real-user LCP, INP and CLS from the Chrome UX Report, no Lighthouse run ($0.002 per page; only sites with enough Chrome traffic have data).",
            "default": "full"
          },
          "categories": {
            "title": "Lighthouse categories",
            "type": "array",
            "description": "Which Lighthouse scores to calculate (full audit only). Same price for any combination.",
            "items": {
              "type": "string",
              "enum": [
                "performance",
                "seo",
                "accessibility",
                "best-practices"
              ],
              "enumTitles": [
                "Performance",
                "SEO",
                "Accessibility",
                "Best practices"
              ]
            },
            "default": [
              "performance",
              "seo",
              "accessibility",
              "best-practices"
            ]
          },
          "sitemapUrl": {
            "title": "Sitemap URL",
            "type": "string",
            "description": "Optional: a sitemap.xml (or sitemap index) - its pages are added to the list, up to 'Max pages'. Example: https://example.com/sitemap.xml"
          },
          "maxUrls": {
            "title": "Max pages",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper limit of pages per run (from the list and the sitemap together). Protects your budget.",
            "default": 100
          },
          "compareWithPrevious": {
            "title": "Compare with the previous run",
            "type": "boolean",
            "description": "Remembers each page's last score and shows the change (delta) and a regression flag. Use with a schedule (e.g. weekly).",
            "default": true
          },
          "alertOnlyOnRegression": {
            "title": "Only output pages that got worse",
            "type": "boolean",
            "description": "On: the results contain only regressions (performance score dropped by at least the threshold, or Core Web Vitals went from pass to fail). Unchanged pages are still checked, charged and remembered, just not output. You pay per page checked; alerts are free filtering of the output. Ideal with an email or Slack integration.",
            "default": false
          },
          "regressionThreshold": {
            "title": "Regression threshold (score points)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "A page counts as a regression when its performance score drops by at least this many points (0-100 scale).",
            "default": 5
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Separate histories for separate monitors (e.g. one per client). Same name = compared with the last run of that name.",
            "default": "default"
          },
          "maxConcurrency": {
            "title": "Parallel checks",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many pages Google checks at the same time. Google allows about 4 per second per key; 4 is safe.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}