Bidsandtenders APIbidsandtenders.ca ↗
Retrieve public tender details from bids&tenders.ca by bid number. Get title, agency, status, bid type, description, awarded date, and more.
What is the Bidsandtenders API?
The bids&tenders.ca API exposes 1 endpoint — get_bid_by_number — that returns 10 structured fields for any bid opportunity on the bids&tenders eProcurement network, including the buyer organization, current status, bid type, award date, and a direct URL to the public detail page. Provide an exact bid or reference number such as RFT-26-335 and the endpoint resolves the full record across all buyer organizations and all lifecycle statuses.
curl -X GET 'https://api.parse.bot/scraper/a0cf918c-77c2-47fc-903d-bc1997017372/get_bid_by_number?bid_number=RFT-26-335' \ -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-ca-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: look up a public bid opportunity on bids&tenders by its reference number."""
from parse_apis.bidsandtenders_ca_api import BidsAndTenders, BidNotFound
client = BidsAndTenders()
# Fetch a bid by its exact buyer-assigned reference number.
try:
bid = client.bids.get(bid_number="RFT-26-335")
except BidNotFound:
print("No bid found with that number.")
raise
# Typed field access on the returned Bid object.
print(bid.title)
print(bid.agency, "|", bid.status)
print("Closes UTC:", bid.closing_date_utc)
print("Published UTC:", bid.published_date_utc)
print("Document fee:", bid.has_document_fee)
print("Detail page:", bid.detail_url)
# The details dict contains every label→value row from the bid's detail table;
# keys vary by bid, so access them by name.
if "Categories" in bid.details:
print("Categories:", bid.details["Categories"])
if bid.description is not None:
print("Description:", bid.description[:120])
print("exercised: bids.get")
Looks up a single bid opportunity by its exact bid/reference number across all buyer organizations and all statuses (open, closed, awarded, cancelled, etc.) on the bids&tenders opportunities database, then opens the buyer's detail page for that bid. Returns one object with the bid number, title, buyer organization (agency), status, closing and publish dates (both the site's formatted source-timezone text and UTC ISO timestamps), description, bid type, classification, plus a `details` map of every label/value row shown in the bid's details table (labels vary by bid; e.g. Question Deadline or Bid Awarded Date appear only when the buyer set them, so published_date, question_deadline, awarded_date and description can be null). Two round trips per call. Matching is exact on the bid number (case-insensitive); if no opportunity carries that number the call returns a not-found error rather than an empty object.
| Param | Type | Description |
|---|---|---|
| bid_numberrequired | string | The buyer-assigned bid/reference number exactly as shown on the site, e.g. RFT-26-335 or 26158-1. |
{
"type": "object",
"fields": {
"title": "bid name / title",
"agency": "buyer organization that owns the bid",
"status": "bid status as displayed (e.g. Open, Closed, Awarded, Cancelled)",
"details": "object of every label -> value row from the bid details table",
"bid_type": "bid type label (e.g. RFT, RFP)",
"bid_number": "bid/reference number as shown on the detail page",
"detail_url": "public URL of the bid's detail page on the buyer's portal",
"visibility": "Public or Invitational",
"description": "plain-text description (paragraphs joined by newlines), null when absent",
"awarded_date": "award date text, null unless the bid is awarded",
"closing_date": "closing date/time text in the buyer's source timezone, null if not shown on the detail page",
"classification": "bid classification (e.g. Goods, Services)",
"published_date": "publish date/time text in the buyer's source timezone, null when the detail page omits it",
"source_timezone": "IANA timezone of the buyer used for the date text",
"closing_date_utc": "closing date/time as UTC ISO-8601 timestamp from the search listing",
"has_document_fee": "boolean, whether a document fee applies",
"question_deadline": "question deadline text, null when not set",
"published_date_utc": "publish date/time as UTC ISO-8601 timestamp from the search listing"
},
"sample": {
"data": {
"title": "Artificial Turf Infill Replacement at Sherwood Forest Park",
"agency": "City of Burlington",
"status": "Awarded",
"details": {
"Bid Name": "Artificial Turf Infill Replacement at Sherwood Forest Park",
"Bid Type": "RFT",
"Bid Number": "RFT-26-335",
"Bid Status": "Awarded",
"Categories": "Show Categories [+] Landscaping & Forestry Artificial Turf Turf Maintenance",
"Bid Pricing": "$70.80 - Download Only",
"Description": "The City of Burlington is seeking bids from qualified contractors to remove, dispose of, and replace the existing performance infill within the full-size artificial turf field at Sherwood Forest Park (5270 Fairview Street, Burlington, Ontario).\n*ONLINE BID SUBMISSIONS ONLY*",
"Public Opening": "No",
"Published Date": "Wed Aug 5, 2026 3:00:59 PM (EDT)",
"Submission Type": "Online Submissions Only",
"Bid Awarded Date": "Tue Aug 25, 2026 (EDT)",
"Bid Closing Date": "Thu Aug 20, 2026 2:00:59 PM (EDT)",
"Trade Agreements": "Show Trade Agreements [+] Canadian Free Trade Agreement (CFTA)",
"Question Deadline": "Thu Aug 13, 2026 2:00:00 PM (EDT)",
"Bid Classification": "Services Related To Goods"
},
"bid_type": "RFT",
"bid_number": "RFT-26-335",
"detail_url": "https://burlington.bidsandtenders.ca/Module/Tenders/en/Tender/Detail/cc34cb98-2867-4e50-b4c7-0e159458f089",
"visibility": "Public",
"description": "The City of Burlington is seeking bids from qualified contractors to remove, dispose of, and replace the existing performance infill within the full-size artificial turf field at Sherwood Forest Park (5270 Fairview Street, Burlington, Ontario).\n*ONLINE BID SUBMISSIONS ONLY*",
"awarded_date": "Tue Aug 25, 2026 (EDT)",
"closing_date": "Thu Aug 20, 2026 2:00:59 PM (EDT)",
"classification": "Services Related To Goods",
"published_date": "Wed Aug 5, 2026 3:00:59 PM (EDT)",
"source_timezone": "America/New_York",
"closing_date_utc": "2026-08-20T18:00:00.0000000Z",
"has_document_fee": true,
"question_deadline": "Thu Aug 13, 2026 2:00:00 PM (EDT)",
"published_date_utc": "2026-08-05T19:00:00.0000000Z"
},
"status": "success"
}
}About the Bidsandtenders API
What the API Returns
The get_bid_by_number endpoint accepts a single required parameter — bid_number — which must be the exact buyer-assigned reference number as it appears on the bids&tenders portal (e.g. RFT-26-335 or 26158-1). It returns a single object containing the bid title, the agency that issued it, and the current status (Open, Closed, Awarded, Cancelled, or any other value shown on the site). The bid_type field carries the procurement method label such as RFT or RFP, and visibility indicates whether the opportunity is Public or Invitational.
Detail Fields and Description
The response includes a details object that maps every label-value row from the bid's detail table — this is where structured metadata such as closing date, category codes, contact information, and any other fields the buyer organization populates will appear. The description field returns the full plain-text tender description with paragraphs joined by newlines; it is null when the bid carries no description. For awarded bids, awarded_date returns the award date text; it is null for all other statuses. The detail_url field provides the canonical public URL for the bid on the buyer's portal, suitable for linking or archiving.
Coverage and Scope
The API queries across all buyer organizations on the bids&tenders network and all bid statuses, so historical closed or awarded records are retrievable alongside active opportunities. Lookup requires the exact reference number; there is no keyword search or listing endpoint. The network covers Canadian public-sector buyers — municipalities, utilities, school boards, and similar entities — that use the bids&tenders eProcurement platform.
The Bidsandtenders API is a managed, monitored endpoint for bidsandtenders.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bidsandtenders.ca 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.ca 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 award outcomes for specific tender numbers by checking
statusandawarded_dateafter closing. - Build a vendor notification system that enriches internal bid-tracking records with live
statusanddetail_urlfields. - Audit procurement activity for a specific buyer by resolving known bid numbers and comparing
agencyanddetailsfields. - Populate a competitive intelligence database with bid
title,bid_type, anddescriptionfor market analysis. - Verify bid
visibility(Public vs. Invitational) when assessing whether an opportunity was open to all vendors. - Archive closed or awarded tenders by storing the full
detailsobject andawarded_datefor compliance records.
| 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.ca have an official developer API?+
What does `get_bid_by_number` return for a bid that has been awarded?+
awarded_date containing the award date text as shown on the detail page. The status field will reflect 'Awarded'. For bids in any other status, awarded_date is null.What is in the `details` object?+
details object is a key-value map of every row in the bid's structured detail table on the buyer's portal. The exact keys depend on what the issuing buyer organization has filled in — common entries include closing dates, commodity codes, contact names, and delivery location. There is no fixed schema since different buyers populate different fields.Can I search for bids by keyword, category, or buyer organization?+
Does the API return bid documents or attachments?+
detail_url, which points to the public bid detail page where documents may be accessible directly. You can fork the API on Parse and revise it to extract document links if the buyer's portal exposes them on that page.