{"openapi":"3.1.0","info":{"title":"The Buildout API","description":"Read-only access to ingested U.S. federal spending data.","version":"0.1.0"},"paths":{"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/ops/snapshot":{"get":{"summary":"Ops Snapshot","description":"Aggregate everything an operator would want on one screen.\n\nAuth: ?token=<ADMIN_TOKEN> OR Authorization: Bearer <ADMIN_TOKEN>.\n\nReturns DB + filesystem + nginx-log derived metrics in one JSON blob.\n\nPath is intentionally generic (\"ops\") rather than \"/admin\" so it doesn't\nstand out as a high-value target for automated probes. Real security is\nthe bearer token; path obscurity is just defense-in-depth.","operationId":"ops_snapshot_ops_snapshot_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"traffic_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Traffic Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ops Snapshot Ops Snapshot Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ops/founder":{"get":{"summary":"Ops Founder","description":"Daily founder plan: yesterday's facts, copy-paste post drafts,\nweekly-rotated checklist, KPIs vs milestone, anti-pattern reminders.\n\nAuth: same ADMIN_TOKEN as /ops/snapshot.","operationId":"ops_founder_ops_founder_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ops Founder Ops Founder Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ops/brief":{"get":{"summary":"Ops Brief","description":"All briefs from today (most recent first) + plan scaffolding + the\nweekday-action object (copy-paste-ready content keyed to today's\nweekday).","operationId":"ops_brief_ops_brief_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ops Brief Ops Brief Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ops/brief/refresh":{"post":{"summary":"Ops Brief Refresh","description":"Generate a delta-only refresh brief covering the window since the\nprevious brief. Token-gated. Returns the new brief; the founder page\nappends it to today's stack.","operationId":"ops_brief_refresh_ops_brief_refresh_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ops Brief Refresh Ops Brief Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ops/illustration/regenerate":{"post":{"summary":"Ops Illustration Regenerate","description":"Regenerate the day's hero illustration. Reads the latest brief's\nillustration_topic + illustration_slug, calls Leonardo with regenerate=True\nto bypass cache, updates the brief JSON in place with the new URL.\n\nToken-gated. Costs ~$0.04 in Leonardo tokens per click.","operationId":"ops_illustration_regenerate_ops_illustration_regenerate_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ops Illustration Regenerate Ops Illustration Regenerate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats":{"get":{"summary":"Stats","operationId":"stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"integer"},"type":"object","title":"Response Stats Stats Get"}}}}}}},"/signal/first-time-recipients":{"get":{"summary":"Signal First Time Recipients","description":"Entities whose earliest tracked award lands inside the window.\n\nCaveat: \"first-time\" is relative to our ingest history, not federal-wide.\nThe page that displays this should say so.","operationId":"signal_first_time_recipients_signal_first_time_recipients_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1825,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Signal First Time Recipients Signal First Time Recipients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signal/recompete-radar":{"get":{"summary":"Signal Recompete Radar","description":"Awards with period_end in the next N days above a dollar threshold —\ncandidates for incumbent identification and recompete bidding.","operationId":"signal_recompete_radar_signal_recompete_radar_get","parameters":[{"name":"days_ahead","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"default":180,"title":"Days Ahead"}},{"name":"min_amount","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":10000000,"title":"Min Amount"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":15,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Signal Recompete Radar Signal Recompete Radar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signal/sector-momentum":{"get":{"summary":"Signal Sector Momentum","description":"Sector volume + $ over the past N days, by classification.","operationId":"signal_sector_momentum_signal_sector_momentum_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Signal Sector Momentum Signal Sector Momentum Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats/homepage":{"get":{"summary":"Stats Homepage","description":"Aggregates for the homepage hero strip — single round trip.","operationId":"stats_homepage_stats_homepage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Homepage Stats Homepage Get"}}}}}}},"/awards":{"get":{"summary":"List Awards","operationId":"list_awards_awards_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"agency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency"}},{"name":"min_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Amount"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entity Id"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(amount_desc|amount_asc|date_desc|date_asc)$","description":"Sort order: amount_desc (default), amount_asc, date_desc, date_asc","default":"amount_desc","title":"Sort"},"description":"Sort order: amount_desc (default), amount_asc, date_desc, date_asc"},{"name":"pop_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(active|expired)$"},{"type":"null"}],"description":"Filter by period_of_performance status: active (period_end >= today) or expired.","title":"Pop Status"},"description":"Filter by period_of_performance status: active (period_end >= today) or expired."},{"name":"since_created","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Filter to awards first INGESTED into our DB within the last N hours. Used by /tracker to surface what's newly fresh on USAspending.","title":"Since Created"},"description":"Filter to awards first INGESTED into our DB within the last N hours. Used by /tracker to surface what's newly fresh on USAspending."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Awards Awards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/awards/tracker-summary":{"get":{"summary":"Awards Tracker Summary","description":"Aggregates for /tracker. Two windows on one payload:\n\n  - `by_created`: awards INGESTED in the last `hours` (i.e. what\n    USAspending freshly surfaced to us in the most recent cron).\n  - `by_action_date`: awards whose contract `action_date` is in the\n    last `hours` (sparse because USAspending has a publication lag,\n    but it's the authoritative \"what got obligated when\").\n\nThe frontend renders both side-by-side so the reader can see the\ndifference between \"fresh in the database\" and \"freshly obligated.\"","operationId":"awards_tracker_summary_awards_tracker_summary_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"number","maximum":168,"exclusiveMinimum":0,"description":"Rolling window in hours.","default":24,"title":"Hours"},"description":"Rolling window in hours."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Awards Tracker Summary Awards Tracker Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/awards/{award_id}":{"get":{"summary":"Get Award","operationId":"get_award_awards__award_id__get","parameters":[{"name":"award_id","in":"path","required":true,"schema":{"type":"integer","title":"Award Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Award Awards  Award Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entities":{"get":{"summary":"List Entities","operationId":"list_entities_entities_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on normalized name.","title":"Q"},"description":"Substring match on normalized name."},{"name":"has_uei","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Uei"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Entities Entities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entities/{uei}":{"get":{"summary":"Get Entity By Uei","operationId":"get_entity_by_uei_entities__uei__get","parameters":[{"name":"uei","in":"path","required":true,"schema":{"type":"string","title":"Uei"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entities/by-id/{entity_id}":{"get":{"summary":"Get Entity By Id","description":"Used by the award-detail page, which only has the entity_id FK on hand.","operationId":"get_entity_by_id_entities_by_id__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entities/{uei}/sectors":{"get":{"summary":"Entity Sector Breakdown","description":"Aggregate this entity's awards by classified sector.","operationId":"entity_sector_breakdown_entities__uei__sectors_get","parameters":[{"name":"uei","in":"path","required":true,"schema":{"type":"string","title":"Uei"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Entity Sector Breakdown Entities  Uei  Sectors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entities/{uei}/timeline":{"get":{"summary":"Entity Timeline","description":"Per-month count + total $ for this entity's awards. Useful for sparklines.","operationId":"entity_timeline_entities__uei__timeline_get","parameters":[{"name":"uei","in":"path","required":true,"schema":{"type":"string","title":"Uei"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Entity Timeline Entities  Uei  Timeline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/enrichments":{"get":{"summary":"List Enrichments","operationId":"list_enrichments_enrichments_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"award_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Award Id"}},{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Enrichments Enrichments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/federal-register":{"get":{"summary":"List Fr","operationId":"list_fr_federal_register_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"document_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Fr Federal Register Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grant-opportunities":{"get":{"summary":"List Grants","operationId":"list_grants_grant_opportunities_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"closing_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Closing Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Grants Grant Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sam-opportunities":{"get":{"summary":"List Sam","operationId":"list_sam_sam_opportunities_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"notice_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice Type"}},{"name":"department","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Sam Sam Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agency-news":{"get":{"summary":"List News","operationId":"list_news_agency_news_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"feed_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feed Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List News Agency News Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/aggregations/agencies":{"get":{"summary":"List Agencies","description":"Every agency with >=N tracked awards. Powers /agencies index page.","operationId":"list_agencies_aggregations_agencies_get","parameters":[{"name":"min_awards","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Hide agencies below this award count.","default":3,"title":"Min Awards"},"description":"Hide agencies below this award count."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Agencies Aggregations Agencies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agencies/{slug}":{"get":{"summary":"Agency Detail","description":"One agency's full profile: totals, top recipients, sub-tiers, recent awards.\n\nWe resolve `slug` back to the canonical `agency` string by re-slugifying\nevery distinct agency in the DB and matching — there's no agencies table.","operationId":"agency_detail_agencies__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agency Detail Agencies  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/aggregations/sectors":{"get":{"summary":"List Sectors","description":"Every classified sector. Powers /sectors index page.","operationId":"list_sectors_aggregations_sectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sectors Aggregations Sectors Get"}}}}}}},"/sectors/{slug}":{"get":{"summary":"Sector Detail","description":"One sector's profile: top recipients, top agencies, recent awards.","operationId":"sector_detail_sectors__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sector Detail Sectors  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/subscribers/unsubscribe":{"post":{"summary":"Unsubscribe Subscriber","description":"Token-verified unsubscribe.\n\nAlways responds 200 even when the email isn't on the list — leaking\nsubscription status would itself be a privacy issue.","operationId":"unsubscribe_subscriber_subscribers_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Unsubscribe Subscriber Subscribers Unsubscribe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/subscribers/link-digest":{"post":{"summary":"Link Digest","description":"Opt-in: subscribe (or update) an email and link it to the caller's\nanonymous watchlist client_id, so the alerts worker can email a\npersonalized digest. v1 skips email-confirmation (the threat is\nlow-impact, unsubscribe is one click).","operationId":"link_digest_subscribers_link_digest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkDigestIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Link Digest Subscribers Link Digest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/subscribers":{"post":{"summary":"Create Subscriber","operationId":"create_subscriber_subscribers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watches":{"get":{"summary":"List Watches","operationId":"list_watches_watches_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WatchOut"},"title":"Response List Watches Watches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Watch","operationId":"create_watch_watches_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watches/{watch_id}":{"delete":{"summary":"Delete Watch","operationId":"delete_watch_watches__watch_id__delete","parameters":[{"name":"watch_id","in":"path","required":true,"schema":{"type":"integer","title":"Watch Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watches/{watch_id}/mark-read":{"post":{"summary":"Mark Watch Read","operationId":"mark_watch_read_watches__watch_id__mark_read_post","parameters":[{"name":"watch_id","in":"path","required":true,"schema":{"type":"integer","title":"Watch Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"title":"Response Mark Watch Read Watches  Watch Id  Mark Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/saved-searches":{"get":{"summary":"List Saved Searches","operationId":"list_saved_searches_saved_searches_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavedSearchOut"},"title":"Response List Saved Searches Saved Searches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Saved Search","operationId":"create_saved_search_saved_searches_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/saved-searches/{search_id}":{"delete":{"summary":"Delete Saved Search","operationId":"delete_saved_search_saved_searches__search_id__delete","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/saved-searches/{search_id}/mark-read":{"post":{"summary":"Mark Saved Search Read","operationId":"mark_saved_search_read_saved_searches__search_id__mark_read_post","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"title":"Response Mark Saved Search Read Saved Searches  Search Id  Mark Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/digest":{"get":{"summary":"Digest","description":"Everything new for this client_id since their last mark-read across\nwatches and saved searches. The shape mirrors what an email digest would\ncontain.","operationId":"digest_digest_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Digest Digest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"EntityOut":{"properties":{"id":{"type":"integer","title":"Id"},"uei":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uei"},"cage_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cage Code"},"canonical_name":{"type":"string","title":"Canonical Name"},"normalized_name":{"type":"string","title":"Normalized Name"},"parent_uei":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Uei"},"metadata_json":{"additionalProperties":true,"type":"object","title":"Metadata Json"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","uei","cage_code","canonical_name","normalized_name","parent_uei","metadata_json","created_at","updated_at"],"title":"EntityOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LinkDigestIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"client_id":{"type":"string","maxLength":64,"minLength":8,"title":"Client Id"},"source":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Source"}},"type":"object","required":["email","client_id"],"title":"LinkDigestIn"},"SavedSearchIn":{"properties":{"client_id":{"type":"string","maxLength":64,"minLength":8,"title":"Client Id"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"target":{"type":"string","pattern":"^(awards|opportunities|federal_register|sam_opportunities|agency_news)$","title":"Target"},"query_params":{"additionalProperties":true,"type":"object","title":"Query Params"}},"type":"object","required":["client_id","name","target"],"title":"SavedSearchIn"},"SavedSearchOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"name":{"type":"string","title":"Name"},"target":{"type":"string","title":"Target"},"query_params":{"additionalProperties":true,"type":"object","title":"Query Params"},"last_seen_max_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Seen Max Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"new_match_count":{"type":"integer","title":"New Match Count","default":0}},"type":"object","required":["id","client_id","name","target","query_params","last_seen_max_id","created_at"],"title":"SavedSearchOut"},"SubscribeIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"source":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Source"}},"type":"object","required":["email"],"title":"SubscribeIn"},"SubscribeOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"already_subscribed":{"type":"boolean","title":"Already Subscribed","default":false}},"type":"object","required":["id","email","status","created_at"],"title":"SubscribeOut"},"UnsubscribeIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"token":{"type":"string","minLength":8,"title":"Token"}},"type":"object","required":["email","token"],"title":"UnsubscribeIn"},"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"},"WatchIn":{"properties":{"client_id":{"type":"string","maxLength":64,"minLength":8,"title":"Client Id"},"entity_id":{"type":"integer","title":"Entity Id"}},"type":"object","required":["client_id","entity_id"],"title":"WatchIn"},"WatchOut":{"properties":{"id":{"type":"integer","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"entity_id":{"type":"integer","title":"Entity Id"},"entity_uei":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Uei"},"entity_name":{"type":"string","title":"Entity Name"},"last_seen_award_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Seen Award Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"new_award_count":{"type":"integer","title":"New Award Count","default":0}},"type":"object","required":["id","client_id","entity_id","entity_uei","entity_name","last_seen_award_id","created_at"],"title":"WatchOut"}}}}