{
  "openapi": "3.0.1",
  "info": {
    "title": "FEC Campaign Finance - Super PAC, Candidates & Donors Search",
    "description": "Campaign finance data via the official FEC open.fec.gov API: search US federal candidates by name/state/office/party/cycle with totals, donor and campaign contributions (Schedule A), committee spending (Schedule B) or independent expenditures for/against candidates (Schedule E). No key needed.",
    "version": "0.1",
    "x-build-id": "kdnvzVXTlT8C8M65x"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchsmith~fec-campaign-finance-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchsmith-fec-campaign-finance-scraper",
        "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/fetchsmith~fec-campaign-finance-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fetchsmith-fec-campaign-finance-scraper",
        "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/fetchsmith~fec-campaign-finance-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fetchsmith-fec-campaign-finance-scraper",
        "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": {
          "searchMode": {
            "title": "Search mode",
            "enum": [
              "candidates",
              "contributions",
              "disbursements",
              "independentExpenditures"
            ],
            "type": "string",
            "description": "\"candidates\" (default): search candidates and their financial totals. \"contributions\": individual donor contributions (Schedule A) — donor name, employer, occupation, amount, date, receiving committee. \"disbursements\": committee SPENDING (Schedule B) — who a campaign paid, how much, when and what for. \"independentExpenditures\": outside spending FOR or AGAINST a candidate (Schedule E) — super PAC ads and mailers, with the support/oppose flag.",
            "default": "candidates"
          },
          "recipientName": {
            "title": "Recipient / vendor name",
            "type": "string",
            "description": "Filter committee spending by who was paid (e.g. \"META\", \"ActBlue\", \"Delta Air Lines\"). Disbursements mode only.",
            "default": ""
          },
          "payeeName": {
            "title": "Payee name",
            "type": "string",
            "description": "Filter independent expenditures by the vendor paid to run the ad/mailer (e.g. \"Extreme Reach\"). Independent expenditures mode only.",
            "default": ""
          },
          "candidateId": {
            "title": "Candidate ID (FEC)",
            "type": "string",
            "description": "Only return independent expenditures naming this candidate, e.g. \"P80001571\". Find IDs with a run in candidates mode. Independent expenditures mode only.",
            "default": ""
          },
          "supportOppose": {
            "title": "Support or oppose",
            "enum": [
              "",
              "S",
              "O"
            ],
            "type": "string",
            "description": "Restrict independent expenditures to money spent FOR a candidate or AGAINST them. Independent expenditures mode only.",
            "default": ""
          },
          "committeeId": {
            "title": "Committee ID (FEC)",
            "type": "string",
            "description": "Only return rows filed by this committee, e.g. \"C00744946\". Disbursements and independent expenditures modes only — the FEC's Schedule A endpoint times out on this filter, so it is ignored (with a warning) in contributions mode.",
            "default": ""
          },
          "candidateName": {
            "title": "Candidate name",
            "type": "string",
            "description": "Full or partial candidate name to search for (e.g. \"Warren\" or \"Elizabeth Warren\"). Leave empty and use state/office/party filters alone to browse instead of searching by name. Candidates mode only.",
            "default": "Warren"
          },
          "donorName": {
            "title": "Donor name",
            "type": "string",
            "description": "Search individual contributions by donor name (e.g. \"Elon Musk\"). Contributions mode only.",
            "default": ""
          },
          "donorEmployer": {
            "title": "Donor employer",
            "type": "string",
            "description": "Filter contributions by the donor's self-reported employer (e.g. \"Google\"). Contributions mode only.",
            "default": ""
          },
          "donorOccupation": {
            "title": "Donor occupation",
            "type": "string",
            "description": "Filter contributions by the donor's self-reported occupation (e.g. \"Physician\", \"Software Engineer\"). Contributions mode only.",
            "default": ""
          },
          "donorCity": {
            "title": "Donor city",
            "type": "string",
            "description": "Filter contributions by the donor's self-reported city (e.g. \"Seattle\"). Contributions mode only.",
            "default": ""
          },
          "donorZip": {
            "title": "Donor ZIP code",
            "type": "string",
            "description": "Filter contributions by the donor's self-reported ZIP code, exact match (e.g. \"90210\"). Contributions mode only.",
            "default": ""
          },
          "minAmount": {
            "title": "Minimum amount ($)",
            "type": "integer",
            "description": "Only return rows of at least this amount. Applies to the transaction modes: contribution amount (contributions), disbursement amount (disbursements), expenditure amount (independent expenditures)."
          },
          "maxAmount": {
            "title": "Maximum amount ($)",
            "type": "integer",
            "description": "Only return rows of at most this amount. Applies to the transaction modes: contribution amount (contributions), disbursement amount (disbursements), expenditure amount (independent expenditures)."
          },
          "contributionDateFrom": {
            "title": "Transaction date from (YYYY-MM-DD)",
            "type": "string",
            "description": "Only return rows on or after this date — contribution receipt date (contributions), disbursement date (disbursements) or expenditure date (independent expenditures). Ignored in candidates mode. Must be a real calendar date in strict YYYY-MM-DD form; anything else stops the run with an error naming it, because silently dropping a date bound would widen the search to every matching row and charge you for the difference.",
            "default": ""
          },
          "contributionDateTo": {
            "title": "Transaction date to (YYYY-MM-DD)",
            "type": "string",
            "description": "Only return rows on or before this date — contribution receipt date (contributions), disbursement date (disbursements) or expenditure date (independent expenditures). Ignored in candidates mode. Must be a real calendar date in strict YYYY-MM-DD form; anything else stops the run with an error naming it, because silently dropping a date bound would widen the search to every matching row and charge you for the difference. WATCH MODE WARNING: combined with watchLabel, this is a permanent dead end once today’s date passes it — it is an upper bound sent to the FEC as max_date, and genuinely new activity is always newer than any bound fixed in the past, so the watch goes quiet for good (see README “Watch mode”). Leave it unset in a watch run; contributionDateFrom is safe to keep.",
            "default": ""
          },
          "state": {
            "title": "State (2-letter code)",
            "type": "string",
            "description": "Candidates mode: restrict to candidates running in this state. Contributions mode: restrict to donors reporting an address in this state. Disbursements mode: restrict to recipients/vendors in this state. e.g. \"CA\", \"TX\". Leave empty for all states. Not used in independent expenditures mode.",
            "default": ""
          },
          "office": {
            "title": "Office",
            "enum": [
              "",
              "H",
              "S",
              "P"
            ],
            "type": "string",
            "description": "Restrict to one office. Candidates mode only.",
            "default": ""
          },
          "party": {
            "title": "Party code",
            "type": "string",
            "description": "Restrict to one party code, e.g. \"DEM\", \"REP\", \"IND\", \"LIB\". Candidates mode only.",
            "default": ""
          },
          "electionYear": {
            "title": "Election cycle year",
            "type": "integer",
            "description": "Even-numbered election cycle, e.g. 2024. Candidates mode: leave empty for all cycles. Contributions / disbursements / independent expenditures: required by the FEC API to keep the query fast — defaults to the most recent even year if left empty."
          },
          "includeTotals": {
            "title": "Include financial totals",
            "type": "boolean",
            "description": "For each candidate found, fetch their campaign financial totals (receipts, disbursements, cash on hand, individual contributions) from the FEC's totals endpoint. Adds one extra request per candidate. Candidates mode only.",
            "default": true
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Stop after this many rows (candidates, contributions, disbursements or independent expenditures, depending on searchMode).",
            "default": 20
          },
          "watchLabel": {
            "title": "Watch mode: label for a saved search (optional)",
            "type": "string",
            "description": "Transaction modes only (contributions, disbursements, independentExpenditures). Set a name for this saved search (e.g. \"acme-corp-employees\") to turn on watch mode: the first run with a given label + filter set is a free baseline (0 results, 0 charged); every later run on the same label returns and charges only rows that are NEW since the last run. Ignored (with a warning) in candidates mode. Leave empty for normal behavior. Do not combine with contributionDateTo — that upper-bounds the transaction date and permanently kills the watch once today’s date passes it.",
            "default": ""
          },
          "webhookUrl": {
            "title": "Webhook URL (notify on completion)",
            "type": "string",
            "description": "Optional. An http(s) URL to POST a small JSON summary to when the run finishes — results pushed, watch-label new count if Watch label is set, and the run's dataset ID so you can fetch the results. A convenience for callers who want a completion ping without setting up an Apify platform webhook (which needs separate Console/API configuration per Task, not per run). Best-effort: a failed or slow webhook is logged as a warning and never fails the run or affects charging — it fires after every result has already been pushed and charged. Leave empty to skip."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}