{
  "openapi": "3.0.1",
  "info": {
    "title": "Core Web Vitals Alerts: Score Drops Since Last Run",
    "description": "Check a list of page URLs with Google PageSpeed Insights on your own free API key and get the score, LCP, CLS and INP, plus an alert mode that only returns and bills the URLs whose performance regressed since your last run.",
    "version": "1.0",
    "x-build-id": "srGnfUsUg5eA2Lpiz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~core-web-vitals-regression-alerts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-core-web-vitals-regression-alerts",
        "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/accountable_eel~core-web-vitals-regression-alerts/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-core-web-vitals-regression-alerts",
        "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/accountable_eel~core-web-vitals-regression-alerts/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-core-web-vitals-regression-alerts",
        "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": "Page URLs to check",
            "type": "array",
            "description": "One page URL per line (https:// is added if missing). Each URL is one Google PageSpeed Insights run, so a long list takes a few minutes. Needs your own free Google API key below. Accepted formats: https://example.com, www.example.com/pricing, https://shop.example.com/products/best-seller. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "googleApiKey": {
            "title": "Your Google API key (PageSpeed Insights)",
            "type": "string",
            "description": "Optional but needed for real results. Create a free key in Google Cloud Console (APIs and Services, Credentials), enable the PageSpeed Insights API for the project, about 10 minutes, free up to 25,000 checks a day. This actor never ships or shares a key; yours is used only for this run. Without a key every row comes back as NEEDS_KEY, free, so you can see the shape."
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "strategy": {
            "title": "Device",
            "enum": [
              "mobile",
              "desktop"
            ],
            "type": "string",
            "description": "Which Lighthouse profile to test. Mobile is what Google ranks on. Switching device starts a separate monitoring memory.",
            "default": "mobile"
          },
          "scoreDropPoints": {
            "title": "Alert when the score drops by (points)",
            "type": "integer",
            "description": "Tolerance band for the 0-100 performance score. Lab scores jitter by a few points between identical runs, so a drop smaller than this is STABLE. Default 5.",
            "default": 5
          },
          "metricWorsenPercent": {
            "title": "Alert when LCP, CLS or INP worsen by (%)",
            "type": "integer",
            "description": "A metric counts as regressed only when it moved into a worse Google band (LCP 2500/4000 ms, CLS 0.1/0.25, INP 200/500 ms) AND got at least this much worse than last run. Default 20.",
            "default": 20
          },
          "onlyNewSinceLastRun": {
            "title": "Only return URLs that regressed since the last run (monitoring)",
            "type": "boolean",
            "description": "On: the first run stores a baseline (returned and billed once per URL); after that only URLs that crossed a threshold are returned and billed, unchanged URLs come back as free STABLE rows. Run it on a schedule as an alert. Off: every URL is measured and billed every time.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Optional. Name this monitoring memory so two schedules of this actor stay apart, or keep one memory across a device change. Leave empty to derive one from the device.",
            "default": ""
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "pageUrl",
                "strategy",
                "performanceScore",
                "lcpMs",
                "cls",
                "tbtMs",
                "inpMs",
                "fieldLcpMs",
                "fieldCls",
                "fieldCategory",
                "monitorStatus",
                "regressed",
                "regressions",
                "previousScore",
                "previousLcpMs",
                "previousCls",
                "previousInpMs",
                "previousCheckedAt",
                "reportUrl",
                "urlCount"
              ],
              "enumTitles": [
                "Page tested",
                "Device",
                "Performance score (0-100)",
                "LCP, lab (ms)",
                "CLS, lab",
                "TBT, lab (ms)",
                "INP, real users (ms)",
                "LCP, real users (ms)",
                "CLS, real users",
                "Real-user verdict",
                "Monitoring status",
                "Regressed since last run",
                "What got worse",
                "Previous score",
                "Previous LCP, lab (ms)",
                "Previous CLS, lab",
                "Previous INP (ms)",
                "Previous check",
                "Full PageSpeed report",
                "Billed checks"
              ]
            },
            "default": [
              "pageUrl",
              "strategy",
              "performanceScore",
              "lcpMs",
              "cls",
              "tbtMs",
              "inpMs",
              "fieldLcpMs",
              "fieldCls",
              "fieldCategory",
              "monitorStatus",
              "regressed",
              "regressions",
              "previousScore",
              "previousLcpMs",
              "previousCls",
              "previousInpMs",
              "previousCheckedAt",
              "reportUrl",
              "urlCount"
            ]
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}