{"openapi":"3.1.0","info":{"title":"Federal Influence Graph","summary":"Investigative leads across linked federal public records","description":"\nFIG is a **research index for public federal records**. It connects contracts,\nlobbying disclosures, campaign-finance records, legislation, votes, people,\norganizations, and agencies so journalists, analysts, and researchers can find\nrelationships worth investigating.\n\n**Good starting questions**\n\n* What public-record connections surround a person or organization?\n* Which contractors employ lobbyists with prior service at awarding agencies?\n* Where do a PAC's contributions, sponsored legislation, and relevant votes overlap?\n* Which primary filings support a result?\n\nStart with `GET /api/v1/meta` to understand current coverage, then\n`GET /api/v1/search` to find the best entity ID.\n\n**Interpretation:** FIG surfaces leads; it does not establish causation,\ncoordination, wrongdoing, or legal violations. Source fields can be incomplete\nor self-reported, and cross-source identity matches can be probabilistic. Verify\nmaterial findings against the linked primary records.\n","license":{"name":"AGPL-3.0"},"version":"0.2.0"},"paths":{"/api/v1/meta":{"get":{"tags":["meta"],"summary":"Get Metadata","description":"Describe what is currently loaded, which record dates it covers, and the\ninterpretation limits investigators should understand before using it.\n\nRecord-date ranges are calculated from the graph at request time. They are\ncoverage indicators, not a guarantee that every record in the range is\npresent and not a timestamp for the most recent ingestion run.","operationId":"get_metadata_api_v1_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphMetadataResponse"}}}}}}},"/api/v1/search":{"get":{"tags":["entities"],"summary":"Search Entities","description":"Full-text search across Person, Organization, and Agency name indexes.\n\nUses Neo4j's Lucene-backed full-text indexes for fast prefix and fuzzy\nmatching. Results favor exact lexical matches and resolver-canonical\nentities while retaining source-specific fragments for comparison.","operationId":"search_entities_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search string (full-text)","title":"Q"},"description":"Search string (full-text)"},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Person","Organization","Agency"],"type":"string"},{"type":"null"}],"description":"Filter by graph label, or omit to search all public entity types","title":"Entity Type"},"description":"Filter by graph label, or omit to search all public entity types"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entity/{entity_id}":{"get":{"tags":["entities"],"summary":"Get Entity","description":"Return an entity profile, complete relationship counts, and one bounded\npage of relationships with their temporal and provenance properties.\n\nRaises 404 if no entity with that canonical_id exists.","operationId":"get_entity_api_v1_entity__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"relationship_skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset into the entity relationship list","default":0,"title":"Relationship Skip"},"description":"Offset into the entity relationship list"},{"name":"relationship_limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Relationships returned in this page","default":50,"title":"Relationship Limit"},"description":"Relationships returned in this page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/revolving-door":{"get":{"tags":["relationships"],"summary":"Get Revolving Door","description":"Find individuals who left a federal agency and joined a lobbying firm or\nregulated industry within the specified cooling-off window.\n\nThe 24-month default matches the statutory cooling-off period for senior\nofficials (18 U.S.C. section 207(c)). Results are ordered by gap_months\nascending (shortest revolving door first). Covered-position filings\nfrequently omit dates; pass dated_only=false to see those transitions too.\nThis is a screening query, not a determination that a statutory restriction\napplies to any person or role.","operationId":"get_revolving_door_api_v1_revolving_door_get","parameters":[{"name":"agency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by agency name (case-insensitive substring)","title":"Agency"},"description":"Filter by agency name (case-insensitive substring)"},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"description":"Cooling-off window in months","default":24,"title":"Months"},"description":"Cooling-off window in months"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Skip"},"description":"Pagination offset"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Page size","default":50,"title":"Limit"},"description":"Page size"},{"name":"dated_only","in":"query","required":false,"schema":{"type":"boolean","description":"True: enforce the cooling-off window (both dates required). False: include transitions whose filings carry no dates — most of the data — with gap_months null. Known dated transitions must still fall within `months`.","default":true,"title":"Dated Only"},"description":"True: enforce the cooling-off window (both dates required). False: include transitions whose filings carry no dates — most of the data — with gap_months null. Known dated transitions must still fall within `months`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevolvingDoorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/influence-cycle/{organization_id}":{"get":{"tags":["relationships"],"summary":"Get Influence Cycle","description":"For a given organization, return the complete influence cycle:\ncontracts received, lobbying filed, employee contributions, and\nformer government employees now on staff.\n\nEvery data point includes source attribution (source + source_url).","operationId":"get_influence_cycle_api_v1_influence_cycle__organization_id__get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset per sub-query","default":0,"title":"Skip"},"description":"Pagination offset per sub-query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Page size per sub-query","default":50,"title":"Limit"},"description":"Page size per sub-query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluenceCycleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/iron-triangle":{"get":{"tags":["relationships"],"summary":"Get Iron Triangle","description":"Find contractors whose registered lobbyists previously worked at the very\nagencies awarding their contracts — the classic iron-triangle pattern.\nOrdered by total contract value descending.","operationId":"get_iron_triangle_api_v1_iron_triangle_get","parameters":[{"name":"agency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by awarding agency name (case-insensitive substring)","title":"Agency"},"description":"Filter by awarding agency name (case-insensitive substring)"},{"name":"min_contract_value","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Minimum total contract dollars per contractor","default":1000000,"title":"Min Contract Value"},"description":"Minimum total contract dollars per contractor"},{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum contractors returned","default":25,"title":"Top N"},"description":"Maximum contractors returned"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IronTriangleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/structural-indicators":{"get":{"tags":["relationships"],"summary":"Get Structural Indicators","description":"Return separately labeled structural indicators for one agency, plus the\nexisting experimental heuristic for reproducibility.\n\nThese counts are descriptive screening signals. They do not measure\nregulatory capture and should not be used to rank misconduct or legal risk.","operationId":"get_structural_indicators_api_v1_structural_indicators_get","parameters":[{"name":"agency","in":"query","required":true,"schema":{"type":"string","description":"Exact agency node name","title":"Agency"},"description":"Exact agency node name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuralIndicatorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/capture-score":{"get":{"tags":["relationships"],"summary":"Get Capture Score","description":"Deprecated compatibility route. Use /structural-indicators for neutral component labels and explicit methodology caveats.","operationId":"get_capture_score_api_v1_capture_score_get","deprecated":true,"parameters":[{"name":"agency","in":"query","required":true,"schema":{"type":"string","description":"Exact agency node name","title":"Agency"},"description":"Exact agency node name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptureScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pac-influence":{"get":{"tags":["relationships"],"summary":"Get Pac Influence","description":"For one PAC, show total disbursements and which congressional committees'\nmembers receive its contributions — the money side of the iron triangle.","operationId":"get_pac_influence_api_v1_pac_influence_get","parameters":[{"name":"committee_id","in":"query","required":true,"schema":{"type":"string","description":"FEC committee ID of the PAC (C...)","title":"Committee Id"},"description":"FEC committee ID of the PAC (C...)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max committees returned","default":15,"title":"Limit"},"description":"Max committees returned"},{"name":"include_subcommittees","in":"query","required":false,"schema":{"type":"boolean","description":"Include subcommittee rows (top-level only by default)","default":false,"title":"Include Subcommittees"},"description":"Include subcommittee rows (top-level only by default)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PacInfluenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/legislative-alignment":{"get":{"tags":["relationships"],"summary":"Get Legislative Alignment","description":"Close the influence loop: of the legislators a PAC funds, what policy\nareas do the bills they sponsor fall into? Connects the money side\n(contributions → committee members) to the output side (sponsored bills).","operationId":"get_legislative_alignment_api_v1_legislative_alignment_get","parameters":[{"name":"committee_id","in":"query","required":true,"schema":{"type":"string","description":"FEC committee ID of the PAC (C...)","title":"Committee Id"},"description":"FEC committee ID of the PAC (C...)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max policy areas returned","default":15,"title":"Limit"},"description":"Max policy areas returned"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegislativeAlignmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/money-vote-alignment":{"get":{"tags":["relationships"],"summary":"Get Money Vote Alignment","description":"On roll calls for bills this PAC's sponsor company lobbied on (its own\nLDA disclosures), how do the legislators the PAC funds vote compared to\nsame-party legislators it does not fund?","operationId":"get_money_vote_alignment_api_v1_money_vote_alignment_get","parameters":[{"name":"committee_id","in":"query","required":true,"schema":{"type":"string","description":"FEC committee ID of the PAC (C...)","title":"Committee Id"},"description":"FEC committee ID of the PAC (C...)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoneyVoteAlignmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/paths":{"get":{"tags":["paths"],"summary":"Find Paths","description":"Find all shortest paths connecting two entities in the influence graph.\n\nUses Neo4j's allShortestPaths(), bounded by max_hops. Each path is a\nsequence of alternating nodes and relationships with full properties.\n\nPerformance note: densely connected nodes (major PACs, large agencies)\nmay produce many short paths. Use limit to bound the response (maximum 50).","operationId":"find_paths_api_v1_paths_get","parameters":[{"name":"source","in":"query","required":true,"schema":{"type":"string","description":"canonical_id of the source entity","title":"Source"},"description":"canonical_id of the source entity"},{"name":"target","in":"query","required":true,"schema":{"type":"string","description":"canonical_id of the target entity","title":"Target"},"description":"canonical_id of the target entity"},{"name":"max_hops","in":"query","required":false,"schema":{"type":"integer","maximum":6,"minimum":1,"description":"Maximum relationship hops (keep <= 4 for performance)","default":4,"title":"Max Hops"},"description":"Maximum relationship hops (keep <= 4 for performance)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum shortest paths returned; lower values reduce response size","default":10,"title":"Limit"},"description":"Maximum shortest paths returned; lower values reduce response size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health Check","description":"Return service liveness status. Does not check Neo4j connectivity.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Health Get"}}}}}}}},"components":{"schemas":{"AcquisitionSourceStatus":{"properties":{"expected_assets":{"type":"integer","title":"Expected Assets"},"acquired_assets":{"type":"integer","title":"Acquired Assets"},"remaining_assets":{"type":"integer","title":"Remaining Assets"},"known_total_bytes":{"type":"integer","title":"Known Total Bytes"},"acquired_bytes":{"type":"integer","title":"Acquired Bytes"},"remaining_bytes":{"type":"integer","title":"Remaining Bytes"},"completeness_pct":{"type":"number","title":"Completeness Pct"}},"type":"object","required":["expected_assets","acquired_assets","remaining_assets","known_total_bytes","acquired_bytes","remaining_bytes","completeness_pct"],"title":"AcquisitionSourceStatus","description":"Raw bulk-archive acquisition progress for one source."},"AcquisitionStatus":{"properties":{"state_version":{"type":"integer","title":"State Version"},"operational_status":{"type":"string","title":"Operational Status"},"generated_at":{"type":"string","title":"Generated At"},"manifest_generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Generated At"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"},"target_completion_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Completion At"},"expected_assets":{"type":"integer","title":"Expected Assets"},"acquired_assets":{"type":"integer","title":"Acquired Assets"},"remaining_assets":{"type":"integer","title":"Remaining Assets"},"completeness_pct":{"type":"number","title":"Completeness Pct"},"known_total_bytes":{"type":"integer","title":"Known Total Bytes"},"acquired_bytes":{"type":"integer","title":"Acquired Bytes"},"remaining_bytes":{"type":"integer","title":"Remaining Bytes"},"unknown_size_assets":{"type":"integer","title":"Unknown Size Assets","default":0},"observed_bytes_per_second":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Observed Bytes Per Second"},"required_bytes_per_second":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Required Bytes Per Second"},"estimated_completion_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion At"},"disk_free_bytes":{"type":"integer","title":"Disk Free Bytes"},"sources":{"additionalProperties":{"$ref":"#/components/schemas/AcquisitionSourceStatus"},"type":"object","title":"Sources"},"deferred_assets":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Deferred Assets"},"api_only_or_unavailable":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Api Only Or Unavailable"}},"type":"object","required":["state_version","operational_status","generated_at","expected_assets","acquired_assets","remaining_assets","completeness_pct","known_total_bytes","acquired_bytes","remaining_bytes","disk_free_bytes"],"title":"AcquisitionStatus","description":"Resumable upstream archive acquisition and byte projection."},"BackupStatus":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"storage":{"type":"string","title":"Storage"},"started_at":{"type":"string","title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"exit_code":{"type":"integer","title":"Exit Code"},"snapshot_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Id"}},"type":"object","required":["run_id","status","storage","started_at","exit_code"],"title":"BackupStatus","description":"Most recent verified database backup status."},"CaptureScoreResponse":{"properties":{"agency_name":{"type":"string","title":"Agency Name"},"agency_code":{"type":"string","title":"Agency Code"},"revolving_door_count":{"type":"integer","title":"Revolving Door Count"},"active_lobbyist_count":{"type":"integer","title":"Active Lobbyist Count"},"top_contractors":{"items":{"type":"string"},"type":"array","title":"Top Contractors"},"capture_score":{"type":"number","title":"Capture Score"}},"type":"object","required":["agency_name","agency_code","revolving_door_count","active_lobbyist_count","top_contractors","capture_score"],"title":"CaptureScoreResponse","description":"Composite regulatory-capture indicators for one agency.\n\nThe score is a heuristic (weighted revolving-door count, lobbying volume,\nand contractor concentration, normalized 0-1) — treat it as a screening\nsignal, not a measurement."},"ContractItem":{"properties":{"award_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Award Id"},"piid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Piid"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"agency_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Name"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","title":"ContractItem"},"ContributionItem":{"properties":{"contributor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contributor Name"},"contributor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contributor Id"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"committee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Committee Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","title":"ContributionItem"},"CoverageControllerStatus":{"properties":{"state_version":{"type":"integer","title":"State Version"},"operational_status":{"type":"string","title":"Operational Status"},"generated_at":{"type":"string","title":"Generated At"},"as_of":{"type":"string","title":"As Of"},"expected_partitions":{"type":"integer","title":"Expected Partitions"},"completed_partitions":{"type":"integer","title":"Completed Partitions"},"missing_partitions":{"type":"integer","title":"Missing Partitions"},"stale_partitions":{"type":"integer","title":"Stale Partitions"},"completeness_pct":{"type":"number","title":"Completeness Pct"},"last_progress_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Progress At"},"artifact_projection":{"additionalProperties":true,"type":"object","title":"Artifact Projection"},"processing_projection":{"additionalProperties":true,"type":"object","title":"Processing Projection"},"sources":{"additionalProperties":{"$ref":"#/components/schemas/SourcePartitionCoverage"},"type":"object","title":"Sources"},"blocked_tasks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Blocked Tasks"},"selected_tasks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Selected Tasks"}},"type":"object","required":["state_version","operational_status","generated_at","as_of","expected_partitions","completed_partitions","missing_partitions","stale_partitions","completeness_pct"],"title":"CoverageControllerStatus","description":"Durable backlog and freshness state from the ingestion controller."},"DatasetCoverage":{"properties":{"source":{"type":"string","title":"Source"},"record_type":{"type":"string","title":"Record Type"},"record_count":{"type":"integer","title":"Record Count"},"earliest_record_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Earliest Record Date"},"latest_record_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Record Date"},"date_basis":{"type":"string","title":"Date Basis"},"scope_note":{"type":"string","title":"Scope Note"},"source_url":{"type":"string","title":"Source Url"}},"type":"object","required":["source","record_type","record_count","earliest_record_date","latest_record_date","date_basis","scope_note","source_url"],"title":"DatasetCoverage","description":"Loaded record coverage for one public data source."},"EntityDetail":{"properties":{"canonical_id":{"type":"string","title":"Canonical Id"},"label":{"type":"string","title":"Label"},"name":{"type":"string","title":"Name"},"record_scope":{"type":"string","title":"Record Scope","description":"resolver-canonical for entity-resolver output; source-specific otherwise","default":"source-specific"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes"},"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids"},"relationship_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Relationship Counts","description":"Counts per relationship type, e.g. {'EMPLOYED_BY': 3}"},"relationships":{"items":{"$ref":"#/components/schemas/RelationshipDetail"},"type":"array","title":"Relationships"},"relationship_total":{"type":"integer","title":"Relationship Total","description":"Total relationships before pagination","default":0},"relationship_skip":{"type":"integer","title":"Relationship Skip","default":0},"relationship_limit":{"type":"integer","title":"Relationship Limit","default":50},"relationships_returned":{"type":"integer","title":"Relationships Returned","default":0},"has_more_relationships":{"type":"boolean","title":"Has More Relationships","default":false}},"type":"object","required":["canonical_id","label","name"],"title":"EntityDetail","description":"Full entity detail including all relationships and temporal properties."},"EntitySummary":{"properties":{"canonical_id":{"type":"string","title":"Canonical Id"},"label":{"type":"string","title":"Label","description":"Neo4j node label: Person, Organization, Agency, etc."},"name":{"type":"string","title":"Name"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Composite rank: lexical match, resolver-canonical status, and text score"},"text_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Text Score","description":"Raw Neo4j full-text relevance score"},"match_quality":{"type":"string","title":"Match Quality","description":"Lexical match class: exact, same-tokens, prefix, contains, token, or fuzzy","default":"fuzzy"},"record_scope":{"type":"string","title":"Record Scope","description":"resolver-canonical for entity-resolver output; source-specific otherwise. This does not guarantee that multiple sources were merged.","default":"source-specific"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes"}},"type":"object","required":["canonical_id","label","name"],"title":"EntitySummary","description":"Compact entity representation used in search results."},"FormerGovtItem":{"properties":{"person_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Name"},"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id"},"former_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Former Title"},"agency_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Name"},"started":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started"},"left":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Left"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","title":"FormerGovtItem"},"GraphMetadataResponse":{"properties":{"service":{"type":"string","title":"Service","default":"Federal Influence Graph"},"purpose":{"type":"string","title":"Purpose"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"release_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Sha"},"data_pipeline":{"anyOf":[{"$ref":"#/components/schemas/PipelineStatus"},{"type":"null"}]},"data_backup":{"anyOf":[{"$ref":"#/components/schemas/BackupStatus"},{"type":"null"}]},"coverage_controller":{"anyOf":[{"$ref":"#/components/schemas/CoverageControllerStatus"},{"type":"null"}]},"data_acquisition":{"anyOf":[{"$ref":"#/components/schemas/AcquisitionStatus"},{"type":"null"}]},"node_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Node Counts"},"relationship_count":{"type":"integer","title":"Relationship Count","default":0},"datasets":{"items":{"$ref":"#/components/schemas/DatasetCoverage"},"type":"array","title":"Datasets"},"coverage_note":{"type":"string","title":"Coverage Note"},"interpretation_caveats":{"items":{"type":"string"},"type":"array","title":"Interpretation Caveats"}},"type":"object","required":["purpose","generated_at","coverage_note"],"title":"GraphMetadataResponse","description":"Current graph scope and the caveats needed to interpret it."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InfluenceCycleResponse":{"properties":{"organization_name":{"type":"string","title":"Organization Name"},"organization_id":{"type":"string","title":"Organization Id"},"contracts_received":{"items":{"$ref":"#/components/schemas/ContractItem"},"type":"array","title":"Contracts Received"},"lobbying_filed":{"items":{"$ref":"#/components/schemas/LobbyingItem"},"type":"array","title":"Lobbying Filed"},"contributions_made":{"items":{"$ref":"#/components/schemas/ContributionItem"},"type":"array","title":"Contributions Made"},"former_govt_employees":{"items":{"$ref":"#/components/schemas/FormerGovtItem"},"type":"array","title":"Former Govt Employees"}},"type":"object","required":["organization_name","organization_id"],"title":"InfluenceCycleResponse","description":"Complete influence cycle for an organization."},"IronTriangleResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/TriangleItem"},"type":"array","title":"Results"},"agency_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Filter"},"min_contract_value":{"type":"number","title":"Min Contract Value"}},"type":"object","required":["results","agency_filter","min_contract_value"],"title":"IronTriangleResponse","description":"Contractors whose lobbyists formerly worked at their awarding agencies."},"LegislativeAlignmentResponse":{"properties":{"pac_name":{"type":"string","title":"Pac Name"},"pac_canonical_id":{"type":"string","title":"Pac Canonical Id"},"funded_legislators":{"type":"integer","title":"Funded Legislators"},"by_policy_area":{"items":{"$ref":"#/components/schemas/PolicyAreaItem"},"type":"array","title":"By Policy Area"}},"type":"object","required":["pac_name","pac_canonical_id","funded_legislators"],"title":"LegislativeAlignmentResponse","description":"Policy areas of bills sponsored by the legislators a PAC funds."},"LobbyingItem":{"properties":{"filing_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Uuid"},"filing_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Type"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Income"},"issues":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Issues"},"registrant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registrant Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","title":"LobbyingItem"},"MoneyVoteAlignmentResponse":{"properties":{"pac_name":{"type":"string","title":"Pac Name"},"sponsor_name":{"type":"string","title":"Sponsor Name"},"bills_lobbied":{"type":"integer","title":"Bills Lobbied"},"rollcalls":{"type":"integer","title":"Rollcalls"},"rows":{"items":{"$ref":"#/components/schemas/VoteAlignmentRowItem"},"type":"array","title":"Rows"}},"type":"object","required":["pac_name","sponsor_name","bills_lobbied","rollcalls"],"title":"MoneyVoteAlignmentResponse","description":"Within-party yea-rates on roll calls tied to bills the PAC's sponsor\ncompany lobbied on. Compare funded vs non-funded rows WITHIN a party —\nparty is the dominant confound. Yea is not necessarily the\ncompany-favorable direction, and alignment is not causation: money\nflowing to already-aligned members is indistinguishable from persuasion\nin this data."},"PacCommitteeItem":{"properties":{"committee_id":{"type":"string","title":"Committee Id"},"committee_name":{"type":"string","title":"Committee Name"},"chamber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chamber"},"dollars":{"type":"number","title":"Dollars"},"member_count":{"type":"integer","title":"Member Count"}},"type":"object","required":["committee_id","committee_name","chamber","dollars","member_count"],"title":"PacCommitteeItem"},"PacInfluenceResponse":{"properties":{"pac_name":{"type":"string","title":"Pac Name"},"pac_canonical_id":{"type":"string","title":"Pac Canonical Id"},"total_disbursed":{"type":"number","title":"Total Disbursed"},"to_legislator_committees":{"type":"number","title":"To Legislator Committees"},"by_committee":{"items":{"$ref":"#/components/schemas/PacCommitteeItem"},"type":"array","title":"By Committee"}},"type":"object","required":["pac_name","pac_canonical_id","total_disbursed","to_legislator_committees"],"title":"PacInfluenceResponse","description":"Where a PAC's money goes, sliced by congressional committee.\n\nCommittee rows overlap (a legislator's receipts count toward every\ncommittee they sit on), so rows do not sum to total_disbursed."},"PathEdge":{"properties":{"rel_type":{"type":"string","title":"Rel Type"},"source_id":{"type":"string","title":"Source Id"},"target_id":{"type":"string","title":"Target Id"},"properties":{"additionalProperties":true,"type":"object","title":"Properties"}},"type":"object","required":["rel_type","source_id","target_id"],"title":"PathEdge","description":"A relationship in an influence path."},"PathNode":{"properties":{"canonical_id":{"type":"string","title":"Canonical Id"},"label":{"type":"string","title":"Label"},"name":{"type":"string","title":"Name"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes"}},"type":"object","required":["canonical_id","label","name"],"title":"PathNode","description":"A node in an influence path."},"PathResult":{"properties":{"nodes":{"items":{"$ref":"#/components/schemas/PathNode"},"type":"array","title":"Nodes"},"relationships":{"items":{"$ref":"#/components/schemas/PathEdge"},"type":"array","title":"Relationships"},"hop_count":{"type":"integer","title":"Hop Count"}},"type":"object","required":["nodes","relationships","hop_count"],"title":"PathResult","description":"A single path connecting two entities."},"PathsResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"target_id":{"type":"string","title":"Target Id"},"paths":{"items":{"$ref":"#/components/schemas/PathResult"},"type":"array","title":"Paths"},"path_count":{"type":"integer","title":"Path Count"},"min_hops":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Hops","description":"None if no path exists within max_hops"},"max_hops_searched":{"type":"integer","title":"Max Hops Searched"},"limit":{"type":"integer","title":"Limit","description":"Maximum paths requested"},"limit_reached":{"type":"boolean","title":"Limit Reached","description":"True when the response reached the requested cap; more paths may exist"}},"type":"object","required":["source_id","target_id","paths","path_count","max_hops_searched","limit","limit_reached"],"title":"PathsResponse","description":"All shortest paths between two entities."},"PipelineStatus":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"since":{"type":"string","title":"Since"},"started_at":{"type":"string","title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"exit_code":{"type":"integer","title":"Exit Code"},"source_since":{"additionalProperties":{"type":"string"},"type":"object","title":"Source Since"}},"type":"object","required":["run_id","status","since","started_at","exit_code"],"title":"PipelineStatus","description":"Most recent server-side ingestion run status."},"PolicyAreaItem":{"properties":{"policy_area":{"type":"string","title":"Policy Area"},"bill_count":{"type":"integer","title":"Bill Count"},"sponsor_count":{"type":"integer","title":"Sponsor Count"},"dollars_to_sponsors":{"type":"number","title":"Dollars To Sponsors"}},"type":"object","required":["policy_area","bill_count","sponsor_count","dollars_to_sponsors"],"title":"PolicyAreaItem"},"RelationshipDetail":{"properties":{"rel_type":{"type":"string","title":"Rel Type"},"direction":{"type":"string","title":"Direction","description":"'outgoing' or 'incoming'"},"neighbor_id":{"type":"string","title":"Neighbor Id"},"neighbor_name":{"type":"string","title":"Neighbor Name"},"neighbor_label":{"type":"string","title":"Neighbor Label"},"rel_props":{"additionalProperties":true,"type":"object","title":"Rel Props"}},"type":"object","required":["rel_type","direction","neighbor_id","neighbor_name","neighbor_label"],"title":"RelationshipDetail","description":"A single relationship on an entity."},"RevolvingDoorItem":{"properties":{"person_name":{"type":"string","title":"Person Name"},"person_canonical_id":{"type":"string","title":"Person Canonical Id"},"government_title":{"type":"string","title":"Government Title"},"agency_name":{"type":"string","title":"Agency Name"},"left_government":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Left Government"},"new_employer":{"type":"string","title":"New Employer"},"new_employer_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Employer Type"},"gap_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gap Months"},"lobbying_issues":{"items":{"type":"string"},"type":"array","title":"Lobbying Issues"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["person_name","person_canonical_id","government_title","agency_name","left_government","new_employer","new_employer_type"],"title":"RevolvingDoorItem","description":"One revolving-door instance."},"RevolvingDoorResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RevolvingDoorItem"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"agency_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Filter"},"max_gap_months":{"type":"integer","title":"Max Gap Months"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["results","total","agency_filter","max_gap_months","skip","limit"],"title":"RevolvingDoorResponse","description":"Paginated revolving-door results."},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EntitySummary"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"query":{"type":"string","title":"Query"}},"type":"object","required":["results","total","query"],"title":"SearchResponse","description":"Paginated search results."},"SourcePartitionCoverage":{"properties":{"expected_partitions":{"type":"integer","title":"Expected Partitions"},"completed_partitions":{"type":"integer","title":"Completed Partitions"},"missing_partitions":{"type":"integer","title":"Missing Partitions"},"stale_partitions":{"type":"integer","title":"Stale Partitions"},"oldest_missing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest Missing"},"newest_complete":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newest Complete"},"completeness_pct":{"type":"number","title":"Completeness Pct"},"completed_artifact_bytes":{"type":"integer","title":"Completed Artifact Bytes","default":0},"projected_remaining_artifact_bytes":{"type":"integer","title":"Projected Remaining Artifact Bytes","default":0},"projected_remaining_processing_seconds":{"type":"integer","title":"Projected Remaining Processing Seconds","default":0}},"type":"object","required":["expected_partitions","completed_partitions","missing_partitions","stale_partitions","completeness_pct"],"title":"SourcePartitionCoverage","description":"Partition-level completeness for one upstream source."},"StructuralIndicatorsResponse":{"properties":{"agency_name":{"type":"string","title":"Agency Name"},"agency_code":{"type":"string","title":"Agency Code"},"prior_government_person_count":{"type":"integer","title":"Prior Government Person Count","description":"People linked to the agency by PREVIOUSLY_AT records"},"lobbying_filing_count":{"type":"integer","title":"Lobbying Filing Count","description":"Distinct lobbying filings matched to the agency name"},"sample_contractors":{"items":{"type":"string"},"type":"array","title":"Sample Contractors","description":"Up to ten contractors connected to the agency; not a ranking"},"experimental_screening_score":{"type":"number","title":"Experimental Screening Score","description":"Version 0.1 heuristic normalized to 0-1; not a factual finding"},"methodology":{"type":"string","title":"Methodology"},"caveat":{"type":"string","title":"Caveat"}},"type":"object","required":["agency_name","agency_code","prior_government_person_count","lobbying_filing_count","sample_contractors","experimental_screening_score","methodology","caveat"],"title":"StructuralIndicatorsResponse","description":"Neutral labels for the components behind the experimental heuristic."},"TriangleItem":{"properties":{"contractor_name":{"type":"string","title":"Contractor Name"},"contractor_canonical_id":{"type":"string","title":"Contractor Canonical Id"},"total_contract_value":{"type":"number","title":"Total Contract Value"},"lobbyist_count":{"type":"integer","title":"Lobbyist Count"},"agencies":{"items":{"type":"string"},"type":"array","title":"Agencies"}},"type":"object","required":["contractor_name","contractor_canonical_id","total_contract_value","lobbyist_count"],"title":"TriangleItem","description":"One contractor-lobbyist-agency triangle."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VoteAlignmentRowItem":{"properties":{"party":{"type":"string","title":"Party"},"funded":{"type":"boolean","title":"Funded"},"legislators":{"type":"integer","title":"Legislators"},"votes":{"type":"integer","title":"Votes"},"yea":{"type":"integer","title":"Yea"},"yea_rate":{"type":"number","title":"Yea Rate"}},"type":"object","required":["party","funded","legislators","votes","yea","yea_rate"],"title":"VoteAlignmentRowItem"}}},"tags":[{"name":"meta","description":"Service scope, loaded-data coverage, and interpretation limits."},{"name":"entities","description":"Find canonical entities and inspect bounded relationship pages."},{"name":"relationships","description":"Investigative patterns across contracts, lobbying, personnel, money, and votes."},{"name":"paths","description":"Bounded shortest-path exploration between known entities."}]}