UNPKG

@lineai/gov-deals

Version:

Explore Federal contracts for government building renovations, city hall renovations, courthouse updates, library modernizations, federal building improvement contracts, base housing and facilities upgrades.

379 lines (291 loc) 12.6 kB
# @lineai/gov-deals A TypeScript library for exploring federal contracts and opportunities for government building renovations, including city halls, courthouses, libraries, federal buildings, and base housing upgrades. ## Features - 🔍 **Advanced Search**: Find government contracts by keywords, NAICS codes, location, and more with intelligent filtering - 🧭 **AI-Powered Guidance**: Built-in search tips and suggestions to help optimize queries for better results - 🏗️ **Construction-Focused**: Built-in helpers for construction industry NAICS codes - 📄 **Multiple Access Methods**: Get opportunities by ID, URL, or comprehensive search - 🔄 **Type-Safe**: Full TypeScript support with runtime validation using Zod -**Efficient**: Optimized filters and pagination to handle large result sets - 🛠️ **Multiple Data Sources**: - **SAM.gov API**: Live federal opportunities with all filters working correctly - **CSV Files**: Local data for offline development - **Supabase**: Historical opportunities database (no API key required) - 📊 **Historical Analysis**: Access 70,000+ historical opportunities for research - 🎯 **Filter Accuracy**: All major filters (NAICS, PSC, set-aside, geographic, dates) verified and working ## Installation ```bash npm install @lineai/gov-deals ``` ## Quick Start ### Using SAM.gov API (Live Data) ```typescript import { SamApi } from '@lineai/gov-deals'; // Initialize with your SAM.gov API key const api = new SamApi({ apiKey: process.env.SAM_API_KEY }); // Search for construction opportunities const results = await api.opportunities.searchConstruction({ keywords: 'renovation' }, { limit: 25 }); // Get specific opportunity details const opportunity = await api.opportunities.getById('notice-id'); const description = await api.opportunities.getDescription('notice-id'); // Get opportunity by SAM.gov URL const opp = await api.opportunities.getByUrl('https://sam.gov/opp/abc123.../view'); ``` ### Using Supabase (Historical Data - No API Key Required) ```typescript import { createSupabaseApi } from '@lineai/gov-deals'; // Initialize with Supabase credentials const api = createSupabaseApi( 'https://your-project.supabase.co', 'your-anon-key' ); // Same interface as SamApi const results = await api.opportunities.search({ naicsCodes: ['236220'], // Commercial construction placeOfPerformanceStates: ['CA', 'TX'], postedFrom: '2025-01-01' }, { limit: 50 }); ``` **Important Note**: All historical records in the Supabase database have `active: "No"` status as they represent past opportunities. When searching historical data: - Don't use `activeOnly: true` as it will return zero results - Use date ranges to find opportunities from specific time periods - All opportunities are inactive but contain valuable historical information ### Using CSV Files (Offline Development) ```typescript import { CsvApi } from '@lineai/gov-deals'; // Initialize with CSV file path const api = new CsvApi({ csvPath: './data/opportunities.csv' }); // Same interface for searching const results = await api.opportunities.search({ keywords: 'courthouse' }); ``` ## Search with AI-Powered Guidance The library provides intelligent search tips to help optimize your queries: ```typescript const results = await api.opportunities.search({ keywords: 'construction repair', // Multiple keywords use AND logic naicsCodes: ['999999'] // Non-existent code }); // Results include helpful tips: console.log(results.searchTips); // [ // "Multiple keywords use AND logic - try single keywords for broader results", // "No results for specified codes - try broader classification codes or remove code filters" // ] ``` ### AI Guidance Features - **Multiple Keywords**: Warns about AND logic behavior - **Geographic Searches**: Explains keyword vs filter differences - **Invalid Operators**: Alerts about unsupported OR/AND/| operators - **Filter Optimization**: Suggests combinations for better results - **Data Quality**: Warns about potential issues with certain filter types ## Search Filters All data sources support the same comprehensive search filters: ```typescript interface SearchFilters { // Text search keywords?: string; // Search in titles // Classification naicsCodes?: string[]; // NAICS industry codes pscCodes?: string[]; // Product/Service codes // Opportunity types types?: OpportunityType[]; // 'o' = Solicitation, 's' = Special Notice, etc. // Set-asides setAsideTypes?: SetAsideType[]; // 'SBA', 'WOSB', 'HZC', etc. // Location placeOfPerformanceStates?: string[]; // State codes: ['CA', 'TX'] placeOfPerformanceZips?: string[]; // ZIP codes // Dates postedFrom?: string; // YYYY-MM-DD postedTo?: string; // YYYY-MM-DD responseDeadlineFrom?: string; // YYYY-MM-DD responseDeadlineTo?: string; // YYYY-MM-DD // Status activeOnly?: boolean; // Filter active opportunities } ``` ## Construction Industry Focus The library includes built-in support for construction-related NAICS codes: ```typescript import { CONSTRUCTION_NAICS_CODES, getConstructionNAICSCodes } from '@lineai/gov-deals'; // Pre-configured construction search const results = await api.opportunities.searchConstruction(); // Get all construction NAICS codes const naicsCodes = getConstructionNAICSCodes(); // Returns: ['236220', '236210', '238210', ...] // Check if a NAICS code is construction-related const isConstruction = isConstructionNAICS('236220'); // true ``` ### Included Construction NAICS Codes - **236220**: Commercial and Institutional Building Construction - **236210**: Industrial Building Construction - **236118**: Residential Remodeling - **238210**: Electrical Contractors - **238220**: Plumbing, Heating, and Air-Conditioning - **238310**: Drywall and Insulation - **238320**: Painting and Wall Covering - **238910**: Site Preparation - **238160**: Roofing Contractors - **238110**: Poured Concrete Foundation ## Opportunity Types Use these codes for the `types` filter: | Code | Description | |------|-------------| | `o` | Solicitation | | `p` | Presolicitation | | `a` | Award Notice | | `s` | Special Notice | | `k` | Combined Synopsis/Solicitation | | `u` | Justification | | `r` | Sources Sought | | `g` | Sale of Surplus Property | | `i` | Intent to Bundle Requirements | ## Set-Aside Types Common set-aside codes for the `setAsideTypes` filter: | Code | Description | |------|-------------| | `SBA` | Total Small Business | | `WOSB` | Women-Owned Small Business | | `EDWOSB` | Economically Disadvantaged WOSB | | `HZC` | HUBZone Competitive | | `HZS` | HUBZone Sole Source | | `SDVOSBC` | Service-Disabled Veteran-Owned (Competitive) | | `SDVOSBS` | Service-Disabled Veteran-Owned (Sole Source) | | `8A` | 8(a) Sole Source | | `8AN` | 8(a) Set-Aside | | `VSA` | Veteran-Owned (VA specific) | ## Verified Filter Behavior All search filters have been thoroughly tested and verified to work correctly: ### ✅ Working Filters - **Keywords**: Case-insensitive, searches titles only, multiple keywords use AND logic - **NAICS Codes**: 100% accuracy, supports all formats (2-6 digits) - **PSC Codes**: 100% accuracy, proper classification filtering - **Set-Aside Types**: All types working, realistic result distributions - **Geographic Filters**: State filters working, zip codes work with real data - **Date Ranges**: Posted dates working perfectly, proper validation - **Opportunity Types**: 6/7 types working (Special Notice has data quality issues) ### 🧭 Search Tips Provided The library automatically provides contextual guidance: - **Multiple Keywords**: `"maintenance repair"` → Suggests single keywords for broader results - **State Names in Keywords**: `"Texas construction"` → Suggests using state filter instead - **Invalid Operators**: `"construction OR repair"` → Explains operators don't work - **Rare Set-Asides**: `HZC` filter → Suggests more common alternatives like `SBA` - **High Results**: Large result sets → Suggests adding more filters - **Zero Results**: No matches → Provides specific suggestions based on filters used ## Examples ### Find Recent Construction Opportunities in Multiple States ```typescript const results = await api.opportunities.search({ naicsCodes: ['236220', '238210'], placeOfPerformanceStates: ['CA', 'TX', 'FL'], postedFrom: '2025-01-01', types: ['o', 'k'], // Solicitations and Combined Synopsis setAsideTypes: ['SBA', 'WOSB'] }, { limit: 100, page: 1 }); console.log(`Found ${results.totalRecords} opportunities`); results.opportunitiesData.forEach(opp => { console.log(`${opp.title} - ${opp.naicsCode} - ${opp.placeOfPerformance?.state}`); }); ``` ### Search by Keywords and Location ```typescript const results = await api.opportunities.search({ keywords: 'courthouse renovation', placeOfPerformanceStates: ['NY'], responseDeadlineFrom: '2025-07-01' }); ``` ### Get Full Opportunity Details ```typescript // Get basic opportunity data const opportunity = await api.opportunities.getById('abc123'); // Get full description (often contains detailed requirements) const description = await api.opportunities.getDescription('abc123'); // Get opportunity from SAM.gov URL (flexible input handling) const opp1 = await api.opportunities.getByUrl('https://sam.gov/opp/abc123.../view'); const opp2 = await api.opportunities.getByUrl('sam.gov/opp/abc123.../view'); const opp3 = await api.opportunities.getByUrl('abc123'); // Just the ID const opp4 = await api.opportunities.getByUrl('invalid-url'); // Returns undefined ``` ## Data Sources Comparison | Feature | SAM.gov API | Supabase | CSV | |---------|-------------|----------|-----| | Real-time data | ✅ | ❌ | ❌ | | Historical data | ❌ | ✅ (71,969+ records) | ✅ | | API key required | ✅ | ❌ | ❌ | | Internet required | ✅ | ✅ | ❌ | | Search performance | Good | Excellent | Good | | Data completeness | Full | Full | Depends on CSV | | Active opportunities | ✅ | ❌ (all inactive) | Depends on CSV | | Date range | Current | 2018-2025 | Depends on CSV | | **AI Search Guidance** | ✅ | ✅ | ✅ | | **Verified Filters** | ✅ All working | ✅ All working | ✅ All working | | **URL-based Access** | ✅ getByUrl() | ✅ getByUrl() | ✅ getByUrl() | ## Environment Variables ```bash # For SAM.gov API SAM_API_KEY=your-sam-gov-api-key # For Supabase (optional - can pass directly to function) SUPABASE_URL=https://your-project.supabase.co SUPABASE_ANON_KEY=your-anon-key ``` ## Error Handling The library throws typed errors for better error handling: ```typescript import { ApiError, AuthenticationError, ValidationError } from '@lineai/gov-deals'; try { const results = await api.opportunities.search({ /* ... */ }); } catch (error) { if (error instanceof AuthenticationError) { console.error('Invalid API key'); } else if (error instanceof ValidationError) { console.error('Invalid search parameters:', error.message); } else if (error instanceof ApiError) { console.error('API error:', error.status, error.message); } } ``` ## TypeScript Support Full TypeScript support with strict typing: ```typescript import type { SamOpportunity, SamOpportunitySearchFilters, OpportunityType, SetAsideType } from '@lineai/gov-deals'; // All responses and parameters are fully typed const filters: SamOpportunitySearchFilters = { naicsCodes: ['236220'], types: ['o'] as OpportunityType[], activeOnly: true }; ``` ## Contributing See [CONTRIBUTING.md](./CONTRIBUTING.md) for development setup and guidelines. ## License MIT ## Additional Documentation - [Search Guidance System](./docs/SEARCH_GUIDANCE.md) - Complete guide to AI-powered search tips and filter behavior - [API Comparison Guide](./docs/API_COMPARISON.md) - Detailed comparison of SAM.gov, Supabase, and CSV data sources - [Supabase Integration Guide](./docs/SUPABASE_INTEGRATION.md) - Guide for using the Supabase historical data API - [Historical Data Guide](./docs/HISTORICAL_DATA_GUIDE.md) - Working with historical opportunities data - [Implementation Guide](./docs/IMPLEMENTATION_GUIDE.md) - Technical implementation details ## Resources - [SAM.gov API Documentation](https://open.gsa.gov/api/get-opportunities-public-api/) - [NAICS Code Lookup](https://www.census.gov/naics/) - [Federal Acquisition Regulation (FAR)](https://www.acquisition.gov/far/)