Canadian Registry Lookup — licence checks at the source avatar

Canadian Registry Lookup — licence checks at the source

Pricing

$5.00 / 1,000 completed registry checks

Go to Apify Store
Canadian Registry Lookup — licence checks at the source

Canadian Registry Lookup — licence checks at the source

Checks a person against a Canadian regulator's public register at the moment you ask, and returns the answer with the timestamp of the actual query and the source URL. No stored copy is served as an answer.

Pricing

$5.00 / 1,000 completed registry checks

Rating

0.0

(0)

Developer

Danilo Dzyuban

Danilo Dzyuban

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Share

Canadian Registry Lookup

Asks the regulator. Now. And tells you when it asked.

You give a name or a licence number. It queries the regulator's own public register at that moment and returns what the register says — with the UTC timestamp of the actual query and the URL of the source.

No stored copy is ever served as an answer. A verification that quietly returns last week's snapshot is worse than no verification: licences are suspended on Tuesdays too, and the person relying on your check is the one who pays for it.

{
"registry": "reco-on",
"verdict": "on_register",
"matches": [{
"name": "Allison LANE Guthrie",
"category": "Broker",
"licence_number": "4715694",
"status": "REGISTERED",
"expiry": "2026/11/06",
"firm": "SIMCOE HILLS REAL ESTATE INC.",
"address": "301 Laclie St. Unit: 2 Orillia, ON L3V 4N9 CANADA",
"phone": "705-325-6262"
}],
"match_count": 1,
"as_of": "2026-08-11T04:36:45+00:00",
"source": "https://registrantsearch.reco.on.ca/",
"source_live": true,
"regulator": "Real Estate Council of Ontario (RECO)",
"billable": true
}

Registers covered

SlugRegulatorWhoRequires
reco-onReal Estate Council of Ontariosalespersons and brokerscity
bccohp-bcBC College of Oral Health Professionalssix oral health professionsprofession
cpspei-peCollege of Physicians and Surgeons of Prince Edward Islandphysiciansname
cotbc-bcCollege of Occupational Therapists of British Columbiaoccupational therapistsname
acot-abAlberta College of Occupational Therapistsoccupational therapistsname
bccsw-bcBC College of Social Workerssocial workersname
lss-skLaw Society of Saskatchewanlawyersname
mvma-mbManitoba Veterinary Medical Associationveterinariansname
nbds-nbNew Brunswick Dental Societydentistsname
acsw-abAlberta College of Social Workerssocial workersname
cap-abCollege of Alberta Psychologistspsychologistsname
cdhm-mbCollege of Dental Hygienists of Manitobadental hygienistsname
cdhs-skCollege of Dental Hygienists of Saskatchewandental hygienistsname
clpnm-mbCollege of Licensed Practical Nurses of Manitobalicensed practical nursesname
clpnnl-nlCollege of Licensed Practical Nurses of Newfoundland and Labradorlicensed practical nursesname
clpns-nsCollege of Licensed Practical Nurses of Nova Scotialicensed practical nursesname
cotm-mbCollege of Occupational Therapists of Manitobaoccupational therapistsname
cphm-mbCollege of Pharmacists of Manitobapharmacistsname
cpsnb-nbCollege of Physicians and Surgeons of New Brunswickphysiciansname
cpsnl-nlCollege of Physicians and Surgeons of Newfoundland and Labradorphysiciansname
cpta-abCollege of Physiotherapists of Albertaphysiotherapistsname
cptbc-bcCollege of Physical Therapists of British Columbiaphysical therapistsname
cptnb-nbCollege of Physiotherapists of New Brunswickphysiotherapistsname
crnm-mbCollege of Registered Nurses of Manitobaregistered nursesname
crnnl-nlCollege of Registered Nurses of Newfoundland and Labradorregistered nursesname
crns-skCollege of Registered Nurses of Saskatchewanregistered nursesname
nlchp-nlNewfoundland and Labrador College of Health Professionalsallied health professionalsname

Every one of these was queried live while building this, and every one is re-checked by validate.py, which asks all of them in one pass and prints which answered. A register that is in the table but silent is worse than one that is missing — the buyer assumes it works. So the table is what survives that check, not what was once found.

