Merx APImerx.com ↗
Search open and closed Canadian procurement solicitations, retrieve full notice details, and filter by category, location, and date via the Merx.com API.
What is the Merx API?
The Merx API provides structured access to Canadian procurement data across 6 endpoints, covering open solicitations, closed solicitations, full notice details, category lookups, filter vocabularies, and TSSA-specific listings. The get_solicitation_detail endpoint returns every labelled field from a public notice — including reference number, closing date, trade agreement types, description, and assigned UNSPSC/GSIN/MERX category codes — identified by the internal ID surfaced in search results.
curl -X GET 'https://api.parse.bot/scraper/4ac01421-66eb-460e-af83-a8f895284f34/search_open_solicitations?page=1&keywords=services&publish_date=WEEK_1' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for open tender solicitations/RFPs on Merx with keyword, category, location, publish-date and closing-date filters. One round-trip per page; 25 results per page. Note that the site's 'open' list also contains notices whose closing date has already passed; use closing_date_from (for example today's date) to keep only solicitations still accepting bids. Without a date filter, results are the site's relevance ordering. When publish_date_from and/or publish_date_to is given, the site is asked for publication-date-newest-first ordering and the page's rows are filtered locally to the inclusive date range (the site itself offers no exact date-range filter): a page can therefore hold fewer than 25 matching rows or none while later pages still match, and callers should page until has_more is false. When only closing_date_from is given, the site is asked for closing-date-latest-first ordering and rows closing before that date are dropped locally, with the same paging semantics (has_more turns false as soon as the page's earliest closing date predates closing_date_from). When closing_date_from is combined with a publish date range, publication-date ordering is used and the closing-date floor is applied locally to every page without an early stop. has_more is true while a further page may still contain results. total_count is the site's total match count for the keyword/category/location/publish_date filters and never reflects the date filters (null when the site shows no count). Each result carries an internal_id usable with get_solicitation_detail and get_solicitation_categories; reference_number and internal_id are both the site's numeric notice ID. Each result's location is the notice's own delivery region(s) as shown by the site ('Canada' for nationwide notices; several regions are joined with '; '); a province location filter also returns nationwide notices because the site treats them as matching every province. public_notice is true when the notice is viewable without an account (detail and categories lookups succeed) and false for subscription-only solicitations, whose detail lookup returns a not-found error. An empty results array for a page beyond the last page or a filter combination with no matches is a valid empty result. Dates in results are strings in YYYY/MM/DD form. A malformed date, or publish_date_from later than publish_date_to, yields a stale_input error.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (25 results per page). |
| category | string | Category code from get_filter_options.categories[*].value (e.g., 10034 for EDP Hardware and Software). |
| keywords | string | Search keywords to filter solicitations by title or content. |
| location | string | Province/territory code from get_filter_options.locations[*].value (e.g., 337 for Nova Scotia, 355 for Ontario, 38000 for All of Canada). Restricts results to notices delivered to that region; nationwide notices (location 'Canada') are included by the site for every province. |
| publish_date | string | Filter by publish date window; forwarded to the site as given. |
| publish_date_to | string | Latest publication date to include, inclusive, in ISO YYYY-MM-DD form (YYYY/MM/DD is also accepted). Switches results to publication-date-newest-first ordering; pages newer than this date return no rows but has_more stays true. |
| closing_date_from | string | Earliest closing date to include, inclusive, in ISO YYYY-MM-DD form (YYYY/MM/DD is also accepted); set it to today's date to exclude solicitations that have already closed. On its own it switches results to closing-date-latest-first ordering; see the endpoint description for paging semantics. |
| publish_date_from | string | Earliest publication date to include, inclusive, in ISO YYYY-MM-DD form (YYYY/MM/DD is also accepted). Switches results to publication-date-newest-first ordering; see the endpoint description for paging semantics. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"results": "array of solicitation summaries: title, organization, location (string delivery region(s) as shown by the site, 'Canada' for nationwide notices, several regions joined with '; '), reference_number, internal_id (string numeric notice ID), url, public_notice (boolean, anonymously viewable), published_date, closing_date",
"has_more": "boolean, true while a further page may still contain results",
"total_count": "integer total number of matching solicitations for the site-side filters (excludes the date filters), or null when the site shows no count"
},
"sample": {
"data": {
"page": 1,
"results": [
{
"url": "https://www.merx.com/public/supplier/interception/view-notice/22785013742?origin=0",
"title": "EB144-270536 - ITT - Lead Dust Abatement - Cape Scott",
"location": "Nova Scotia, CAN",
"internal_id": "22785013742",
"closing_date": "2026/10/01",
"organization": "Department of Public Works and Government Services (PSPC)",
"public_notice": true,
"published_date": "2026/09/14",
"reference_number": "22785013742"
}
],
"has_more": true,
"total_count": 113
},
"status": "success"
}
}About the Merx API
Search and Filter Solicitations
The search_open_solicitations and search_closed_solicitations endpoints accept keywords, category, location, and date-range parameters. Category codes and location codes come from get_filter_options, which returns roughly 50 MERX category entries and 14 location entries (all provinces, territories, and a pan-Canada option). Open solicitation searches also accept publish_date_from, publish_date_to, closing_date_from, and publish_date parameters for date-window filtering. Both search endpoints page at 25 results and return a has_more boolean, a total_count integer (or null when the site omits a count), and an array of summary objects that include title, organization, location, and the internal_id needed for detail lookups.
Solicitation Detail and Categories
get_solicitation_detail takes a single internal_id and returns the full public notice: title, reference_number, source_id, publication date, closing_date, description, agreement_types, location, categories, and internal_id. Dates are returned as the site displays them (e.g. YYYY/MM/DD hh:mm:ss AM EDT). The categories field carries an array of objects with code and name, covering UNSPSC, GSIN, or MERX classification codes depending on the notice. If you only need the category tree for a notice, get_solicitation_categories returns the same array with one fewer round-trip.
TSSA Buyer Page
list_tssa_solicitations targets the Technical Standards and Safety Authority buyer page on Merx specifically. It exposes four tabs via the status parameter: open, closed, bid_results, and awarded. Results include solicitation_number (the buyer's own number), title, reference_number (the Merx notice number), and additional row-level fields. The sort_by and sort_direction parameters control ordering; keywords filters within the selected tab. Pagination follows the same 25-rows-per-page pattern with has_more and total_count returned.
The Merx API is a managed, monitored endpoint for merx.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when merx.com 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 merx.com 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 published Canadian federal and provincial RFPs by polling
search_open_solicitationswith apublish_date_fromfilter - Build a tender alert system that flags solicitations by UNSPSC or GSIN category code using the
categoryparameter - Aggregate full notice text and trade agreement types from
get_solicitation_detailfor compliance or bid/no-bid analysis - Track TSSA procurement activity across open, awarded, and closed tabs using
list_tssa_solicitationswithstatusswitching - Populate a supplier dashboard with solicitation closing dates and locations from
search_open_solicitationsresult arrays - Cross-reference category codes from
get_filter_optionsagainst internal product catalogs to find relevant procurement opportunities - Archive closed solicitation metadata from
search_closed_solicitationsto analyse historical procurement patterns by region or category
| 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 Merx have an official developer API?+
What does `search_open_solicitations` return, and how should I handle closing dates?+
title, organization, location, internal_id, and related fields. The site's 'open' list can include notices whose closing date has already passed. Use the closing_date_from parameter — set to today's date in YYYY-MM-DD format — to exclude those and keep results to genuinely active tenders.Does the API cover buyer pages other than TSSA?+
list_tssa_solicitations. Other individual buyer or agency pages on Merx are not exposed as separate endpoints. You can fork this API on Parse and revise it to add a dedicated endpoint for another buyer page.Are bid documents or attachments accessible through the API?+
How does `total_count` behave when date filters are applied?+
total_count reflects the site's own count for the non-date filters (keywords, category, location). The publish_date_from, publish_date_to, and closing_date_from filters are applied after the site-side count is calculated, so the actual number of results returned across pages may be lower than total_count. When the site shows no count, the field returns null.