ProcureData API Documentation

Every Canadian government tender, contract, and award in one normalized API. Federal contracts, tenders, and awards (CanadaBuys, TBS proactive disclosure, PSPC/SOSA standing offers), Quebec public sector (SEAO), and provincial and municipal sources: Nova Scotia, British Columbia, Alberta…

Documentation menu

Quickstart

Three steps to your first call:

  1. Sign up at procuredata.ca/subscribe/ and copy your key (free tier, no card).
  2. Call the base URL https://api.procuredata.ca with your key in the headers.
  3. Parse the JSON response.
curl --request GET \
  --url 'https://api.procuredata.ca/sources' \
  --header 'X-API-Key: YOUR_API_KEY'
import requests

url = "https://api.procuredata.ca/sources"
headers = {"X-API-Key": "YOUR_API_KEY"}
resp = requests.get(url, headers=headers)
print(resp.json())
const res = await fetch("https://api.procuredata.ca/sources", {
  headers: {
    "X-API-Key": "YOUR_API_KEY",
  },
});
const data = await res.json();
console.log(data);
<?php
$ch = curl_init("https://api.procuredata.ca/sources");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "X-API-Key: YOUR_API_KEY",
]);
echo curl_exec($ch);
require "net/http"
require "uri"

uri = URI("https://api.procuredata.ca/sources")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = "YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    req, _ := http.NewRequest("GET", "https://api.procuredata.ca/sources", nil)
    req.Header.Add("X-API-Key", "YOUR_API_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://api.procuredata.ca/sources"))
    .header("X-API-Key", "YOUR_API_KEY")
    .build();
HttpResponse<String> res = HttpClient.newHttpClient()
    .send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());

Guides

Cookbook

Copy-paste recipes for common ProcureData tasks.

Endpoint reference

Every ProcureData route. Click through for parameters, examples and a sample response.

GET/sourcesList all data sourcesGET/tender/alerts/unsubscribeUnsubscribe from tender alertsGET/vendorsSearch vendors by nameGET/departmentsSearch and list departmentsGET/expiringContracts ending soon, with the incumbent and what they were paidGET/tender/feedPro: matched open-tender lead feed (keyword-matched, new-since window)GET/tender/{record_id}/documents/{doc_index}Redirect to a CanadaBuys tender document by indexGET/department/{name}Department procurement profileGET/process/{process_key}Every record in one procurement: the tender, the award, the contractGET/vendor/{name}Vendor procurement profileGET/contractSearch contractsGET/tenderSearch tendersGET/awardSearch awardsGET/disclosureSearch proactive disclosure contractsGET/standing_offerSearch standing offers and supply arrangementsGET/pre_solicitationSearch pre-solicitation notices (ACAN, RFI, ITQ)GET/contract/statsContract statisticsGET/tender/statsTender statisticsGET/award/statsAward statisticsGET/disclosure/statsDisclosure statisticsGET/standing_offer/statsStanding offer statisticsGET/pre_solicitation/statsPre-solicitation statisticsGET/contract/coverageContract count per municipalityGET/tender/coverageTender count per municipalityGET/award/coverageAward count per municipalityGET/disclosure/coverageDisclosure count per municipalityGET/standing_offer/coverageStanding offer count per municipalityGET/pre_solicitation/coveragePre-solicitation count per municipalityGET/procurement/{solicitation_number}Procurement lifecycle for a solicitationGET/contract/{record_id}Get contract by IDGET/tender/{record_id}Get tender by IDGET/award/{record_id}Get award by IDGET/disclosure/{record_id}Get disclosure by IDGET/standing_offer/{record_id}Get standing offer by IDGET/pre_solicitation/{record_id}Get pre-solicitation notice by ID
Ready to build?Create a free key and start calling ProcureData in minutes. No card required.
Get your API key →