Lobbying Filings
Federal lobbying disclosures: who lobbied, for which client, on what issues, and the reported spend.
lobbying_filings — the dataset name to pass to the Obscura API.
What one row means
One federal lobbying disclosure filing from the Senate LDA (Lobbying Disclosure Act) public database: a single registrant-client relationship's periodic report (registration, quarterly activity report, or termination), carrying the reported income/expenses, the client and registrant identities, and the distinct general-issue-area codes lobbied on.
One row per (filing_uuid).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For lobbying_filings: published: available_date = the date-part of event_time (dt_posted), the moment the LDA accepted/posted the filing into the public system.
Refresh cadence
Obscura refreshes lobbying_filings daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 31 columns
The full public column list for lobbying_filings, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/lobbying_filings.
| Column | Type | Description |
|---|---|---|
| filing_uuid | text · not null | LDA-assigned UUID for the filing submission (e.g. '42172053-5ad0-45ac-a489-7f30c1061a5a'); primary key and the natural join/dedup key used by the collector's 'seen' set to skip already-stored filings. |
| filing_type | text | LDA filing-type short code, e.g. 'RR' (registration), 'Q1'-'Q4' (quarterly activity report), '2T'/'2TY' (quarter termination, with/without activity), '1' (year-end)/'1A' (year-end amendment). Nullable; blank strings filtered to null by the parser's `s()` helper. |
| filing_type_display | text | Human-readable label for filing_type as supplied by the LDA API, e.g. '2nd Quarter - Termination', '2nd Quarter - Termination (No Activity)', 'Registration'. Nullable. |
| filing_year | integer · not null | Calendar year the filing's reporting period falls in, per the LDA `filing_year` field; NOT NULL (defaults to 0 if absent from the API payload, which parse_filing treats as an unset sentinel rather than failing the row). Drives the collector's per-year sweep and gap_years backfill windowing, not the public-availability date. |
| filing_period | text | LDA reporting period label the filing covers, e.g. 'first_quarter', 'second_quarter', 'third_quarter', 'fourth_quarter'; nullable. Combined with filing_year this is the AS-OF reporting period the disclosure describes, which precedes the actual posting (available_date/event_time) by the statutory filing window (~20 days after quarter-end for quarterly reports). |
| income | double precision | Lobbying-firm income for the period, in USD, as reported by an outside registrant lobbying on behalf of a client (the fee the firm was paid). Parsed from the LDA `income` field, which arrives as either a JSON string ('40000.00') or a number; null when the field is absent, when the filer is an in-house registrant (which reports expenses instead), or on no-activity terminations. |
| expenses | double precision | In-house lobbying expenses for the period, in USD, as reported by a registrant lobbying on its own organization's behalf. Same string-or-number parsing as income; null when not applicable (most outside-firm filings report income, not expenses, and vice versa) or when unreported on a termination filing. |
| client_name | text | Display name of the client on whose behalf the registrant lobbied (e.g. 'VALTHOS INC.', 'JACKSON WALKER LLP ON BEHALF OF SAN MIGUEL ELECTRIC COOPERATIVE, INC.'), from the LDA API's nested `client.name`. Nullable if the client object is absent. |
| client_id | bigint | LDA's internal numeric identifier for the client organization (`client.client_id`); stable across a client's filings over time, letting filings for the same client be grouped even as client_name text varies slightly. Nullable. |
| client_description | text | Free-text description of the client's business supplied on the filing (e.g. 'Artificial intelligence biotechnology company.', 'Electric utility company in South Texas'), from `client.general_description`. Nullable. |
| registrant_name | text | Display name of the registrant (the lobbying firm or in-house government-affairs entity that filed the disclosure), from `registrant.name`, e.g. 'INVARIANT LLC'. Nullable. |
| registrant_id | bigint | LDA's internal numeric identifier for the registrant (`registrant.id`); stable across a registrant's filings, letting all of one firm's clients/filings be grouped. Nullable. |
| issue_codes | text | Comma-joined, order-preserved, deduplicated list of general-issue-area codes lobbied on across the filing's constituent lobbying_activities entries (e.g. 'DEF', 'FIN', or 'BUD,TAX'); LDA standard 2-4 letter codes such as DEF=Defense, FIN=Financial Institutions/Investments/Securities, BUD=Budget/Appropriations, TAX=Taxation. Null when the filing lists no activities (e.g. a bare registration or no-activity termination). |
| event_time | timestamp with time zone | The exact moment the LDA accepted/posted this filing into the public system, sourced directly from the API's `dt_posted` field (parsed via RFC3339, e.g. '2026-07-03T00:23:45Z'); this column was itself renamed from dt_posted by migration m20260702_000060. This is the true public-availability instant -- available_date is its date-part. Nullable only if the source payload omits or fails to parse dt_posted. |
| available_date | date | STORED generated column: the UTC date-part of event_time (`(event_time AT TIME ZONE 'UTC')::date`), i.e. the calendar day the filing was posted/became publicly retrievable via the LDA API. This is the point-in-time anchor every consumer/export/coverage-range keys on; it always lags filing_year/filing_period by the statutory reporting-to-posting window, never leads it. |
| termination_date | date | Date the lobbying relationship terminated, from the LDA top-level `termination_date` (e.g. '2026-03-31'); populated only on termination-type filings, null otherwise. A real relationship-end event date distinct from event_time (the posting instant). |
| client_effective_date | date | Date the client-registrant relationship became effective, from the nested `client.effective_date` (e.g. '2023-03-01'); the relationship-start date. Nullable. |
| expenses_method | text | LDA accounting method used to compute `expenses` (code 'A'/'B'/'C'), from the top-level `expenses_method` field; affects the comparability/meaning of the expenses figure. Nullable. |
| house_registrant_id | bigint | Alternate registrant identifier cross-linking to the U.S. House lobbying database, from nested `registrant.house_registrant_id`; a join key across the Senate LDA and House lobbying systems. Nullable. |
| registrant_description | text | Registrant (lobbying firm) business self-description, from nested `registrant.description` (e.g. 'Consulting'); the registrant-side analogue of client_description. Nullable. |
| registrant_state | text | Registrant location: state/province code, from nested `registrant.state`. Nullable. |
| registrant_city | text | Registrant location: city, from nested `registrant.city`. Nullable. |
| registrant_country | text | Registrant location: country code, from nested `registrant.country`. Nullable. |
| registrant_zip | text | Registrant location: postal/ZIP code, from nested `registrant.zip`. Nullable. |
| registrant_ppb_country | text | Registrant principal-place-of-business country, from nested `registrant.ppb_country`. Nullable. |
| client_state | text | Client location: state/province code, from nested `client.state`. Nullable. |
| client_country | text | Client location: country code, from nested `client.country`. Nullable. |
| client_ppb_state | text | Client principal-place-of-business state/province, from nested `client.ppb_state`. Nullable. |
| client_ppb_country | text | Client principal-place-of-business country, from nested `client.ppb_country`. Nullable. |
| client_government_entity | boolean | Flag: whether the client is itself a government entity, from nested `client.client_government_entity`. Nullable. |
| client_self_select | boolean | Flag: whether the client self-identified/self-selected on the filing, from nested `client.client_self_select`. Nullable. |
Access lobbying_filings
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="lobbying_filings",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the lobbying_filings dataset?
Federal lobbying disclosures: who lobbied, for which client, on what issues, and the reported spend. One federal lobbying disclosure filing from the Senate LDA (Lobbying Disclosure Act) public database: a single registrant-client relationship's periodic report (registration, quarterly activity report, or termination), carrying the reported income/expenses, the client and registrant identities, and the distinct general-issue-area codes lobbied on.
How do I avoid look-ahead bias with lobbying_filings?
Filter on lobbying_filings.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the date-part of event_time (dt_posted), the moment the LDA accepted/posted the filing into the public system. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get lobbying_filings?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="lobbying_filings". The column schema is public at https://api.obscura.trade/v1/catalog/lobbying_filings.
How often is lobbying_filings updated?
Obscura refreshes lobbying_filings on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.