{
  "openapi": "3.0.1",
  "info": {
    "title": "Building Permits Open Data Scraper",
    "description": "Pull building permit records from US city and county Socrata open-data portals (Chicago, NYC, San Francisco, Los Angeles, Seattle, Austin and more) into one normalized JSON schema: permit number, type, status, address, coordinates, dates, valuation, contractor company. No login, pay per permit.",
    "version": "0.1",
    "x-build-id": "ng5CHT06RjkKQkUr4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/jonoworks~building-permits-open-data/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-jonoworks-building-permits-open-data",
        "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/jonoworks~building-permits-open-data/runs": {
      "post": {
        "operationId": "runs-sync-jonoworks-building-permits-open-data",
        "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/jonoworks~building-permits-open-data/run-sync": {
      "post": {
        "operationId": "run-sync-jonoworks-building-permits-open-data",
        "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 / counties",
            "type": "array",
            "description": "Which built-in Socrata permit datasets to pull. Each is processed one after another. Leave empty if you only want to use a custom portal below.",
            "items": {
              "type": "string",
              "enum": [
                "chicago",
                "nyc",
                "nyc_bis",
                "sf",
                "la",
                "seattle",
                "austin",
                "cincinnati",
                "mesa",
                "montgomery_county_md_residential",
                "montgomery_county_md_commercial",
                "baton_rouge",
                "marin_county",
                "cambridge"
              ],
              "enumTitles": [
                "Chicago, IL (Building Permits)",
                "New York City, NY (DOB NOW: Build - Approved Permits)",
                "New York City, NY (legacy DOB BIS Permit Issuance)",
                "San Francisco, CA (Building Permits)",
                "Los Angeles, CA (Building Permits Issued 2020-present)",
                "Seattle, WA (Building Permits)",
                "Austin, TX (Issued Construction Permits)",
                "Cincinnati, OH (Building Permits)",
                "Mesa, AZ (Building Permits)",
                "Montgomery County, MD (Residential Permits)",
                "Montgomery County, MD (Commercial Permits)",
                "East Baton Rouge Parish, LA (Building Permits)",
                "Marin County, CA (Building Permits)",
                "Cambridge, MA (Building Permits: Addition/Alteration)"
              ]
            },
            "default": [
              "chicago",
              "nyc"
            ]
          },
          "custom": {
            "title": "Custom Socrata portal",
            "type": "object",
            "description": "Optional. Pull any other Socrata dataset: {\"domain\": \"data.example.gov\", \"datasetId\": \"abcd-1234\", \"fieldMap\": {\"permitNumber\": \"permit_no\", \"issuedDate\": \"issue_date\", \"permitType\": \"type\", \"estimatedCost\": \"valuation\", \"address\": \"site_address\"}}. fieldMap keys are normalized output field names, values are the dataset's column names. Unmapped columns are passed through (except columns that look like personal owner/applicant data). issuedDate is needed for date filters and ordering."
          },
          "issuedAfter": {
            "title": "Issued on or after",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional ISO date (YYYY-MM-DD). Only permits issued on or after this date."
          },
          "issuedBefore": {
            "title": "Issued before",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional ISO date (YYYY-MM-DD). Only permits issued before this date (exclusive)."
          },
          "permitTypeContains": {
            "title": "Permit type contains",
            "type": "string",
            "description": "Optional, case-insensitive substring match on the permit type field, e.g. \"new construction\", \"demolition\", \"solar\", \"plumbing\"."
          },
          "minEstimatedCost": {
            "title": "Minimum estimated cost",
            "minimum": 0,
            "type": "number",
            "description": "Optional. Skip permits whose declared valuation / estimated cost is below this amount (USD). Datasets without a cost field ignore this filter."
          },
          "maxResultsPerCity": {
            "title": "Maximum permits per city",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop each city after this many permits. Each permit is one charged result.",
            "default": 500
          },
          "includeRaw": {
            "title": "Include raw record",
            "type": "boolean",
            "description": "Attach the untouched original portal record under `raw`. Note: raw records may contain fields the normalized output deliberately omits (see Data privacy in the README).",
            "default": false
          },
          "appToken": {
            "title": "Socrata app token",
            "type": "string",
            "description": "Optional. A free Socrata application token, sent as X-App-Token for higher rate limits. Works without one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}