{
  "openapi": "3.0.1",
  "info": {
    "title": "MCS Certified Installers Scraper - UK Heat Pump & Solar Leads",
    "description": "From $13 per 1,000 installers, no start fee. The official MCS register of UK heat pump, solar PV and battery installers: email, phone, website, address, MCS cert number, Boiler Upgrade Scheme flag, technologies and regions covered. Filter by technology, region, BUS or miles from a postcode.",
    "version": "0.1",
    "x-build-id": "BD7Zs7cDJx6jfbyo7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~mcs-certified-installers-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-mcs-certified-installers-scraper",
        "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/scrapersdelight~mcs-certified-installers-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-mcs-certified-installers-scraper",
        "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/scrapersdelight~mcs-certified-installers-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-mcs-certified-installers-scraper",
        "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": {
          "technologies": {
            "title": "Technologies",
            "type": "array",
            "description": "Keep installers MCS-certified for ANY of these (the register's own server-side filter - pick several and you get the union; turn on requireAllTechnologies for the intersection). Empty = every technology. 'All heat pumps' = air, ground/water, exhaust-air and solar-assisted, exactly as the MCS form groups them.",
            "items": {
              "type": "string",
              "enum": [
                "solar_pv",
                "battery",
                "ashp",
                "gshp_wshp",
                "eahp",
                "sahp",
                "all_heat_pumps",
                "solar_thermal",
                "biomass",
                "wind_turbine",
                "micro_chp"
              ],
              "enumTitles": [
                "Solar PV",
                "Battery Storage",
                "Air Source Heat Pump",
                "Ground/Water Source Heat Pump",
                "Exhaust Air Heat Pump",
                "Solar Assisted Heat Pump",
                "All Heat Pumps",
                "Solar Heating (solar thermal)",
                "Biomass",
                "Small Wind Turbines",
                "Micro CHP"
              ]
            }
          },
          "requireAllTechnologies": {
            "title": "Require ALL selected technologies",
            "type": "boolean",
            "description": "Off (default): an installer certified for any selected technology is returned. On: only installers certified for every selected technology - e.g. Solar PV + Battery Storage for installers who fit both. Rows removed by this are never delivered and never charged.",
            "default": false
          },
          "regions": {
            "title": "Regions covered",
            "type": "array",
            "description": "Keep installers that say they cover ANY of these areas (MCS's own filter). 'England' = any English region; 'Nationwide' = installers covering all 12 regions. Empty = the whole UK.",
            "items": {
              "type": "string",
              "enum": [
                "england",
                "scotland",
                "wales",
                "northern_ireland",
                "nationwide",
                "eastern",
                "east_midlands",
                "london",
                "north_east",
                "north_west",
                "south_east",
                "south_west",
                "west_midlands",
                "yorkshire_humberside"
              ],
              "enumTitles": [
                "England (any English region)",
                "Scotland",
                "Wales",
                "Northern Ireland",
                "Nationwide (all 12 regions)",
                "Eastern",
                "East Midlands",
                "London",
                "North East",
                "North West",
                "South East",
                "South West",
                "West Midlands",
                "Yorkshire & Humberside"
              ]
            }
          },
          "boilerUpgradeSchemeOnly": {
            "title": "Boiler Upgrade Scheme registered only",
            "type": "boolean",
            "description": "Only installers MCS marks as registered for the Boiler Upgrade Scheme (the GBP 7,500 heat-pump grant) - 1,663 of 5,614 on 2026-09-23. Applied server-side by MCS.",
            "default": false
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Optional text for MCS's own search box (company name words, e.g. \"solar\" or \"Octopus\"). Leave empty for no keyword."
          },
          "nearPostcode": {
            "title": "Near UK postcode",
            "type": "string",
            "description": "Optional. A full UK postcode (\"BS1 4DJ\") or a district (\"BS1\"), located with the free postcodes.io service. Results then come nearest-first with distanceKm and distanceMiles filled. An unknown postcode stops the run before anything is charged."
          },
          "radiusMiles": {
            "title": "Radius (miles)",
            "minimum": 0,
            "type": "integer",
            "description": "With nearPostcode: stop at installers whose office is farther than this many miles away. 0 = no radius (nearest-first over the whole register). Measures from the installer's registered address, not the area they say they cover - use regions for coverage.",
            "default": 0
          },
          "requirePhone": {
            "title": "Only installers with a valid phone",
            "type": "boolean",
            "description": "Skip installers whose published phone is empty or not a UK number (1.2% of the register). Skipped rows are never charged.",
            "default": false
          },
          "requireWebsite": {
            "title": "Only installers with a website",
            "type": "boolean",
            "description": "Skip installers with no usable website (about 45% publish none). Skipped rows are never charged.",
            "default": false
          },
          "maxItems": {
            "title": "Max installers",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many delivered installers (you pay per delivered installer). 0 = no cap: the whole matching register - 5,614 installers for no filters on 2026-09-23.",
            "default": 25
          },
          "concurrency": {
            "title": "Concurrent page requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Listing pages (30 installers each) fetched in parallel. 4 walks the full register in about 30 seconds.",
            "default": 4
          },
          "saveRawPages": {
            "title": "Save raw pages (debug)",
            "type": "boolean",
            "description": "Store the first 40 JSON pages MCS returned in the key-value store as RAW_* records, for auditing.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Off by default - MCS answers Apify's network directly. If Cloudflare ever starts challenging, switch on Apify Proxy with the RESIDENTIAL group (the run summary counts challenges).",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}