# Opportunity source adapters This package registers each federal feed as an OpportunitySource (the protocol lives in the parent opportunity_intelligence module). Every adapter is a thin wrapper over an existing client and normalizer and yields one normalized OpportunityRecord per item, so the ingester treats every feed the same way. ## Live feeds - **SAM.gov opportunities** (`sam.go`): active solicitations, the requirement feed. - **SAM Contract Awards** (`sam_contract_awards.go`): federal contract awards and incumbents, the FPDS replacement, with the free **USASpending** pull (`usaspending.go`) as the resilient fallback via `fallback.go`. - **GSA and agency forecasts** (`forecast.go`): planning stage upcoming opportunities from CSV exports. ## Deferred feeds (stubs only, no live calls) Three sources are present in `stubs.go` as STUBS only. They implement the interface so the wiring is ready, but they make no network call and yield no records. Each carries a documented constraint, so proprietary data is never wired into customer facing output before the right license or credential is in place. Enabling any of them is a deliberate, licensed step, not a configuration flip. ### GovWin IQ (Deltek) A commercial federal market intelligence database. The data may not be redistributed into a customer facing product without a data redistribution or OEM license from Deltek. Deferred until such a license is in place. `Fetch` returns `ErrRequiresLicense`. ### GovTribe A commercial federal market intelligence service. Same constraint as GovWin: a redistribution or OEM license is required before any customer facing use. Deferred. `Fetch` returns `ErrRequiresLicense`. ### GSA eBuy (per tenant connector) eBuy is GSA's closed RFQ system. It is reachable ONLY with the customer's own GSA Schedule login, and it exposes only the RFQs issued against the SINs that customer holds. It therefore can never be a bought, shared feed: it works only as a per tenant credential connector, acting on behalf of one customer with that customer's own credential. The stub holds the tenant id it would act for and makes no live call. Enabling it requires a per tenant credential vault and a connector that authenticates as the customer, which is a future build. `Fetch` returns `ErrRequiresTenantCredential`. ## Why stubs and not nothing Keeping the stubs in the code path means the source registry is complete and the constraint is visible at the exact place a future engineer would wire the feed, so the license or credential gate cannot be forgotten and proprietary data cannot slip into customer facing output by accident.