{
  "openapi": "3.0.1",
  "info": {
    "title": "Building Permit Monitor — 30 US Cities, New Permits, No Login",
    "description": "Watch 30 US cities (NYC, LA, Chicago, SF, Seattle, Denver, Boston and more) and get only NEW building permits since the last run, filtered by type, keyword, value or contractor, with address, coordinates, value and contractor license. Daily schedule. No login. MCP-ready. $10 per 1,000 permits.",
    "version": "1.0",
    "x-build-id": "mH12xiJ5fbMDmta4A"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/chimerical_quicklime~building-permit-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-chimerical_quicklime-building-permit-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/chimerical_quicklime~building-permit-monitor/runs": {
      "post": {
        "operationId": "runs-sync-chimerical_quicklime-building-permit-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/chimerical_quicklime~building-permit-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-chimerical_quicklime-building-permit-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": {
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "City keys to monitor: nyc, los-angeles, chicago, san-francisco, seattle, austin, denver, boston, philadelphia, nashville, washington-dc, detroit, fort-worth, charlotte, raleigh, columbus, cleveland, minneapolis, miami, san-antonio, pittsburgh, cincinnati, mesa, tucson, tacoma, tempe, scottsdale, memphis, montgomery-county-md, portland. Use \"all\" for every live city. (dallas is available but its source stopped in Nov 2024.)",
            "default": [
              "nyc",
              "los-angeles",
              "chicago"
            ],
            "items": {
              "type": "string"
            }
          },
          "permitTypes": {
            "title": "Permit types / work classes",
            "type": "array",
            "description": "Case-insensitive substrings matched against the permit type and work class, e.g. solar, electrical, roof, plumbing, demolition, new building. A permit matches if any term matches. Empty = all types.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minValue": {
            "title": "Minimum job value (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only permits whose estimated/declared value is at least this amount. 0 = no minimum (permits without a published value are kept).",
            "default": 0
          },
          "keywords": {
            "title": "Description keywords",
            "type": "array",
            "description": "Case-insensitive substrings matched against the work description (and type/class). OR-ed. Empty = no keyword filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "contractors": {
            "title": "Contractors",
            "type": "array",
            "description": "Case-insensitive substrings matched against the contractor name. Useful for tracking competitors or your own crews. Empty = all contractors.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "lookbackDays": {
            "title": "Lookback window (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Only consider permits issued within this many days. 7 is a safe overlap for a daily schedule; some cities publish with a 2-4 week lag (see README).",
            "default": 7
          },
          "maxNewPerCity": {
            "title": "Max new permits per city per run",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap per city. Permits beyond the cap stay unseen and are emitted on the next run.",
            "default": 5
          },
          "maxItems": {
            "title": "Max permits per run (all cities)",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Overall cap on emitted records per run.",
            "default": 10
          },
          "firstRunMode": {
            "title": "First run mode",
            "enum": [
              "emitAll",
              "baseline"
            ],
            "type": "string",
            "description": "What to do when the monitor has no saved state yet. emitAll: treat every current match as new and emit it. baseline: silently record every current match as seen and emit nothing, so the next scheduled run reports only what is new since.",
            "default": "emitAll"
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Optional. After each run a JSON summary {monitorId, runAt, newCount, statusChangeCount, cities{...}, permits[first 50]} is POSTed here (Slack/Zapier/Make/your API).",
            "default": ""
          },
          "monitorId": {
            "title": "Monitor ID",
            "type": "string",
            "description": "Name of this watchlist. Each monitor ID keeps its own seen-state in a key-value store named permit-monitor-<hash>, so you can run several profiles (e.g. \"solar-southwest\", \"roofing-tx\") side by side.",
            "default": "default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}