{
  "openapi": "3.0.1",
  "info": {
    "title": "Municipal Agenda Keyword Radar",
    "description": "Monitor US city-council agendas for your keywords: zoning, data centers, short-term rentals, competitors. Official Legistar + PrimeGov APIs, no proxies. Agenda-item snippets with links; alert mode sends only NEW matches to your webhook. Pay per match.",
    "version": "0.0",
    "x-build-id": "BUnA6eQOWgOUxq93u"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/searchandfind~municipal-agenda-keyword-radar/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-searchandfind-municipal-agenda-keyword-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/searchandfind~municipal-agenda-keyword-radar/runs": {
      "post": {
        "operationId": "runs-sync-searchandfind-municipal-agenda-keyword-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/searchandfind~municipal-agenda-keyword-radar/run-sync": {
      "post": {
        "operationId": "run-sync-searchandfind-municipal-agenda-keyword-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",
        "required": [
          "keywords"
        ],
        "properties": {
          "keywords": {
            "title": "Keywords to watch",
            "type": "array",
            "description": "Words or phrases to find in council meeting agendas (case-insensitive, whole-word). Examples: <code>data center</code>, <code>short-term rental</code>, <code>rezoning</code>, <code>battery storage</code>, your company or a competitor's name.",
            "items": {
              "type": "string"
            }
          },
          "legistarClients": {
            "title": "Legistar cities",
            "type": "array",
            "description": "Cities on Legistar InSite. Use the subdomain of <code>{city}.legistar.com</code> — e.g. <code>seattle</code> for seattle.legistar.com. Pasting the full URL also works. Hundreds of US cities and counties use Legistar; check <code>yourcity.legistar.com</code>.",
            "items": {
              "type": "string"
            }
          },
          "primegovClients": {
            "title": "PrimeGov cities",
            "type": "array",
            "description": "Cities on PrimeGov portals. Use the subdomain of <code>{city}.primegov.com</code> — e.g. <code>lacity</code> for Los Angeles (lacity.primegov.com). Pasting the full URL also works.",
            "items": {
              "type": "string"
            }
          },
          "granicusClients": {
            "title": "Granicus (ViewPublisher) sites",
            "type": "array",
            "description": "Jurisdictions on legacy Granicus video/agenda portals ({host}.granicus.com). Format: <code>host:viewIds</code> — e.g. <code>pwcgov:23,12,24</code> for Prince William County VA (Board of County Supervisors, Planning Commission, Zoning Appeals). Give just the host (e.g. <code>pwcgov</code>) to auto-discover active agenda views (slower first run).",
            "items": {
              "type": "string"
            }
          },
          "escribeClients": {
            "title": "eScribe portals",
            "type": "array",
            "description": "Jurisdictions on eScribe meeting portals — the subdomain of <code>{name}.escribemeetings.com</code>, e.g. <code>pub-loudoun</code> for Loudoun County VA. Pasting the full URL also works.",
            "items": {
              "type": "string"
            }
          },
          "daysBack": {
            "title": "Days back",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "How many days of past meetings to scan (agendas AND minutes already published). 0 = upcoming meetings only.",
            "default": 14
          },
          "daysAhead": {
            "title": "Days ahead",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "How far into the future to scan scheduled meetings and their published agendas.",
            "default": 60
          },
          "scanAgendaText": {
            "title": "Scan full agenda content",
            "type": "boolean",
            "description": "ON: scan every agenda item, legislative matter, and full HTML agenda text (recommended — this is where the signal lives). OFF: scan meeting titles only (faster, cheaper, much weaker).",
            "default": true
          },
          "onlyNewResults": {
            "title": "Alert mode — only new results",
            "type": "boolean",
            "description": "Remember what previous runs already found and only output matches you haven't seen before. Turn this ON for scheduled monitoring so each run returns only NEW hits (you pay only for new matches).",
            "default": false
          },
          "maxMeetingsPerClient": {
            "title": "Max meetings per city",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Upper bound of meetings scanned per city per run (closest meetings first).",
            "default": 40
          },
          "alertWebhookUrl": {
            "title": "Alert webhook URL",
            "type": "string",
            "description": "Optional. If set and the run finds matches, the Actor POSTs a JSON payload <code>{ actorRunId, matchCount, matches[] }</code> to this URL — plug into Slack, Zapier, Make, or your own endpoint."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}