# Canada Federal Corporations - Corporations Canada Open Data (`jpopendata/canada-federal-corporations`) Actor

Canadian federal corporations from Corporations Canada's daily open data (OGL-Canada): corporation number, business number, names, type (CBCA, not-for-profit, co-op), status, anniversary date, last annual filing, city, province, postal FSA. Unofficial; not affiliated with Corporations Canada.

- **URL**: https://apify.com/jpopendata/canada-federal-corporations.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Canada Federal Corporations — Corporations Canada Open Data

Search and export **every federal corporation in Canada** — business corporations under the *Canada Business Corporations Act* (CBCA), not-for-profit corporations, cooperatives, boards of trade and Special Act corporations, **active and inactive/dissolved** — from Corporations Canada's official daily open data. No account, no API key, no browser.

Filter by **corporate name keywords, corporation number, business number (BN), corporation type, status, status detail (e.g. "dissolution pending"), province, city, postal code prefix and incorporation date**. Typical uses: KYB / vendor checks by corporation number or BN, lists of newly incorporated federal companies, not-for-profit lists by province, and compliance monitoring of corporations flagged for dissolution.

### Quick start — verified input

```json
{
  "maxItems": 20
}
```

An empty input `{}` does the same: the first 20 active business corporations, in about a second (2 requests). A typical search:

```json
{
  "keywords": ["holdings"],
  "provinces": ["ON"],
  "statuses": ["active"],
  "incorporatedFrom": "2026-01-01",
  "maxItems": 500
}
```

### What you get (one row per corporation)

