Servidor MCP

openfec-mcp-server

io.github.cyanheads/openfec-mcp-server
Datos y analítica Legal y cumplimiento Público y accesible MCP 2025-11-25

Qué hace este MCP

Queries U.S. FEC data on candidates, committees, contributions, spending, filings, elections, and enforcement documents.

openfec_get_committee_totals
Openfec Get Committee Totals
Get pre-aggregated committee financial totals — receipts, disbursements, cash on hand, debts, and the itemized/unitemized breakdown — without paginating Schedule A. Use mode "single" (the default) with a committee_id for one committee's totals, one row per two-year cycle it has filed. Use mode "by_entity_type" to rank or screen every committee of one type (presidential, pac, party, pac-party, house-senate, ie-only) by state, designation, or a receipts/disbursements threshold.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['single', 'by_entity_type'], 'type': 'string', 'default': 'single', 'description': 'Query mode. "single" returns one committee\'s totals, one row per cycle. "by_entity_type" returns a page of committees of one entity type, filterable and sortable across committees.'}, 'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed). Read pagination.pages in the response to see how many pages exist â\x80\x94 a long-running committee can have more cycles than one page holds.'}, 'sort': {'enum': ['cycle', '-cycle', 'receipts', '-receipts', 'disbursements', '-disbursements', 'last_cash_on_hand_end_period', '-last_cash_on_hand_end_period'], 'type': 'string', 'description': 'Sort field. A "-" prefix sorts descending: "-receipts" ranks the biggest fundraisers first in by_entity_type mode, "-cycle" puts a committee\'s most recent cycle first in single mode.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (e.g., 2024). Even years only. Omit in single mode to get every cycle the committee has filed.'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page.'}, 'entity_type': {'enum': ['presidential', 'pac', 'party', 'pac-party', 'house-senate', 'ie-only'], 'type': 'string', 'description': 'Committee entity type for the grouped search. Required in by_entity_type mode. house-senate covers both chambers as one group; ie-only is committees that report only independent expenditures.'}, 'committee_id': {'type': 'string', 'description': 'Committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required in single mode; in by_entity_type mode it narrows the grouped search to that one committee.'}, 'max_receipts': {'type': 'number', 'description': 'Maximum total receipts in dollars. by_entity_type mode only.'}, 'min_receipts': {'type': 'number', 'description': 'Minimum total receipts in dollars. by_entity_type mode only.'}, 'committee_type': {'type': 'string', 'description': 'Committee type code â\x80\x94 H (House), S (Senate), P (Presidential), O (Super PAC), N/Q (PAC), X/Y (party). by_entity_type mode only.'}, 'committee_state': {'type': 'string', 'description': 'Two-letter state code of the committee. by_entity_type mode only.'}, 'max_disbursements': {'type': 'number', 'description': 'Maximum total disbursements in dollars. by_entity_type mode only.'}, 'min_disbursements': {'type': 'number', 'description': 'Minimum total disbursements in dollars. by_entity_type mode only.'}, 'organization_type': {'type': 'string', 'description': 'Sponsoring organization type â\x80\x94 C (corporation), L (labor), M (membership), T (trade), V (cooperative), W (corporation without capital stock). by_entity_type mode only.'}, 'committee_designation': {'type': 'string', 'description': 'Committee designation â\x80\x94 A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). by_entity_type mode only.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['single', 'by_entity_type'], 'type': 'string', 'description': 'Query mode as the server resolved it. Rows mean different things by mode â\x80\x94 single rows are cycles of one committee, by_entity_type rows are different committees â\x80\x94 so read this rather than inferring from the fields present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['committee_id_required_for_single_mode', 'entity_type_required_for_group_mode', 'inputs_not_applicable_to_mode', 'committee_totals_not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `committee_id_required_for_single_mode`: Mode single invoked without a committee_id. `entity_type_required_for_group_mode`: Mode by_entity_type invoked without an entity_type. `inputs_not_applicable_to_mode`: A grouped-search filter (entity_type, committee_state, committee_type, committee_designation, organization_type, or a receipts/disbursements bound) was supplied alongside mode single, which cannot apply it. `committee_totals_not_found`: Single-committee lookup matched no totals row â\x80\x94 the committee_id does not exist, it filed nothing in the requested cycle, or it has never filed a financial report at all. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Guidance when the response carries no totals: how to broaden a search that matched nothing, or which requested position ran out when totals did match.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Committee totals row for one committee and cycle; common keys include committee_id, committee_name, cycle, receipts, disbursements, last_cash_on_hand_end_period, last_debts_owed_by_committee, individual_contributions, and coverage_end_date.', 'additionalProperties': {}}, 'description': 'Committee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching totals rows before pagination.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_get_legal_document
Openfec Get Legal Document
Fetch one FEC legal document — advisory opinion, MUR, ADR, administrative fine, or statute — by its type and number. openfec_search_legal replaces each result's documents and dispositions arrays with a count and category summary and cuts every commission vote down to a date and a 200-character action; this returns the record as upstream sends it, whole when it fits the 100,000-byte response budget. A larger record returns its scalar fields and the arrays that fit, with the rest listed in withheld; page through one by re-calling with array and offset. doc_type is the plural form of the document_type discriminator on a search result (advisory_opinion becomes advisory_opinions, mur becomes murs, adr becomes adrs, admin_fine becomes admin_fines, statute becomes statutes), and no is that result's no field — every document type carries it, and advisory opinions repeat it as ao_no.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['doc_type', 'no'], 'properties': {'no': {'type': 'string', 'minLength': 1, 'description': 'Document number, copied from the no field of the matching openfec_search_legal result. Advisory opinions are year-serial (e.g. "2024-01", also repeated as ao_no); murs, adrs, and admin_fines are digit strings (e.g. "8363"); statutes are U.S. Code section numbers (e.g. "30123").'}, 'array': {'type': 'string', 'minLength': 1, 'description': 'Name of one top-level array field of the record to page through by entry â\x80\x94 usually one listed in withheld when the record was too large to return whole (e.g. "dispositions", "documents"). Returns that array\'s entries from offset while they fit the response budget, in slice, with the record\'s scalar fields. Omit to fetch the record itself.'}, 'offset': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Entry offset (0-indexed) into array. Requires array; defaults to 0 when array is given. Pass the next_offset a previous slice returned to continue.'}, 'doc_type': {'enum': ['advisory_opinions', 'murs', 'adrs', 'admin_fines', 'statutes'], 'type': 'string', 'description': 'Legal document type, always plural. openfec_search_legal reports the singular form in each result document_type â\x80\x94 advisory_opinion, mur, adr, admin_fine, statute â\x80\x94 so add an "s" to get the value this field wants.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['document', 'search_criteria', 'attachedDocumentCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['legal_document_not_found', 'array_not_in_record', 'offset_without_array'], 'description': 'Machine-readable failure mode. Declared by this tool: `legal_document_not_found`: No legal document exists at the requested doc_type and document number. `array_not_in_record`: The array input names a field this record does not carry as an array. `offset_without_array`: offset was given without array, so there is no array for it to index. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'slice': {'type': 'object', 'required': ['array', 'offset', 'total', 'entries'], 'properties': {'array': {'type': 'string', 'description': 'The array these entries come from.'}, 'total': {'type': 'number', 'description': 'Entries in the whole array.'}, 'offset': {'type': 'number', 'description': 'Offset (0-indexed) of the first entry here.'}, 'entries': {'type': 'array', 'items': {'description': 'One entry, exactly as the record carries it.'}, 'description': 'Entries from offset, as many as fit the response budget â\x80\x94 at least one while offset is inside the array.'}, 'next_offset': {'type': 'number', 'description': 'Offset that continues the array. Absent once the last entry is here.'}}, 'description': 'A run of the requested array. Present only when array was given.', 'additionalProperties': False}, 'notice': {'type': 'string', 'description': 'How to continue: which arrays were held back and how to page them, where a slice continues, or that an offset ran past the end of its array.'}, 'document': {'type': 'object', 'properties': {}, 'description': "The legal document record, fields as upstream sends them â\x80\x94 the full documents array openfec_search_legal summarizes, the complete dispositions and commission_votes entries, and the scalar and date fields (name, type, url, penalty and determination amounts, case dates). Whole when it fits the 100,000-byte response budget; otherwise the scalar fields and the arrays that fit, with the rest in withheld. With array set, the record's non-array fields only â\x80\x94 the entries are in slice. Fields present vary by document type.", 'additionalProperties': {}}, 'withheld': {'type': 'array', 'items': {'type': 'object', 'required': ['array', 'count', 'bytes'], 'properties': {'array': {'type': 'string', 'description': 'Name of the array field held back â\x80\x94 pass it as array.'}, 'bytes': {'type': 'number', 'description': 'Size of the whole array as JSON, in UTF-8 bytes.'}, 'count': {'type': 'number', 'description': 'Entries in the array.'}}, 'description': 'One array held back from document.', 'additionalProperties': False}, 'description': 'Arrays held back from document because the whole record exceeds the 100,000-byte response budget, smallest first. Page through one by re-calling with array set to its name. Absent when document is the whole record.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}, 'attachedDocumentCount': {'type': 'number', 'description': 'Number of related filings in the record documents array â\x80\x94 the full count, whether this response carries them in document, in a slice, or holds them back. Compare against the document_count openfec_search_legal reported for the same record.'}}, 'additionalProperties': False}
openfec_lookup_calendar
Openfec Lookup Calendar
Look up FEC calendar events, filing deadlines, and election dates. Use to find upcoming filing windows for a committee, locate when a federal election occurred, or scope FEC events by date range and category.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['events', 'filing_deadlines', 'election_dates'], 'type': 'string', 'default': 'events', 'description': 'events = FEC calendar events. filing_deadlines = report due dates. election_dates = upcoming/past elections.'}, 'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed). Default 1.'}, 'state': {'type': 'string', 'description': 'Two-letter state code (e.g., AZ, CA). Primarily for election_dates mode.'}, 'office': {'enum': ['H', 'S', 'P'], 'type': 'string', 'description': 'Office sought (H=House, S=Senate, P=President). Election dates mode.'}, 'category': {'enum': ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '32', '33', '34', '36', '37', '38', '39', '40'], 'type': 'string', 'description': 'Calendar category ID. 20=Commission Meetings, 21=Reporting Deadlines, 22=Conferences and Outreach, 23=AOs and Rules, 24=Other, 25=Quarterly, 26=Monthly, 27=Pre and Post-Elections, 28=EC Periods, 29=IE Periods, 32=Open Meetings, 33=Conferences, 34=Roundtables, 36=Election Dates, 37=Federal Holidays, 38=FEA Periods, 39=Executive Sessions, 40=Public Hearings. Events mode only.'}, 'district': {'type': 'string', 'description': 'Two-digit House district (e.g., "14", "07"); a single digit is zero-padded. Pair it with state â\x80\x94 alone it matches that district number in every state. At-large races carry no district upstream, so a district filter never matches them. Election dates mode.'}, 'max_date': {'type': 'string', 'description': 'Latest date (YYYY-MM-DD).'}, 'min_date': {'type': 'string', 'description': 'Earliest date (YYYY-MM-DD).'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Default 20, max 100.'}, 'description': {'type': 'string', 'description': 'Full-text event description search. Events mode.'}, 'report_type': {'type': 'string', 'description': 'Report type code (e.g. "Q1", "Q2"). Filing deadlines mode only.'}, 'report_year': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Report year. Filing deadlines mode.'}, 'election_year': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Election year. Election dates mode.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['events', 'filing_deadlines', 'election_dates'], 'type': 'string', 'description': 'Query mode as the server resolved it. Each mode reads a different FEC dataset with its own row shape â\x80\x94 calendar events, report due dates, or election dates â\x80\x94 so read this rather than inferring the dataset from the fields present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['inputs_not_applicable_to_mode'], 'description': 'Machine-readable failure mode. Declared by this tool: `inputs_not_applicable_to_mode`: A filter belonging to a different calendar mode was supplied, which the chosen mode cannot apply. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Guidance when the response carries no calendar entries: how to broaden a search that matched nothing, or which requested position ran out when entries did match.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Event record (mode=events), filing deadline record (mode=filing_deadlines), or election date record (mode=election_dates).', 'additionalProperties': {}}, 'description': 'Calendar result set; events, filing deadlines, or election dates depending on mode.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching calendar entries before pagination.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_lookup_elections
Openfec Lookup Elections
Look up federal election races and candidate financial summaries. Find who's running in a race with fundraising totals, or get an aggregate race summary.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['office', 'cycle'], 'properties': {'zip': {'type': 'string', 'description': 'ZIP code â\x80\x94 finds races covering this ZIP. Search mode only.'}, 'mode': {'enum': ['search', 'summary'], 'type': 'string', 'default': 'search', 'description': 'search = candidates in a race with financial totals. summary = aggregate race financial summary.'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed). Search mode only; explicit page is rejected in summary mode. Defaults to 1 for search.'}, 'cycle': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Election cycle year (even years only, e.g. 2024).'}, 'state': {'type': 'string', 'description': 'Two-letter US state code (e.g., AZ, CA). Required for senate/house unless zip is provided.'}, 'office': {'enum': ['H', 'S', 'P'], 'type': 'string', 'description': 'Office sought: H=House, S=Senate, P=President.'}, 'district': {'type': 'string', 'description': 'Two-digit district number (e.g. "07"). Required for house unless zip is provided.'}, 'per_page': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Search mode only; defaults to 20.'}, 'election_full': {'type': 'boolean', 'description': 'Expand to full election period (4yr president, 6yr senate, 2yr house). Defaults to true when omitted; a ZIP-scoped search rejects it, since that endpoint has no such parameter. Carries no schema default, so an explicit value is distinguishable from an omission.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['search', 'summary'], 'type': 'string', 'description': 'Query mode as the server resolved it. Row shapes differ by mode â\x80\x94 search rows are per-candidate financial records, summary is one aggregate race row â\x80\x94 so read this rather than inferring the shape from the fields present.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['cycle_must_be_even', 'missing_state_for_office', 'missing_district_for_house', 'summary_does_not_support_zip', 'inputs_not_applicable_to_mode'], 'description': 'Machine-readable failure mode. Declared by this tool: `cycle_must_be_even`: Cycle is an odd year. `missing_state_for_office`: Senate or House office without a state and without a zip. `missing_district_for_house`: House office without a district number and without a zip. `summary_does_not_support_zip`: Summary mode invoked with a zip parameter. `inputs_not_applicable_to_mode`: The resolved elections endpoint does not accept one or more explicitly supplied inputs. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Guidance when the response carries no election results: how to broaden a search that matched nothing, or which requested position ran out when results did match.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Candidate financial row (search mode) or aggregate race summary (summary mode).', 'additionalProperties': {}}, 'description': 'Election race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching candidates or race summaries.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_search_candidates
Openfec Search Candidates
Find federal candidates by name, state, office, party, or cycle. Retrieve a specific candidate by FEC ID with financial totals. Candidate IDs start with H (House), S (Senate), or P (President) followed by exactly eight letters or digits.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Search-results page number (1-indexed). Defaults to 1 on the search path.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (even year, e.g., 2024).'}, 'party': {'type': 'string', 'description': 'Three-letter party code (e.g., DEM, REP, LIB).'}, 'query': {'type': 'string', 'description': 'Full-text candidate name search.'}, 'state': {'type': 'string', 'description': 'Two-letter US state code (e.g., AZ, CA).'}, 'office': {'enum': ['H', 'S', 'P'], 'type': 'string', 'description': 'Filter by office: H=House, S=Senate, P=President.'}, 'district': {'type': 'string', 'description': 'Two-digit district number for House candidates.'}, 'per_page': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Search results per page. Defaults to 20 on the search path. With include_totals, at most 35 candidates are requested when cycle or election_year scopes the totals and 5 when the totals span every cycle, keeping the response under a 100,000-byte budget. A page bounded below your request reports truncated and cap, and pagination.per_page echoes the size applied â\x80\x94 page numbers count at that size, so continue with the next page number.'}, 'candidate_id': {'type': 'string', 'description': 'FEC candidate ID: H, S, or P followed by exactly eight letters or digits (e.g., P00003392, H2CO07170). Get IDs from openfec_search_candidates results. When provided, returns a single candidate with full detail.'}, 'election_year': {'type': 'number', 'description': 'Specific election year the candidate ran in.'}, 'include_totals': {'type': 'boolean', 'description': 'Include financial totals (receipts, disbursements, cash on hand). Defaults to true when fetching by candidate_id.'}, 'candidate_status': {'enum': ['C', 'F', 'N', 'P'], 'type': 'string', 'description': 'Candidate status: C=present, F=future, N=not yet, P=prior.'}, 'has_raised_funds': {'type': 'boolean', 'description': 'Only candidates whose committee has received receipts.'}, 'incumbent_challenge': {'enum': ['I', 'C', 'O'], 'type': 'string', 'description': 'Incumbent status: I=incumbent, C=challenger, O=open seat.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['candidates', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['candidate_not_found', 'inputs_not_applicable_to_id_lookup'], 'description': 'Machine-readable failure mode. Declared by this tool: `candidate_not_found`: Single-candidate lookup by candidate_id returned no record. `inputs_not_applicable_to_id_lookup`: A direct candidate_id lookup includes search-only inputs, or totals-only scope while include_totals is false. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when candidates did match, or that the page was bounded below the per_page requested and how to continue.'}, 'totals': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Per-cycle financial totals row for a candidate committee.', 'additionalProperties': {}}, 'description': 'Financial totals (receipts, disbursements, cash_on_hand) when include_totals is true. One row per candidate per cycle.'}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Candidate record; common keys include candidate_id, name, party, state, office, and cycles.', 'additionalProperties': {}}, 'description': 'Candidate result set; one record per match.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching candidates before pagination.'}, 'missing_totals': {'type': 'array', 'items': {'type': 'string', 'description': 'FEC candidate ID with no totals row in this response.'}, 'description': 'Candidates whose financial totals were not retrieved because the totals fetch hit its page cap. Re-query each one on its own with candidate_id to get its totals.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_search_committees
Openfec Search Committees
Find political committees (campaign, PAC, Super PAC, party) by name, type, candidate affiliation, or state. Retrieve a specific committee by FEC ID. Committee IDs start with C followed by exactly eight digits (e.g., C00358796).
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Search-results page number (1-indexed). Defaults to 1 on the search path.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (even year).'}, 'party': {'type': 'string', 'description': 'Three-letter party code (e.g., DEM, REP).'}, 'query': {'type': 'string', 'description': 'Full-text committee name search.'}, 'state': {'type': 'string', 'description': 'Two-letter state code.'}, 'per_page': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Search results per page. Defaults to 20 on the search path.'}, 'designation': {'type': 'string', 'description': "Committee designation. A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). Matches each committee's current designation only, even with cycle set â\x80\x94 a past principal committee since redesignated drops out of P. For a candidate's principal committee in a given cycle, use openfec_lookup_elections (mode: search) and read candidate_pcc_id."}, 'candidate_id': {'type': 'string', 'description': 'Find committees linked to this candidate (authorized, leadership, joint fundraising). Get IDs from openfec_search_candidates results.'}, 'committee_id': {'type': 'string', 'description': "FEC committee ID: 'C' followed by exactly eight digits (e.g., C00358796). Get IDs from openfec_search_committees results. Returns a single committee with full detail."}, 'committee_type': {'type': 'string', 'description': 'Committee type code. Common: H (House), S (Senate), P (Presidential), O (Super PAC), N (PAC nonqualified), Q (PAC qualified), X (Party nonqualified), Y (Party qualified).'}, 'treasurer_name': {'type': 'string', 'description': 'Full-text treasurer name search.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['committees', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['committee_not_found', 'inputs_not_applicable_to_id_lookup'], 'description': 'Machine-readable failure mode. Declared by this tool: `committee_not_found`: Single-committee lookup by committee_id returned no record. `inputs_not_applicable_to_id_lookup`: A direct committee_id lookup includes inputs that only the committee search endpoint supports. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Guidance when the response carries no committees: how to broaden a search that matched nothing, or which requested position ran out when committees did match.'}, 'committees': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Committee record; common keys include committee_id, name, type, designation, party, and state.', 'additionalProperties': {}}, 'description': 'Committee result set; one record per match.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching committees before pagination.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_search_contributions
Openfec Search Contributions
Search itemized individual contributions (Schedule A) or get aggregate breakdowns by size, state, employer, or occupation. Use to answer "who is funding this committee?" Itemized mode requires a committee_id. Aggregate by_size/by_state can use candidate_id instead.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['itemized', 'by_size', 'by_state', 'by_employer', 'by_occupation'], 'type': 'string', 'default': 'itemized', 'description': 'Query mode. "itemized" returns individual contribution records (keyset pagination). "by_size" aggregates by contribution size bucket. "by_state" aggregates by contributor state. "by_employer" aggregates by employer. "by_occupation" aggregates by occupation.'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.'}, 'sort': {'enum': ['contribution_receipt_date', '-contribution_receipt_date', 'contribution_receipt_amount', '-contribution_receipt_amount'], 'type': 'string', 'description': 'Sort field. A "-" prefix sorts descending: use "-contribution_receipt_amount" for the largest receipts first, since the ascending form leads with the most negative rows (refunds, reattributions, redesignations). Itemized only; OpenFEC sorts by "-contribution_receipt_date" when omitted.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode.'}, 'cursor': {'type': 'string', 'description': 'Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call â\x80\x94 changing any other argument, including sort, rejects the cursor; omit it to start over.'}, 'max_date': {'type': 'string', 'description': 'Latest contribution date (YYYY-MM-DD). Itemized only.'}, 'min_date': {'type': 'string', 'description': 'Earliest contribution date (YYYY-MM-DD). Itemized only.'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Itemized mode sends at most 30 upstream, keeping the response under a 100,000-byte budget; a page bounded below your request reports truncated and cap, and next_cursor continues it.'}, 'max_amount': {'type': 'number', 'description': 'Maximum contribution amount in dollars. Itemized only.'}, 'min_amount': {'type': 'number', 'description': 'Minimum contribution amount in dollars. Itemized only.'}, 'candidate_id': {'type': 'string', 'description': 'Candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. Enables by_size and by_state aggregates without a committee_id.'}, 'committee_id': {'type': 'string', 'description': 'Receiving committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.'}, 'is_individual': {'type': 'boolean', 'description': 'Only individual contributions (excludes committee-to-committee transfers). Itemized only.'}, 'contributor_zip': {'type': 'string', 'description': 'ZIP code prefix (starts-with match). Itemized only.'}, 'contributor_city': {'type': 'string', 'description': 'Contributor city. Itemized only.'}, 'contributor_name': {'type': 'string', 'description': 'Full-text donor name search. Itemized only.'}, 'contributor_state': {'type': 'string', 'description': 'Two-letter state code (e.g., CA). Itemized only.'}, 'contributor_employer': {'type': 'string', 'description': 'Full-text employer search. Itemized only.'}, 'contributor_occupation': {'type': 'string', 'description': 'Full-text occupation search. Itemized only.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'mode': {'enum': ['itemized', 'by_size', 'by_state', 'by_employer', 'by_occupation', 'by_size_candidate', 'by_state_candidate'], 'type': 'string', 'description': 'Query mode as the server resolved it. "by_size" and "by_state" resolve to "by_size_candidate" / "by_state_candidate" when scoped by candidate_id â\x80\x94 a different endpoint with different row shapes â\x80\x94 so read this rather than assuming the mode you sent.'}, 'count': {'type': 'number', 'description': 'Total matching contributions (itemized mode). Check count_is_approximate before quoting it as a figure.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['itemized_requires_committee_id', 'aggregate_requires_committee_id', 'itemized_only_filters_in_aggregate_mode', 'inputs_not_applicable_to_mode'], 'description': 'Machine-readable failure mode. Declared by this tool: `itemized_requires_committee_id`: Itemized mode invoked without a committee_id. `aggregate_requires_committee_id`: by_employer or by_occupation aggregate without a committee_id. `itemized_only_filters_in_aggregate_mode`: An itemized-only filter was supplied alongside an aggregate mode, which cannot apply it. `inputs_not_applicable_to_mode`: The resolved Schedule A endpoint does not accept one or more explicitly supplied inputs. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when contributions did match, that the total is an estimate, or that the page was bounded below the per_page requested and how to continue.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Itemized contribution record (mode=itemized) or aggregate row (mode=by_size, by_state, by_employer, by_occupation).', 'additionalProperties': {}}, 'description': 'Contribution result set; itemized records or aggregate buckets depending on mode.'}, 'committee': {'type': 'object', 'properties': {}, 'description': 'The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object.', 'additionalProperties': {}}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination info (aggregate modes only).', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching contributions or aggregate rows.'}, 'next_cursor': {'type': ['string', 'null'], 'description': 'Pagination cursor for the next page of itemized results. Null when no more pages.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally.'}}, 'additionalProperties': False}
openfec_search_coordinated_expenditures
Openfec Search Coordinated Expenditures
Search coordinated party expenditures (Schedule F) — spending a party committee makes on behalf of a candidate it supports, in coordination with that campaign. Distinct from independent expenditures (openfec_search_expenditures), which cannot be coordinated with the candidate, and from direct contributions: coordinated expenditures carry their own statutory limits and can run into tens of millions per party in a presidential cycle. Scope with a spending committee_id, a benefiting candidate_id, or a cycle; unscoped queries span all years.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed). Read pagination.pages in the response to see how many pages exist.'}, 'sort': {'enum': ['expenditure_date', '-expenditure_date', 'expenditure_amount', '-expenditure_amount'], 'type': 'string', 'description': 'Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest coordinated spending first, since the ascending form leads with the most negative rows (corrections and voided entries). OpenFEC sorts by "-expenditure_date" when omitted.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (e.g., 2024). Even years only. Omitting it searches every cycle on record.'}, 'max_date': {'type': 'string', 'description': 'Latest expenditure date (YYYY-MM-DD).'}, 'min_date': {'type': 'string', 'description': 'Earliest expenditure date (YYYY-MM-DD).'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. At most 80 are requested upstream when scoped by committee_id and 25 otherwise, keeping the response under a 100,000-byte budget. A page bounded below your request reports truncated and cap, and pagination.per_page echoes the size applied â\x80\x94 page numbers count at that size, so continue with the next page number.'}, 'max_amount': {'type': 'number', 'description': 'Maximum expenditure amount in dollars.'}, 'min_amount': {'type': 'number', 'description': 'Minimum expenditure amount in dollars.'}, 'payee_name': {'type': 'string', 'description': 'Full-text payee name search (the vendor the party paid).'}, 'candidate_id': {'type': 'string', 'description': 'Benefiting candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.'}, 'committee_id': {'type': 'string', 'description': 'Spending party committee ID (e.g., C00003418). Get IDs from openfec_search_committees results â\x80\x94 party committees carry committee_type X or Y.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when expenditures did match, or that the page was bounded below the per_page requested and how to continue.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Coordinated expenditure record; common keys include expenditure_date, expenditure_amount, payee_name, candidate_id, candidate_name, candidate_office, expenditure_type_full, pdf_url, and subordinate_committee_id â\x80\x94 the committee the expenditure was attributed to, which is usually the spender but can be another committee; look it up with openfec_search_committees.', 'additionalProperties': {}}, 'description': 'Coordinated expenditure result set; one record per itemized transaction.'}, 'committee': {'type': 'object', 'properties': {}, 'description': 'The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object.', 'additionalProperties': {}}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching coordinated expenditures before pagination.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_search_disbursements
Openfec Search Disbursements
Search itemized committee spending (Schedule B) or get aggregate breakdowns by purpose or recipient. All modes require a committee_id. Use to answer "what is this committee spending money on?" or "who is receiving payments from this committee?"
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['committee_id'], 'properties': {'mode': {'enum': ['itemized', 'by_purpose', 'by_recipient', 'by_recipient_id'], 'type': 'string', 'default': 'itemized', 'description': 'Query mode. "itemized" returns individual disbursement records (keyset pagination). "by_purpose" aggregates by purpose category. "by_recipient" aggregates by recipient name. "by_recipient_id" aggregates by recipient committee ID (committee-to-committee transfers).'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates.'}, 'sort': {'enum': ['disbursement_date', '-disbursement_date', 'disbursement_amount', '-disbursement_amount'], 'type': 'string', 'description': 'Sort field. A "-" prefix sorts descending: use "-disbursement_amount" for the biggest payments first, since the ascending form leads with the most negative rows (refunds and voided payments). Itemized only; OpenFEC sorts by "-disbursement_date" when omitted.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted â\x80\x94 Schedule B spans all history, and an all-history scan of an active committee times out upstream. Pass an explicit cycle to search an earlier period.'}, 'cursor': {'type': 'string', 'description': 'Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call â\x80\x94 changing any other argument, including sort, rejects the cursor; omit it to start over.'}, 'max_date': {'type': 'string', 'description': 'Latest disbursement date (YYYY-MM-DD). Itemized only.'}, 'min_date': {'type': 'string', 'description': 'Earliest disbursement date (YYYY-MM-DD). Itemized only.'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Itemized mode sends at most 30 upstream, keeping the response under a 100,000-byte budget; a page bounded below your request reports truncated and cap, and next_cursor continues it.'}, 'max_amount': {'type': 'number', 'description': 'Maximum amount in dollars. Itemized only.'}, 'min_amount': {'type': 'number', 'description': 'Minimum amount in dollars. Itemized only.'}, 'committee_id': {'type': 'string', 'minLength': 1, 'description': 'Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required for all modes.'}, 'recipient_city': {'type': 'string', 'description': 'Recipient city. Itemized only.'}, 'recipient_name': {'type': 'string', 'description': 'Full-text payee name search. Itemized only.'}, 'recipient_state': {'type': 'string', 'description': 'Recipient state. Itemized only.'}, 'recipient_committee_id': {'type': 'string', 'description': 'Recipient committee ID (for committee-to-committee transfers). Itemized only.'}, 'disbursement_description': {'type': 'string', 'description': 'Full-text description search (e.g., "media buy", "consulting"). Itemized only.'}, 'disbursement_purpose_category': {'type': 'string', 'description': 'Purpose category code. Itemized only.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'mode': {'enum': ['itemized', 'by_purpose', 'by_recipient', 'by_recipient_id'], 'type': 'string', 'description': 'Query mode as the server resolved it. Row shapes differ by mode â\x80\x94 itemized rows are individual payments, aggregate rows are buckets with a total â\x80\x94 so read this rather than inferring the shape from the fields present.'}, 'count': {'type': 'number', 'description': 'Total matching disbursements (itemized mode). Check count_is_approximate before quoting it as a figure.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['itemized_only_filters_in_aggregate_mode', 'inputs_not_applicable_to_mode'], 'description': 'Machine-readable failure mode. Declared by this tool: `itemized_only_filters_in_aggregate_mode`: An itemized-only filter was supplied alongside an aggregate mode, which cannot apply it. `inputs_not_applicable_to_mode`: Itemized mode receives an explicit page number that its keyset endpoint cannot apply. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when disbursements did match, that the total is an estimate, or that the page was bounded below the per_page requested and how to continue.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Itemized disbursement record (mode=itemized) or aggregate row (mode=by_purpose, by_recipient, by_recipient_id).', 'additionalProperties': {}}, 'description': 'Disbursement result set; itemized records or aggregate buckets depending on mode.'}, 'committee': {'type': 'object', 'properties': {}, 'description': 'The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object.', 'additionalProperties': {}}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination info (aggregate modes only).', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching disbursements or aggregate rows.'}, 'next_cursor': {'type': ['string', 'null'], 'description': 'Pagination cursor for the next page of itemized results. Null when no more pages.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally.'}}, 'additionalProperties': False}
openfec_search_expenditures
Openfec Search Expenditures
Search independent expenditures (Schedule E) — outside spending supporting or opposing federal candidates. Covers Super PACs, party committees, and other groups. Use itemized mode for individual expenditure records, or by_candidate for aggregated totals per candidate; by_candidate needs either a candidate_id or a full race scope (candidate_office alone for President, plus candidate_office_state for Senate, plus candidate_office_district as well for House).
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['itemized', 'by_candidate'], 'type': 'string', 'default': 'itemized', 'description': 'Query mode. "itemized" returns individual expenditure records (keyset pagination). "by_candidate" returns aggregated totals per candidate by committee (page-based).'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed) for by_candidate mode. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for by_candidate.'}, 'sort': {'enum': ['expenditure_date', '-expenditure_date', 'expenditure_amount', '-expenditure_amount', 'office_total_ytd', '-office_total_ytd'], 'type': 'string', 'description': 'Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest outside spending first, since the ascending form leads with the most negative rows (corrections and voided entries). Itemized only; OpenFEC sorts by "-expenditure_date" when omitted.'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted â\x80\x94 Schedule E spans all history and an unscoped scan times out upstream. Pass an explicit cycle to search an earlier period. In by_candidate mode the cycle names the election, and election_full decides whether the totals cover the full election period ending in it (4yr president, 6yr senate, 2yr house) or only this two-year cycle.'}, 'cursor': {'type': 'string', 'description': 'Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call â\x80\x94 changing any other argument, including sort, rejects the cursor; omit it to start over.'}, 'max_date': {'type': 'string', 'description': 'Latest expenditure date (YYYY-MM-DD). Itemized only.'}, 'min_date': {'type': 'string', 'description': 'Earliest expenditure date (YYYY-MM-DD). Itemized only.'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Itemized mode sends at most 60 upstream when scoped by committee_id and 30 otherwise, keeping the response under a 100,000-byte budget; a page bounded below your request reports truncated and cap, and next_cursor continues it.'}, 'is_notice': {'type': 'boolean', 'description': 'Only 24/48-hour notice filings (near-election spending). Itemized only.'}, 'max_amount': {'type': 'number', 'description': 'Maximum expenditure amount in dollars. Itemized only.'}, 'min_amount': {'type': 'number', 'description': 'Minimum expenditure amount in dollars. Itemized only.'}, 'payee_name': {'type': 'string', 'description': 'Full-text payee name search. Itemized only.'}, 'most_recent': {'type': 'boolean', 'description': 'Only the most recent version of amended filings. Itemized only â\x80\x94 by_candidate rejects it. Defaults to true in itemized mode when omitted; pass false to see superseded versions of amended filings.'}, 'candidate_id': {'type': 'string', 'description': 'Targeted candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.'}, 'committee_id': {'type': 'string', 'description': 'Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results.'}, 'election_full': {'type': 'boolean', 'description': 'by_candidate only: expand cycle to the full election period (4yr president, 6yr senate, 2yr house) instead of the two-year cycle alone. Defaults to true when omitted; itemized mode rejects it, since that endpoint has no such parameter. Carries no schema default, so an explicit value is distinguishable from an omission.'}, 'support_oppose': {'enum': ['S', 'O'], 'type': 'string', 'description': 'S = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate.'}, 'candidate_party': {'type': 'string', 'description': 'Three-letter party code of the targeted candidate (e.g., DEM, REP). Itemized only â\x80\x94 by_candidate rejects it, since the aggregate endpoint has no party filter.'}, 'candidate_office': {'enum': ['H', 'S', 'P'], 'type': 'string', 'description': 'Office of the targeted candidate: H=House, S=Senate, P=President. In by_candidate mode this scopes a whole race: P stands alone, S also needs candidate_office_state, H also needs candidate_office_state and candidate_office_district.'}, 'candidate_office_state': {'type': 'string', 'description': 'Two-letter state code of the targeted race. Required alongside candidate_office=H or candidate_office=S in by_candidate mode; leave it off for candidate_office=P, whose aggregate rows carry no state and match nothing when one is supplied.'}, 'candidate_office_district': {'type': 'string', 'description': 'Two-digit House district of the targeted race (e.g., "09"). Required alongside candidate_office=H and candidate_office_state in by_candidate mode; Senate and presidential rows carry no district and match nothing when one is supplied.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'mode', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'mode': {'enum': ['itemized', 'by_candidate'], 'type': 'string', 'description': 'Query mode as the server resolved it. Row shapes differ by mode â\x80\x94 itemized rows are individual expenditures, by_candidate rows are per-candidate totals â\x80\x94 so read this rather than inferring the shape from the fields present.'}, 'count': {'type': 'number', 'description': 'Total matching independent expenditures (itemized mode). Check count_is_approximate before quoting it as a figure.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['by_candidate_requires_scope', 'itemized_only_filters_in_aggregate_mode', 'inputs_not_applicable_to_mode'], 'description': 'Machine-readable failure mode. Declared by this tool: `by_candidate_requires_scope`: by_candidate mode invoked without a candidate_id and without a full race scope. `itemized_only_filters_in_aggregate_mode`: An itemized-only filter (payee_name, candidate_party, a date or amount bound, is_notice, most_recent, sort, cursor) was supplied alongside mode by_candidate, which cannot apply it. `inputs_not_applicable_to_mode`: Itemized mode receives an explicit page number or election_full, neither of which its keyset endpoint can apply. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when expenditures did match, that the total is an estimate, or that the page was bounded below the per_page requested and how to continue.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Itemized independent expenditure record (mode=itemized) or per-candidate aggregate row (mode=by_candidate).', 'additionalProperties': {}}, 'description': 'Expenditure result set; itemized records or per-candidate aggregates depending on mode.'}, 'committee': {'type': 'object', 'properties': {}, 'description': 'The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own committee object.', 'additionalProperties': {}}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination info (by_candidate mode only).', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching expenditures or per-candidate aggregates.'}, 'next_cursor': {'type': ['string', 'null'], 'description': 'Pagination cursor for the next page of itemized results. Null when no more pages.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally.'}}, 'additionalProperties': False}
openfec_search_filings
Openfec Search Filings
Search FEC filings and reports by committee, candidate, form type, or date range. Covers financial reports (F3/F3P/F3X), statements of candidacy (F2), organizational filings (F1), 24-hour IE notices (F24), and amendments.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'page': {'type': 'integer', 'default': 1, 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Page number (1-indexed).'}, 'cycle': {'type': 'number', 'description': 'Two-year election cycle (even year).'}, 'per_page': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. At most 65 are requested upstream, keeping the response under a 100,000-byte budget. A page bounded below your request reports truncated and cap, and pagination.per_page echoes the size applied â\x80\x94 page numbers count at that size, so continue with the next page number.'}, 'form_type': {'type': 'string', 'description': 'FEC form type. Common: F3 (House/Senate quarterly), F3P (Presidential), F3X (PAC/party), F24 (24-hour IE notice), F1 (statement of organization), F2 (statement of candidacy), F5 (IE by persons).'}, 'filer_name': {'type': 'string', 'description': 'Full-text filer name search.'}, 'is_amended': {'type': 'boolean', 'description': 'Filter to original or amended filings only.'}, 'most_recent': {'type': 'boolean', 'default': True, 'description': 'Only the most recent version (filters out superseded amendments).'}, 'report_type': {'type': 'string', 'description': 'Report type code. Common: Q1/Q2/Q3 (quarterly), YE (year-end), M3-M12 (monthly), 12G/12P/30G (pre/post election).'}, 'report_year': {'type': 'number', 'description': 'Filing year.'}, 'candidate_id': {'type': 'string', 'description': 'Associated candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results.'}, 'committee_id': {'type': 'string', 'description': 'Filing committee ID (e.g., C00358796). Get IDs from openfec_search_committees results.'}, 'max_receipt_date': {'type': 'string', 'description': 'Latest FEC receipt date (YYYY-MM-DD).'}, 'min_receipt_date': {'type': 'string', 'description': 'Earliest date FEC received the filing (YYYY-MM-DD).'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'pagination', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per_page this call applied in place of the one requested â\x80\x94 the page-size ceiling for this tool and scope. Present only when truncated is true.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Rows in this page. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when filings did match, that the total is an estimate, or that the page was bounded below the per_page requested and how to continue.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Filing record; common keys include form_type, committee_id, committee_name, report_type, financial totals, and pdf_url.', 'additionalProperties': {}}, 'description': 'Filing result set; one record per match.'}, 'truncated': {'type': 'boolean', 'description': 'True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a naturally short last page.'}, 'pagination': {'type': 'object', 'required': ['page', 'pages', 'count', 'per_page'], 'properties': {'page': {'type': 'number', 'description': 'Current page number (1-indexed).'}, 'count': {'type': 'number', 'description': 'Total result count.'}, 'pages': {'type': 'number', 'description': 'Total number of pages.'}, 'per_page': {'type': 'number', 'description': 'Results per page.'}, 'count_is_approximate': {'type': 'boolean', 'description': 'True when OpenFEC reports this count as an estimate rather than a tally, which it does on its highest-volume datasets. Absent means the count is a tally. An estimated count â\x80\x94 and the pages derived from it â\x80\x94 can be off by a wide margin; treat it as an order of magnitude, not a figure to quote.'}}, 'description': 'Page-based pagination metadata.', 'additionalProperties': False}, 'totalCount': {'type': 'number', 'description': 'Total matching filings before pagination.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
openfec_search_legal
Openfec Search Legal
Search FEC legal documents: advisory opinions, enforcement cases (MURs), alternative dispute resolutions, administrative fines, and statutes. The citation, penalty, respondent, ao_number, and case_number filters each apply to only some document types; with type omitted, the search returns only the types every one of them applies to. Each response is held to 100,000 bytes: when a page would exceed it, whole results are held back and nextFromHit gives the from_hit that continues each document type.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'type': {'enum': ['advisory_opinions', 'murs', 'adrs', 'admin_fines', 'statutes'], 'type': 'string', 'description': 'Document type filter. Omit to search every type the other filters apply to â\x80\x94 all five when only query is given. admin_fines can be slow without a query.'}, 'query': {'type': 'string', 'description': 'Full-text search across legal documents.'}, 'from_hit': {'type': 'integer', 'default': 0, 'maximum': 9999, 'minimum': 0, 'description': 'Offset for pagination (0-indexed), counted within each document type rather than across them. Default 0. When a response is bounded, nextFromHit gives the value that continues each type. The search index serves a 10,000-result window, so from_hit plus hits_returned must be 10,000 or less â\x80\x94 the ceiling here assumes hits_returned of 1.'}, 'max_date': {'type': 'string', 'description': 'Latest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind.'}, 'min_date': {'type': 'string', 'description': 'Earliest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind.'}, 'ao_number': {'type': 'string', 'description': 'Specific advisory opinion number (e.g. "2024-01"). Applies to advisory_opinions only: rejected with any other type, and with type omitted only advisory opinions are returned.'}, 'date_kind': {'enum': ['issue_date', 'request_date', 'open_date', 'close_date', 'document_date', 'rtb_date', 'fd_date'], 'type': 'string', 'description': 'Which date min_date/max_date bound. Each document type records its own dates, so this must be one the chosen type has: type=advisory_opinions â\x86\x92 issue_date (opinion issued), request_date (request received), document_date; type=murs or adrs â\x86\x92 open_date (case opened), close_date (case closed), document_date; type=admin_fines â\x86\x92 rtb_date (reason-to-believe finding), fd_date (final determination). type=statutes cannot be date-filtered. Required whenever min_date or max_date is given, together with type.'}, 'respondent': {'type': 'string', 'description': 'Respondent name. Applies to enforcement cases (murs, adrs) only: rejected with any other type, and with type omitted only MURs and ADRs are returned.'}, 'case_number': {'type': 'string', 'description': 'Specific MUR, ADR, or administrative fine case number (e.g. "8343"). Applies to murs, adrs, and admin_fines: rejected with advisory_opinions or statutes, and with type omitted only those three types are returned.'}, 'hits_returned': {'type': 'integer', 'default': 20, 'maximum': 200, 'minimum': 1, 'description': 'Results per page, applied per document type. Default 20, max 200. A response is held to 100,000 bytes, so a page of large records can carry fewer, with nextFromHit naming where each type continues. Bounded together with from_hit by the 10,000-result window.'}, 'max_penalty_amount': {'type': 'number', 'description': 'Maximum penalty amount in dollars. Applies to murs, adrs, and admin_fines (an administrative fine matches on its reason-to-believe or final-determination amount): rejected with advisory_opinions or statutes, and with type omitted only those three types are returned.'}, 'min_penalty_amount': {'type': 'number', 'description': 'Minimum penalty amount in dollars. Applies to murs, adrs, and admin_fines (an administrative fine matches on its reason-to-believe or final-determination amount): rejected with advisory_opinions or statutes, and with type omitted only those three types are returned.'}, 'statutory_citation': {'type': 'string', 'description': 'U.S.C. citation in the form "<title> U.S.C. <section>" (e.g. "52 U.S.C. 30104"; "USC", "§", and a suffix such as "30104(g)" are accepted â\x80\x94 a bare "30104" is rejected as invalid_citation). One citation per value: "52 U.S.C. 30104, 52 U.S.C. 30118" is rejected, since only the first would be applied. Given with regulatory_citation, matches a document that cites either one. On murs and adrs it cannot be combined with case_number, respondent, a penalty bound, or an open_date or close_date bound, which the search index would ignore. Applies to advisory_opinions, murs, and adrs: rejected with admin_fines or statutes, and with type omitted only those three types are returned.'}, 'regulatory_citation': {'type': 'string', 'description': 'CFR citation in the form "<title> CFR <part>.<section>" (e.g. "11 CFR 110.1"; "C.F.R.", "§", and a suffix such as "110.1(b)" are accepted â\x80\x94 a bare "110.1" is rejected as invalid_citation). One citation per value: "11 CFR 110.1; 11 CFR 110.2" is rejected, since only the first would be applied. Given with statutory_citation, matches a document that cites either one. On murs and adrs it cannot be combined with case_number, respondent, a penalty bound, or an open_date or close_date bound, which the search index would ignore. Applies to advisory_opinions, murs, and adrs: rejected with admin_fines or statutes, and with type omitted only those three types are returned.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'total_count', 'search_criteria', 'totalCount']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['missing_filter', 'date_filter_incomplete', 'date_kind_not_valid_for_type', 'filter_not_valid_for_type', 'invalid_citation', 'legal_window_exceeded'], 'description': 'Machine-readable failure mode. Declared by this tool: `missing_filter`: Called without any scoping filter at all. `date_filter_incomplete`: min_date or max_date given without both a type and a date_kind, or a date_kind given with neither bound. `date_kind_not_valid_for_type`: The requested date_kind is not a date this document type records. `filter_not_valid_for_type`: A type-specific filter was sent with a type it does not filter, or type-specific filters that no single document type accepts together â\x80\x94 including a citation with case_number, respondent, a penalty bound, or an open_date or close_date bound on murs or adrs. `invalid_citation`: A citation is not in a form the search index parses, so upstream would ignore it and return the type unfiltered, or a value holds a second citation upstream would ignore. `legal_window_exceeded`: from_hit plus hits_returned exceeds the 10,000-result window the search index serves. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Results in this response. Present only when truncated is true.'}, 'notice': {'type': 'string', 'description': 'Guidance on the page returned: how to broaden a search that matched nothing, that from_hit ran past the end when documents did match, or â\x80\x94 when truncated is set â\x80\x94 how each document type continues.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Legal document record. The document_type field discriminates among advisory_opinion, mur, adr, admin_fine, and statute. Common fields include no (the identifier every type carries, and the one openfec_get_legal_document takes; advisory opinions repeat it as ao_no), name, document_type, document_count and document_categories summarizing the related filings, and disposition_count and disposition_categories summarizing the dispositions.', 'additionalProperties': {}}, 'description': 'Legal document result set spanning advisory opinions, MURs, ADRs, admin fines, and statutes â\x80\x94 only the types searched. Grouped by type in upstream order; when truncated is set, each type holds its first results up to the response budget.'}, 'truncated': {'type': 'boolean', 'description': 'True when results upstream returned for this page were held back because the next one would take the response past its 100,000-byte budget. Absent when the page is complete, including a naturally short page and an offset past the end.'}, 'totalCount': {'type': 'number', 'description': 'Total matching legal documents across the document types searched.'}, 'nextFromHit': {'type': 'object', 'description': 'The from_hit that continues each document type with results held back, keyed by the value to pass as type (advisory_opinions, murs, adrs, admin_fines, statutes). Re-call with the same filters, that type, and this from_hit. Present only when truncated is true.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'number'}}, 'total_count': {'type': 'number', 'description': 'Total matching documents across the types searched: the requested type, or with type omitted, every type the supplied filters apply to.'}, 'retrievalHint': {'type': 'string', 'description': 'How to recover the material trimmed out of these results. Present whenever any result was returned, because every result is trimmed.'}, 'search_criteria': {'type': 'object', 'properties': {}, 'description': 'Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present â\x80\x94 compare it against what you sent to confirm every filter was honoured.', 'additionalProperties': {}}}, 'additionalProperties': False}
Modificado
openfec_get_legal_document
27 de September de 2026 a las 02:44
Modificado
openfec_search_legal
27 de September de 2026 a las 02:44
Modificado
openfec_lookup_calendar
25 de September de 2026 a las 02:51
Modificado
openfec_search_legal
25 de September de 2026 a las 02:51
Modificado
openfec_lookup_elections
25 de September de 2026 a las 02:51
Modificado
openfec_search_filings
25 de September de 2026 a las 02:51
Modificado
openfec_search_coordinated_expenditures
25 de September de 2026 a las 02:51
Modificado
openfec_search_expenditures
25 de September de 2026 a las 02:51
Modificado
openfec_search_disbursements
25 de September de 2026 a las 02:51
Modificado
openfec_search_contributions
25 de September de 2026 a las 02:51
Modificado
openfec_get_committee_totals
25 de September de 2026 a las 02:51
Modificado
openfec_search_committees
25 de September de 2026 a las 02:51
Modificado
openfec_search_candidates
25 de September de 2026 a las 02:51
Modificado
openfec_lookup_calendar
21 de September de 2026 a las 02:50
Modificado
openfec_get_legal_document
21 de September de 2026 a las 02:50
Modificado
openfec_search_legal
21 de September de 2026 a las 02:50
Modificado
openfec_lookup_elections
21 de September de 2026 a las 02:50
Modificado
openfec_search_expenditures
21 de September de 2026 a las 02:50
Modificado
openfec_search_disbursements
21 de September de 2026 a las 02:50
Modificado
openfec_search_contributions
21 de September de 2026 a las 02:50
Modificado
openfec_get_committee_totals
21 de September de 2026 a las 02:50
Modificado
openfec_search_committees
21 de September de 2026 a las 02:50
Modificado
openfec_search_candidates
21 de September de 2026 a las 02:50
Añadido
openfec_lookup_calendar
17 de September de 2026 a las 12:41
Añadido
openfec_get_legal_document
17 de September de 2026 a las 12:41
Añadido
openfec_search_legal
17 de September de 2026 a las 12:41
Añadido
openfec_lookup_elections
17 de September de 2026 a las 12:41
Añadido
openfec_search_filings
17 de September de 2026 a las 12:41
Añadido
openfec_search_coordinated_expenditures
17 de September de 2026 a las 12:41
Añadido
openfec_search_expenditures
17 de September de 2026 a las 12:41