REST API
Β·
10,000+ Opportunities
Β·
JSON Responses
Β·
Updated Daily
Β·
100 req/min
Developer API β€” Now Available

Government contract data,
exactly when you need it

10,000+ opportunities from SAM.gov, Grants.gov, USASpending.gov, and 4 state systems β€” accessible via a clean REST API with full filtering, pagination, and daily updates.

10,000 requests/day  Β·  Cancel anytime  Β·  JSON responses

terminal
# Fetch California construction contracts due this month curl "https://bidstream.org/api/v1/opportunities?state=CA&keyword=construction&per_page=5" \ -H "X-API-Key: bs_live_your_key_here" # Response: { "data": [{ "id": 48291, "title": "Highway Resurfacing β€” I-5 Corridor", "agency": "Caltrans β€” District 7", "response_deadline": "2026-03-28T23:59:59Z", "naics_code": "237310", "relevance_score": 94 }], "meta": { "total": 1847, "pages": 185 } }
10,000+
Active Opportunities
7 Sources
Federal + State Systems
100/min
Rate Limit
Daily
Data Refresh

What developers build with it

From CRM integrations to custom procurement dashboards β€” the API unlocks use cases the manual portal can't.

πŸ—οΈ

Procurement Intelligence Platforms

Build custom dashboards that surface the right contracts for your clients. Filter by NAICS code, deadline, location, and agency. Show relevance scores. Power white-label tools.

NAICS filtering Relevance scores Pagination
πŸ”—

CRM & Sales Tool Integration

Push matching government opportunities directly into Salesforce, HubSpot, or any CRM. Automate prospecting for business development teams targeting government clients.

Webhook-ready JSON API Automation
πŸ“Š

Competitive Analysis Tools

Track agency spending patterns, identify which contractors are winning which bids, and spot market gaps before competitors do. Build alerts for new opportunities in specific verticals.

Agency tracking Historical data Trend analysis
⚑

Automated Bid Alert Systems

Build Slack bots, email workflows, or mobile apps that notify your team the moment a matching opportunity drops. Poll hourly, filter aggressively, never miss a deadline.

Real-time polling Custom filters Notifications

Clean, predictable REST API

Four endpoints cover everything. Full OpenAPI spec available in the docs.

GET /api/v1/opportunities Search & filter all opportunities

Filter Params

  • keywordFull-text search in title + description
  • stateTwo-letter state code (CA, TX, NY…)
  • naics_codeNAICS code prefix (e.g., 236, 541)
  • sourcesam.gov, grants.gov, california…
  • posted_afterISO date filter on posted_date
  • deadline_beforeISO date filter on response_deadline
  • page / per_pagePagination (max 100 per page)

Example

GET /api/v1/opportunities?state=TX &naics_code=541 &per_page=20 &page=1 X-API-Key: bs_live_xxxx
GET /api/v1/opportunities/:id Full detail for a single opportunity

Returns

  • titleFull opportunity title
  • descriptionFull text description / SOW
  • agencyIssuing agency name
  • naics_codeNAICS classification code
  • source_urlLink to original posting
  • response_deadlineISO timestamp

Example

GET /api/v1/opportunities/48291 X-API-Key: bs_live_xxxx β†’ 200 OK { "data": { "id": 48291, "title": "Highway Resurfacing...", "description": "Full SOW text...", "source_url": "https://sam.gov/..." } }
GET /api/v1/matching AI-matched opportunities for your profile

Params

  • min_scoreMin relevance score 0–100 (default: 50)
  • per_pageResults per page (max 100)

Example Response

{ "data": [{ "id": 48291, "relevance_score": 94, "match_reasons": [ "Location match: CA", "NAICS match: 237310", "Keyword: construction" ] }] }
GET /api/v1/account Usage stats & rate limit status

Returns

  • rate_limitsPer-minute and daily usage + remaining
  • usage_last_30_daysDaily request counts + avg response time
  • accountSubscription status, profile config

Rate Limits

{ "rate_limits": { "per_minute": { "limit": 100, "used": 12, "remaining": 88 }, "per_day": { "limit": 10000, "used": 2340 } } }
View Full API Documentation β†’

Built for real integrations

Not a government portal export. A purpose-built API with developer experience as a first-class concern.

The only aggregated government opportunity API

SAM.gov, Grants.gov, USASpending.gov each have their own fragmented APIs with inconsistent schemas. BidStream normalizes all 7 sources into a single clean schema.

  • βœ“ Unified schema across all 7 sources
  • βœ“ Consistent date formats (ISO 8601)
  • βœ“ Deduplicated across sources
  • βœ“ NAICS codes normalized and searchable
