Documentation menu
Getting started
QuickstartEndpoints
GET/sourcesGET/tender/alerts/unsubscribeGET/tender/{record_id}/documents/{doc_index}GET/vendorsGET/departmentsGET/department/{name}GET/vendor/{name}GET/contractGET/tenderGET/awardGET/disclosureGET/standing_offerGET/pre_solicitationGET/contract/statsGET/tender/statsGET/award/statsGET/disclosure/statsGET/standing_offer/statsGET/pre_solicitation/statsGET/contract/coverageGET/tender/coverageGET/award/coverageGET/disclosure/coverageGET/standing_offer/coverageGET/pre_solicitation/coverageGET/procurement/{solicitation_number}GET/tender/feedGET/contract/{record_id}GET/tender/{record_id}GET/award/{record_id}GET/disclosure/{record_id}GET/standing_offer/{record_id}GET/pre_solicitation/{record_id}Search awards
Parameters
| Parameter | Type | Description | |
|---|---|---|---|
municipality | string | optional | Filter to one city by its slug, e.g. 'new_westminster', 'toronto', 'north_vancouver_city'. Exact match. This is the city filter for BuildData datasets (permits, development permits, planning applications, inspections); call /{entity_type}/coverage for the list of valid slugs. The 'city' param is accepted as an alias here. (For the US liquor/healthcare/tank datasets, 'city' is instead a distinct filter and 'municipality' does not apply.) |
q | string | optional | Full-text search across every field of the record, including names (business, establishment, licensee, vendor, contractor) wherever the dataset carries them, e.g. q=brewery or q="Iron Hill". This is the name search: there is no separate name= parameter, and it works on every plan including free. Space-separated words require all terms (e.g. "wood panel"). Use OR to match any term ("wood OR panel OR acoustic"), quotes for exact phrases ("supply arrangement"), and a leading minus to exclude ("software -hardware"). |
department | string | optional | Filter by department name (partial/substring match; min 3 characters). Matches the normalized department name. |
vendor | string | optional | Filter by vendor name (partial/substring match; min 3 characters) |
category | string | optional | Procurement category: CNST, GD, SRV, SRVTGD. For recalls: product category (e.g. 'Baby products', 'Toys and games'). For healthcare: facility category (acute, long_term, home, behavioral, outpatient, specialty). For storage tanks: record type (tank or release). |
status | string | optional | Filter by status. Contracts/tenders: Active, Expired, Cancelled, Open (exact). Permits: use a status_canonical value instead (issued, in_review, completed, expired, cancelled, unknown). |
procurement_method | string | optional | Filter by procurement method (prefix match on procurement_method_en/fr, e.g. 'Competitive') |
vendor_province | string | optional | Filter by vendor province (e.g. 'Ontario', 'Quebec') |
reference_number | string | optional | Exact tender/notice reference number (e.g. the CanadaBuys 'cb-...' id). Returns the notice and all its amendments. |
value_min | number | optional | Minimum value, applied to the entity's value field (construction_value for permits, contract_value for contracts, agreement_value for grants, monetary_amount for contributions, total_co2e for emissions, assessed_value for assessments). Ignored for entity types with no monetary field. |
value_max | number | optional | Maximum value; same per-entity field mapping as value_min. Ignored for entity types with no monetary field. |
issued_after | string | optional | Filter by date >= YYYY-MM-DD (award_date for contracts/awards, publication_date for tenders). Aliases: date_from, date_after |
issued_before | string | optional | Filter by date <= YYYY-MM-DD. Aliases: date_to, date_before |
closing_after | string | optional | Filter tenders by closing_date >= YYYY-MM-DD. |
closing_before | string | optional | Filter tenders by closing_date <= YYYY-MM-DD. |
sort_by | string | optional | Sort field: published (publication_date, tenders only), date (event date; this is award_date for contracts/awards), value (the entity's value field), closing (closing_date for tenders) |
sort_order | string | optional | Sort order: asc or desc |
limit | integer | optional | |
offset | integer | optional | |
cursor | string | optional | Pagination cursor from next_cursor in a previous response. Use instead of offset for deep pagination. |
Request
curl --request GET \
--url 'https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award' \
--header 'x-rapidapi-host: procuredata-canadian-government-procurement-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_RAPIDAPI_KEY'import requests
url = "https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award"
headers = {"x-rapidapi-host": "procuredata-canadian-government-procurement-api.p.rapidapi.com", "x-rapidapi-key": "YOUR_RAPIDAPI_KEY"}
resp = requests.get(url, headers=headers)
print(resp.json())const res = await fetch("https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award", {
headers: {
"x-rapidapi-host": "procuredata-canadian-government-procurement-api.p.rapidapi.com",
"x-rapidapi-key": "YOUR_RAPIDAPI_KEY",
},
});
const data = await res.json();
console.log(data);<?php
$ch = curl_init("https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-rapidapi-host: procuredata-canadian-government-procurement-api.p.rapidapi.com",
"x-rapidapi-key: YOUR_RAPIDAPI_KEY",
]);
echo curl_exec($ch);require "net/http"
require "uri"
uri = URI("https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award")
req = Net::HTTP::Get.new(uri)
req["x-rapidapi-host"] = "procuredata-canadian-government-procurement-api.p.rapidapi.com"
req["x-rapidapi-key"] = "YOUR_RAPIDAPI_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.bodypackage main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award", nil)
req.Header.Add("x-rapidapi-host", "procuredata-canadian-government-procurement-api.p.rapidapi.com")
req.Header.Add("x-rapidapi-key", "YOUR_RAPIDAPI_KEY")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.*;
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://procuredata-canadian-government-procurement-api.p.rapidapi.com/award"))
.header("x-rapidapi-host", "procuredata-canadian-government-procurement-api.p.rapidapi.com")
.header("x-rapidapi-key", "YOUR_RAPIDAPI_KEY")
.build();
HttpResponse<String> res = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());Response fields
One award record. Measured over 500 live records sampled across municipalities. Percentages say how often each field is populated: sources publish different columns, so a field missing from a given record is normal rather than an error.
| Field | Type | Description |
|---|---|---|
amendment_number | string | Always present. |
award_date | string | Always present. |
contract_number | string | Populated in 98% of sampled records. |
contract_value | number | Populated in 97% of sampled records. |
currency | string | Populated in 90% of sampled records. |
department_en | string | Always present. |
department_fr | string | Always present. |
description_en | string | Populated in 89% of sampled records. |
description_fr | string | Populated in 89% of sampled records. |
end_date | string | Populated in 99% of sampled records. |
fetched_at | string | When Nimbus last ingested this record. Bookkeeping, not source data. Always present. |
government_level | string | Always present. |
procurement_category | string | Always present. |
procurement_method_en | string | Always present. |
procurement_method_fr | string | Always present. |
publication_date | string | Always present. |
record_id | string | Stable identifier for this record. Pass it to the /{entity_type}/{record_id} endpoint. Always present. |
reference_number | string | Always present. |
regions_of_delivery_en | string | Populated in 96% of sampled records. |
regions_of_delivery_fr | string | Populated in 96% of sampled records. |
solicitation_number | string | Always present. |
start_date | string | Populated in 99% of sampled records. |
status_en | string | Always present. |
status_fr | string | Always present. |
title_en | string | Always present. |
title_fr | string | Always present. |
total_contract_value | number | Populated in 99% of sampled records. |
trade_agreements_en | string | Always present. |
vendor_city | string | Always present. |
vendor_country | string | Always present. |
vendor_postal_code | string | Always present. |
vendor_province | string | Always present. |
6 more fields published by only one or two cities
Present on under 10% of records. Useful when you are working with a specific city, not something to rely on across the dataset.
| Field | Type | Populated |
|---|---|---|
amendment_date | string | 7.0% |
eligibility | object | 0.2% |
gsin | string | 0.6% |
municipality | string | 0.0% |
vendor_name | string | 0.8% |
vendor_name_standardized | string | 0.0% |
Errors
Every error returns {"detail": "…"}, a sentence naming what was wrong and, where there is one, the fix.
| Status | When |
|---|---|
400 | The request is understood but cannot be served as asked, e.g. offset above 9500, or cursor combined with sort_by=value. The message names the fix. |
403 | Missing or invalid API key. |
404 | No such endpoint, or no record with that id. |
422 | A parameter is invalid: an unknown city slug, an impossible date, a limit above 500, an unrecognised sort field, or a misspelled parameter name. The message names the parameter and, where there is one, the nearest valid value. |
429 | Rate limit or plan quota exceeded. |
500 | Unexpected server error. |
504 | The query took too long. Narrow it with a municipality or a date range. |
Ready to build?Subscribe on RapidAPI to get your key and start calling ProcureData in minutes.
Get your API key →