DEV Community

Cover image for Automating Federal Corporate Due Diligence with Corporations Canada
Crawler Bros
Crawler Bros

Posted on Fully Autonomous

Automating Federal Corporate Due Diligence with Corporations Canada

Enterprise Know Your Customer (KYC) processes and corporate compliance audits require verifying legal entity status directly against official registries. When dealing with federally incorporated entities in Canada, the source of truth is Corporations Canada, maintained by Innovation, Science and Economic Development Canada (ISED).

Manual lookups on the web interface do not scale when a compliance pipeline needs to cross-reference hundreds of counterparties. Building a custom scraper directly against the registry search interface requires maintaining scrapers against government table layouts, parsing complex legal histories, and normalizing fields across different federal acts.

The corporations-canada-scraper automates this pipeline by querying Corporations Canada directly and emitting structured JSON records for corporate filings.

Four Ways to Target Federal Corporate Filings

The scraper operates in four distinct lookup modes via the mode parameter:

  1. search: Free-text search by legal entity name via corpName, with optional filters.
  2. byCorporationNumber: Exact lookup using the federal corporation number via corpNumbers (e.g., 426160-7).
  3. byBusinessNumber: Exact lookup using the 9-digit Canada Revenue Agency (CRA) Business Number via businessNumbers (e.g., 847871746).
  4. byCorporationId: Direct record fetch using the registry's internal identifier via corporationIds.

When running broad entity searches, you can narrow results using corpProvince (e.g., ON, QC, BC), corpStatus (1 for Active), and corpAct (such as 6 for the Canada Business Corporations Act).

Setting includeFullDetails to true instructs the scraper to navigate from search results to individual entity profile pages to extract granular operational data, including directors, registered offices, and historical filings.

Structured Registry Outputs

A full entity detail extraction yields structured public filing fields. Key data points in each output record include:

  • Entity Identifiers: corpId, corpName, corpNumber, and businessNumber (which includes program-account suffixes like RC0001 when published).
  • Status & Governance: status, statusDate, governingLegislation, and governingLegislationDate.
  • Location: registeredOfficeAddress, along with parsed registeredOfficeProvince and registeredOfficePostalCode.
  • Governance & Control: directors[] (containing individual name and address entries) alongside directorsMin and directorsMax.
  • Significant Control Disclosures: iscIndividuals[] (reporting name, address, typeOfInterest, and startDate) or iscExemptionReason for entities exempt from disclosing individuals with significant control (such as publicly traded corporations).
  • Filing History: annualFilings[] (historical tracking of annual return compliance), corporateNameHistory[], and filingHistory[] (certificates of incorporation, amendments, revivals, and restated articles).

Empty fields are omitted from output records rather than filled with null assumptions, reflecting exactly what the registry has on file.

Running an Exact Lookup Pipeline in Python

You can trigger a batch run using the Apify Python client to verify corporate numbers against the registry.

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "mode": "byCorporationNumber",
    "corpNumbers": ["426160-7"],
    "includeFullDetails": True,
    "maxItems": 10,
}

# Run the actor and wait for completion
run = client.actor("crawlerbros/corporations-canada-scraper").call(run_input=run_input)

# Fetch results from the run's default dataset
dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items

for record in dataset_items:
    print(f"Legal Name: {record.get('corpName')}")
    print(f"Status: {record.get('status')}")
    print(f"BN: {record.get('businessNumber')}")

    directors = record.get("directors", [])
    print(f"Active Directors ({len(directors)}):")
    for director in directors:
        print(f" - {director.get('name')}: {director.get('address')}")
Enter fullscreen mode Exit fullscreen mode

Running an Entity Search with Filters

For entity discovery or onboarding verification where the corporation number is unknown, run a name query filtered by jurisdiction and status:

run_input = {
    "mode": "search",
    "corpName": "Shopify",
    "corpProvince": "ON",
    "corpStatus": "1",
    "includeFullDetails": True,
    "maxItems": 5,
}

run = client.actor("crawlerbros/corporations-canada-scraper").call(run_input=run_input)
results = client.dataset(run["defaultDatasetId"]).list_items().items

for item in results:
    print(f"Found: {item.get('corpName')} ({item.get('corpNumber')})")
    print(f"Office: {item.get('registeredOfficeAddress')}")
Enter fullscreen mode Exit fullscreen mode

Step-by-Step Actor Configuration

  1. Select the Mode: Determine whether you are querying known IDs (byCorporationNumber, byBusinessNumber, byCorporationId) or performing discovery (search).
  2. Define Search Scope: If using search, populate corpName and optionally apply corpProvince or corpStatus to exclude dissolved or out-of-province entities.
  3. Configure Item Limits and Depth: Set maxItems to control the total records retrieved, and set includeFullDetails to true if you require director names, registered addresses, and ISC records.
  4. Execute and Ingest: Run the scraper via API or scheduler and stream items directly from the default dataset into your internal database.

Pricing and Event Charges

This scraper uses a PAY_PER_EVENT pricing model alongside standard platform usage.

The flat event charges published on the Apify Store are:

  • Actor Start (apify-actor-start): $0.005 per GB of memory allocated to the run, charged once when the run begins.
  • Result (apify-default-dataset-item): Charged per emitted record in the default dataset based on your Apify discount tier:
    • FREE: $0.005 per result
    • BRONZE: $0.00433 per result
    • SILVER: $0.00367 per result
    • GOLD: $0.003 per result
    • PLATINUM: $0.003 per result
    • DIAMOND: $0.003 per result

Platform usage incurred during the run is billed separately at your Apify plan's underlying rates.

Registry Limitations

This scraper only extracts entities registered under federal acts; it will not return records for companies incorporated strictly under provincial legislation (such as standard Ontario or British Columbia provincial corporations) unless they hold a federal charter.


Runs in this article used Corporations Canada Registry Scraper. Its README is the reference for input fields and output structure; this post is only one path through them.

Prices quoted above are this Actor's published pay-per-event rates on the Apify Store, read from the Apify platform API on 2026-09-26. Check the Actor page for the current rates.

Top comments (0)