| Field | Meaning |
|---|---|
| `corporationNumber` | Federal corporation number (digits, as in the open data, e.g. `8660115`) |
| `businessNumber` | 9-digit Canada Revenue Agency business number (BN), or null |
| `corporateName`, `corporateNameForm2` | The registered name and, if registered, its other form (usually the other official language) |
| `corporationType` | `cbca`, `nfp`, `coop`, `coop-associations`, `board-of-trade`, `special-act`, `cca-part-i`, `cca-part-ii`, `pension-fund-society`, `multiple-acts`, `other` |
| `governingLegislation` | The Act as written in the data, e.g. "Canada Not-for-profit Corporations Act" |
| `status`, `statusDetail` | `active` / `inactive` / `dissolved`, and the detail, e.g. "Active - Dissolution Pending (non-compliance)", "Inactive - Amalgamated", "Dissolved by the corporation" |
| `anniversaryDate` | Date of incorporation, amalgamation or continuance (Corporations Canada's "anniversary date") |
| `lastAnnualFilingYear`, `lastAnnualMeetingDate` | Year of the last annual return filed, date of the last annual meeting |
| `city`, `provinceCode`, `provinceName`, `country`, `postalCodeFSA` | Registered office reduced to city, province/territory, country and the first 3 characters of the postal code (forward sortation area) |
| `minDirectors`, `maxDirectors` | Minimum / maximum number of directors set by the articles (numbers only — no names) |
| `datasetSubset` | Which daily file the row came from (`active-business`, `active-other`, `inactive-business`, `inactive-other`) |
| `dataUpdatedAt` | When Corporations Canada last refreshed that file |
| `corporationsCanadaUrl` | Link to the corporation's page in Corporations Canada's federal corporation search (filings, directors) |
| `sourceFileUrl`, `matchedKeywords` | The open data file, and which of your keywords matched |
| `source`, `sourceUrl`, `license`, `retrievedAt` | Attribution on every row |

Example (real record, abridged):

```json
{
  "corporationNumber": "8660115",
  "businessNumber": "835752437",
  "corporateName": "MINDANGLER CAPITAL INC.",
  "corporateNameForm2": null,
  "corporationType": "cbca",
  "governingLegislation": "Canada Business Corporations Act",
  "status": "active",
  "statusDetail": null,
  "anniversaryDate": "2013-10-10",
  "lastAnnualFilingYear": 2025,
  "lastAnnualMeetingDate": "2023-10-10",
  "city": "Ottawa",
  "provinceCode": "ON",
  "provinceName": "Ontario",
  "country": "CA",
  "postalCodeFSA": "K2K",
  "minDirectors": 1,
  "maxDirectors": 12,
  "datasetSubset": "active-business",
  "dataUpdatedAt": "2026-10-12T11:05:33.000Z",
  "corporationsCanadaUrl": "https://ised-isde.canada.ca/cc/lgcy/fdrlCrpDtls.html?p=0&corpId=8660115",
  "license": "Contains information licensed under the Open Government Licence – Canada. ..."
}
```

A `RUN_SUMMARY` record in the key-value store lists the files read, rows scanned, matches, corporation numbers not found, and whether the run was complete.

### Input

All filters are optional and combine with **AND**; the values inside one filter are alternatives (**OR**).

| Input | Example | Notes |
|---|---|---|
| `keywords` | `["maple leaf", "société"]` | Words of either name form; accents and case ignored; each word must start a word of the name |
| `corporationNumbers` | `["8660115", "123456-7"]` | Dash and leading zeros optional; stops as soon as all are found; up to 50,000 |
| `businessNumbers` | `["835752437"]` | 9 digits; `835752437RC0001` also works |
| `corporationTypes` | `["nfp"]` | Codes above, or words: "business", "not-for-profit", "cooperative", "chamber of commerce" |
| `statuses` | `["active"]` | `active`, `inactive`, `dissolved`, "inactive or dissolved", "all" |
| `statusDetails` | `["dissolution pending"]` | Words of the status detail |
| `provinces` | `["QC", "Ontario"]` | Codes or English/French names (`NL` and the data's old `NF` both work) |
| `cities` | `["Montréal", "St. John's"]` | City of the registered office; accents, dots and St/Saint ignored |
| `postalCodePrefixes` | `["M5V", "H2"]` | 1–3 characters of the postal code |
| `incorporatedFrom` / `incorporatedTo` | `"2026-09-01"`, `"2026-09"`, `"30 days ago"` | On the anniversary date |
| `maxItems` | `20` | Stop after this many rows (up to 2,000,000) |

The data comes as four daily files (active / inactive × business corporations / others). The Actor reads only the files that can contain matches — e.g. `corporationTypes: ["nfp"]` with `statuses: ["active"]` reads one 9 MB file — and stops as soon as it has `maxItems` rows.

### Common input mistakes

| Instead of | Use | Why |
|---|---|---|
| `"provinces": ["Toronto"]` | `"cities": ["Toronto"]` | Toronto is a city; provinces are ON, QC, BC, ... |
| `"statuses": ["dissolution pending"]` | `"statusDetails": ["dissolution pending"]` | Statuses are only active / inactive / dissolved |
| `"corporationNumbers": ["835752437"]` | `"businessNumbers": ["835752437"]` | 9-digit numbers are CRA business numbers |
| `"keywords": ["Maple Leaf Foods Inc."]` | `"keywords": ["maple leaf foods"]` | Every word must appear in the registered name, and the legal ending may differ (Inc., Ltd., Limited, Ltée) |
| `"incorporatedFrom": "05/06/2026"` | `"incorporatedFrom": "2026-06-05"` | Day/month order is ambiguous; use YYYY-MM-DD |

### Empty results?

A run that finds nothing still **succeeds** with 0 rows (and a warning in the log). Typical causes:

- The corporation is **provincial or territorial** (e.g. an Ontario or Quebec corporation) or a **bank, insurer, trust or loan company** — these are not federal corporations under Corporations Canada and are not in this data.
- A keyword spelled differently from the registered name (try one distinctive word), or a city registered under a neighbourhood or old municipality name (try `postalCodePrefixes`).
- A status or type filter that excludes it (e.g. looking for an amalgamated company with `statuses: ["active"]`).
- Too many filters combined — all of them must match.

### How long does a run take?

- Searches that reach `maxItems` early (the Quick start, broad filters, a small `maxItems`, corporation numbers that exist) finish in about **1–2 seconds**.
- A search that has to read **all four files** — about 280 MB of CSV and 1.57 million corporations, e.g. a province filter with a large `maxItems`, a business-number lookup, or a corporation number that does not exist — took about **60 seconds** at the default 256 MB of memory (measured on Apify in October 2026: 613 Nunavut corporations).
- `corporationTypes` and `statuses` skip whole files: not-for-profits, cooperatives, boards of trade and Special Act corporations are in two small files (about 18 MB together), so those searches take a few seconds.
- Memory stays around 100 MB, so the default 256 MB is enough for any search, including a full export.

### Data notes

- Source: the "Federal Corporations" dataset of Innovation, Science and Economic Development Canada (Corporations Canada) on the Open Government Portal, refreshed daily (in October 2026 the files were replaced around 11:05 UTC each day). Every row carries `dataUpdatedAt`.
- **Not included, by design:** street addresses, full postal codes and any information about directors or officers. The open data has no director names; for a corporation's directors and filings, follow `corporationsCanadaUrl` to Corporations Canada's own search.
- **Not in the open data:** dissolution dates (the status detail tells how a corporation ended, not when), incorporation dates separate from amalgamation/continuance dates, and corporations under financial-institution or provincial legislation.
- `city` is cleaned: a few filers typed a street, PO box or rural route into the city field; those parts are removed (the city is null if nothing else is left). Old postal zone numbers ("MONTREAL 101") and province suffixes are trimmed.
- Corporate names are shown exactly as registered; some corporations are named after people.

### Legal and attribution

- **Unofficial.** This Actor is not affiliated with, endorsed by or connected to Corporations Canada, Innovation, Science and Economic Development Canada or the Government of Canada. It does not use their names, logos or symbols to suggest any official status.
- It reads only the public open data files linked from the Open Government Portal, at a polite pace (one request at a time, the portal's robots.txt crawl delay honoured). Corporations Canada's search pages and API are never accessed.
- The data is licensed under the [Open Government Licence – Canada](https://open.canada.ca/en/open-government-licence-canada). If you publish or redistribute it, include the attribution statement: **"Contains information licensed under the Open Government Licence – Canada."** (it is on every row in `license`).
- You are responsible for how you use the data: comply with Canada's Anti-Spam Legislation (CASL) for any electronic outreach, with PIPEDA / provincial privacy laws, and with the GDPR where it applies. Do not use the data in a way that suggests government endorsement.

# Actor input Schema

## `keywords` (type: `array`):

Optional. Words of the corporate name (English or French form; any case, accents ignored), e.g. "maple", "holdings", "société", "chamber of commerce". Every word of an entry must start a word of the name, so "maple" also finds "Maplewood" and "maple leaf" needs both words. A corporation matches if ANY entry matches.

## `corporationNumbers` (type: `array`):

Optional. Federal corporation numbers to look up, e.g. "8660115", "123456-7" or "0537403" (the dash and leading zeros may be left out). The run stops as soon as all of them are found; numbers not found are listed in the RUN_SUMMARY record. Up to 50,000 per run.

## `businessNumbers` (type: `array`):

Optional. 9-digit Canada Revenue Agency business numbers, e.g. "835752437" (a program account such as "835752437RC0001" also works; only the first 9 digits are compared). One BN can belong to several corporations, so a BN search reads every file it needs to the end.

## `corporationTypes` (type: `array`):

Optional. cbca (business corporation), nfp (not-for-profit), coop (cooperative), coop-associations, board-of-trade (boards of trade / chambers of commerce), special-act, cca-part-i, cca-part-ii (former Canada Corporations Act, inactive only), pension-fund-society, multiple-acts, other. Words such as "business", "not-for-profit", "cooperative", "chamber of commerce" or the full name of the Act also work. Empty = every type.

## `statuses` (type: `array`):

Optional. active, inactive (amalgamated or discontinued, i.e. continued under another jurisdiction), dissolved. "inactive or dissolved" and "all" also work. Empty = every status.

## `statusDetails` (type: `array`):

Optional. Words of the status detail, e.g. "dissolution pending" (active corporations Corporations Canada intends to dissolve for non-compliance), "intent to dissolve", "discontinuance pending", "amalgamated", "discontinued", "non-compliance", "dissolved by the corporation", "court order". A corporation matches if its status detail contains ANY entry.

## `provinces` (type: `array`):

Optional. Two-letter codes or names in English or French, e.g. "ON", "Quebec", "Colombie-Britannique", "NL" (the files write Newfoundland and Labrador as "NF"; both work). Empty = all of Canada.

## `cities` (type: `array`):

Optional. City or town of the registered office as written in the register, e.g. "Toronto", "Montréal", "Saint-Laurent", "St. John's" (case, accents, dots and St/Saint are ignored). Neighbourhoods are often registered under their own name (e.g. "Scarborough", "North York"). If a city gives few results, try postal code prefixes.

## `postalCodePrefixes` (type: `array`):

Optional. The start of the postal code: 1 to 3 characters such as "M" (Toronto), "M5V" or "H2" (forward sortation area). A full postal code is reduced to its first 3 characters; full postal codes are never output.

## `incorporatedFrom` (type: `string`):

Optional. Earliest date of incorporation, amalgamation or continuance (Corporations Canada's "anniversary date"): YYYY-MM-DD ("2026-09-01"), a month ("2026-09"), a year ("2025"), "yesterday" or "30 days ago". The files are refreshed daily, so new incorporations appear within about a day.

## `incorporatedTo` (type: `string`):

Optional. Latest anniversary date (inclusive), same forms as above; a month ("2026-09") means up to its last day.

## `maxItems` (type: `integer`):

Stop after this many corporations (1..2,000,000). A search that reaches this number early finishes in seconds; one that never reaches it reads every file it needs to the end (up to about 280 MB of CSV for all four files).

## `proxyConfiguration` (type: `object`):

Not needed: the open data files are served to Apify datacenter IPs directly. Leave off unless you have a reason to route the download through a proxy (one sticky session per run, no rotation).

## Actor input object example

```json
{
  "keywords": [],
  "corporationNumbers": [],
  "businessNumbers": [],
  "corporationTypes": [],
  "statuses": [],
  "statusDetails": [],
  "provinces": [],
  "cities": [],
  "postalCodePrefixes": [],
  "incorporatedFrom": "",
  "incorporatedTo": "",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (type: `string`):

Federal corporations with source attribution (source, sourceUrl, license, retrievedAt) on every item.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [],
    "corporationNumbers": [],
    "businessNumbers": [],
    "corporationTypes": [],
    "statuses": [],
    "statusDetails": [],
    "provinces": [],
    "cities": [],
    "postalCodePrefixes": [],
    "incorporatedFrom": "",
    "incorporatedTo": "",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/canada-federal-corporations").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [],
    "corporationNumbers": [],
    "businessNumbers": [],
    "corporationTypes": [],
    "statuses": [],
    "statusDetails": [],
    "provinces": [],
    "cities": [],
    "postalCodePrefixes": [],
    "incorporatedFrom": "",
    "incorporatedTo": "",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/canada-federal-corporations").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [],
  "corporationNumbers": [],
  "businessNumbers": [],
  "corporationTypes": [],
  "statuses": [],
  "statusDetails": [],
  "provinces": [],
  "cities": [],
  "postalCodePrefixes": [],
  "incorporatedFrom": "",
  "incorporatedTo": "",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jpopendata/canada-federal-corporations --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/canada-federal-corporations"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xIGW5CKXZeEE4cxbG/builds/XylLIh3aqzhSbKqlg/openapi.json
