{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk PageSpeed & Lighthouse Checker: Core Web Vitals from CSV",
    "description": "Google PageSpeed Insights (Lighthouse) scores, Core Web Vitals and top speed fixes for every URL in an Apify dataset, CSV or Google Sheet, keeping every original column. Inputs: datasetId or fileUrl, strategy. Charged per completed report. Agent-ready: x402, MCP.",
    "version": "0.1",
    "x-build-id": "E4DQd4v4F7eI10eoT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nerolabs~bulk-pagespeed-checker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nerolabs-bulk-pagespeed-checker",
        "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/nerolabs~bulk-pagespeed-checker/runs": {
      "post": {
        "operationId": "runs-sync-nerolabs-bulk-pagespeed-checker",
        "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/nerolabs~bulk-pagespeed-checker/run-sync": {
      "post": {
        "operationId": "run-sync-nerolabs-bulk-pagespeed-checker",
        "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": {
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "An Apify dataset whose rows each hold a website or page URL. Use the picker so the run is allowed to read it. Leave empty to use a file URL or inline data instead."
          },
          "fileUrl": {
            "title": "File URL (CSV, Excel, JSON or Google Sheet)",
            "type": "string",
            "description": "A public link to a CSV, TSV, Excel (.xlsx), JSON or JSON Lines file, or a Google Sheet shared as 'anyone with the link'. Used when no dataset is set."
          },
          "data": {
            "title": "Data (inline)",
            "type": "array",
            "description": "Rows as a JSON array, each with a website or URL field. Used when neither a dataset nor a file URL is set."
          },
          "fileFormat": {
            "title": "File format",
            "enum": [
              "auto",
              "csv",
              "tsv",
              "json",
              "jsonl",
              "xlsx"
            ],
            "type": "string",
            "description": "How to read the file URL. 'Detect automatically' works from the extension, the content type and the first bytes.",
            "default": "auto"
          },
          "urlField": {
            "title": "URL field",
            "type": "string",
            "description": "The column holding each website or page, for example 'website' or 'url'. Leave empty to detect it automatically. Bare domains, full URLs with paths and even an email address all work: 'bbc.co.uk' is tested as 'https://bbc.co.uk/', and a path such as '/pricing' is kept, so you can audit specific pages."
          },
          "strategy": {
            "title": "Device",
            "enum": [
              "mobile",
              "desktop",
              "both"
            ],
            "type": "string",
            "description": "Google tests the page as a mid-range phone on a slow connection, or as a computer. Google ranks on the mobile version, so most people want mobile. 'Both' runs two tests per page and adds mobile* and desktop* columns side by side.",
            "default": "mobile"
          },
          "categories": {
            "title": "Scores to include",
            "uniqueItems": true,
            "type": "array",
            "description": "Which Lighthouse scores to return. The price is the same whichever you pick; leaving some out makes each test a little faster.",
            "items": {
              "type": "string",
              "enum": [
                "performance",
                "accessibility",
                "best-practices",
                "seo"
              ],
              "enumTitles": [
                "Performance (speed)",
                "Accessibility",
                "Best practices",
                "SEO"
              ]
            },
            "default": [
              "performance",
              "accessibility",
              "best-practices",
              "seo"
            ]
          },
          "maxOpportunities": {
            "title": "Fixes to list per page",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "How many of Google's 'what would make this faster' suggestions to return per page, biggest estimated time saving first (for example 'Reduce unused JavaScript (Est savings of 588 KiB)'). 0 turns them off.",
            "default": 5
          },
          "keep": {
            "title": "Rows to keep",
            "enum": [
              "all",
              "slow",
              "fast",
              "cwv_fail",
              "problems"
            ],
            "type": "string",
            "description": "Which rows end up in the results. Filtering happens after testing, so it does not change what a run costs.",
            "default": "all"
          },
          "slowBelowScore": {
            "title": "Slow means a performance score under",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Sets the 'Slow sites only' and 'Fast sites only' filters and the slow count in the summary. Google's own bands: 90 and up is good, 50 to 89 needs improvement, under 50 is poor.",
            "default": 50
          },
          "googleApiKey": {
            "title": "Google API key (optional)",
            "type": "string",
            "description": "Optional. The Actor includes its own key, so you do not need one. Add your own free Google PageSpeed Insights API key only if you run very large lists and want your own daily allowance (25,000 tests a day). Stored encrypted and never shown in the results."
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many pages Google tests at once. Each test takes Google 10 to 90 seconds, so this is what makes big lists quick. Lower it if you see 'rate_limited' rows.",
            "default": 8
          },
          "requestTimeoutSecs": {
            "title": "Per-test timeout (seconds)",
            "minimum": 30,
            "maximum": 300,
            "type": "integer",
            "description": "How long to wait for Google to finish one test. Heavy pages can genuinely take over a minute. A test that times out is retried once and is never charged.",
            "default": 150
          },
          "maxItems": {
            "title": "Max rows to test",
            "minimum": 1,
            "type": "integer",
            "description": "A safety cap on how many rows are read from the input. Leave empty for no cap (up to 10,000)."
          },
          "exportFormats": {
            "title": "Also export a file",
            "uniqueItems": true,
            "type": "array",
            "description": "Optionally write the results as a real downloadable CSV and/or Excel file as well as the dataset.",
            "items": {
              "type": "string",
              "enum": [
                "csv",
                "xlsx"
              ],
              "enumTitles": [
                "CSV",
                "Excel (.xlsx)"
              ]
            }
          },
          "outputDatasetName": {
            "title": "Append results to a named dataset",
            "type": "string",
            "description": "Optional. The name of a dataset to append every run's results to, so a scheduled weekly speed check builds one growing history instead of a new dataset each time."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Optional. When the run finishes, the summary (average scores, slowest pages, most common fixes, download links) is POSTed here as JSON, so a scheduled speed watch can report into Slack, Zapier, Make, n8n or your own API."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}