Docs
Base URL https://api.nextbid.us (also under https://nextbid.us/v1). Version 0.4.0. JSON in and out. Times are ISO 8601 UTC.
Subscribe / sign up (people and AI agents)
Authorized AI agents may assist with or complete NextBid signup and account setup. Payment and acceptance of terms must be authorized by the account owner or organization. Machine-readable: the signup object in ai.json.
- Request a signup link.
POST https://data.nextbid.us/start/request,Content-Type: application/json, body{"name": "...", "email": "...", "business": "...", "plan": "monthly", "source": "agent"}.plan(monthly|annual) andsourceare optional. Any valid request answers200 {"ok":true}(existing accounts are not revealed); invalid input answers400with the field names. The "Start now" buttons on nextbid.us send the same request. - Verify the email. Email verification is required before checkout. The owner opens the link from admin@nextbid.us:
https://nextbid.us/start?t=<token>&plan=<plan>. It works for 24 hours; a new request replaces it. - Choose a plan. Monthly $49.99 a month or Annual $499 a year; same access, 6,000 calls each month after the trial.
- Checkout. Stripe Checkout; a payment method is required. Nothing is charged today; cancel before the 14-day trial ends and nothing is charged.
- Create the password. Checkout returns to
https://nextbid.us/start/complete?session_id=...: the company account is ready. Create the password; it signs in tohttps://data.nextbid.us/dashboard. - Create a key.
https://data.nextbid.us/keys, then connect over REST (https://api.nextbid.us/v1/...) or MCP (https://api.nextbid.us/mcp), headerX-API-Key.
| Item | Value |
|---|---|
| Trial | 14 days, up to 100 calls and 250 unique opportunities, whichever comes first; card required; Activate now in Plans & billing (https://data.nextbid.us/billing) ends it early and starts the paid plan |
source | human_web (website default), ai_assisted, agent, api; anything else is recorded as unknown. Analytics only: no source is restricted |
| Page markers | each signup page marks its step with data-nextbid-step: signup, verify-email-sent, plan-selection (options carry data-plan), checkout, create-account, activate-now |
Authentication and metering
Send your key as X-API-Key: <key> or Authorization: Bearer <key>. /v1/health, /v1/pricing and /v1/public/corpus need no key. Every other call costs one unit. Each response carries x-usage-today, x-quota-remaining, x-price-cents and x-plan. No key: 401. Quota exhausted: 402 with the upgrade terms in the body.
What consumes a call. One unit each: a search, an opportunity read, a document list, a file list, a file read. Free but recorded: stats, tradelines, set-asides, usage, account, activity, pursuits and profile, and the MCP handshake. Every response carries x-usage-used, x-quota-remaining, x-units, x-usage-period, x-usage-resets-at and x-plan. When the allowance is used the API answers 402 quota_exhausted and free calls keep working. All keys on one account share its allowance.
Endpoints
| Call | Returns |
|---|---|
GET /v1/stats | the corpus numbers with their definitions: total_solicitations (distinct), open (the source lists it open with the deadline ahead or unstated, or the deadline is ahead with no status; listed_open_past_deadline and status_unknown are separate and never counted as open), due_30d (known deadline only; missing deadlines sit in open_no_deadline), open_set_asides (distinct open solicitations designated under any supported program, each counted once), open_set_aside_mentions, set_asides_by_program, unmapped_set_aside_values, open by source, documents, contacts, amendments, as_of, replica_as_of. The public /v1/public/corpus carries the same numbers and definitions |
GET /v1/tradelines | the trade catalog: id, name, description, specialties[], aliases[], open count |
GET /v1/tradelines/{id} | one trade, by id or name |
GET /v1/opportunities | search → total, page, results[], facets |
GET /v1/opportunities/{nb_id} | full record: description, AI summary, contacts, amendments, filed documents |
GET /v1/opportunities/{nb_id}/documents | filed documents and the engine's attachment index (names and metadata) |
GET /v1/opportunities/{nb_id}/files | stored text artifacts: path, bytes, mtime, kind |
GET /v1/opportunities/{nb_id}/files/{path} | the artifact as text/markdown, application/json or text/plain (5 MB cap) |
GET /v1/usage | your account's numbers: plan, allowance used and remaining, reset date, requests and errors this period, keys with last use, what counts as a call (free) |
GET /v1/account | the My Account payload: the numbers above plus your business profile and your recorded pursuits (free) |
GET /v1/account/activity | what NextBid returned to your keys, newest first: operation, parameters, result count, opportunity, units, status, latency, client; filters limit, key, since, operation (free) |
GET /v1/account/pursuits | opportunities you or your agent marked watching, pursuing, submitted, won, lost or dropped (free) |
POST /v1/opportunities/{nb_id}/pursuit | {"status","note"}; records a pursuit only because you said so; reading a bid never counts (free) |
GET /v1/account/profile, PUT | what work you are looking for: company, website, tradelines, specialties, service areas, target markets, certifications, products, notes (free) |
| Trial key | create a NextBid account, then a key from your account (no anonymous keys); start at Pricing |
Search parameters
| Parameter | Meaning |
|---|---|
tradelines | comma list of trade ids or aliases ("badge readers", "structured cabling", "cctv" all resolve to lowvoltage); omit for all trades (rows with no trade tags stay out). Unknown values are reported in query.tradelines_unresolved; if none resolve, 400 unknown_tradeline |
q | keywords, full-text over title and description |
states, agencies, sources, set_asides | filters; use agencies for regions, local portals rarely fill the state column |
open | default true: only opportunities still open |
due_within_days, deadline_from, deadline_to | deadline window |
sort | deadline (default) or relevance (with q) |
page, page_size | pagination, 5 to 100 per page |
Record fields
nb_id, source, title, agency, agency_department, requesting_department, solicitation_number, notice_type, procurement_kind, set_aside, response_deadline, posted_date, lifecycle_status, tradelines[], naics[], unspsc[], psc, states[], cities[], counties[], place_of_performance, document_count, document_set_status, attachment_count, bonding_required, wage_determination, requires_clearance, source_url, summary, last_updated, rank_score. The full record adds description, ai_summary, contract_type, opp_kind, is_goods_only, document0_version, contacts[], amendments[], documents[].
File kinds
document0 the canonical notice (markdown and JSON) · normalized attachment text · case the case file · requirements · scope_graph · evidence · classifications · graph · packet · other.
MCP
Remote endpoint https://api.nextbid.us/mcp (Streamable HTTP). Send the same X-API-Key header. Tools: search_opportunities, get_opportunity, list_documents, list_files, read_file, corpus_stats, list_tradelines (the catalog with specialties and aliases), list_set_asides, my_usage, my_account, mark_pursuit. A tool call costs what its REST call costs (searches and reads one unit; catalogs, stats, account and pursuit tools free) and returns the same JSON as the REST call plus a _meter block.
{ "mcpServers": { "nextbid": { "url": "https://api.nextbid.us/mcp", "headers": { "X-API-Key": "YOUR_KEY" } } } }
Examples
curl -H "X-API-Key: $KEY" "https://api.nextbid.us/v1/opportunities?tradelines=roofing&due_within_days=14&page_size=10"
curl -H "X-API-Key: $KEY" "https://api.nextbid.us/v1/opportunities/NB00098908"
curl -H "X-API-Key: $KEY" "https://api.nextbid.us/v1/opportunities/NB00098908/files"
curl -H "X-API-Key: $KEY" "https://api.nextbid.us/v1/opportunities/NB00010002/files/nextbid/sam/shadow/document0/docs/NB00010002/NB00010002.document0.md"
Limits and status codes
| Limit | Value | Response |
|---|---|---|
| Calls per period | your plan allowance (trial: 14 days, 100 calls and up to 250 unique opportunities delivered, whichever comes first; paid plans: a calendar month) | 402 with upgrade terms |
| Calls per minute per key | 600 | 429 + Retry-After |
| Requests in flight per key | 4 | 429 too_many_concurrent_requests |
| Unauthenticated / public calls per minute per IP | 30 / 60 | 429 |
| Trial keys per address | 3 a day | 429 |
| Query length / list values / URL | 200 chars / 20 values / 2,048 chars | 400 / 414 |
| Revoked key | 403 key_revoked |
Honour Retry-After on 429. Repeated abuse revokes the key.
Terms in one paragraph
Access is licensed for your own use. The issuing agency's official notice always controls; verify with the agency before you bid. Derived fields are labelled. Buyer contacts are public records served with their solicitation and may not be redistributed as a list. Keys are personal; sharing keys or scraping the API ends the licence. Questions and licences: admin@nextbid.us. Full terms of use and privacy notice.
NextBid