# Local Government Decision Lookup & Fact Check (Iowa) (`catalyst-labs/local-government-decision-lookup`) Actor

Fact-check a city council or county board claim against official minutes. Returns supported, contradicted or no_record, with tally, no voters, amount and source link. It never guesses. $0.005 per lookup; uncovered places free. 21 Iowa governments.

- **URL**: https://apify.com/catalyst-labs/local-government-decision-lookup.md
- **Developed by:** [Catalyst Labs](https://apify.com/catalyst-labs) (community)
- **Categories:** AI, Agents, News
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 decision lookups

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Local Government Decision Lookup & Fact Check (Iowa)

### Why agents pick this

- **It answers `no_record` instead of guessing.** When the minutes don't show it, the tool says so. A web search or an LLM tends to make up a plausible vote.
- **Verdict plus evidence:** `supported`, `contradicted` or `no_record`, with outcome, tally, named no voters, dollar amount and a link to the minutes.
- **$0.005 per lookup.** Places it doesn't cover return `not_covered` free.
- **Look up by claim, address or topic.** Covers 21 Iowa governments (Des Moines metro, Polk County, Sioux City).

Check what a city council or county board actually decided, using the official minutes. Give it a **claim**, an **address**, or a **topic**. You get back the matching recorded votes with the outcome, the tally, who voted no, the dollar amount, and links to the minutes and the Citizen Wire page. Claims get a verdict: `supported`, `contradicted` or `no_record`.

Built on [Citizen Wire](https://citizenwire.org) records, compiled from official minutes (CC BY 4.0).

### When to use this tool

- A user or article says "X city approved Y". You want to confirm it, along with the vote and who dissented, before repeating it.
- You need every recorded decision that mentions a street or address, such as rezonings, plats, licenses or hearings on "Center Street".
- You want the recorded decisions on a topic, like Flock cameras, water rates or rezoning, in one covered city.

### When NOT to use it

- The place isn't covered (listed below). You get `status: not_covered`, which is free, and nothing is confirmed or denied.
- You need live or same-day results. This tool reads a snapshot, so check `snapshotDate`.
- You need discussion, public comment or video. Use a transcript tool such as [City Council & Public Meeting Transcripts](https://apify.com/catalyst-labs/city-council-meeting-transcripts).
- State, federal or school board decisions aren't covered.

### Coverage (snapshot 2026-10-24)

Des Moines, Polk County Board of Supervisors, Altoona, Ankeny, Bondurant, Carlisle, Clive, Grimes, Indianola, Mitchellville, Newton, Norwalk, Perry, Pleasant Hill, Polk City, Urbandale, Waukee, Windsor Heights, Winterset, Sioux City and Coralville. Meetings run from January 2026 to mid-October 2026. Every response repeats the exact ranges in `coverage`. West Des Moines, Johnston, Ames and school boards are **not** covered.

### Input

| field | |
|---|---|
| `claim` | A statement to fact-check |
| `address` | A street address or street name |
| `topic` | Keywords |
| `city` | Optional. Detected from the claim if you leave it out |
| `dateFrom` / `dateTo` | Optional, YYYY-MM-DD |
| `maxResults` (5) / `maxChars` (300) | Keep the output small |
| `queries` | Optional batch of up to 100 lookups |

### Output (per lookup)

```json
{ "verdict": "contradicted", "confidence": "high",
  "reason": "The closest recorded decision(s) disagree with the claim on: no_voter.",
  "checks": [{"check":"tally","claim":"4-1","record":"4-1","result":"match"},{"check":"no_voter","claim":"Scott","record":["Rayford"],"result":"mismatch"}],
  "matches": [{ "government":"Sioux City City Council","city":"Sioux City","meetingDate":"2026-02-02",
    "itemTitle":"Resolution authorizing an Assignment Amendment with Flock Group, Inc. ...","outcome":"passed","voteTally":"4-1",
    "noVotes":["Rayford"],"abstainOrRecused":[],"amountUsd":548860,"minutesUrl":"https://...","citizenWireUrl":"https://citizenwire.org/sioux-city/2026-02-02/","matchScore":1 }],
  "coverage": "Covers recorded council/board votes ... Anything outside these governments or dates returns no_record." }
```

### How verdicts work (no guessing)

- **supported**: a closely matching recorded decision agrees with every detail in the claim that can be checked: outcome, tally, unanimity, named no voters and amount.
- **contradicted**: the closest strong match or matches disagree on at least one detail the record states.
- **no_record**: no close match, the match is ambiguous, or the place is out of coverage. This doesn't prove the claim is false.
- A small LLM, when enabled, only picks topic words from the claim text. Every fact comes from the records.

### Fast mode (Standby)

`GET https://catalyst-labs--local-government-decision-lookup.apify.actor/?claim=...&token=YOUR_APIFY_TOKEN` (also takes `address`, `topic`, `city`). `GET /coverage` lists what's covered.

### MCP

`https://mcp.apify.com/?tools=catalyst-labs/local-government-decision-lookup`

### Pricing

Pay per event: **$0.005 per lookup** that returns an answer. A `no_record` verdict inside covered places counts as an answer. Out-of-coverage places and invalid input are never charged.

# Actor input Schema

## `claim` (type: `string`):

A statement about a local government decision, e.g. 'Sioux City approved the Flock Group amendment 4-1 with Rayford voting no'. Returns verdict supported / contradicted / no_record. Use this OR address OR topic.

## `address` (type: `string`):

Street address or street name, e.g. '1917 Center Street'. Returns decisions whose item titles mention that street, plus hearing dates found in them.

## `topic` (type: `string`):

Keywords, e.g. 'rezoning', 'Flock cameras', 'water rates'. Returns the best-matching recorded decisions.

## `city` (type: `string`):

Optional. E.g. 'Des Moines', 'Waukee', 'Polk County'. Detected from the claim if omitted. Uncovered places return status not_covered (never charged).

## `dateFrom` (type: `string`):

Optional YYYY-MM-DD meeting-date lower bound.

## `dateTo` (type: `string`):

Optional YYYY-MM-DD meeting-date upper bound.

## `maxResults` (type: `integer`):

Matches returned per lookup.

## `maxChars` (type: `integer`):

Item titles longer than this are cut (keeps agent context small).

## `queries` (type: `array`):

Up to 100 lookups in one run: strings (claims) or objects with claim/address/topic/city. Each billed lookup is one event.

## `useLlm` (type: `boolean`):

A small LLM only picks topic words and outcome from the claim text. It never supplies facts; all facts come from the records.

## Actor input object example

```json
{
  "claim": "Des Moines approved $1,750,000 for the E. Locust Streetscape Repair",
  "maxResults": 5,
  "maxChars": 300,
  "useLlm": true
}
```

# Actor output Schema

## `result` (type: `string`):

No description

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "claim": "Des Moines approved $1,750,000 for the E. Locust Streetscape Repair"
};

// Run the Actor and wait for it to finish
const run = await client.actor("catalyst-labs/local-government-decision-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "claim": "Des Moines approved $1,750,000 for the E. Locust Streetscape Repair" }

# Run the Actor and wait for it to finish
run = client.actor("catalyst-labs/local-government-decision-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "claim": "Des Moines approved $1,750,000 for the E. Locust Streetscape Repair"
}' |
apify call catalyst-labs/local-government-decision-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,catalyst-labs/local-government-decision-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gbNqGTF3LgM1UesZt/builds/U06VTn90gWspcwPzB/openapi.json