Normalized opportunity object
{ "id": 48291, "source_name": "sam.gov", "title": "Highway Resurfacing β€” I-5", "agency": "Caltrans β€” District 7", "naics_code": "237310", "location_state": "CA", "posted_date": "2026-03-01T00:00:00Z", "response_deadline": "2026-03-28T23:59:59Z", "source_url": "https://sam.gov/opp/..." }

Filter by anything that matters

Build exactly the query you need. Stack multiple filters. Paginate through thousands of results. The API won't get in your way.

  • βœ“ Full-text keyword search
  • βœ“ State, agency, NAICS, source filtering
  • βœ“ Date range filtering (posted + deadline)
  • βœ“ Up to 100 results per page
  • βœ“ Opportunity type (contract, grant, RFP)
Complex filter example
GET /api/v1/opportunities ?state=TX &naics_code=541 &keyword=cybersecurity &posted_after=2026-02-01 &deadline_before=2026-04-30 &per_page=50 &page=1 β†’ 200 OK Β· 87 results found
Official Government Data Sources
FederalSAM.gov
FederalUSASpending.gov
FederalGrants.gov
StateCalifornia Procurement
StateTexas SmartBuy
StateFlorida Vendor Bid
StateNew York Procurement

Integrate in minutes

Works with any language or platform. Here are copy-paste examples.

bash
# Set your API key API_KEY="bs_live_your_key_here" # List IT services contracts in Texas curl "https://bidstream.org/api/v1/opportunities?state=TX&naics_code=541&per_page=10" \ -H "X-API-Key: $API_KEY" | jq # Get AI-matched opportunities (min score 80) curl "https://bidstream.org/api/v1/matching?min_score=80&per_page=20" \ -H "X-API-Key: $API_KEY" | jq # Get a specific opportunity by ID curl "https://bidstream.org/api/v1/opportunities/48291" \ -H "X-API-Key: $API_KEY" | jq
python
import requests API_KEY = "bs_live_your_key_here" BASE_URL = "https://bidstream.org/api/v1" headers = {"X-API-Key": API_KEY} # Search for IT contracts in Texas response = requests.get( f"{BASE_URL}/opportunities", headers=headers, params={ "state": "TX", "naics_code": "541", "per_page": 50 } ) data = response.json() print(f"Found {data['meta']['total']} opportunities") for opp in data["data"]: deadline = opp.get("response_deadline", "TBD")[:10] print(f"{opp['title'][:60]} β€” Due: {deadline}")
javascript
const API_KEY = "bs_live_your_key_here"; const BASE_URL = "https://bidstream.org/api/v1"; // Fetch IT contracts in Texas, page through all results async function getContracts({ state, naics, keyword } = {}) { const params = new URLSearchParams({ ...(state && { state }), ...(naics && { naics_code: naics }), ...(keyword && { keyword }), per_page: 50 }); const res = await fetch(`${BASE_URL}/opportunities?${params}`, { headers: { "X-API-Key": API_KEY } }); const { data, meta } = await res.json(); console.log(`Found ${meta.total} opportunities`); return data; } // Usage getContracts({ state: "TX", naics: "541" }) .then(opps => opps.forEach(o => console.log(o.title)));
ruby
require 'net/http' require 'json' require 'uri' API_KEY = "bs_live_your_key_here" BASE_URL = "https://bidstream.org/api/v1" # Fetch IT contracts in Texas def get_opportunities(params = {}) uri = URI("#{BASE_URL}/opportunities") uri.query = URI.encode_www_form(params) req = Net::HTTP::Get.new(uri) req["X-API-Key"] = API_KEY res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) } JSON.parse(res.body) end data = get_opportunities(state: "TX", naics_code: "541", per_page: 20) puts "Found #{data['meta']['total']} opportunities" data["data"].each { |opp| puts opp["title"] }

Simple, transparent pricing

No contracts, no setup fees. Cancel anytime.

Pro β€” Daily Alerts
$29
per month
  • βœ“ Daily email digest of matched bids
  • βœ“ 10,690+ active opportunities
  • βœ“ AI relevance scoring
  • βœ“ Industry + location filtering
  • βœ“ Dashboard access
Get Started β†’
πŸ”’ Secure checkout via Stripe  Β·  Cancel anytime  Β·  Instant API key after signup

Start pulling real contract data today

Sign up, get your API key from the dashboard, and make your first request in under 5 minutes.

Questions? Email support@bidstream.org