Programmatically access government contract opportunities from SAM.gov and state procurement systems. 3,000+ active RFPs updated daily.
$37/month • 10,000 requests/day • Cancel anytime
Get your first opportunities in 3 steps:
Go to your dashboard → API Keys section → Generate Key
Format: bs_live_xxxxxxxxxxxxx...
curl https://bidstream.org/api/v1/opportunities \
-H "X-API-Key: your_api_key_here" \
| jq
All API requests require authentication via API key. Include your key in one of two ways:
curl https://bidstream.org/api/v1/opportunities \
-H "X-API-Key: bs_live_your_key_here"
curl https://bidstream.org/api/v1/opportunities \
-H "Authorization: Bearer bs_live_your_key_here"
Keep your API key secret! Don't commit it to version control or expose it in client-side code.
API requests are rate-limited to ensure fair usage:
100
requests per minute
10,000
requests per day
If you exceed the limit, you'll receive a 429 Too Many Requests response:
{
"error": {
"message": "Rate limit exceeded: 100 requests per minute",
"code": "RATE_LIMIT_MINUTE"
}
}
Check your current usage via the /api/v1/account endpoint.
/api/v1/opportunities
Search and filter government contract opportunities.
| Parameter | Type | Description |
|---|---|---|
keyword | string | Search in title/description |
agency | string | Filter by agency name |
state | string | Filter by state (e.g., CA, TX) |
naics_code | string | Filter by NAICS code (e.g., 236) |
posted_after | date | ISO date (e.g., 2026-01-01) |
deadline_before | date | ISO date |
source | string | Filter by source (sam.gov, california, etc.) |
page | integer | Page number (default: 1) |
per_page | integer | Results per page (default: 20, max: 100) |
curl "https://bidstream.org/api/v1/opportunities?state=CA&keyword=construction&per_page=10" \
-H "X-API-Key: bs_live_your_key_here"
{
"data": [
{
"id": 12345,
"source_id": "abc123",
"source_name": "sam.gov",
"title": "Road Construction Services",
"description": "Request for proposals for highway resurfacing...",
"agency": "California Department of Transportation",
"posted_date": "2026-02-15T00:00:00.000Z",
"response_deadline": "2026-03-15T23:59:59.000Z",
"naics_code": "237310",
"location_city": "Sacramento",
"location_state": "CA",
"source_url": "https://sam.gov/...",
"created_at": "2026-02-15T08:30:00.000Z"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 1523,
"total_pages": 153
}
}
import requests
API_KEY = "bs_live_your_key_here"
BASE_URL = "https://bidstream.org/api/v1"
response = requests.get(
f"{BASE_URL}/opportunities",
headers={"X-API-Key": API_KEY},
params={
"state": "CA",
"keyword": "construction",
"per_page": 10
}
)
data = response.json()
for opp in data["data"]:
print(f"{opp['title']} - {opp['agency']}")
const API_KEY = "bs_live_your_key_here";
const BASE_URL = "https://bidstream.org/api/v1";
async function getOpportunities() {
const params = new URLSearchParams({
state: "CA",
keyword: "construction",
per_page: 10
});
const response = await fetch(`${BASE_URL}/opportunities?${params}`, {
headers: {
"X-API-Key": API_KEY
}
});
const data = await response.json();
data.data.forEach(opp => {
console.log(`${opp.title} - ${opp.agency}`);
});
}
getOpportunities();
/api/v1/opportunities/:id
Get details for a single opportunity by ID.
curl "https://bidstream.org/api/v1/opportunities/12345" \
-H "X-API-Key: bs_live_your_key_here"
{
"data": {
"id": 12345,
"source_id": "abc123",
"source_name": "sam.gov",
"title": "Road Construction Services",
"description": "Request for proposals for highway resurfacing...",
"agency": "California Department of Transportation",
"posted_date": "2026-02-15T00:00:00.000Z",
"response_deadline": "2026-03-15T23:59:59.000Z",
"naics_code": "237310",
"location_city": "Sacramento",
"location_state": "CA",
"source_url": "https://sam.gov/...",
"created_at": "2026-02-15T08:30:00.000Z"
}
}
/api/v1/matching
Get personalized opportunities matched to your profile (industry, location, keywords).
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
per_page | integer | Results per page (default: 20, max: 100) |
min_score | integer | Minimum relevance score (0-100) |
curl "https://bidstream.org/api/v1/matching?min_score=70&per_page=20" \
-H "X-API-Key: bs_live_your_key_here"
{
"data": [
{
"id": 12345,
"title": "Road Construction Services",
"description": "...",
"agency": "California Department of Transportation",
"posted_date": "2026-02-15T00:00:00.000Z",
"response_deadline": "2026-03-15T23:59:59.000Z",
"relevance_score": 85,
"match_reasons": [
"Location match: CA",
"Industry match: 237310 (Highway, Street, and Bridge Construction)",
"Keyword match: construction"
],
"has_preferences": true
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 142,
"total_pages": 8
}
}
/api/v1/account
Get your account information, API usage stats, and rate limits.
curl "https://bidstream.org/api/v1/account" \
-H "X-API-Key: bs_live_your_key_here"
{
"data": {
"account": {
"email": "user@example.com",
"company_name": "ACME Corp",
"industry": "236",
"location_state": "CA",
"subscription_status": "active",
"subscription_started_at": "2026-01-15T00:00:00.000Z"
},
"api_key": {
"name": "Production API Key",
"key_prefix": "bs_live_abc123...",
"created_at": "2026-01-15T10:00:00.000Z",
"last_used_at": "2026-02-27T18:30:00.000Z"
},
"rate_limits": {
"per_minute": {
"limit": 100,
"used": 15,
"remaining": 85
},
"per_day": {
"limit": 10000,
"used": 2340,
"remaining": 7660
}
},
"usage_last_30_days": [
{
"date": "2026-02-27",
"requests": 380,
"avg_response_time": 142
}
]
}
}
All errors follow this format:
{
"error": {
"message": "Human-readable error message",
"code": "ERROR_CODE"
}
}
| HTTP Status | Error Code | Description |
|---|---|---|
| 401 | MISSING_API_KEY |
No API key provided in request |
| 401 | INVALID_API_KEY |
API key is invalid or revoked |
| 403 | SUBSCRIPTION_REQUIRED |
API access requires active subscription |
| 404 | NOT_FOUND |
Resource not found |
| 429 | RATE_LIMIT_MINUTE |
Exceeded 100 requests per minute |
| 429 | RATE_LIMIT_DAY |
Exceeded 10,000 requests per day |
| 500 | INTERNAL_ERROR |
Server error - contact support if persistent |
Need help or have questions?