Documentation menu
Docs / Reference / Search standing offers and supply arrangements

Search standing offers and supply arrangements

GET/standing_offer

Parameters

ParameterTypeDescription
municipalitystringoptionalFilter 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.)
qstringoptionalFull-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").
departmentstringoptionalFilter by department name (partial/substring match; min 3 characters). Matches the normalized department name.
vendorstringoptionalFilter by vendor name (partial/substring match; min 3 characters)
categorystringoptionalProcurement 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).
reference_numberstringoptionalExact tender/notice reference number (e.g. the CanadaBuys 'cb-...' id). Returns the notice and all its amendments.
issued_afterstringoptionalFilter by date >= YYYY-MM-DD (award_date for contracts/awards, publication_date for tenders). Aliases: date_from, date_after
issued_beforestringoptionalFilter by date <= YYYY-MM-DD. Aliases: date_to, date_before
closing_afterstringoptionalFilter tenders by closing_date >= YYYY-MM-DD.
closing_beforestringoptionalFilter tenders by closing_date <= YYYY-MM-DD.
sort_bystringoptionalSort 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_orderstringoptionalSort order: asc or desc
limitintegeroptional
offsetintegeroptional
cursorstringoptionalPagination 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/standing_offer' \
  --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/standing_offer"
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/standing_offer", {
  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/standing_offer");
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/standing_offer")
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.body
package main

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

func main() {
    req, _ := http.NewRequest("GET", "https://procuredata-canadian-government-procurement-api.p.rapidapi.com/standing_offer", 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/standing_offer"))
    .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());

Example response

{
  "entity_type": "standing_offer",
  "count": 1,
  "offset": 0,
  "results": [
    {
      "record_id": "CW2306314-ACM_176664527|9736140 CANADA INC|Canada",
      "vendor_name": "9736140 CANADA INC",
      "department_en": "Public Services and Procurement Canada",
      "sosa_description_en": "EN578-231556 Aircraft Charter Services",
      "commodity_description_en": "78142001 - Rental of freight aircraft",
      "agreement_type_en": "NMSO",
      "agreement_number": "CW2306314-ACM_176664527",
      "award_date": "2023-06-01",
      "expiry_date": "2026-05-31",
      "delivery_point_en": "Canada",
      "government_level": "federal"
    }
  ]
}

Response fields

One standing_offer record. Measured over 2,896 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.

FieldTypeDescription
agreement_numberstringAlways present.
agreement_type_enstringAlways present.
agreement_type_frstringAlways present.
award_datestringAlways present.
commoditystringAlways present.
commodity_description_enstringAlways present.
commodity_description_frstringAlways present.
date_file_publishedstringAlways present.
delivery_point_codestringAlways present.
delivery_point_enstringAlways present.
delivery_point_frstringAlways present.
department_enstringAlways present.
department_frstringAlways present.
expiry_datestringAlways present.
fetched_atstringWhen Nimbus last ingested this record. Bookkeeping, not source data. Always present.
government_levelstringAlways present.
municipalitystringCity slug. Call /{entity_type}/coverage for every slug in this dataset. Always present.
record_idstringStable identifier for this record. Pass it to the /{entity_type}/{record_id} endpoint. Always present.
sosa_description_enstringAlways present.
sosa_description_frstringAlways present.
supplier_legal_namestringAlways present.
supplier_operating_namestringPopulated in 38% of sampled records.
vendor_namestringAlways present.
1 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.

FieldTypePopulated
eligibilityobject5.7%

Errors

Every error returns {"detail": "…"}, a sentence naming what was wrong and, where there is one, the fix.

StatusWhen
400The 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.
403Missing or invalid API key.
404No such endpoint, or no record with that id.
422A 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.
429Rate limit or plan quota exceeded.
500Unexpected server error.
504The 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 →