RECO returned 83 registrants for Orillia in a single request; BCCOHP returned 267 denturists for British Columbia; the nursing colleges answer by name.

Last full validation: 13 August 2026 — 27 of 27 registers answered, in 90 seconds. Re-run it yourself with python3 validate.py.

Twenty-five of the twenty-seven run on Alinity, a platform used by 45+ Canadian health regulators — so the same adapter reaches far more registers than are listed here. Adding one is a row in a table, not new code. They are added on request rather than in bulk, because every register added is a permanent maintenance obligation.

Verdicts

verdictMeaningCharged
on_registerListed, and the regulator publishes standingyes
on_register_status_not_publishedListed, but this regulator shows standing only on the detail page — not the same as "in good standing"yes
not_foundThe register answered and has no such recordyes
ambiguousSeveral records match; narrow by licence number or cityyes
source_unavailableThe regulator did not answer, or a required field was missingno

You are charged per completed check, not per match. A confirmed "this person is not on the register" is usually the exact answer you came for. You are never charged when the regulator fails to answer — that is our problem, not your bill.

Why the required fields are not optional

RECO's register refuses an empty city — that is their rule, not ours, and a tool that quietly substituted "Toronto" would be inventing an answer. BCCOHP requires a profession because its six professions are separate registers behind one form.

If you do not know the city, you can supply a routing index (see below) and the lookup will find it locally, then still ask the regulator for the answer itself.

What this tool will not do

  • It will not read standing where the regulator does not publish it. BCCOHP shows discipline history and standing on a per-person detail page; the search results do not carry it. The verdict says so explicitly instead of implying good standing from mere presence in a list.
  • It will not defeat a captcha. The Law Society of BC deliberately puts a captcha in front of member email addresses. That is a considered decision by a regulator about its members' data, and it is respected here — which is also why LSBC is not in the table above.
  • It will not invent a field. Where the source leaves something blank, the answer is null. A fabricated licence number is worse than a missing one, because a missing one gets checked.

Usage

As an Apify Actor

{
"registry": "reco-on",
"people": [
{ "name": "Allison Lane Guthrie", "city": "Orillia" },
{ "licence_number": "4715694", "city": "Orillia" }
]
}

Set listRegistries: true to get the catalogue instead of running checks.

From the command line

python3 cli.py --registries
python3 cli.py --registry reco-on --name "Allison Lane Guthrie" --city Orillia
python3 cli.py --registry bccohp-bc --name "Ahmed Abu-Omar" --profession denturist
python3 cli.py --in people.jsonl --out checked.jsonl --registry reco-on

Optional: routing index

If you already hold a bulk export of a register, point the tool at it:

$export REGISTRY_INDEX_DIR=/path/to/exports # expects <slug>.jsonl

The index answers exactly one question — which city should I ask about — when the caller does not know it. Nothing from the index reaches the answer: not the status, not the licence number, not the address. Those come from the live query or not at all. Loading a 97,000-record export takes about three seconds.

Manners

One request at a time, answers cached for the run, and a gap between calls. Checking a hundred people from one city is one request to the regulator, not a hundred. These registers are published under professional regulation statutes for exactly this kind of check; hammering them would be both rude and self-defeating.

Two details learned the hard way, both on 13 August 2026:

The rate limit is per platform, not per host. Twenty-five of these registers run on the same Alinity installation base. Pacing requests per subdomain — as this tool first did — is not pacing at all: a sweep across twelve of them knocked over half, and registers that had answered a minute earlier started failing. The gap is now counted across the whole platform.

A refusal is not a dead register. A full pass over the catalogue ran fine for 21 requests and then failed on every remaining one — a cumulative limit, not six broken regulators. All six answered normally on retry. Requests now back off and retry rather than reporting the register as unavailable, because a client checking fifty people should not be told that half the country's colleges are offline.

Fragility, stated up front

These are scraped HTML forms, not documented APIs. Regulators redesign pages without notice, and when that happens the adapter raises an error naming the register rather than returning an empty result. Silence that looks like an answer is the one failure mode this tool refuses to have.

Observed during development: one regulator on the Alinity platform changed its category values between 2 and 10 August 2026 and began returning zero records for a previously working query. It is not in the table above for that reason.

License

MIT.