Nova Scotia APIprocurement-portal.novascotia.ca ↗
Search 30k+ Nova Scotia public tender notices, fetch full tender details, and list bid documents with download URLs via 3 structured endpoints.
What is the Nova Scotia API?
This API exposes three endpoints covering the Nova Scotia Procurement Portal's full catalogue of roughly 30,000 public tender notices — open and historical. Use search_tenders to filter by keyword, status, organization, category, and date range; call get_tender for a complete tender record including buyer details, UNSPSC classifications, award data, and closing dates; and use list_tender_documents to retrieve attached bid documents with direct download URLs.
curl -X GET 'https://api.parse.bot/scraper/66aba440-65c7-46a7-93c8-4e64555ff542/search_tenders?status=OPEN&solicitation_type=Request+for+Proposal+%28Construction%29%2CRequest+for+Quotation' \ -H 'X-API-Key: $PARSE_API_KEY'
Searches the portal's public tender notices (all ~30k notices, open and historical) and returns one page of tender summaries, newest posted first by default. Keyword matches tender ID and title. Solicitation type, status and category filters accept comma-separated lists (any match); organization is a single buyer name as shown in the portal's Organization dropdown; closing and posted date ranges are inclusive ISO dates. Pagination is a true page/page_size window over the filtered result set: page defaults to 1, page_size defaults to 25 and is capped at 100; total_results is the portal's own count and has_more tells whether a later page exists. Each row is a summary only; use get_tender for description, contacts, categories, awards and attachments. An unrecognized status or category value is rejected; unrecognized solicitation types and organizations are passed to the portal and simply match nothing. closing_date is a UTC timestamp 'YYYY-MM-DD HH:MM:SS'.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| sort | string | Result ordering. |
| status | string | Comma-separated tender statuses (case-insensitive), e.g. 'Open,Awarded'. Omitted = all statuses. |
| keyword | string | Free-text search over tender ID and title. Omitted = no keyword restriction. |
| category | string | Comma-separated procurement categories. Omitted = all categories. |
| page_size | integer | Rows per page, 1-100 (larger values are clamped to 100). |
| organization | string | Buyer organization name exactly as listed in the portal's Organization filter (e.g. 'Halifax Regional Municipality'). Matches the tender's organization field. Omitted = all organizations. |
| posted_date_to | string | Latest posted date, ISO YYYY-MM-DD (inclusive). |
| closing_date_to | string | Latest closing date, ISO YYYY-MM-DD (inclusive). |
| posted_date_from | string | Earliest posted date, ISO YYYY-MM-DD (inclusive). |
| closing_date_from | string | Earliest closing date, ISO YYYY-MM-DD (inclusive). |
| solicitation_type | string | Comma-separated solicitation type names exactly as the portal displays them, e.g. 'Request for Proposal (Construction),Request for Quotation'. Confirmed values: Request for Proposal (Construction); Request for Proposal (Negotiations, Concurrent, BAFO); Request for Proposal (Negotiations, Consecutive); Request for Proposal (No Negotiation, Contract A); Request for Quotation; Request for Information; Request for Standing Offer; Request for Supplier Qualification (Prequalification for RFP); Request for Supplier Qualification (Supplier Arrangement); Advance Contract Award Notice; Notice of Participation in Buying Group; Notice of Proposed Procurement; Other. Historical notices also carry legacy labels such as 'Tender' and 'Request for Tender', which are accepted verbatim. Omitted = all types. |
{
"type": "object",
"fields": {
"page": "page number returned",
"tenders": "array of tender summaries: tender_id, title, solicitation_type, status (OPEN|AWARDED|CANCELLED|EXPIRED), organization, end_user_entity (department/partner, null when none), posted_date (YYYY-MM-DD), closing_date (UTC 'YYYY-MM-DD HH:MM:SS'), sent_to_canada_buys",
"has_more": "true when page * page_size < total_results",
"page_size": "effective rows per page after clamping",
"total_results": "portal's total count of tenders matching the filters"
},
"sample": {
"data": {
"page": 1,
"tenders": [
{
"title": "Supply and Installation of Roof Top Air-Handling Unit at Scotiabank Centre",
"status": "OPEN",
"tender_id": "HRM-2026-0471",
"posted_date": "2026-09-24",
"closing_date": "2026-10-14 03:00:00",
"organization": "Halifax Regional Municipality",
"end_user_entity": null,
"solicitation_type": "Request for Proposal (Construction)",
"sent_to_canada_buys": true
},
{
"title": "RFC-Sydney Correctional Facility Main Roof Replacement",
"status": "AWARDED",
"tender_id": "Doc3258805979",
"posted_date": "2026-08-19",
"closing_date": "2026-09-14 17:00:00",
"organization": "Province of Nova Scotia",
"end_user_entity": "Department of Public Works",
"solicitation_type": "Request for Proposal (Construction)",
"sent_to_canada_buys": true
}
],
"has_more": true,
"page_size": 5,
"total_results": 180
},
"status": "success"
}
}About the Nova Scotia API
Searching Tenders
The search_tenders endpoint pages through the portal's full notice history, returning summaries that include tender_id, title, solicitation_type, status (OPEN, AWARDED, CANCELLED, or EXPIRED), and organization. Filters can be stacked: keyword matches tender ID and title text, status and category accept comma-separated values for OR logic, organization accepts the buyer name exactly as listed in the portal, and posted_date_to lets you anchor a date window. Results are sorted newest-first by default, and has_more plus total_results drive pagination.
Full Tender Records
get_tender accepts a tender_id (e.g. HRM-2026-0471) and returns the complete public record in one call. Response fields cover the buyer object (name, address, phone, email), contact object (name, email, phone, and available contact methods), closing_date in UTC alongside the local Atlantic closing_time, categories as an array of UNSPSC classifications down to four levels, attachments with per-file metadata, awards with supplier name, location, award_amount, and currency_code, and a bids array of published bid records.
Bid Documents
list_tender_documents returns every public attachment for a tender without requiring a portal account. Each entry carries attachment_id, document_type (e.g. TENDER_OTHER, TENDER_ADDENDUM), and kind: file entries include filename, content_type, size, size_units, and a download_url; link entries provide an external_url; note entries carry inline text. The file_count field gives a quick tally of hosted files. This endpoint is the fastest path to enumerating a tender's downloadable PDFs, DOCX, XLSX, and ZIP packages.
The Nova Scotia API is a managed, monitored endpoint for procurement-portal.novascotia.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when procurement-portal.novascotia.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 procurement-portal.novascotia.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 newly posted OPEN tenders from specific Nova Scotia buyer organizations by polling
search_tenderswithstatus=Openand anorganizationfilter. - Build a tender-alert service that watches
posted_date_toandkeywordto surface relevant procurement notices as they appear. - Extract award data — supplier name, location, and
award_amount— fromget_tenderto track public spending by category or organization. - Compile UNSPSC category breakdowns of provincial procurement by aggregating
categoriesfields across historical tender records. - Automate document retrieval by calling
list_tender_documentsfor open tenders and downloading all files wherekind=fileanddocument_type=TENDER_ADDENDUM. - Analyse closing-date distributions by collecting
closing_dateandclosing_timefields across a filtered slice of tenders. - Map buyer organization addresses using the
buyer.street_address,city, andpostal_codefields returned byget_tender.
| 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 the Nova Scotia Procurement Portal have an official developer API?+
What does `get_tender` return that `search_tenders` does not?+
search_tenders returns lightweight summaries useful for filtering and pagination. get_tender adds the full buyer object with address and phone, the contact object, UNSPSC categories down to four levels, attachments with file metadata, the awards array with supplier and amount details, bids, and both UTC closing_date and local Atlantic closing_time.Can I retrieve the actual content of bid documents through the API?+
download_url values for hosted files via list_tender_documents, but does not return file contents inline. You follow the download_url to fetch the PDF, DOCX, or other file directly. You can fork this API on Parse and revise it to add an endpoint that fetches and parses file contents.Does the API cover private or restricted tenders that require a portal login?+
How far back does the tender history go, and how is pagination handled?+
search_tenders covers all notices in the portal — roughly 30,000 open and historical records. Pages are 1-based and capped at 100 rows each (page_size is clamped to 100). Use total_results and has_more to determine whether additional pages exist.