RBQ Quebec Contractor Licence Scraper — Phone, Email, NEQ
Pricing
$5.40 / 1,000 per licence returneds
RBQ Quebec Contractor Licence Scraper — Phone, Email, NEQ
Every active Régie du bâtiment du Québec contractor licence, one row per licence: phone, email, address, NEQ, sub-categories, bonding company and bond amount. 54,000+ licences from the RBQ's daily open data. Filter by trade, region, city.
Pricing
$5.40 / 1,000 per licence returneds
Rating
0.0
(0)
Developer
Scrapers Delight
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
Every active contractor licence issued by the Régie du bâtiment du Québec (RBQ), as one clean row per licence: business name, trade names, phone, email, address, NEQ, legal status, every licence sub-category with its official label, the bonding company and bond amount, issue date and restriction status. 54,225 licences in the register on 2026-09-22; 49,764 publish a phone and 47,195 a usable email.
Québec is the province where English-language contractor directories are thinnest. In every other province a contractor-marketing agency can start from HomeStars or a Yellow Pages scrape; in Québec most trades are not there, but every one of them must hold an RBQ licence, and the RBQ publishes the whole register with the contact details the contractor filed. This Actor turns that register into a lead list.
Who uses it: building-product distributors and manufacturer reps selling into Québec trades, construction insurers and surety/bonding companies (bonding company, bond amount, licence restrictions), contractor-marketing agencies, and anyone verifying that a Québec contractor is licensed for the work it is quoting.
Why one row per licence matters
The RBQ file is not one row per contractor. It has one row for every combination of licence × sub-category × trade name — 927,338 rows for 54,225 licences, about 17 rows per contractor (one excavation firm is 140 rows). A scraper that emits file rows bills you 17 times for the same phone number.
This Actor folds each licence into one row, with its sub-categories and trade names as arrays, and it checks the fold on every licence rather than assuming it:
- the number of distinct sub-categories equals the count the RBQ itself declares for that licence
(
Nombre de sous-catégorie autorisées) — 54,225 of 54,225 on 2026-09-22; - the rows equal sub-categories × trade names, with no duplicate pair;
- every other column is identical across the licence's rows;
- no licence number ever reappears later in the file (a split licence would be two billed rows).
A licence that breaks any of these is not delivered and is listed in the run summary; more than 1% breaking them fails the run loudly instead of shipping a quietly wrong list.
Quick start
Plumbers (sub-category 15.5) in the Montréal region, 50 licences:
{ "subcategories": ["15.5"], "regions": ["06"], "maxItems": 50 }
New contractor businesses licensed since 1 January 2026 anywhere in Québec, with a phone:
{ "issuedOnOrAfter": "2026-01-01", "requirePhone": true, "maxItems": 2000 }
Roofers and siding contractors (sub-category 7) in Laval and Longueuil, with the named respondents:
{ "subcategories": ["7"], "municipalities": ["Laval", "Longueuil"], "includeRegisterDetail": true, "maxItems": 500 }
Example output
A real row from a live run on 2026-09-23 (build 0.1.4), unedited:
{"licenceNumber": "1163-2767-87","businessName": "B.R. électrique inc.","otherNames": ["B.R. électrique Inc.", "BR Énergie", "BR Électrique"],"phone": "+14502630919","phoneFormatted": "450-263-0919","email": "info@brelectrique.ca","emails": ["info@brelectrique.ca"],"emailRaw": "info@brelectrique.ca","address": "1122 RUE DU SUD BUREAU 500 COWANSVILLE QC CANADA J2K 2Y3","municipality": "Cowansville","postalCode": "J2K 2Y3","province": "QC","country": "CA","regionCode": "05","region": "Estrie","neq": "1173814741","legalStatus": "Personne morale","licenceType": "Entrepreneur","licenceStatus": "Active","issuingBody": "CMEQ","categories": ["general", "specialised"],"isGeneralContractor": true,"isSpecialtyContractor": true,"subcategoryCodes": ["1.3", "16"],"subcategories": [{ "code": "1.3", "label": "Bâtiments de tout genre", "category": "general" },{ "code": "16", "label": "Électricité", "category": "specialised" }],"managementQualifications": [{ "code": "ADM", "label": "Administration d'entreprise de construction" },{ "code": "GPC", "label": "Gestion de projets et de chantiers de construction" },{ "code": "SEC", "label": "Gestion de la sécurité sur les chantiers de construction" }],"subcategoryCountDeclared": 5,"issueDate": "1984-03-13","annualPaymentDueDate": "2027-04-17","hasRestriction": false,"restrictionStartDate": null,"restrictionEndDate": null,"bondingCompany": "L'Unique assurances générales","bondAmountCad": 40000,"identityWithheldBySource": false,"sourceRowCount": 15,"sourceSnapshotDate": "2026-09-18","source": "Régie du bâtiment du Québec — Liste des licences actives (Données Québec, CC-BY 4.0)"}
Fields
| Field | What it is |
|---|---|
licenceNumber | RBQ licence number, NNNN-NNNN-NN. The row key. |
businessName | Name of the licence holder as registered. |
otherNames | Every trade name (autre nom) registered on the licence. |
phone / phoneFormatted | The registered phone, as +1XXXXXXXXXX and XXX-XXX-XXXX. Reformatted only. |
email / emails / emailRaw | The registered email. emailRaw is the cell exactly as published; email is set only when the whole cell is one valid address (or emails when it is a ;-separated list). |
address, municipality, postalCode, province, country | The published address verbatim; postal code, province and country are the tokens already in it, never looked up. |
regionCode, region | Québec administrative region (01–17). |
neq | Québec enterprise number (Registraire des entreprises) — the join key to the business register. |
legalStatus | Personne morale, Personne physique, Corporation or Autorite publique. |
licenceType | Entrepreneur or Constructeur-proprietaire (owner-builder). |
licenceStatus | Always Active — the file is the active register. |
issuingBody | Regie (RBQ), CMEQ (master electricians' corporation) or CMMTQ (master pipe-mechanics' corporation), which issue licences for their trades on the RBQ's behalf. |
categories, isGeneralContractor, isSpecialtyContractor | Whether the licence holds general (1.x) and/or specialty (2–17) sub-categories. |
subcategoryCodes, subcategories[] | Every trade sub-category, with the RBQ's own French label. |
managementQualifications[] | The management qualifications held through the licence's respondent (ADM, GPC, SEC, and the owner-builder variants). |
subcategoryCountDeclared | The RBQ's own count, kept so you can check the fold yourself. |
issueDate, annualPaymentDueDate | Date the licence was first issued; next annual fee date. |
hasRestriction, restrictionStartDate, restrictionEndDate | Licence restriction (45 licences on 2026-09-22), e.g. a ban on public contracts. |
bondingCompany, bondAmountCad | Who bonds the contractor, and the bond amount (CAD 20,000 or 40,000 — the only two values in the file). |
identityWithheldBySource | true when the RBQ publishes no name, address, phone or email for the licence. |
sourceRowCount, sourceSnapshotDate, source | How many file rows folded into this one; the date of the RBQ extract. |
With includeRegisterDetail: true each row also gets, from the RBQ's own register:
| Field | What it is | Seen on (40 licences, live run 2026-09-23) |
|---|---|---|
respondents[] | firstName, lastName, isDirector, qualifications of each person answering for the licence | 40 / 40 |
directors[] | Names of the respondents the register flags as directors | 29 / 40 |
phoneExtension | Extension for the registered phone | 13 / 40 |
guaranteePlanAccreditation | New-home guarantee-plan accreditation number | 4 / 40 |
workLocations[] | Additional registered work locations | 1 / 40 |
restrictionText | The restriction in the RBQ's words (e.g. "cette licence comporte une restriction qui interdit de soumissionner pour un contrat public…") | 12 / 12 restricted licences probed |
registerDetailStatus | ok, not-found or unreachable |
Field fill — measured on the whole register
Counted over all 54,225 licences in the 2026-09-22 file (live platform run, full read, CRC-verified):
| Field | Licences | % of register | % of named licences (49,770) |
|---|---|---|---|
businessName | 49,770 | 91.8% | 100% |
phone | 49,764 | 91.8% | 99.99% |
email (valid) | 47,195 | 87.0% | 94.8% |
address | 49,764 | 91.8% | 99.99% |
postalCode | 49,757 | 91.8% | |
neq | 53,312 | 98.3% | |
bondingCompany / bondAmountCad | 53,189 | 98.1% | |
regionCode | 53,121 | 98.0% | |
municipality | 54,203 | 99.96% | |
issueDate | 54,225 | 100% |
The whole gap in phone, email and address is one thing: the RBQ withholds the identity of individual licence
holders (Personne physique). All 4,455 of them have no name, no address, no phone and no email in the file.
Those licences are skipped and not charged by default; set includeWithheldIdentities: true if you want
them anyway (for example to count sole proprietors per trade) — they are then billed like any other row.
33 email cells are free text rather than an address ("x@y.com/ M. Marco Perron", "a@b@.com"). For those,
email is null and the cell is kept verbatim in emailRaw — the Actor never guesses which part was meant.
Every value was checked for placeholders, not just for being present: all phones are 10-digit North-American numbers, all NEQs are 10 digits, all bond amounts are 20,000 or 40,000, and no value repeats as a filler.
Inputs
| Input | Default | What it does |
|---|---|---|
subcategories | all | RBQ sub-category codes; dotted-prefix match ("15" = 15.1–15.10, "1.1" = 1.1.1 and 1.1.2, never 1.10). |
regions | all | Administrative region codes 01–17. |
municipalities | all | Municipality names; accents, case and hyphens ignored. |
contractorCategories | both | general and/or specialised. |
legalStatuses | all | Legal form. |
licenceTypes | both | Entrepreneur and/or Constructeur-proprietaire. |
keyword | — | Business name or trade name contains. |
issuedOnOrAfter | — | YYYY-MM-DD: licences first issued on or after this date — new businesses. |
requirePhone / requireEmail | off | Only licences with a phone / a valid email. |
includeWithheldIdentities | off | Also deliver (and bill) licences the RBQ publishes without identity. |
includeRegisterDetail | off | Add named respondents, directors, restriction text and more from the RBQ register (one extra request per licence). |
onlyNewSinceLastRun + stateKey | off | Monitoring mode: only licences that were not in the register at your previous run. The first run saves a baseline. |
maxItems | 50 | Stop after this many licences. |
proxyConfiguration | no proxy (direct) | See Reliability below. |
Common sub-category codes: 1.1.1 / 1.1.2 new homes under a guarantee plan · 1.2 small buildings · 1.3 buildings of any kind · 1.4 roads and piping · 2.5 excavation · 3.2 small concrete work · 4.2 masonry, marble, ceramic · 5.2 metal work · 6.2 wood and plastic · 7 insulation, waterproofing, roofing, cladding · 8 doors and windows · 9 finishing · 10 solid-fuel heating · 13.x fire protection · 14.x elevators · 15.1–15.10 heating, gas, plumbing (15.5), ventilation, refrigeration · 16 electrical · 17.x instrumentation and security systems. Every row carries the official label, so you never need this list to read the output.
Pricing
$0.0054 per licence delivered — $5.40 per 1,000. No start fee, and you are not charged for licences
your filters remove or for withheld-identity licences (unless you opt in). The default run (maxItems 50) costs
at most $0.27. The entire register of named contractors (about 49,770) is about $269.
The other RBQ actor on the Store charges $0.006 per record plus a start fee ($0.005 per GB of memory, $0.02 at its 4 GB default) plus the platform usage of the run, which its pricing passes to you.
How it compares
| This Actor | truenorthdata/canada-contractor-licenses | |
|---|---|---|
| Source | RBQ open data (same file) | RBQ open data |
| Price | $0.0054 / licence, nothing else | $0.006 / record + start fee + platform usage |
| Phone, email, NEQ, address, trade names | ✓ | ✓ |
| Sub-category codes | ✓ with official labels | ✓ |
| Bond amount | ✓ | ✓ |
| Bonding company | ✓ | — |
| Legal status, licence type, issuing body (CMEQ / CMMTQ) | ✓ | — |
| Issue date, annual fee date, restriction dates | ✓ | "restrictions" named in its README, not in its schema |
| Named respondents and directors, restriction text | ✓ (optional) | — |
| Filters | sub-category, region, municipality, category, legal status, licence type, name, issue date, phone/email required | keyword, class, region |
| New-since-last-run monitoring | ✓ | ✓ |
| Withheld-identity licences not billed by default | ✓ | — |
| Download proven whole (byte count + CRC-32 + 50,000-licence floor) | ✓ | not stated |
| Ontario HCRA builders | — (Ontario is a separate Actor) | ✓ |
Compared from that Actor's own README and output schema (build 0.2.8), 2026-09-22.
Reliability
The register is a single 11.4 MB zip that the RBQ republishes on Données Québec every day. Large bodies are known to be cut short on datacenter proxy exits while still reporting HTTP 200, which would silently turn the register into a smaller one. So this Actor:
- reads the zip as a sequence of byte-range pieces (256 KB, 512 KB, 1 MB, then 2 MB), checks every piece
against its
Content-Range, and re-fetches a short piece on a fresh proxy session; - inflates and parses as the bytes arrive, so a 50-licence run stops after well under 1 MB and never pays for the other 10 MB;
- on a full read, proves the file whole three ways — total bytes, the zip's CRC-32 and inflated size, and a floor of 50,000 licences — and fails the run rather than ship a short register;
- uses
If-Rangewith the file's ETag, so if the RBQ replaces the file mid-run the Actor stops cleanly instead of splicing two days together.
The default transport is direct (no proxy): the file is open data on a public government portal, and every piece is length-checked regardless of route. Measured 2026-09-22/23: direct whole-file reads from Apify's servers all complete and CRC-verified; through Apify RESIDENTIAL 8 / 8 complete and CRC-verified (3 on the platform, 5 from outside), 0 short pieces. Pick RESIDENTIAL in the proxy field if a direct read ever fails for you; if the proxy cannot be started, the run falls back to direct instead of failing. One residential piece once stalled without ever timing out, so every piece now has its own hard deadline (18 s for 256 KB up to 39 s for 2 MB) and is aborted and re-fetched on a new exit when it passes it. Seven 50-licence runs took 4 to 23 seconds; reading the whole register takes 100 to 145 seconds at the default 1 GB of memory.
Data limits
- Active licences only. The open-data file is the active register; suspended, cancelled or expired licences are not in it.
- No websites. The RBQ does not publish one.
- Individuals are anonymous. The RBQ withholds the identity of every individual licence holder (4,455); see above.
- Extract date. Each row carries
sourceSnapshotDate, the date the RBQ produced the extract inside the zip (2026-09-18 in the file published 2026-09-22). The RBQ's live register may be a few days ahead of it. - Bond claims, orders and licence events are exposed by the register API but were empty on all 172 licences probed, including 12 under restriction, so they are not shipped as a column of zeros.
- The register detail adds one request per licence (about 0.4 s, 8 in parallel); use it on filtered runs.
Source
- Data: Liste des licences actives de la Régie du bâtiment du Québec, published by the Régie du bâtiment du Québec on Données Québec under Creative Commons Attribution 4.0 (CC-BY 4.0), refreshed daily. A full read is 8 ranged requests; a 50-licence run usually 1–2.
- Register detail comes from the RBQ's public licence register (
pes.rbq.gouv.qc.ca), the same data its search page shows.
Run summary
Every run writes RUN_SUMMARY to its key-value store: bytes read vs the file's size, pieces retried, CRC and
size checks, licences seen and matched, withheld identities skipped, any licence that failed an invariant, and
per-field fill for both the rows delivered and every licence the run read.