Bidsandtenders APIbidsandtenders.com ↗
Search open and historical bid opportunities from the bids&tenders eProcurement platform across Canada and the USA. Filter by status, type, org, and date.
What is the Bidsandtenders API?
The bids&tenders API exposes public procurement data from the bids&tenders eProcurement platform through a single search_bids endpoint that returns up to 50 bid opportunities per page with fields including bid name, organization, status, closing date, document fees, and bid type. It covers active and historical tenders across Canadian provinces and US jurisdictions, with filters for keyword, date range, bid type, and organization ID.
curl -X GET 'https://api.parse.bot/scraper/94f5a0e0-28d3-4ff5-a4e7-dfd2e4953d34/search_bids?page=1&status=Open&keyword=construction&organization=5231' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace bidsandtenders-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: bidsandtenders SDK — bounded, re-runnable; every call capped."""
from parse_apis.bidsandtenders_com_api import BidsAndTenders, BidStatus, ParseError
client = BidsAndTenders()
# Search open bids in BC by organization IDs (Metro Vancouver + City of Surrey)
for bid in client.bids.search(status=BidStatus.OPEN, organization="5231,12412", limit=3):
print(bid.bid_name, bid.organization, bid.closing_date)
# Keyword search across all open bids
bid = client.bids.search(keyword="construction", status=BidStatus.OPEN, limit=1).first()
if bid:
print(bid.bid_name, bid.bid_type, bid.detail_url)
# Handle errors on a search
try:
for b in client.bids.search(keyword="plumbing", limit=2):
print(b.bid_name, b.status)
except ParseError as e:
print(f"error: {e}")
print("exercised: bids.search")
Search open and historical bid opportunities by keyword, status, organization, bid type, and date range. Results are paginated with up to 50 bids per page, ordered by closing date descending. To find bids in a specific province (e.g. BC), pass a comma-separated list of organization IDs for that region.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-indexed). Each page returns up to 50 bids. |
| status | string | Filter by bid status. |
| keyword | string | Free-text search against bid name and organization name. |
| bid_type | string | Filter by bid type (e.g. Public, Prequalification, Invitational). |
| publish_to | string | Filter bids published on or before this date, format MM/DD/YYYY. Omit to not filter by end date. |
| organization | string | Comma-separated list of organization IDs to filter results. Organization IDs can be discovered from the platform's organization dropdown (e.g. 5231 for Metro Vancouver, 12416 for City of Abbotsford). |
| publish_from | string | Filter bids published on or after this date, format MM/DD/YYYY. Omit to not filter by start date. |
{
"type": "object",
"fields": {
"bids": "array of bid opportunity objects with bid_name, status, published_date, closing_date, organization, document_fees, bid_type, detail_url",
"page": "current page number",
"total": "total number of matching bids across all pages",
"total_pages": "total number of pages available"
},
"sample": {
"data": {
"bids": [
{
"status": "Open",
"bid_name": "25-767 - Hydrothermal Liquefaction Products Management – Research and Development",
"bid_type": "Public",
"detail_url": "https://metrovancouver.bidsandtenders.ca/Module/Tenders/en/Tender/Detail/0db78897-6f32-4316-88fb-d16685a0de71",
"closing_date": "2028-12-31T22:00:00.0000000Z",
"organization": "Metro Vancouver",
"document_fees": "No",
"published_date": "2025-12-23T00:30:00.0000000Z"
}
],
"page": 1,
"total": 115,
"total_pages": 3
},
"status": "success"
}
}About the Bidsandtenders API
What the API Returns
The search_bids endpoint returns paginated bid opportunity records from the bids&tenders eProcurement platform. Each result object includes bid_name, status, published_date, closing_date, organization, document_fees, bid_type, and a detail URL. The response envelope also provides page, total, and total_pages so you can walk through result sets that exceed the 50-record-per-page limit.
Filtering and Pagination
You can narrow results using several independent parameters. The keyword param matches against bid name and organization name. status filters by lifecycle stage (e.g. open, closed). bid_type accepts values like Public, Prequalification, or Invitational. Date range filtering uses publish_from and publish_to in MM/DD/YYYY format to bound by publication date. To scope results to a specific province or state, pass a comma-separated list of organization IDs to the organization parameter — organization IDs correspond to the issuing entities registered on the platform. Results are ordered by closing date descending.
Coverage and Scope
The platform covers procurement activity across Canadian provinces and US jurisdictions. Because organization IDs are the mechanism for regional filtering, knowing the IDs for the organizations in your target region (e.g. British Columbia municipalities) is necessary for precise geographic queries. Without an organization filter, results span the full platform footprint.
The Bidsandtenders API is a managed, monitored endpoint for bidsandtenders.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bidsandtenders.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official bidsandtenders.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new Public bid opportunities relevant to a specific trade or service keyword before their closing date
- Track historical bid activity for a set of government organizations using organization ID filters
- Build a tender alert system that queries
search_bidsdaily and flags records whereclosing_dateis within 7 days - Aggregate
document_feesacross open Prequalification bids to estimate participation costs for a procurement pipeline - Filter bids by
bid_typeto separate Invitational from Public opportunities for vendor eligibility analysis - Enumerate all bids from a specific municipality by passing its organization ID and paginating through results
- Compare
published_datetoclosing_dateto identify bids with unusually short response windows
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does bids&tenders have an official developer API?+
How does geographic filtering work in `search_bids`?+
organization parameter. Each organization ID corresponds to a registered issuing entity on the platform — for example, specific municipalities or school districts in a given province. You need to know the relevant organization IDs for the region you want to cover.Does the API return the full bid document or specification attachments?+
detail URL pointing to the bid's page on the platform, but the API does not return document attachments or specification files directly. You can fork this API on Parse and revise it to add an endpoint that fetches document metadata or attachment links from the detail page.Are there limitations on how far back historical bids go?+
publish_from and publish_to date filters let you bound queries to a specific window, which is useful for systematic historical pulls.