RBQ Quebec Contractor Licence Scraper — Phone, Email, NEQ avatar

RBQ Quebec Contractor Licence Scraper — Phone, Email, NEQ

Pricing

$5.40 / 1,000 per licence returneds

Go to Apify Store
RBQ Quebec Contractor Licence Scraper — Phone, Email, NEQ

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

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

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

FieldWhat it is
licenceNumberRBQ licence number, NNNN-NNNN-NN. The row key.
businessNameName of the licence holder as registered.
otherNamesEvery trade name (autre nom) registered on the licence.
phone / phoneFormattedThe registered phone, as +1XXXXXXXXXX and XXX-XXX-XXXX. Reformatted only.
email / emails / emailRawThe 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, countryThe published address verbatim; postal code, province and country are the tokens already in it, never looked up.
regionCode, regionQuébec administrative region (01–17).
neqQuébec enterprise number (Registraire des entreprises) — the join key to the business register.
legalStatusPersonne morale, Personne physique, Corporation or Autorite publique.
licenceTypeEntrepreneur or Constructeur-proprietaire (owner-builder).
licenceStatusAlways Active — the file is the active register.
issuingBodyRegie (RBQ), CMEQ (master electricians' corporation) or CMMTQ (master pipe-mechanics' corporation), which issue licences for their trades on the RBQ's behalf.
categories, isGeneralContractor, isSpecialtyContractorWhether 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).
subcategoryCountDeclaredThe RBQ's own count, kept so you can check the fold yourself.
issueDate, annualPaymentDueDateDate the licence was first issued; next annual fee date.
hasRestriction, restrictionStartDate, restrictionEndDateLicence restriction (45 licences on 2026-09-22), e.g. a ban on public contracts.
bondingCompany, bondAmountCadWho bonds the contractor, and the bond amount (CAD 20,000 or 40,000 — the only two values in the file).
identityWithheldBySourcetrue when the RBQ publishes no name, address, phone or email for the licence.
sourceRowCount, sourceSnapshotDate, sourceHow 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:

FieldWhat it isSeen on (40 licences, live run 2026-09-23)
respondents[]firstName, lastName, isDirector, qualifications of each person answering for the licence40 / 40
directors[]Names of the respondents the register flags as directors29 / 40
phoneExtensionExtension for the registered phone13 / 40
guaranteePlanAccreditationNew-home guarantee-plan accreditation number4 / 40
workLocations[]Additional registered work locations1 / 40
restrictionTextThe 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
registerDetailStatusok, 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):

FieldLicences% of register% of named licences (49,770)
businessName49,77091.8%100%
phone49,76491.8%99.99%
email (valid)47,19587.0%94.8%
address49,76491.8%99.99%
postalCode49,75791.8%
neq53,31298.3%
bondingCompany / bondAmountCad53,18998.1%
regionCode53,12198.0%
municipality54,20399.96%
issueDate54,225100%

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

InputDefaultWhat it does
subcategoriesallRBQ sub-category codes; dotted-prefix match ("15" = 15.1–15.10, "1.1" = 1.1.1 and 1.1.2, never 1.10).
regionsallAdministrative region codes 01–17.
municipalitiesallMunicipality names; accents, case and hyphens ignored.
contractorCategoriesbothgeneral and/or specialised.
legalStatusesallLegal form.
licenceTypesbothEntrepreneur 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 / requireEmailoffOnly licences with a phone / a valid email.
includeWithheldIdentitiesoffAlso deliver (and bill) licences the RBQ publishes without identity.
includeRegisterDetailoffAdd named respondents, directors, restriction text and more from the RBQ register (one extra request per licence).
onlyNewSinceLastRun + stateKeyoffMonitoring mode: only licences that were not in the register at your previous run. The first run saves a baseline.
maxItems50Stop after this many licences.
proxyConfigurationno 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 Actortruenorthdata/canada-contractor-licenses
SourceRBQ 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)—
Filterssub-category, region, municipality, category, legal status, licence type, name, issue date, phone/email requiredkeyword, 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:

  1. 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;
  2. 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;
  3. 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;
  4. uses If-Range with 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.