{
  "openapi": "3.0.1",
  "info": {
    "title": "UK Planning Application Leads for Trades: Solar, Roofing, HVAC",
    "description": "Find new England planning applications that need your trade: solar PV and batteries, roofing, scaffolding, extensions and lofts, HVAC and glazing. Filter by postcode radius and get address, description, decision status and council link per lead. Official planning.data.gov.uk data.",
    "version": "0.1",
    "x-build-id": "oeaorExsLwBLs56j0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/plym-actor-factory~uk-planning-trade-lead-radar/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-plym-actor-factory-uk-planning-trade-lead-radar",
        "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/plym-actor-factory~uk-planning-trade-lead-radar/runs": {
      "post": {
        "operationId": "runs-sync-plym-actor-factory-uk-planning-trade-lead-radar",
        "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/plym-actor-factory~uk-planning-trade-lead-radar/run-sync": {
      "post": {
        "operationId": "run-sync-plym-actor-factory-uk-planning-trade-lead-radar",
        "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": {
          "trades": {
            "title": "Trades",
            "type": "array",
            "description": "Trade taxonomy ids to match against proposal descriptions. Built-in: solar_pv_battery, roof, scaffold, extension_loft, hvac, glazing. Use \"all\" or leave default for every built-in trade. Custom ids require customTradeKeywords.",
            "default": [
              "solar_pv_battery",
              "roof",
              "scaffold",
              "extension_loft",
              "hvac",
              "glazing"
            ],
            "items": {
              "type": "string"
            }
          },
          "originPostcode": {
            "title": "Origin postcode (optional radius)",
            "type": "string",
            "description": "UK postcode used as the centre of an optional radius filter. Geocoded via public postcodes.io in live mode. Leave empty for nationwide (API coverage) matching.",
            "default": ""
          },
          "radiusMiles": {
            "title": "Radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "When originPostcode is set, keep only applications whose published point (or geocoded address postcode) falls within this radius. 0 / empty = no radius filter.",
            "default": 0
          },
          "organisationEntityIds": {
            "title": "Organisation entity ids (optional)",
            "type": "array",
            "description": "Optional planning.data.gov.uk organisation-entity ids to restrict the live query (LPA / local authority entities). Empty = all organisations present in the API.",
            "default": []
          },
          "customTradeKeywords": {
            "title": "Custom trade keywords (optional)",
            "type": "object",
            "description": "Map of trade id → extra keyword/phrase list (case-insensitive substrings). Extends or adds trades beyond the built-in taxonomy.",
            "default": {}
          },
          "lookbackDays": {
            "title": "Initial lookback days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "When no checkpoint exists, search entry-date this many days back from today (UTC). Subsequent runs resume from stored high-water.",
            "default": 14
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "minimum": 5,
            "maximum": 300,
            "type": "integer",
            "description": "Wall-clock budget for this scheduled catch-up.",
            "default": 55
          },
          "maxEvents": {
            "title": "Max delivered trade leads",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many unique trade-matched leads are delivered (does not include RUN_STATUS).",
            "default": 500
          },
          "resumeFromCheckpoint": {
            "title": "Resume from stored checkpoint",
            "type": "boolean",
            "description": "If true, resume entry-date high-water and seen event_uids from the default Key-Value Store.",
            "default": true
          },
          "sourceMode": {
            "title": "Source mode",
            "enum": [
              "fixture",
              "live"
            ],
            "type": "string",
            "description": "fixture = local/CI / Apify Store daily auto-test default (no network; emits RUN_STATUS only unless emitFixtureDemoEvents=true). live = official planning.data.gov.uk HTTP API.",
            "default": "fixture"
          },
          "emitFixtureDemoEvents": {
            "title": "Emit fixture demo trade leads",
            "type": "boolean",
            "description": "When sourceMode=fixture, if true push fabricated fixture leads (unit/local demos only). Default false so Store daily auto-tests never emit fake leads or charge trade-lead-delivered. Production: leave false and use sourceMode=live. SAMPLE rows only: demo events use placeholder entities (never real companies/IDs), are flagged sample=true / isSample=true, and are NEVER charged.",
            "default": false
          },
          "maxTotalChargeUsd": {
            "title": "Max total charge (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Optional soft budget hint for delivered leads. Platform ACTOR_MAX_TOTAL_CHARGE_USD also applies when set."
          },
          "requestPaceMs": {
            "title": "Request pace (ms)",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Minimum delay between outbound HTTP requests (planning.data.gov.uk and postcodes.io).",
            "default": 250
          },
          "stateKey": {
            "title": "State key (optional)",
            "type": "string",
            "description": "Optional label that pins this monitor's persistent baseline (named key-value store in YOUR Apify account). Leave empty to derive it automatically from the watchlist (and the saved task, if any), so different watchlists/tasks never share state. Set it (e.g. 'client-acme') if you want to edit the watchlist without re-baselining existing entries. The first live run for a new state key only stores the baseline: no change events, no product charge."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}