# Filemark developer docs

Read the client and engagement records in your firm's Filemark workspace and run Filemark's Canadian T2 corporate tax computations from your own systems, over REST or the Model Context Protocol (MCP). The API is read-only: nothing writes to a workspace.

- REST base URL: `https://api.filemark.ca/api/v1`
- MCP server: `https://api.filemark.ca/mcp`
- Contract: the [OpenAPI schema](https://api.filemark.ca/api/v1/openapi.json), also browsable as the [interactive REST reference](https://api.filemark.ca/api/v1/docs)
- Format: JSON over HTTPS, OAuth 2.0 bearer tokens
- Markdown: any page plus `.md`, the whole guide at [/llms-full.txt](/llms-full.txt), and an index at [/llms.txt](/llms.txt)

## Start here

- [Quickstart](/quickstart): mint a token, run a computation, list your clients.
- [Definitions](/definitions): clients, entities, engagements, saved data, targets and cells.
- [Authentication](/authentication) for a server integration, or [delegated access](/delegated-access) to connect an AI assistant or other MCP host as a signed-in user.

## Reference

- [REST reference](/rest): every operation with a request example, parameters, and response fields.
- [Computation reference](/computations): every target's input and output cells.
- [Run computations](/run-computations) and [Connect over MCP](/mcp).
- [Conventions](/conventions), [rate limits](/rate-limits), and [error codes](/errors).

# Quickstart

You need a Filemark workspace where you are an owner, or an admin with the Manage developer API permission; only those roles can create API credentials.

## 1. Create API credentials

[Create an API client](/authentication#create-api-credentials) with the `tax:compute` and `clients:read` scopes, and copy the secret when it is shown.

```bash
export FILEMARK_CLIENT_ID="<client-id>"
export FILEMARK_CLIENT_SECRET="<client-secret>"
```

## 2. Get an access token

```bash
curl --request POST \
  --url https://api.filemark.ca/oauth2/token \
  --user "$FILEMARK_CLIENT_ID:$FILEMARK_CLIENT_SECRET" \
  --header "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "grant_type=client_credentials" \
  --data-urlencode "resource=https://api.filemark.ca" \
  --data-urlencode "scope=https://api.filemark.ca/tax:compute https://api.filemark.ca/clients:read"
```

```python
import os
import requests

FILEMARK_CLIENT_ID = os.environ["FILEMARK_CLIENT_ID"]
FILEMARK_CLIENT_SECRET = os.environ["FILEMARK_CLIENT_SECRET"]

response = requests.post(
    "https://api.filemark.ca/oauth2/token",
    auth=(FILEMARK_CLIENT_ID, FILEMARK_CLIENT_SECRET),
    data={
        "grant_type": "client_credentials",
        "resource": "https://api.filemark.ca",
        "scope": "https://api.filemark.ca/tax:compute https://api.filemark.ca/clients:read",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_CLIENT_ID = process.env.FILEMARK_CLIENT_ID;
const FILEMARK_CLIENT_SECRET = process.env.FILEMARK_CLIENT_SECRET;

const response = await fetch("https://api.filemark.ca/oauth2/token", {
  method: "POST",
  headers: {
    Authorization: `Basic ${Buffer.from(`${FILEMARK_CLIENT_ID}:${FILEMARK_CLIENT_SECRET}`).toString("base64")}`,
    "Content-Type": "application/x-www-form-urlencoded",
  },
  body: new URLSearchParams({
    grant_type: "client_credentials",
    resource: "https://api.filemark.ca",
    scope: "https://api.filemark.ca/tax:compute https://api.filemark.ca/clients:read",
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

```json
{
  "access_token": "<access-token>",
  "token_type": "Bearer",
  "expires_in": 900,
  "scope": "https://api.filemark.ca/tax:compute https://api.filemark.ca/clients:read"
}
```

```bash
export FILEMARK_ACCESS_TOKEN="<access-token>"
```

Mint a new token when `expires_in` runs out.

## 3. Read the computation catalog

```bash
curl https://api.filemark.ca/api/v1/computations \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/computations",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations", {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

```json
{
  "data": {
    "batchTargets": ["schedule1", "schedule3", "schedule8", "schedule24", "part_i_tax"],
    "batchDependencies": {
      "schedule8": ["schedule23", "schedule24", "schedule6"]
    },
    "rolloverTargets": ["section-22", "section-86"]
  }
}
```

The real response lists every published target; this excerpt is abbreviated. `batchDependencies` names the targets that run automatically with the one you request.

## 4. Run a computation

This runs entirely from the inputs you send, so it works before your workspace holds a single client.

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/batch \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "schedule24"
    ],
    "inputs": {
      "taxYear": 2025,
      "schedule24": {
        "filingTriggers": [
          "incorporation"
        ],
        "operationCode": "01",
        "predecessors": [],
        "subsidiaries": []
      }
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/batch",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "schedule24",
        ],
        "inputs": {
            "taxYear": 2025,
            "schedule24": {
                "filingTriggers": [
                    "incorporation",
                ],
                "operationCode": "01",
                "predecessors": [],
                "subsidiaries": [],
            },
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/batch", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "schedule24"
    ],
    "inputs": {
      "taxYear": 2025,
      "schedule24": {
        "filingTriggers": [
          "incorporation"
        ],
        "operationCode": "01",
        "predecessors": [],
        "subsidiaries": []
      }
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

```json
{
  "data": {
    "results": {
      "schedule24": {
        "ready": false,
        "provisional": false,
        "warnings": []
      }
    }
  },
  "computeVersion": "<string>",
  "engineSchemaVersion": "<string>",
  "ratesVersion": "<string>",
  "timestamp": "2026-07-14T12:00:00Z"
}
```

Each result also carries the target's own output cells, listed under [schedule24](/computations/schedule24). To try a computation before wiring up credentials, sign in at [app.filemark.ca](https://app.filemark.ca) and open **API sandbox**: it runs the same targets from your browser session and copies out the equivalent curl command.

## 5. List your clients

```bash
curl --get https://api.filemark.ca/api/v1/clients \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=5"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/clients",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "5",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL("https://api.filemark.ca/api/v1/clients");
url.searchParams.set("limit", "5");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "Acme Holdings Inc.",
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 5,
    "offset": 0,
    "total": 1,
    "hasMore": false
  }
}
```

Entities and tax years hang off the client; see [Definitions](/definitions#clients-entities-and-tax-years).

## Next steps

- [Computation reference](/computations) lists every target's cells and an example request.
- [Run computations](/run-computations) adds vendor handoff, strict contracts, and rollovers.
- [Scopes](/scopes) and [rate limits](/rate-limits) govern what a token may do and how often.
- [Error codes](/errors) explains the per-field `error.details` a refused computation returns.
- [Delegated access](/delegated-access) connects an AI assistant or other MCP host as a signed-in user.

# Definitions

## Organization

Your API client belongs to one organization: the firm's Filemark workspace. The access token identifies the organization, so no request carries an organization ID, and a resource in another organization returns `404`. A [delegated](/delegated-access) token is narrowed further, to the clients its user can see.

## Clients, entities, and tax years

Records form a tree, and each level is addressed by a stable UUID:

- Client: the firm's end customer.
- Entity: a legal entity belonging to a client, with its registered name, corporation number, business number, and incorporation details when known.
- Tax year: one taxation-year engagement for an entity, with its fiscal period and workflow status.

The [REST reference](/rest) lists every field. `GET /api/v1/clients/{client_id}/entities` and `GET /api/v1/entities/{entity_id}/tax-years` walk the tree; `GET /api/v1/search` and `GET /api/v1/engagements` find engagements directly.

## Engagements

"Engagement" and "tax year" name the same record: the engagement ID that `/api/v1/engagements/...` operations take is the tax year's UUID.

An engagement carries a workflow status, a source (prepared in Filemark or imported as a prior-year reference), an optional service type, a lock flag, and return lifecycle metadata: revision number, filing time, and links to the engagement it amends or that amends it.

An amended return is a new engagement revision linked to its parent. [Get engagement context](/rest#get-engagement-context) resolves the revision you asked for and the current one; [Get engagement history](/rest#get-engagement-history) lists the chain, up to 100 revisions, without edit diffs or the people involved.

## Saved data

Saved data is what Filemark has stored for an engagement. These reads return it unchanged:

- Trial balance: active accounts with their balances, before any adjusting entries or tax adjustments, each with its GIFI code. GIFI is the CRA's standard chart of accounts for financial statements filed with a return.
- Account and adjustments: the saved classification, the accepted GIFI mapping, posted book adjusting entries, and the workpaper tax-adjustment sources linked to the account.
- Documents and workpapers: registry metadata only. File contents and workpaper payloads are never returned.
- Review summary: persisted review indicators such as sign-offs and review marks, not a filing-readiness verdict.

A form catalog sits beside the saved data: the production forms whose declared tax-year window covers the engagement's year. It is support metadata, not a determination that the client must file a form.

## Computation targets and cells

A target is one computation the engine publishes: a schedule, or a named result other schedules consume. A cell is one addressable input or output of a target, named by a dotted path such as `schedule24.operationCode`, with a published JSON type. A dependency is a target another target needs; batch dependencies run automatically and their results come back alongside.

Batch targets are computed together from one request. Rollover, reorganization, and screening targets each run alone by path.

Nothing a computation reads comes from a workspace unless you call the saved-state scenario operation. [Run computations](/run-computations) covers both, the default input boundary, the strict `payloadContract` option, and handoff, which returns computed cells as the receiving tax software's import identifiers.

# Authentication

Server integrations hold a client ID and secret and exchange them for short-lived access tokens with the OAuth 2.0 `client_credentials` grant. Interactive AI hosts connect as a signed-in user through [delegated access](/delegated-access) instead.

## Create API credentials

1. Sign in at [app.filemark.ca](https://app.filemark.ca) and open **Developer**. Creating credentials needs the owner role, or the admin role with the Manage developer API permission; other members see the list read-only.
2. Create an API client and select only the scopes your integration needs.
3. Copy the client secret when it is shown. It is never shown again.

Store the secret in a server-side secret manager. Never put it in browser code, browser-based tools like the interactive REST reference, source control, logs, URLs, or support messages.

If a secret is exposed, rotate it from the same page: rotation issues a replacement secret and keeps the client ID and scopes. Revoking a client is immediate and permanent; its tokens are refused on their next request.

## Get an access token

- `resource` is required. Send `https://api.filemark.ca` for a server integration; the trailing-slash form works too. MCP hosts may send the MCP server URL `https://api.filemark.ca/mcp` instead, but a token minted for that resource works only on the MCP server.
- `scope` is required and lists the [scopes](/scopes) your integration needs, written in full. Request `mcp` only if you will connect over MCP.
- Authenticate with HTTP Basic or with the `client_id` and `client_secret` form fields, never both, and send each parameter once.

```bash
curl --request POST \
  --url https://api.filemark.ca/oauth2/token \
  --user "$FILEMARK_CLIENT_ID:$FILEMARK_CLIENT_SECRET" \
  --header "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "grant_type=client_credentials" \
  --data-urlencode "resource=https://api.filemark.ca" \
  --data-urlencode "scope=https://api.filemark.ca/mcp https://api.filemark.ca/tax:compute"
```

```python
import os
import requests

FILEMARK_CLIENT_ID = os.environ["FILEMARK_CLIENT_ID"]
FILEMARK_CLIENT_SECRET = os.environ["FILEMARK_CLIENT_SECRET"]

response = requests.post(
    "https://api.filemark.ca/oauth2/token",
    auth=(FILEMARK_CLIENT_ID, FILEMARK_CLIENT_SECRET),
    data={
        "grant_type": "client_credentials",
        "resource": "https://api.filemark.ca",
        "scope": "https://api.filemark.ca/mcp https://api.filemark.ca/tax:compute",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_CLIENT_ID = process.env.FILEMARK_CLIENT_ID;
const FILEMARK_CLIENT_SECRET = process.env.FILEMARK_CLIENT_SECRET;

const response = await fetch("https://api.filemark.ca/oauth2/token", {
  method: "POST",
  headers: {
    Authorization: `Basic ${Buffer.from(`${FILEMARK_CLIENT_ID}:${FILEMARK_CLIENT_SECRET}`).toString("base64")}`,
    "Content-Type": "application/x-www-form-urlencoded",
  },
  body: new URLSearchParams({
    grant_type: "client_credentials",
    resource: "https://api.filemark.ca",
    scope: "https://api.filemark.ca/mcp https://api.filemark.ca/tax:compute",
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

```json
{
  "access_token": "<access-token>",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "https://api.filemark.ca/mcp https://api.filemark.ca/tax:compute"
}
```

Tokens last up to 60 minutes.

## Token endpoint errors

A failed exchange returns the OAuth 2.0 error shape, `{"error": "...", "error_description": "..."}`:

| `error` | Status | Cause |
| --- | --- | --- |
| `invalid_request` | `400` | The form is malformed, a parameter is missing, duplicated, or unsupported, both authentication methods were sent, or the `Content-Type` is not `application/x-www-form-urlencoded`. |
| `invalid_request` | `413` | The form body exceeds 256 KiB. |
| `invalid_client` | `401` | The client ID and secret were rejected, or the client is unknown or not active. |
| `invalid_scope` | `400` | A requested scope is not a [published scope](/scopes) or is not one this client was granted. |
| `unsupported_grant_type` | `400` | `grant_type` is not one the endpoint supports. |
| `invalid_target` | `400` | `resource` is not `https://api.filemark.ca`, its trailing-slash form, or `https://api.filemark.ca/mcp`. |
| `temporarily_unavailable` | `429` or `503` | The token-minting budget is exhausted (`429`) or the token service is unavailable (`503`). Wait the `Retry-After` seconds and retry. |

# Scopes

A token must hold the scope an operation requires, or the request fails with `403`. Every MCP connection also needs the `mcp` scope; no domain scope grants transport access on its own.

Scope names are shortened below. Send them in full, prefixed with `https://api.filemark.ca/` and separated by spaces:

```text
scope=https://api.filemark.ca/clients:read https://api.filemark.ca/mcp
```

| Short scope | Grants |
| --- | --- |
| `mcp` | MCP transport access. Request this for any MCP client |
| `tax:compute` | List computation targets, read their cell contracts, and run deterministic computations |
| `clients:read` | List or get clients |
| `entities:read` | List or get legal entities |
| `tax-years:read` | List or get tax years |
| `engagements:read` | Search, list, and get engagement metadata, amendment context/history, and the year-supported form catalog |
| `tax-data:read` | Read saved trial-balance and account data; combine with `tax:compute` for saved-state scenarios |
| `documents:read` | List document metadata |
| `workpapers:read` | List workpaper metadata |
| `review:read` | Get review indicators |

# Delegated access (AI hosts)

Interactive AI assistants and other MCP hosts can connect to Filemark as a signed-in user rather than as a server integration.

## Connection flow

Point the host at `https://api.filemark.ca/mcp`. A host that supports interactive OAuth needs no further configuration: its first call returns `401` with a pointer to the [protected-resource metadata](https://api.filemark.ca/.well-known/oauth-protected-resource), which names the [authorization server](https://api.filemark.ca/.well-known/oauth-authorization-server), and the host takes it from there:

1. It registers itself (RFC 7591 dynamic client registration at `/oauth2/register`) as a public client: no client secret, PKCE required. The scopes it declares at registration are its ceiling; scopes Filemark does not publish are dropped rather than refused, and a later authorization asking for more is narrowed to them.
2. It sends the user to `/oauth2/authorize` with a PKCE `S256` challenge and an RFC 8707 `resource`, either `https://api.filemark.ca/mcp` or `https://api.filemark.ca`. Both are required. The user signs in, reviews the application name and requested scopes, and approves or denies. A scope Filemark does not publish is refused here with `invalid_scope`.
3. On approval the host exchanges its code at `/oauth2/token` for an access token and a refresh token. The same `resource` must be sent on every token and refresh request for the grant; a different one is `invalid_target`. It becomes the token's audience, so a token minted for `/mcp` works only on the MCP server.

## Scopes and visibility

Every MCP connection needs the `mcp` scope plus the domain scopes for the tools it will call; see [scopes](/scopes). The consent page lists each requested scope with a plain-language description before the user approves, and the host gets exactly the scopes approved.

Any member of the workspace can approve a request for themselves; no firm-level permission is needed. A delegated token sees exactly the clients its user can see in Filemark, and follows any later change to that user's client assignments or role on its next request.

## Token lifetimes

Consent must be completed within 10 minutes of the redirect, and the authorization code must be redeemed within 60 seconds and only once. Access tokens last up to 60 minutes. Refresh tokens rotate on every use and are single-use: presenting one twice revokes the whole chain. A chain lasts 90 days from the original approval and rotation does not extend it, so a long-lived connection re-authorizes at least quarterly.

## Revocation

To see or withdraw access, sign in at [app.filemark.ca](https://app.filemark.ca), open **Developer**, and revoke the application under delegated access. Each user sees and revokes their own delegations; workspace owners, and admins who hold Manage developer API, see and can revoke every member's. Revoking takes effect on the application's next request: the token it holds stops working, its refresh token stops working, and any authorization it had not yet redeemed is cancelled, so reconnecting requires a fresh approval. A user who leaves the workspace is treated the same way.

# Run computations

`POST /api/v1/computations/batch` and `POST /api/v1/computations/rollovers/{target}` run only from the inputs you submit; neither takes an engagement ID. To compute from an engagement's stored inputs instead, see [Compute over saved data](#compute-over-saved-data). `GET /api/v1/computations` returns the available targets: the batch targets, their dependency graph, and the rollover targets. The [computation reference](/computations) lists each target's input and output cells, their accepted values, which cells are always required, and an example request.

## Run a batch computation

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/batch \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "schedule3"
    ],
    "inputs": {
      "taxYear": 2025,
      "workpapers": [
        {
          "id": "wp-dividends-target",
          "templateId": "dividends",
          "linkedAccountIds": [],
          "adjustmentStatus": "ok",
          "customName": "Cedar Ridge 2025 capital dividend",
          "rows": [
            {
              "payerName": "Cedar Ridge Manufacturing Inc.",
              "amountCY": 80000,
              "isConnected": "no",
              "dividendType": "Capital Dividend",
              "direction": "paid",
              "dividendSource": "canadian_taxable",
              "denial112": false,
              "foreignCurrency": "CAD"
            }
          ],
          "sectionRows": {},
          "assumption": "Caller-supplied facts only; no CDA balance, election, recipient/share, payment, or filing verification"
        }
      ]
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/batch",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "schedule3",
        ],
        "inputs": {
            "taxYear": 2025,
            "workpapers": [
                {
                    "id": "wp-dividends-target",
                    "templateId": "dividends",
                    "linkedAccountIds": [],
                    "adjustmentStatus": "ok",
                    "customName": "Cedar Ridge 2025 capital dividend",
                    "rows": [
                        {
                            "payerName": "Cedar Ridge Manufacturing Inc.",
                            "amountCY": 80000,
                            "isConnected": "no",
                            "dividendType": "Capital Dividend",
                            "direction": "paid",
                            "dividendSource": "canadian_taxable",
                            "denial112": False,
                            "foreignCurrency": "CAD",
                        },
                    ],
                    "sectionRows": {},
                    "assumption": "Caller-supplied facts only; no CDA balance, election, recipient/share, payment, or filing verification",
                },
            ],
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/batch", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "schedule3"
    ],
    "inputs": {
      "taxYear": 2025,
      "workpapers": [
        {
          "id": "wp-dividends-target",
          "templateId": "dividends",
          "linkedAccountIds": [],
          "adjustmentStatus": "ok",
          "customName": "Cedar Ridge 2025 capital dividend",
          "rows": [
            {
              "payerName": "Cedar Ridge Manufacturing Inc.",
              "amountCY": 80000,
              "isConnected": "no",
              "dividendType": "Capital Dividend",
              "direction": "paid",
              "dividendSource": "canadian_taxable",
              "denial112": false,
              "foreignCurrency": "CAD"
            }
          ],
          "sectionRows": {},
          "assumption": "Caller-supplied facts only; no CDA balance, election, recipient/share, payment, or filing verification"
        }
      ]
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

`compute` names 1 to 100 targets; their dependencies run automatically. `inputs` holds the engine inputs, and a four-digit `inputs.taxYear` is required. The optional `payloadContract` and `handoff` selectors reject `null`; omit the property instead. Every field is listed under [Compute tax schedules](/rest#compute-tax-schedules).

Responses share one envelope: results keyed by target under `data.results` (a rollover returns `data.result`), plus `computeVersion`, `engineSchemaVersion`, `ratesVersion`, and `timestamp`. Each result carries `ready` and `provisional` booleans, a `warnings` array, and the target's output cells. Two responses with the same `computeVersion` and `ratesVersion` were computed on identical engine code and identical rate tables.

Every `inputs` member is checked against the published input cells of the requested targets and of the dependencies that run automatically: the member must be one of those cells and must use its published JSON type. A misspelled or unpublished member fails the call with a `400` whose `error.details` names each failing cell; see [validation details](/errors#validation-details). A published cell set to `null` counts as unanswered, and the engine reports what that leaves unresolved.

This default boundary checks cell names and JSON types, not values, with one exception: a few rollover facts must be answered, because the engine will not choose a statutory branch for you. For per-value validation, [pin a strict contract](#pin-a-strict-contract). Structural bounds apply either way: at most 500 elements in any array (`413`), at most 12 levels of nesting (`400`), and no numeric value above 1e15 in absolute terms, `NaN`, or `Infinity` (`400`). A target name that is not in the catalog is a `400` that names it.

## Get handoff cells

Add the `handoff` selector to also return the computed schedule cells as the receiving tax software's import identifiers and encoded values:

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/batch \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "schedule8"
    ],
    "inputs": {
      "taxYear": 2025,
      "fiscalStart": "2025-01-01",
      "fiscalEnd": "2025-12-31",
      "isCCPC": true,
      "daysInYear": 365,
      "pyUCCPools": [
        {
          "ccaClass": "8",
          "closingUCC": 0
        }
      ],
      "assetData": [],
      "dispositions": [],
      "schedule8AdjustmentCoverage": {
        "schemaVersion": 2,
        "reviewed": true,
        "reviewedAt": "2026-07-19T12:00:00Z",
        "column205AdjustmentsApplicable": false,
        "column221AssistanceAfterDispositionApplicable": false,
        "column222RepaymentsAfterDispositionApplicable": false,
        "rentalPropertySeparateClassApplicable": false,
        "purposeBuiltRentalPropertyRulesApplicable": false,
        "rentalIncomeCcaLimitApplicable": false,
        "leasingPropertyRulesApplicable": false,
        "specifiedLeasingPropertyRulesApplicable": false,
        "affiliatedPersonStopLossApplicable": false,
        "reg1101_5qElectionApplies": false,
        "multipleClass10_1VehiclesPresent": false,
        "otherPrescribedSeparateClassRuleApplies": false,
        "specialDispositionRolloverOrDeferralApplies": false,
        "class14_1TransitionalOpeningBalanceApplicable": false,
        "specifiedEnergyPropertyRulesApplicable": false,
        "class1NrbAdditionalAllowanceEligible": false,
        "class1UnmodelledAdditionalAllowanceApplies": false,
        "class12ParagraphHalfYearExclusionApplies": false,
        "diepEligibilityAndAllocationConfirmed": false,
        "capitalGainRoutingComplete": false
      },
      "t2Jacket": {
        "filingStatus": {
          "firstYearAfterIncorporation": false,
          "firstYearAfterAmalgamation": false,
          "subsidiaryWindupS88": false
        }
      }
    },
    "handoff": {
      "vendor": "taxprep"
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/batch",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "schedule8",
        ],
        "inputs": {
            "taxYear": 2025,
            "fiscalStart": "2025-01-01",
            "fiscalEnd": "2025-12-31",
            "isCCPC": True,
            "daysInYear": 365,
            "pyUCCPools": [
                {
                    "ccaClass": "8",
                    "closingUCC": 0,
                },
            ],
            "assetData": [],
            "dispositions": [],
            "schedule8AdjustmentCoverage": {
                "schemaVersion": 2,
                "reviewed": True,
                "reviewedAt": "2026-07-19T12:00:00Z",
                "column205AdjustmentsApplicable": False,
                "column221AssistanceAfterDispositionApplicable": False,
                "column222RepaymentsAfterDispositionApplicable": False,
                "rentalPropertySeparateClassApplicable": False,
                "purposeBuiltRentalPropertyRulesApplicable": False,
                "rentalIncomeCcaLimitApplicable": False,
                "leasingPropertyRulesApplicable": False,
                "specifiedLeasingPropertyRulesApplicable": False,
                "affiliatedPersonStopLossApplicable": False,
                "reg1101_5qElectionApplies": False,
                "multipleClass10_1VehiclesPresent": False,
                "otherPrescribedSeparateClassRuleApplies": False,
                "specialDispositionRolloverOrDeferralApplies": False,
                "class14_1TransitionalOpeningBalanceApplicable": False,
                "specifiedEnergyPropertyRulesApplicable": False,
                "class1NrbAdditionalAllowanceEligible": False,
                "class1UnmodelledAdditionalAllowanceApplies": False,
                "class12ParagraphHalfYearExclusionApplies": False,
                "diepEligibilityAndAllocationConfirmed": False,
                "capitalGainRoutingComplete": False,
            },
            "t2Jacket": {
                "filingStatus": {
                    "firstYearAfterIncorporation": False,
                    "firstYearAfterAmalgamation": False,
                    "subsidiaryWindupS88": False,
                },
            },
        },
        "handoff": {
            "vendor": "taxprep",
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/batch", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "schedule8"
    ],
    "inputs": {
      "taxYear": 2025,
      "fiscalStart": "2025-01-01",
      "fiscalEnd": "2025-12-31",
      "isCCPC": true,
      "daysInYear": 365,
      "pyUCCPools": [
        {
          "ccaClass": "8",
          "closingUCC": 0
        }
      ],
      "assetData": [],
      "dispositions": [],
      "schedule8AdjustmentCoverage": {
        "schemaVersion": 2,
        "reviewed": true,
        "reviewedAt": "2026-07-19T12:00:00Z",
        "column205AdjustmentsApplicable": false,
        "column221AssistanceAfterDispositionApplicable": false,
        "column222RepaymentsAfterDispositionApplicable": false,
        "rentalPropertySeparateClassApplicable": false,
        "purposeBuiltRentalPropertyRulesApplicable": false,
        "rentalIncomeCcaLimitApplicable": false,
        "leasingPropertyRulesApplicable": false,
        "specifiedLeasingPropertyRulesApplicable": false,
        "affiliatedPersonStopLossApplicable": false,
        "reg1101_5qElectionApplies": false,
        "multipleClass10_1VehiclesPresent": false,
        "otherPrescribedSeparateClassRuleApplies": false,
        "specialDispositionRolloverOrDeferralApplies": false,
        "class14_1TransitionalOpeningBalanceApplicable": false,
        "specifiedEnergyPropertyRulesApplicable": false,
        "class1NrbAdditionalAllowanceEligible": false,
        "class1UnmodelledAdditionalAllowanceApplies": false,
        "class12ParagraphHalfYearExclusionApplies": false,
        "diepEligibilityAndAllocationConfirmed": false,
        "capitalGainRoutingComplete": false
      },
      "t2Jacket": {
        "filingStatus": {
          "firstYearAfterIncorporation": false,
          "firstYearAfterAmalgamation": false,
          "subsidiaryWindupS88": false
        }
      }
    },
    "handoff": {
      "vendor": "taxprep"
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

`data.handoff` appears beside `data.results`. Its values match the handoff files the Filemark app exports from the same computation, byte for byte:

```json
{
  "vendor": "taxprep",
  "mappingTableVersion": "0.4.8",
  "vendorEdition": "T2 Taxprep 2024 v.2",
  "cells": [
    { "cellId": "CCACat.FD08C[1].FED.Ttw08cA5", "value": "50000" },
    { "cellId": "CCACat.FD08C[1].FED.Ttw08cA1", "value": "8" }
  ],
  "blocked": null,
  "warnings": []
}
```

| Field | Meaning |
| --- | --- |
| `vendor` | `"taxcycle"`, `"taxprep"`, or `"ifirm"`, echoing the selector. |
| `mappingTableVersion` | Version of the Filemark mapping table the identifiers came from. |
| `vendorEdition` | The build the identifiers were mapped against. Confirm your install matches it before importing. |
| `cells` | For `taxprep`: `.csv` cell IDs. For `ifirm`: `cells/setdata` cell paths. |
| `forms` | For `taxcycle`, replacing `cells`: import field codes grouped per form (`[{form, cells}]`). A `tableClear` entry reproduces the product's repeating-table clear row. |
| `warnings` | One `{code, message}` per computed cell the selected product cannot carry. Branch on `code`; `message` is prose. |
| `blocked` | `null` when the projection was built. Otherwise an object whose `reason` says why Filemark would refuse the equivalent handoff export or could not build the selected product's payload; it may also carry a `code`, an `action`, and the `issues` behind the refusal. `data.results` is unaffected either way. |

The T2 jacket and Schedule 141 are not batch targets, so their cells never appear here. `handoff` and `payloadContract` can be sent together.

## Get the import file

Send the same request with `format` added to the `handoff` selector to get the receiving tax software's import file instead of the cell list:

```json
"handoff": {
  "vendor": "taxprep",
  "format": "file"
}
```

In the response, `data.handoff.files` replaces `cells`/`forms`; `warnings`, `blocked`, `vendorEdition`, and `mappingTableVersion` are unchanged. Every entry's `content` is base64, the `.csv` included.

```json
{
  "vendor": "taxprep",
  "mappingTableVersion": "0.4.8",
  "vendorEdition": "T2 Taxprep 2024 v.2",
  "files": [
    {
      "filename": "filemark_taxprep.csv",
      "mediaType": "text/csv; charset=utf-8",
      "encoding": "base64",
      "content": "W0ZpbGVtYXJrfDB8MF0NCg…"
    }
  ],
  "blocked": null,
  "warnings": []
}
```

| `format` | Result |
| --- | --- |
| omitted, or `"json"` | `cells` or `forms`, exactly as above. |
| `"file"` | `files`. For `taxprep` and `ifirm`: one `.csv`. For `taxcycle`: one `.xlsx` per form. |

## Pin a strict contract

Add `payloadContract` to pin one target to a strict contract. Its value is the `boundaryProfileId` and `payloadSchemaVersion` pair published for that target in the [computation reference](/computations).

- It names exactly one direct target. A value with no published contract is a `400`.
- Inputs are validated against that version's input schema before execution; a mismatch is a `400` and nothing runs. `error.details` names each failing cell and the constraint it violated; see [validation details](/errors#validation-details).
- The computed result is validated against that version's output schema afterwards. If the contract admitted your request but cannot express the answer, the call fails with a `422` whose `error.code` is `result_not_representable` and no result is returned: choose a version that covers this branch, or supply inputs that keep the computation on a declared one. Engine faults on the same stage remain `500`.
- A pinned version is a floor, not a freeze. Within one `payloadSchemaVersion` the output can gain keys, an output enum can gain members, bounds can widen, and new optional inputs can appear; removing an output key, changing an output type, narrowing an enum, or tightening an input requires a new version. Tolerate unknown output keys and enum members.

## Run a rollover

One rollover, reorganization, or screening target from the catalog:

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/rollovers/section-86 \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "inputs": {
      "old_shares": {
        "acb": 100000,
        "puc": 80000,
        "fmv": 150000,
        "isCapitalProperty": true,
        "allSharesOfClassDisposed": true,
        "outlaysAndExpenses": 0,
        "priorS53_2_g1DeductionsAmount": null,
        "priorS53_2_g1Deductions": false
      },
      "new_shares": [
        {
          "label": "Cedar Ridge Holdings preferred",
          "fmv": 90000,
          "legalStatedCapital": 60000
        },
        {
          "label": "Cedar Ridge Holdings common",
          "fmv": 50000,
          "legalStatedCapital": 50000
        }
      ],
      "boot": {
        "fmv": 10000
      },
      "party": {
        "s85ElectionFiled": false,
        "inCourseOfReorganizationOfCapital": true,
        "isRelatedReorganization": false,
        "giftToRelatedPerson": 0
      }
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/rollovers/section-86",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "inputs": {
            "old_shares": {
                "acb": 100000,
                "puc": 80000,
                "fmv": 150000,
                "isCapitalProperty": True,
                "allSharesOfClassDisposed": True,
                "outlaysAndExpenses": 0,
                "priorS53_2_g1DeductionsAmount": None,
                "priorS53_2_g1Deductions": False,
            },
            "new_shares": [
                {
                    "label": "Cedar Ridge Holdings preferred",
                    "fmv": 90000,
                    "legalStatedCapital": 60000,
                },
                {
                    "label": "Cedar Ridge Holdings common",
                    "fmv": 50000,
                    "legalStatedCapital": 50000,
                },
            ],
            "boot": {
                "fmv": 10000,
            },
            "party": {
                "s85ElectionFiled": False,
                "inCourseOfReorganizationOfCapital": True,
                "isRelatedReorganization": False,
                "giftToRelatedPerson": 0,
            },
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/rollovers/section-86", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "inputs": {
      "old_shares": {
        "acb": 100000,
        "puc": 80000,
        "fmv": 150000,
        "isCapitalProperty": true,
        "allSharesOfClassDisposed": true,
        "outlaysAndExpenses": 0,
        "priorS53_2_g1DeductionsAmount": null,
        "priorS53_2_g1Deductions": false
      },
      "new_shares": [
        {
          "label": "Cedar Ridge Holdings preferred",
          "fmv": 90000,
          "legalStatedCapital": 60000
        },
        {
          "label": "Cedar Ridge Holdings common",
          "fmv": 50000,
          "legalStatedCapital": 50000
        }
      ],
      "boot": {
        "fmv": 10000
      },
      "party": {
        "s85ElectionFiled": false,
        "inCourseOfReorganizationOfCapital": true,
        "isRelatedReorganization": false,
        "giftToRelatedPerson": 0
      }
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

## Compute over saved data

`POST /api/v1/engagements/{engagement_id}/computations/scenario` computes from an engagement's saved inputs and replaces only the cells you name. It needs both `tax-data:read` and `tax:compute`.

```bash
curl --request POST https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/computations/scenario \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "part_i_tax"
    ],
    "inputs": {}
  }'
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/computations/scenario",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "part_i_tax",
        ],
        "inputs": {},
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/computations/scenario`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "part_i_tax"
    ],
    "inputs": {}
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

Send `inputs: {}` to compute the engagement as saved. A member of `inputs` replaces its whole top-level cell rather than merging into it, and `null` means unanswered. The cells that identify the taxation period (`taxYear`, `taxYearId`, `currentYear`, `daysInYear`, `fiscalStart`, `fiscalEnd`, `priorTaxYearStart`, `priorTaxYearEnd`, `pinnedFormRevisions`) and the server-authored filing-lineage cells cannot be replaced; naming one is a `400` that lists each refused cell in `error.details`. To compute a different period, send a full payload to the batch endpoint instead.

`data.appliedOverrides` lists the cells this request replaced and `data.sourceStateSha256` identifies the saved state they were applied to, so two responses with the same hash are comparable. Nothing is persisted and saved inputs are never returned. Field-level detail is under [Compute an engagement's saved state with cells replaced](/rest#compute-an-engagement-s-saved-state-with-cells-replaced).

# Connect over MCP

The Filemark MCP server speaks Streamable HTTP and holds no session state between requests:

```text
https://api.filemark.ca/mcp
```

Use the exact path. A trailing slash (`https://api.filemark.ca/mcp/`) is rejected with `404`.

## Add Filemark to your host

Most hosts read a JSON configuration file. The common shape is:

```json
{
  "mcpServers": {
    "filemark": {
      "url": "https://api.filemark.ca/mcp"
    }
  }
}
```

Some hosts use a `servers` key and an explicit transport type:

```json
{
  "servers": {
    "filemark": {
      "type": "http",
      "url": "https://api.filemark.ca/mcp"
    }
  }
}
```

Check your host's own MCP documentation for the file it reads and the key it expects.

A host that supports interactive OAuth needs nothing else: on the first call it discovers the authorization server, registers itself, and sends you to Filemark to sign in and approve. See [delegated access](/delegated-access). A server-side client instead uses the [MCP OAuth client credentials extension](https://modelcontextprotocol.io/extensions/auth/oauth-client-credentials) with the values below and mints its own tokens with the [client-credentials flow](/authentication); there is no long-lived API key.

| Setting | Value |
| --- | --- |
| Transport | Streamable HTTP |
| OAuth grant | `client_credentials` for server integrations; authorization code + PKCE for interactive hosts |
| Token endpoint | `https://api.filemark.ca/oauth2/token` |
| Resource | `https://api.filemark.ca/mcp`, which MCP hosts send automatically, or `https://api.filemark.ca`. A token minted for `/mcp` works on the MCP server only; one minted for the origin works on both surfaces. |
| Scopes | `mcp` plus the domain scopes for the tools you call; see [scopes](/scopes) |
| Discovery | [MCP protected-resource metadata](https://api.filemark.ca/.well-known/oauth-protected-resource/mcp) (the document a `401` names; its `resource` is `https://api.filemark.ca/mcp`), the [REST protected-resource metadata](https://api.filemark.ca/.well-known/oauth-protected-resource), [authorization-server metadata](https://api.filemark.ca/.well-known/oauth-authorization-server), and [signing keys](https://api.filemark.ca/.well-known/jwks.json) |

Each request carries its own bearer token, there is no session identifier to keep, and responses are JSON rather than an event stream. Every `/mcp` response is `Cache-Control: no-store`. Non-browser clients send no `Origin` header and are accepted; a browser-based client must be served from `https://app.filemark.ca` or `https://filemark.ca`, or it is refused with `403` before authentication runs.

## When a call returns 401 or 403

An unauthenticated or expired request returns `401` with a challenge that names the protected-resource metadata:

```text
WWW-Authenticate: Bearer error="invalid_token", error_description="Authentication required",
  resource_metadata="https://api.filemark.ca/.well-known/oauth-protected-resource/mcp"
```

An interactive host refreshes its token, and re-authorizes if the refresh fails with `invalid_grant`, which means the delegation was revoked or the user left the workspace. A server integration mints a new token and retries; a `401` that persists with a fresh token means the token was minted for a different `resource`.

`403` means the client is disabled or the token lacks a scope the tool requires; the `WWW-Authenticate` header names the missing scopes. Re-authorizing does not fix it: the grant has to be widened.

## Published tools

Domain scopes are shortened below; see [scopes](/scopes).

| Tool | Domain scope | REST operation |
| --- | --- | --- |
| `list_computations` | `tax:compute` | [List computation targets](/rest#list-computation-targets) |
| `get_computation_target_contract` | `tax:compute` | [Get a computation target contract](/rest#get-a-computation-target-contract) |
| `compute_tax_schedules` | `tax:compute` | [Compute tax schedules](/rest#compute-tax-schedules) |
| `compute_engagement_scenario` | `tax-data:read` + `tax:compute` | [Compute an engagement's saved state with cells replaced](/rest#compute-an-engagement-s-saved-state-with-cells-replaced) |
| `compute_rollover` | `tax:compute` | [Compute a rollover or reorganization](/rest#compute-a-rollover-or-reorganization) |
| `list_clients` | `clients:read` | [List clients](/rest#list-clients) |
| `get_client` | `clients:read` | [Get a client](/rest#get-a-client) |
| `list_entities` | `entities:read` | [List a client's entities](/rest#list-a-client-s-entities) |
| `get_entity` | `entities:read` | [Get an entity](/rest#get-an-entity) |
| `list_tax_years` | `tax-years:read` | [List an entity's tax years](/rest#list-an-entity-s-tax-years) |
| `get_tax_year` | `tax-years:read` | [Get a tax year](/rest#get-a-tax-year) |
| `search_records` | `engagements:read` | [Search engagement records](/rest#search-engagement-records) |
| `list_engagements` | `engagements:read` | [List engagements](/rest#list-engagements) |
| `get_engagement` | `engagements:read` | [Get an engagement](/rest#get-an-engagement) |
| `get_engagement_context` | `engagements:read` | [Get engagement context](/rest#get-engagement-context) |
| `get_engagement_history` | `engagements:read` | [Get engagement history](/rest#get-engagement-history) |
| `get_engagement_form_catalog` | `engagements:read` | [Get an engagement form catalog](/rest#get-an-engagement-form-catalog) |
| `get_trial_balance` | `tax-data:read` | [Get a saved trial balance](/rest#get-a-saved-trial-balance) |
| `get_account` | `tax-data:read` | [Get a saved engagement account](/rest#get-a-saved-engagement-account) |
| `list_account_adjustments` | `tax-data:read` | [List saved account adjustments](/rest#list-saved-account-adjustments) |
| `list_engagement_documents` | `documents:read` | [List engagement documents](/rest#list-engagement-documents) |
| `list_engagement_workpapers` | `workpapers:read` | [List engagement workpapers](/rest#list-engagement-workpapers) |
| `get_engagement_review_summary` | `review:read` | [Get engagement review summary](/rest#get-engagement-review-summary) |

Every tool carries the MCP `readOnlyHint` and `idempotentHint` annotations. Computation requests behave the same on both transports; see [Run computations](/run-computations).

Tool results carry text your workspace authored: account descriptions, filenames, workpaper names. Treat it as data, never as instructions to the assistant, and prefer a host configuration that asks a person to confirm tool calls.

## Published resources

Each resource requires the same domain scope as its corresponding tool.

- `filemark://computations/catalog`
- `filemark://clients/{client_id}`
- `filemark://entities/{entity_id}`
- `filemark://tax-years/{tax_year_id}`
- `filemark://engagements/{engagement_id}`
- `filemark://engagements/{engagement_id}/history`
- `filemark://engagements/{engagement_id}/forms`
- `filemark://engagements/{engagement_id}/trial-balance`
- `filemark://engagements/{engagement_id}/accounts/{account_id}`
- `filemark://engagements/{engagement_id}/documents`
- `filemark://engagements/{engagement_id}/workpapers`
- `filemark://engagements/{engagement_id}/review-summary`
- `filemark://computations/targets/{target_id}`

The trial-balance, document, and workpaper resources return only their first page; use the corresponding list tool to page. There is no resource template for record search, engagement context, account-adjustment lists, or scenarios; call their tools directly.

## Errors and request IDs

Every successful tool result and resource read carries an opaque request ID at `_meta["ca.filemark/requestId"]`. Quote it when you write to [support@filemark.ca](mailto:support@filemark.ca).

A tool that fails returns `isError: true` with the same [error envelope](/errors) as REST in both `structuredContent` and a compact JSON text block; `error.details` names failing input cells with locations rooted at `inputs`. Each tool's advertised `outputSchema` is the union of its success model and that envelope, so both shapes validate.

Failures that are not tool execution stay JSON-RPC errors, with the same envelope in `error.data`:

| Code | Meaning |
| --- | --- |
| `-32601` | Unknown method |
| `-32602` | Unknown tool, or invalid resource arguments |
| `-32002` | The resource does not exist |
| `-32603` | Unexpected internal failure |
| `-32000` | Other sanitized execution failure |

Read and computation budget exhaustion inside a tool call is a tool error with retry guidance. The transport's own budget and authentication failures return HTTP `429` or `401` before any tool runs; see [rate limits](/rate-limits).

# Conventions

## Base URL and versioning

REST operations live under `https://api.filemark.ca/api/v1`; the MCP server is `https://api.filemark.ca/mcp`. Both are HTTPS only.

Changes within `v1` are additive. The [OpenAPI schema](https://api.filemark.ca/api/v1/openapi.json) is the published contract; its `info.version` rises when operations or fields are added, and a CI gate blocks removals and narrowings of published operations, parameters, request bodies, responses, and response headers. Computation targets version their strict schemas separately through `payloadSchemaVersion`; see [Pin a strict contract](/run-computations#pin-a-strict-contract).

There is no separate test environment. Every request reads your live workspace, and the API is read-only, so no call can change it; the batch and rollover computations read no workspace data at all. Filemark publishes no client libraries; generate one for your language from the OpenAPI schema.

## Requests

- Send the access token as `Authorization: Bearer <access-token>`.
- Bodies are JSON with `Content-Type: application/json`. The token endpoint alone takes `application/x-www-form-urlencoded`.
- Path and query parameters are `snake_case` (`client_id`, `year_end`); JSON fields are `camelCase` (`yearEnd`).
- A body may be up to 16 MiB on `/api/v1` and `/mcp`, and up to 256 KiB at the token endpoint. A larger body is rejected with `413` before it reaches the API.

## Responses

- Bodies are JSON. Collection reads return `data` and `pagination`; computations return the envelope described under [Run computations](/run-computations#run-a-batch-computation).
- Failures return `requestId` and an `error` object with `code` and `message`; see [error codes](/errors).
- IDs are UUID strings.
- Timestamps are ISO-8601 in UTC, for example `2026-07-14T12:00:00Z`. Dates are `YYYY-MM-DD`.
- Money in the saved tax-data reads (trial balance, accounts, adjustments) is an exact decimal string, for example `"125000.5"` or `"-4200"`, never a float; those reads report debits as positive and credits as negative. Computation inputs and results carry money as JSON numbers; see each target's cells in the [computation reference](/computations).
- Enumerations are lowercase strings, `snake_case` except the document `kind` values, which are kebab-case. Each enum's members are listed inline in the [REST reference](/rest).
- `null` means unknown or not applicable for that record.

## Response headers

| Header | Sent on | Meaning |
| --- | --- | --- |
| `X-Request-Id` | Every `/api/v1` response | Opaque request identifier. Quote it when you report a failed request. MCP carries the same identifier in the tool result's `_meta["ca.filemark/requestId"]` and in the error envelope's `requestId`. |
| `WWW-Authenticate` | `401`, `403` | `Bearer` when no credential was presented, `Bearer error="invalid_token"` when a token was refused, and `Bearer error="insufficient_scope", scope="..."` when a valid token lacks a scope; the `scope` parameter lists what the operation requires. |
| `Retry-After` | `429`, `503` | Seconds to wait before retrying. |
| `X-RateLimit-Limit`, `X-RateLimit-Remaining` | `429` | The exhausted budget's window size and the requests left in it. |

## Retries

Every operation is read-only or stateless, so any request can be retried. On `429` and `503`, wait the `Retry-After` seconds first. Retries count against the same [request budgets](/rate-limits) as first attempts.

# REST reference

Every operation is under `https://api.filemark.ca/api/v1` and takes `Authorization: Bearer <access-token>`; see [Authentication](/authentication). Shared rules for types, headers, and retries are under [Conventions](/conventions). Scopes are shortened here; [send them in full](/scopes).

| Resource | Operation | Method and path | Scope |
| --- | --- | --- | --- |
| Clients | [List clients](#list-clients) | `GET /api/v1/clients` | `clients:read` |
| Clients | [Get a client](#get-a-client) | `GET /api/v1/clients/{client_id}` | `clients:read` |
| Clients | [List a client's entities](#list-a-client-s-entities) | `GET /api/v1/clients/{client_id}/entities` | `entities:read` |
| Entities | [Get an entity](#get-an-entity) | `GET /api/v1/entities/{entity_id}` | `entities:read` |
| Entities | [List an entity's tax years](#list-an-entity-s-tax-years) | `GET /api/v1/entities/{entity_id}/tax-years` | `tax-years:read` |
| Tax years | [Get a tax year](#get-a-tax-year) | `GET /api/v1/tax-years/{tax_year_id}` | `tax-years:read` |
| Search | [Search engagement records](#search-engagement-records) | `GET /api/v1/search` | `engagements:read` |
| Engagements | [List engagements](#list-engagements) | `GET /api/v1/engagements` | `engagements:read` |
| Engagements | [Get an engagement](#get-an-engagement) | `GET /api/v1/engagements/{engagement_id}` | `engagements:read` |
| Engagements | [Get engagement context](#get-engagement-context) | `GET /api/v1/engagements/{engagement_id}/context` | `engagements:read` |
| Engagements | [Get engagement history](#get-engagement-history) | `GET /api/v1/engagements/{engagement_id}/history` | `engagements:read` |
| Engagements | [List engagement documents](#list-engagement-documents) | `GET /api/v1/engagements/{engagement_id}/documents` | `documents:read` |
| Engagements | [List engagement workpapers](#list-engagement-workpapers) | `GET /api/v1/engagements/{engagement_id}/workpapers` | `workpapers:read` |
| Engagements | [Get engagement review summary](#get-engagement-review-summary) | `GET /api/v1/engagements/{engagement_id}/review-summary` | `review:read` |
| Engagement forms | [Get an engagement form catalog](#get-an-engagement-form-catalog) | `GET /api/v1/engagements/{engagement_id}/forms` | `engagements:read` |
| Saved tax data | [Get a saved trial balance](#get-a-saved-trial-balance) | `GET /api/v1/engagements/{engagement_id}/trial-balance` | `tax-data:read` |
| Saved accounts | [Get a saved engagement account](#get-a-saved-engagement-account) | `GET /api/v1/engagements/{engagement_id}/accounts/{account_id}` | `tax-data:read` |
| Saved accounts | [List saved account adjustments](#list-saved-account-adjustments) | `GET /api/v1/engagements/{engagement_id}/accounts/{account_id}/adjustments` | `tax-data:read` |
| Saved-state computations | [Compute an engagement's saved state with cells replaced](#compute-an-engagement-s-saved-state-with-cells-replaced) | `POST /api/v1/engagements/{engagement_id}/computations/scenario` | `tax-data:read` + `tax:compute` |
| Computations | [List computation targets](#list-computation-targets) | `GET /api/v1/computations` | `tax:compute` |
| Computations | [Get a computation target contract](#get-a-computation-target-contract) | `GET /api/v1/computations/targets/{target_id}` | `tax:compute` |
| Computations | [Compute tax schedules](#compute-tax-schedules) | `POST /api/v1/computations/batch` | `tax:compute` |
| Computations | [Compute a rollover or reorganization](#compute-a-rollover-or-reorganization) | `POST /api/v1/computations/rollovers/{target}` | `tax:compute` |

An engagement ID is a tax year's UUID; see [Definitions](/definitions#engagements). Unknown IDs and IDs outside your organization return `404`.

## Pagination

`GET /clients`, `/engagements/{id}/documents`, and `/engagements/{id}/workpapers` use bounded offset pagination. `limit` defaults to 50 and accepts 1 through 200. `offset` is zero-based and accepts 0 through 100,000. Follow `pagination.hasMore` and advance `offset` by the number of returned rows.

The client-to-entity, entity-to-tax-year, and `GET /engagements` collections use opaque keyset cursors. Pass the returned `pagination.nextCursor` unchanged as the next request's `cursor`; do not decode it or reuse it under a different parent resource. A null `nextCursor` marks the final page.

`GET /engagements/{id}/trial-balance` uses an opaque snapshot-bound cursor, and every page must come from the same saved projection. A `409` saying the trial balance changed means that projection moved: discard the cursor and restart from the first page. A `409` saying the saved trial balance cannot be represented is a stored-state problem that restarting will not fix. A malformed cursor, or one from another engagement, is a `400`.

## Operation reference

Generated from the published [OpenAPI schema](https://api.filemark.ca/api/v1/openapi.json) (version 1.2.0). A path variable such as `$CLIENT_ID` is a UUID from an earlier read. Response bodies show the shape only: values in angle brackets are placeholders, an enum lists its alternatives inline, and a computation result also carries the target's output cells.

## List clients

`GET /api/v1/clients`

List clients using tenant identity from the verified principal only.

Scope: `clients:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/clients \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/clients",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL("https://api.filemark.ca/api/v1/clients");
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `offset` | query | integer, 0 to 100000, default `0` | no | Zero-based row offset (maximum 100,000). |

#### Response

`200`. One page of the organization's clients.

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "Acme Holdings Inc.",
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string (uuid) | yes | Stable UUID of the client. |
| `data[].name` | string | yes | Client display name. |
| `data[].createdAt` | string (date-time) | yes | ISO-8601 creation timestamp (UTC). |
| `data[].updatedAt` | string (date-time) | yes | ISO-8601 last-modified timestamp (UTC). |
| `pagination` | object | yes | Offset pagination retained for the original client-list contract. |
| `pagination.limit` | integer | yes | Page size actually applied (1-200). |
| `pagination.offset` | integer | yes | Zero-based row offset (max 100,000). |
| `pagination.total` | integer | yes | Total matching resources in the organization. |
| `pagination.hasMore` | boolean | yes | True when more rows exist past this page. |

#### Errors

The shared codes only; see [error codes](/errors).

## Get a client

`GET /api/v1/clients/{client_id}`

Get one client without revealing cross-organization identifiers.

Scope: `clients:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/clients/$CLIENT_ID \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

CLIENT_ID = "<client-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/clients/{CLIENT_ID}",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const CLIENT_ID = "<client-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/clients/${CLIENT_ID}`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `client_id` | path | string (uuid) | yes |  |

#### Response

`200`. The requested client.

```json
{
  "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "name": "Acme Holdings Inc.",
  "createdAt": "2026-07-14T12:00:00Z",
  "updatedAt": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | yes | Stable UUID of the client. |
| `name` | string | yes | Client display name. |
| `createdAt` | string (date-time) | yes | ISO-8601 creation timestamp (UTC). |
| `updatedAt` | string (date-time) | yes | ISO-8601 last-modified timestamp (UTC). |

#### Errors

The shared codes only; see [error codes](/errors).

## List a client's entities

`GET /api/v1/clients/{client_id}/entities`

List entities under an organization-owned client.

Scope: `entities:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/clients/$CLIENT_ID/entities \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

CLIENT_ID = "<client-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/clients/{CLIENT_ID}/entities",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const CLIENT_ID = "<client-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL(`https://api.filemark.ca/api/v1/clients/${CLIENT_ID}/entities`);
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `client_id` | path | string (uuid) | yes |  |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `cursor` | query | nullable string, 1 to 4096 characters | no | Opaque cursor returned by the preceding page. |

#### Response

`200`. One cursor-paginated page of the client's entities.

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "clientId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "<string>",
      "legalName": "<string>",
      "corporationNumber": "<string>",
      "businessNumber": "<string>",
      "naicsCode": "<string>",
      "dissolvedAt": "2025-12-31",
      "incorporationJurisdiction": "<string>",
      "incorporationDate": "2025-12-31"
    }
  ],
  "pagination": {
    "limit": 0,
    "nextCursor": "<string>",
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string (uuid) | yes | Stable UUID of the entity. |
| `data[].clientId` | string (uuid) | yes | UUID of the entity's parent client. |
| `data[].name` | string | yes | Entity display name. |
| `data[].legalName` | nullable string | no | Registered legal name, when known. |
| `data[].corporationNumber` | nullable string | no | Corporate registry number, when known. |
| `data[].businessNumber` | nullable string | no | Canadian business number, when known. |
| `data[].naicsCode` | nullable string | no | NAICS industry code, when assigned. |
| `data[].dissolvedAt` | nullable string (date) | no | Entity dissolution date, when applicable. |
| `data[].incorporationJurisdiction` | nullable string | no | Corporate-law jurisdiction the corporation is incorporated or continued under: 'CA' (federal CBCA) or a two-letter province/territory code. Changes only by continuance (ITA s.250(5.1)), never by fiscal period. This is NOT the provincial jurisdiction the corporation is taxed in, that is the per-tax-year permanent-establishment set (ITR Reg. 400(2)/402(3)) reported on Schedule 5. Null when not recorded, which is also the correct state for a corporation incorporated outside Canada. |
| `data[].incorporationDate` | nullable string (date) | no | Date the current incorporationJurisdiction took effect: original incorporation, or the most recent continuance into that jurisdiction. Null when not recorded. |
| `pagination` | object | yes | Opaque keyset pagination for new v1 collection endpoints. |
| `pagination.limit` | integer | yes | Page size actually applied (1-200). |
| `pagination.nextCursor` | nullable string | no | Opaque cursor for the next page; null on the final page. |
| `pagination.hasMore` | boolean | yes | True when another page is available. |

#### Errors

The shared codes only; see [error codes](/errors).

## Get an entity

`GET /api/v1/entities/{entity_id}`

Get one entity without revealing cross-organization identifiers.

Scope: `entities:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/entities/$ENTITY_ID \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENTITY_ID = "<entity-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/entities/{ENTITY_ID}",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENTITY_ID = "<entity-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/entities/${ENTITY_ID}`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `entity_id` | path | string (uuid) | yes |  |

#### Response

`200`. The requested entity.

```json
{
  "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "clientId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "name": "<string>",
  "legalName": "<string>",
  "corporationNumber": "<string>",
  "businessNumber": "<string>",
  "naicsCode": "<string>",
  "dissolvedAt": "2025-12-31",
  "incorporationJurisdiction": "<string>",
  "incorporationDate": "2025-12-31"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | yes | Stable UUID of the entity. |
| `clientId` | string (uuid) | yes | UUID of the entity's parent client. |
| `name` | string | yes | Entity display name. |
| `legalName` | nullable string | no | Registered legal name, when known. |
| `corporationNumber` | nullable string | no | Corporate registry number, when known. |
| `businessNumber` | nullable string | no | Canadian business number, when known. |
| `naicsCode` | nullable string | no | NAICS industry code, when assigned. |
| `dissolvedAt` | nullable string (date) | no | Entity dissolution date, when applicable. |
| `incorporationJurisdiction` | nullable string | no | Corporate-law jurisdiction the corporation is incorporated or continued under: 'CA' (federal CBCA) or a two-letter province/territory code. Changes only by continuance (ITA s.250(5.1)), never by fiscal period. This is NOT the provincial jurisdiction the corporation is taxed in, that is the per-tax-year permanent-establishment set (ITR Reg. 400(2)/402(3)) reported on Schedule 5. Null when not recorded, which is also the correct state for a corporation incorporated outside Canada. |
| `incorporationDate` | nullable string (date) | no | Date the current incorporationJurisdiction took effect: original incorporation, or the most recent continuance into that jurisdiction. Null when not recorded. |

#### Errors

The shared codes only; see [error codes](/errors).

## List an entity's tax years

`GET /api/v1/entities/{entity_id}/tax-years`

List tax years under an organization-owned entity.

Scope: `tax-years:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/entities/$ENTITY_ID/tax-years \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

ENTITY_ID = "<entity-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/entities/{ENTITY_ID}/tax-years",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENTITY_ID = "<entity-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL(`https://api.filemark.ca/api/v1/entities/${ENTITY_ID}/tax-years`);
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `entity_id` | path | string (uuid) | yes |  |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `cursor` | query | nullable string, 1 to 4096 characters | no | Opaque cursor returned by the preceding page. |

#### Response

`200`. One cursor-paginated page of the entity's tax years.

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "entityId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "clientId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "yearEnd": "2025-12-31",
      "periodStart": "2025-12-31",
      "status": "<in_progress | review | complete>",
      "source": "<prepared | imported>",
      "engagementType": "<compilation | review | audit | tax_only>",
      "priorYearTaxYearId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "createdAt": "2026-07-14T12:00:00Z",
      "lastModifiedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 0,
    "nextCursor": "<string>",
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string (uuid) | yes | Stable UUID of the tax-year engagement. |
| `data[].entityId` | string (uuid) | yes | UUID of the parent entity. |
| `data[].clientId` | string (uuid) | yes | UUID of the parent client. |
| `data[].yearEnd` | string (date) | yes | Fiscal year-end date. |
| `data[].periodStart` | nullable string (date) | no | Fiscal period start date; null only for legacy records. |
| `data[].status` | one of `in_progress`, `review`, `complete` | yes | Current engagement workflow status. |
| `data[].source` | one of `prepared`, `imported` | yes | Prepared binder or imported prior-year reference. |
| `data[].engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no | Engagement service type, when assigned. |
| `data[].priorYearTaxYearId` | nullable string (uuid) | no | Linked prior tax year used for comparatives, when present. |
| `data[].createdAt` | string (date-time) | yes | ISO-8601 creation timestamp (UTC). |
| `data[].lastModifiedAt` | string (date-time) | yes | ISO-8601 last-modified timestamp (UTC). |
| `pagination` | object | yes | Opaque keyset pagination for new v1 collection endpoints. |
| `pagination.limit` | integer | yes | Page size actually applied (1-200). |
| `pagination.nextCursor` | nullable string | no | Opaque cursor for the next page; null on the final page. |
| `pagination.hasMore` | boolean | yes | True when another page is available. |

#### Errors

The shared codes only; see [error codes](/errors).

## Get a tax year

`GET /api/v1/tax-years/{tax_year_id}`

Get one tax year without revealing cross-organization identifiers.

Scope: `tax-years:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/tax-years/$TAX_YEAR_ID \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

TAX_YEAR_ID = "<tax-year-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/tax-years/{TAX_YEAR_ID}",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const TAX_YEAR_ID = "<tax-year-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/tax-years/${TAX_YEAR_ID}`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `tax_year_id` | path | string (uuid) | yes |  |

#### Response

`200`. The requested tax-year engagement.

```json
{
  "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "entityId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "clientId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "yearEnd": "2025-12-31",
  "periodStart": "2025-12-31",
  "status": "<in_progress | review | complete>",
  "source": "<prepared | imported>",
  "engagementType": "<compilation | review | audit | tax_only>",
  "priorYearTaxYearId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "createdAt": "2026-07-14T12:00:00Z",
  "lastModifiedAt": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | yes | Stable UUID of the tax-year engagement. |
| `entityId` | string (uuid) | yes | UUID of the parent entity. |
| `clientId` | string (uuid) | yes | UUID of the parent client. |
| `yearEnd` | string (date) | yes | Fiscal year-end date. |
| `periodStart` | nullable string (date) | no | Fiscal period start date; null only for legacy records. |
| `status` | one of `in_progress`, `review`, `complete` | yes | Current engagement workflow status. |
| `source` | one of `prepared`, `imported` | yes | Prepared binder or imported prior-year reference. |
| `engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no | Engagement service type, when assigned. |
| `priorYearTaxYearId` | nullable string (uuid) | no | Linked prior tax year used for comparatives, when present. |
| `createdAt` | string (date-time) | yes | ISO-8601 creation timestamp (UTC). |
| `lastModifiedAt` | string (date-time) | yes | ISO-8601 last-modified timestamp (UTC). |

#### Errors

The shared codes only; see [error codes](/errors).

## Search engagement records

`GET /api/v1/search`

Searches current organization-owned engagements by client name, entity name, fiscal year, or year-end. Returns safe engagement metadata only; accounts, financials, saved forms, classified reports, documents, workpapers, and people are excluded. A no-match result is a successful response and ambiguity is reported explicitly.

Scope: `engagements:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/search \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "q=<q>" \
  --data-urlencode "limit=10"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/search",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "q": "<q>",
        "limit": "10",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL("https://api.filemark.ca/api/v1/search");
url.searchParams.set("q", "<q>");
url.searchParams.set("limit", "10");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `q` | query | string, 2 to 80 characters | yes | Two to eighty characters and at most six whitespace-separated terms. ILIKE wildcard characters are matched literally. |
| `year_end` | query | nullable string (date) | no | Optional exact taxation-year end date. |
| `status` | query | nullable one of `in_progress`, `review`, `complete` | no | Optional workflow-status filter. |
| `limit` | query | integer, 1 to 25, default `10` | no | Shortlist size (1-25). |

#### Response

`200`. Current engagement matches and their explicit resolution state.

```json
{
  "query": "<string>",
  "resolution": "<no_match | unique | ambiguous>",
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "client": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "entity": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "yearEnd": "2025-12-31",
      "periodStart": "2025-12-31",
      "status": "<in_progress | review | complete>",
      "source": "<prepared | imported>",
      "engagementType": "<compilation | review | audit | tax_only>",
      "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "isLocked": false,
      "lifecycle": {
        "filedAt": "2026-07-14T12:00:00Z",
        "revisionNumber": 1,
        "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
      },
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 1,
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `query` | string, 2 to 80 characters | yes |  |
| `resolution` | one of `no_match`, `unique`, `ambiguous` | yes |  |
| `data` | array of objects, up to 25 items | yes |  |
| `data[].id` | string (uuid) | yes |  |
| `data[].client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `data[].client.id` | string (uuid) | yes |  |
| `data[].client.name` | string | yes |  |
| `data[].client.legalName` | nullable string | no |  |
| `data[].entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `data[].entity.id` | string (uuid) | yes |  |
| `data[].entity.name` | string | yes |  |
| `data[].entity.legalName` | nullable string | no |  |
| `data[].yearEnd` | string (date) | yes |  |
| `data[].periodStart` | nullable string (date) | no |  |
| `data[].status` | one of `in_progress`, `review`, `complete` | yes |  |
| `data[].source` | one of `prepared`, `imported` | yes |  |
| `data[].engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `data[].priorYearEngagementId` | nullable string (uuid) | no |  |
| `data[].isLocked` | boolean | yes |  |
| `data[].lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `data[].lifecycle.filedAt` | nullable string (date-time) | no |  |
| `data[].lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `data[].lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `data[].lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `data[].createdAt` | string (date-time) | yes |  |
| `data[].updatedAt` | string (date-time) | yes |  |
| `pagination` | object | yes | Metadata for one bounded search shortlist. |
| `pagination.limit` | integer, 1 to 25 | yes | Result limit actually applied. |
| `pagination.hasMore` | boolean | yes | True when additional matching engagements were omitted. |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `409`: A matched engagement revision is inconsistent.

## List engagements

`GET /api/v1/engagements`

Discover engagements without exposing stored financial or tax payloads.

Scope: `engagements:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/engagements \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/engagements",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL("https://api.filemark.ca/api/v1/engagements");
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `client_id` | query | nullable string (uuid) | no | Optional organization-owned client filter. |
| `entity_id` | query | nullable string (uuid) | no | Optional organization-owned legal-entity filter. |
| `year_end` | query | nullable string (date) | no | Optional exact taxation-year end date. |
| `status` | query | nullable one of `in_progress`, `review`, `complete` | no | Optional workflow-status filter. |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `cursor` | query | nullable string, 1 to 4096 characters | no | Opaque cursor returned by the preceding page. |

#### Response

`200`. One newest-first page of safe engagement identity and lifecycle metadata.

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "client": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "entity": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "yearEnd": "2025-12-31",
      "periodStart": "2025-12-31",
      "status": "<in_progress | review | complete>",
      "source": "<prepared | imported>",
      "engagementType": "<compilation | review | audit | tax_only>",
      "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "isLocked": false,
      "lifecycle": {
        "filedAt": "2026-07-14T12:00:00Z",
        "revisionNumber": 1,
        "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
      },
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 0,
    "nextCursor": "<string>",
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string (uuid) | yes |  |
| `data[].client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `data[].client.id` | string (uuid) | yes |  |
| `data[].client.name` | string | yes |  |
| `data[].client.legalName` | nullable string | no |  |
| `data[].entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `data[].entity.id` | string (uuid) | yes |  |
| `data[].entity.name` | string | yes |  |
| `data[].entity.legalName` | nullable string | no |  |
| `data[].yearEnd` | string (date) | yes |  |
| `data[].periodStart` | nullable string (date) | no |  |
| `data[].status` | one of `in_progress`, `review`, `complete` | yes |  |
| `data[].source` | one of `prepared`, `imported` | yes |  |
| `data[].engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `data[].priorYearEngagementId` | nullable string (uuid) | no |  |
| `data[].isLocked` | boolean | yes |  |
| `data[].lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `data[].lifecycle.filedAt` | nullable string (date-time) | no |  |
| `data[].lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `data[].lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `data[].lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `data[].createdAt` | string (date-time) | yes |  |
| `data[].updatedAt` | string (date-time) | yes |  |
| `pagination` | object | yes | Opaque keyset pagination for new v1 collection endpoints. |
| `pagination.limit` | integer | yes | Page size actually applied (1-200). |
| `pagination.nextCursor` | nullable string | no | Opaque cursor for the next page; null on the final page. |
| `pagination.hasMore` | boolean | yes | True when another page is available. |

#### Errors

The shared codes only; see [error codes](/errors).

## Get an engagement

`GET /api/v1/engagements/{engagement_id}`

Read one tax-year engagement without its financial/tax payloads.

Scope: `engagements:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Response

`200`. Safe identity, period, status, and lifecycle metadata.

```json
{
  "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "client": {
    "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "name": "<string>",
    "legalName": "<string>"
  },
  "entity": {
    "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "name": "<string>",
    "legalName": "<string>"
  },
  "yearEnd": "2025-12-31",
  "periodStart": "2025-12-31",
  "status": "<in_progress | review | complete>",
  "source": "<prepared | imported>",
  "engagementType": "<compilation | review | audit | tax_only>",
  "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "isLocked": false,
  "lifecycle": {
    "filedAt": "2026-07-14T12:00:00Z",
    "revisionNumber": 1,
    "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
  },
  "createdAt": "2026-07-14T12:00:00Z",
  "updatedAt": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | yes |  |
| `client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `client.id` | string (uuid) | yes |  |
| `client.name` | string | yes |  |
| `client.legalName` | nullable string | no |  |
| `entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `entity.id` | string (uuid) | yes |  |
| `entity.name` | string | yes |  |
| `entity.legalName` | nullable string | no |  |
| `yearEnd` | string (date) | yes |  |
| `periodStart` | nullable string (date) | no |  |
| `status` | one of `in_progress`, `review`, `complete` | yes |  |
| `source` | one of `prepared`, `imported` | yes |  |
| `engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `priorYearEngagementId` | nullable string (uuid) | no |  |
| `isLocked` | boolean | yes |  |
| `lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `lifecycle.filedAt` | nullable string (date-time) | no |  |
| `lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `createdAt` | string (date-time) | yes |  |
| `updatedAt` | string (date-time) | yes |  |

#### Errors

The shared codes only; see [error codes](/errors).

## Get engagement context

`GET /api/v1/engagements/{engagement_id}/context`

Resolve one engagement revision without loading saved tax data.

Scope: `engagements:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/context \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/context",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/context`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Response

`200`. Requested and current amendment revisions using safe engagement projections.

```json
{
  "requestedEngagement": {
    "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "client": {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "<string>",
      "legalName": "<string>"
    },
    "entity": {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "<string>",
      "legalName": "<string>"
    },
    "yearEnd": "2025-12-31",
    "periodStart": "2025-12-31",
    "status": "<in_progress | review | complete>",
    "source": "<prepared | imported>",
    "engagementType": "<compilation | review | audit | tax_only>",
    "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "isLocked": false,
    "lifecycle": {
      "filedAt": "2026-07-14T12:00:00Z",
      "revisionNumber": 1,
      "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
    },
    "createdAt": "2026-07-14T12:00:00Z",
    "updatedAt": "2026-07-14T12:00:00Z"
  },
  "currentEngagement": {
    "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "client": {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "<string>",
      "legalName": "<string>"
    },
    "entity": {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "name": "<string>",
      "legalName": "<string>"
    },
    "yearEnd": "2025-12-31",
    "periodStart": "2025-12-31",
    "status": "<in_progress | review | complete>",
    "source": "<prepared | imported>",
    "engagementType": "<compilation | review | audit | tax_only>",
    "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "isLocked": false,
    "lifecycle": {
      "filedAt": "2026-07-14T12:00:00Z",
      "revisionNumber": 1,
      "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
    },
    "createdAt": "2026-07-14T12:00:00Z",
    "updatedAt": "2026-07-14T12:00:00Z"
  },
  "revision": {
    "rootEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "previousEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "nextEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "currentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "isCurrent": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `requestedEngagement` | object | yes | One tax-year engagement, without financial or tax-return payloads. |
| `requestedEngagement.id` | string (uuid) | yes |  |
| `requestedEngagement.client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `requestedEngagement.client.id` | string (uuid) | yes |  |
| `requestedEngagement.client.name` | string | yes |  |
| `requestedEngagement.client.legalName` | nullable string | no |  |
| `requestedEngagement.entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `requestedEngagement.entity.id` | string (uuid) | yes |  |
| `requestedEngagement.entity.name` | string | yes |  |
| `requestedEngagement.entity.legalName` | nullable string | no |  |
| `requestedEngagement.yearEnd` | string (date) | yes |  |
| `requestedEngagement.periodStart` | nullable string (date) | no |  |
| `requestedEngagement.status` | one of `in_progress`, `review`, `complete` | yes |  |
| `requestedEngagement.source` | one of `prepared`, `imported` | yes |  |
| `requestedEngagement.engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `requestedEngagement.priorYearEngagementId` | nullable string (uuid) | no |  |
| `requestedEngagement.isLocked` | boolean | yes |  |
| `requestedEngagement.lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `requestedEngagement.lifecycle.filedAt` | nullable string (date-time) | no |  |
| `requestedEngagement.lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `requestedEngagement.lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `requestedEngagement.lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `requestedEngagement.createdAt` | string (date-time) | yes |  |
| `requestedEngagement.updatedAt` | string (date-time) | yes |  |
| `currentEngagement` | object | yes | One tax-year engagement, without financial or tax-return payloads. |
| `currentEngagement.id` | string (uuid) | yes |  |
| `currentEngagement.client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `currentEngagement.client.id` | string (uuid) | yes |  |
| `currentEngagement.client.name` | string | yes |  |
| `currentEngagement.client.legalName` | nullable string | no |  |
| `currentEngagement.entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `currentEngagement.entity.id` | string (uuid) | yes |  |
| `currentEngagement.entity.name` | string | yes |  |
| `currentEngagement.entity.legalName` | nullable string | no |  |
| `currentEngagement.yearEnd` | string (date) | yes |  |
| `currentEngagement.periodStart` | nullable string (date) | no |  |
| `currentEngagement.status` | one of `in_progress`, `review`, `complete` | yes |  |
| `currentEngagement.source` | one of `prepared`, `imported` | yes |  |
| `currentEngagement.engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `currentEngagement.priorYearEngagementId` | nullable string (uuid) | no |  |
| `currentEngagement.isLocked` | boolean | yes |  |
| `currentEngagement.lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `currentEngagement.lifecycle.filedAt` | nullable string (date-time) | no |  |
| `currentEngagement.lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `currentEngagement.lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `currentEngagement.lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `currentEngagement.createdAt` | string (date-time) | yes |  |
| `currentEngagement.updatedAt` | string (date-time) | yes |  |
| `revision` | object | yes | Safe amendment-chain relationships for one requested engagement. |
| `revision.rootEngagementId` | string (uuid) | yes |  |
| `revision.previousEngagementId` | nullable string (uuid) | no |  |
| `revision.nextEngagementId` | nullable string (uuid) | no |  |
| `revision.currentEngagementId` | string (uuid) | yes |  |
| `revision.isCurrent` | boolean | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `409`: The persisted amendment chain is inconsistent.

## Get engagement history

`GET /api/v1/engagements/{engagement_id}/history`

Read amendment metadata only; raw change history remains private.

Scope: `engagements:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/history \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/history",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/history`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Response

`200`. A bounded, validated amendment chain without edit diffs or user identities.

```json
{
  "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "currentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "revisions": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "client": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "entity": {
        "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "name": "<string>",
        "legalName": "<string>"
      },
      "yearEnd": "2025-12-31",
      "periodStart": "2025-12-31",
      "status": "<in_progress | review | complete>",
      "source": "<prepared | imported>",
      "engagementType": "<compilation | review | audit | tax_only>",
      "priorYearEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "isLocked": false,
      "lifecycle": {
        "filedAt": "2026-07-14T12:00:00Z",
        "revisionNumber": 1,
        "parentEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
        "amendedByEngagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f"
      },
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ]
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `engagementId` | string (uuid) | yes |  |
| `currentEngagementId` | string (uuid) | yes |  |
| `revisions` | array of objects, 1 to 100 items | yes |  |
| `revisions[].id` | string (uuid) | yes |  |
| `revisions[].client` | object | yes | Safe identity fields for an engagement's client or entity. |
| `revisions[].client.id` | string (uuid) | yes |  |
| `revisions[].client.name` | string | yes |  |
| `revisions[].client.legalName` | nullable string | no |  |
| `revisions[].entity` | object | yes | Safe identity fields for an engagement's client or entity. |
| `revisions[].entity.id` | string (uuid) | yes |  |
| `revisions[].entity.name` | string | yes |  |
| `revisions[].entity.legalName` | nullable string | no |  |
| `revisions[].yearEnd` | string (date) | yes |  |
| `revisions[].periodStart` | nullable string (date) | no |  |
| `revisions[].status` | one of `in_progress`, `review`, `complete` | yes |  |
| `revisions[].source` | one of `prepared`, `imported` | yes |  |
| `revisions[].engagementType` | nullable one of `compilation`, `review`, `audit`, `tax_only` | no |  |
| `revisions[].priorYearEngagementId` | nullable string (uuid) | no |  |
| `revisions[].isLocked` | boolean | yes |  |
| `revisions[].lifecycle` | object | yes | Non-sensitive return lifecycle metadata. |
| `revisions[].lifecycle.filedAt` | nullable string (date-time) | no |  |
| `revisions[].lifecycle.revisionNumber` | integer, at least 1 | yes |  |
| `revisions[].lifecycle.parentEngagementId` | nullable string (uuid) | no |  |
| `revisions[].lifecycle.amendedByEngagementId` | nullable string (uuid) | no |  |
| `revisions[].createdAt` | string (date-time) | yes |  |
| `revisions[].updatedAt` | string (date-time) | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `409`: The persisted amendment chain is inconsistent.

## List engagement documents

`GET /api/v1/engagements/{engagement_id}/documents`

List metadata only; storage paths and file contents are never returned.

Scope: `documents:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/documents \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/documents",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/documents`);
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `offset` | query | integer, 0 to 100000, default `0` | no | Zero-based row offset (maximum 100,000). |

#### Response

`200`. One page of safe document-registry metadata.

```json
{
  "data": [
    {
      "id": "<string>",
      "fileName": "<string>",
      "kind": "<gl | fs | workpaper | supporting | tb-current | tb-prior | tb-classification | gifi-export | prior-return | portal-upload | evidence>",
      "source": "<onboarding | manual | portal | connector | unknown>",
      "uploadedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 1,
    "offset": 0,
    "total": 0,
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string, 1 to 256 characters | yes |  |
| `data[].fileName` | string, 1 to 512 characters | yes |  |
| `data[].kind` | one of `gl`, `fs`, `workpaper`, `supporting`, `tb-current`, `tb-prior`, `tb-classification`, `gifi-export`, `prior-return`, `portal-upload`, `evidence` | yes |  |
| `data[].source` | one of `onboarding`, `manual`, `portal`, `connector`, `unknown` | yes |  |
| `data[].uploadedAt` | nullable string (date-time) | no |  |
| `pagination` | object | yes | Bounded offset-pagination metadata. |
| `pagination.limit` | integer, 1 to 200 | yes | Page size actually applied. |
| `pagination.offset` | integer, 0 to 100000 | yes | Zero-based row offset actually applied. |
| `pagination.total` | integer, at least 0 | yes | Total matching resources. |
| `pagination.hasMore` | boolean | yes | True when another page is available. |

#### Errors

The shared codes only; see [error codes](/errors).

## List engagement workpapers

`GET /api/v1/engagements/{engagement_id}/workpapers`

List promoted metadata only; JSONB content and account IDs stay private.

Scope: `workpapers:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/workpapers \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/workpapers",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/workpapers`);
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |
| `limit` | query | integer, 1 to 200, default `50` | no | Page size (1-200). |
| `offset` | query | integer, 0 to 100000, default `0` | no | Zero-based row offset (maximum 100,000). |

#### Response

`200`. One page of workpaper metadata without payloads.

```json
{
  "data": [
    {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "templateId": "<string>",
      "kind": "<string>",
      "origin": "<string>",
      "status": "<string>",
      "parseStatus": "<string>",
      "tieOutMode": "<string>",
      "tieOutStatus": "<string>",
      "detectedType": "<string>",
      "category": "<string>",
      "version": 1,
      "isReviewed": false,
      "reviewedAt": "2026-07-14T12:00:00Z",
      "sourceFileName": "<string>",
      "linkedAccountCount": 0,
      "createdAt": "2026-07-14T12:00:00Z",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  ],
  "pagination": {
    "limit": 1,
    "offset": 0,
    "total": 0,
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | array of objects | yes |  |
| `data[].id` | string (uuid) | yes |  |
| `data[].templateId` | nullable string | no |  |
| `data[].kind` | string | yes |  |
| `data[].origin` | string | yes |  |
| `data[].status` | string | yes |  |
| `data[].parseStatus` | nullable string | no |  |
| `data[].tieOutMode` | nullable string | no |  |
| `data[].tieOutStatus` | nullable string | no |  |
| `data[].detectedType` | nullable string | no |  |
| `data[].category` | nullable string | no |  |
| `data[].version` | integer, at least 1 | yes |  |
| `data[].isReviewed` | boolean | yes |  |
| `data[].reviewedAt` | nullable string (date-time) | no |  |
| `data[].sourceFileName` | nullable string, up to 512 characters | no |  |
| `data[].linkedAccountCount` | integer, at least 0 | yes |  |
| `data[].createdAt` | string (date-time) | yes |  |
| `data[].updatedAt` | string (date-time) | yes |  |
| `pagination` | object | yes | Bounded offset-pagination metadata. |
| `pagination.limit` | integer, 1 to 200 | yes | Page size actually applied. |
| `pagination.offset` | integer, 0 to 100000 | yes | Zero-based row offset actually applied. |
| `pagination.total` | integer, at least 0 | yes | Total matching resources. |
| `pagination.hasMore` | boolean | yes | True when another page is available. |

#### Errors

The shared codes only; see [error codes](/errors).

## Get engagement review summary

`GET /api/v1/engagements/{engagement_id}/review-summary`

Expose safe review counts without inventing a persisted readiness pass.

Scope: `review:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/review-summary \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/review-summary",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/review-summary`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Response

`200`. Persisted review indicators, explicitly not an authoritative filing-readiness verdict.

```json
{
  "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
  "engagementStatus": "<in_progress | review | complete>",
  "lifecycleStatus": "<open | signed | filed>",
  "signoffs": {
    "preparerSigned": false,
    "reviewerSigned": false,
    "reviewerStatus": "<pending | signed | skipped>",
    "partnerSigned": false
  },
  "workpapers": {
    "total": 0,
    "reviewed": 0,
    "tieOutMatched": 0,
    "tieOutDifference": 0,
    "tieOutIncomplete": 0,
    "tieOutPending": 0
  },
  "accountReviewStatuses": {
    "followUp": 0,
    "analyzed": 0,
    "firstReview": 0,
    "secondReview": 0
  },
  "activeReviewMarks": {
    "total": 0,
    "questions": 0,
    "corrections": 0,
    "firstReview": 0,
    "partnerReview": 0
  },
  "acknowledgedWarningCount": 0,
  "readiness": {
    "evaluated": false,
    "ready": null
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `engagementId` | string (uuid) | yes |  |
| `engagementStatus` | one of `in_progress`, `review`, `complete` | yes |  |
| `lifecycleStatus` | one of `open`, `signed`, `filed` | yes |  |
| `signoffs` | object | yes |  |
| `signoffs.preparerSigned` | boolean | yes |  |
| `signoffs.reviewerSigned` | boolean | yes |  |
| `signoffs.reviewerStatus` | one of `pending`, `signed`, `skipped` | yes |  |
| `signoffs.partnerSigned` | boolean | yes |  |
| `workpapers` | object | yes |  |
| `workpapers.total` | integer, at least 0 | yes |  |
| `workpapers.reviewed` | integer, at least 0 | yes |  |
| `workpapers.tieOutMatched` | integer, at least 0 | yes |  |
| `workpapers.tieOutDifference` | integer, at least 0 | yes |  |
| `workpapers.tieOutIncomplete` | integer, at least 0 | yes |  |
| `workpapers.tieOutPending` | integer, at least 0 | yes |  |
| `accountReviewStatuses` | object | yes |  |
| `accountReviewStatuses.followUp` | integer, at least 0 | yes |  |
| `accountReviewStatuses.analyzed` | integer, at least 0 | yes |  |
| `accountReviewStatuses.firstReview` | integer, at least 0 | yes |  |
| `accountReviewStatuses.secondReview` | integer, at least 0 | yes |  |
| `activeReviewMarks` | object | yes |  |
| `activeReviewMarks.total` | integer, at least 0 | yes |  |
| `activeReviewMarks.questions` | integer, at least 0 | yes |  |
| `activeReviewMarks.corrections` | integer, at least 0 | yes |  |
| `activeReviewMarks.firstReview` | integer, at least 0 | yes |  |
| `activeReviewMarks.partnerReview` | integer, at least 0 | yes |  |
| `acknowledgedWarningCount` | integer, at least 0 | yes |  |
| `readiness` | object | yes | Readiness state when no authoritative result is persisted. |
| `readiness.evaluated` | boolean, always `false` | no |  |
| `readiness.ready` | null | no |  |

#### Errors

The shared codes only; see [error codes](/errors).

## Get an engagement form catalog

`GET /api/v1/engagements/{engagement_id}/forms`

Lists production form targets whose declared tax-year support window contains the requested engagement. This does not determine filing requirements, resolve a historical form revision, inspect saved form state, compute results, or evaluate readiness.

Scope: `engagements:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/forms \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/forms",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/forms`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Response

`200`. Bounded year-support catalog for one organization-owned engagement.

```json
{
  "context": {
    "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "yearEnd": "2025-12-31",
    "taxYear": 1900,
    "revisionNumber": 1,
    "source": "<prepared | imported>",
    "filedAt": "2026-07-14T12:00:00Z",
    "referenceOnly": false
  },
  "data": [
    {
      "targetId": "<string>",
      "displayName": "<string>",
      "formId": "<string>",
      "taxYearWindow": {
        "from": 1900,
        "through": 1900
      },
      "availability": "supported",
      "applicabilityBasis": "tax_year_window",
      "filingRequirement": "not_evaluated"
    }
  ],
  "evaluation": {
    "formRevisionResolved": false,
    "savedStateEvaluated": false,
    "computationEvaluated": false,
    "readinessEvaluated": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `context` | object | yes | Safe engagement context pinned to the exact requested revision. |
| `context.engagementId` | string (uuid) | yes |  |
| `context.yearEnd` | string (date) | yes |  |
| `context.taxYear` | integer, 1900 to 9999 | yes |  |
| `context.revisionNumber` | integer, at least 1 | yes |  |
| `context.source` | one of `prepared`, `imported` | yes |  |
| `context.filedAt` | nullable string (date-time) | yes |  |
| `context.referenceOnly` | boolean | yes |  |
| `data` | array of objects, up to 200 items | yes |  |
| `data[].targetId` | string, matching `^(?:S\d+[A-Z]?\|T\d+[A-Z]?)$` | yes |  |
| `data[].displayName` | string, 1 to 256 characters | yes |  |
| `data[].formId` | string, matching `^[A-Z0-9_-]{1,64}$` | yes |  |
| `data[].taxYearWindow` | object | yes | Inclusive tax-year support window from the canonical registry. |
| `data[].taxYearWindow.from` | integer, 1900 to 9999 | yes |  |
| `data[].taxYearWindow.through` | nullable integer, 1900 to 9999 | yes |  |
| `data[].availability` | string, always `"supported"` | yes |  |
| `data[].applicabilityBasis` | string, always `"tax_year_window"` | yes |  |
| `data[].filingRequirement` | string, always `"not_evaluated"` | yes |  |
| `evaluation` | object | yes | Permanent sentinels preventing catalog discovery from implying results. |
| `evaluation.formRevisionResolved` | boolean, always `false` | yes |  |
| `evaluation.savedStateEvaluated` | boolean, always `false` | yes |  |
| `evaluation.computationEvaluated` | boolean, always `false` | yes |  |
| `evaluation.readinessEvaluated` | boolean, always `false` | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `503`: The canonical form catalog is temporarily unavailable.

## Get a saved trial balance

`GET /api/v1/engagements/{engagement_id}/trial-balance`

Returns a snapshot-bound page of active saved trial-balance accounts and GIFI assignments. Amounts are exact decimal strings in the reported currency and use a debits-positive, credits-negative sign convention. This read does not apply AJEs or tax adjustments and does not evaluate classifications, computations, lineage, or readiness.

Scope: `tax-data:read`.

#### Request

```bash
curl --get https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/trial-balance \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --data-urlencode "limit=50"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/trial-balance",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    params={
        "limit": "50",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const url = new URL(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/trial-balance`);
url.searchParams.set("limit", "50");

const response = await fetch(url, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |
| `limit` | query | integer, 1 to 200, default `50` | no | Maximum active accounts to return (1-200). |
| `cursor` | query | nullable string, 1 to 4096 characters | no | Opaque snapshot-bound cursor from the preceding page. |

#### Response

`200`. A snapshot-bound page of the requested engagement's saved TB.

```json
{
  "context": {
    "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "yearEnd": "2025-12-31",
    "revisionNumber": 1,
    "status": "<in_progress | review | complete>",
    "source": "<prepared | imported>",
    "filedAt": "2026-07-14T12:00:00Z",
    "referenceOnly": false,
    "reportingCurrency": "<string>",
    "currencyBasis": "<canadian_currency | functional_currency | reversionary>",
    "balanceConvention": "debits_positive_credits_negative"
  },
  "sourceRevision": {
    "classifiedReportVersion": 0,
    "gifiAssignmentsVersion": 0,
    "lastModifiedAt": "2026-07-14T12:00:00Z",
    "snapshotDigest": "<string>"
  },
  "availability": "<available | empty | not_imported>",
  "projection": {
    "savedBookBalancesIncluded": true,
    "gifiAssignmentsIncluded": true,
    "archivedAccountsIncluded": false,
    "postedBookAdjustmentsIncluded": false,
    "taxAdjustmentsIncluded": false,
    "classificationIncluded": false,
    "computationEvaluated": false,
    "lineageIncluded": false,
    "readinessEvaluated": false
  },
  "totalStoredAccountCount": 0,
  "archivedAccountCount": 0,
  "data": [
    {
      "id": "<string>",
      "accountCode": "<string>",
      "accountName": "<string>",
      "currentYearBalance": "125000.5",
      "priorYearBalance": "-4200",
      "gifiCode": "<string>",
      "changeStatus": "<new | removed | significant_increase | significant_decrease | minor_change | unchanged | unknown>"
    }
  ],
  "pagination": {
    "limit": 1,
    "total": 0,
    "nextCursor": "<string>",
    "hasMore": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `context` | object | yes |  |
| `context.engagementId` | string (uuid) | yes |  |
| `context.yearEnd` | string (date) | yes |  |
| `context.revisionNumber` | integer, at least 1 | yes |  |
| `context.status` | one of `in_progress`, `review`, `complete` | yes |  |
| `context.source` | one of `prepared`, `imported` | yes |  |
| `context.filedAt` | nullable string (date-time) | yes |  |
| `context.referenceOnly` | boolean | yes |  |
| `context.reportingCurrency` | string, matching `^[A-Z]{3}$` | yes |  |
| `context.currencyBasis` | one of `canadian_currency`, `functional_currency`, `reversionary` | yes |  |
| `context.balanceConvention` | string, always `"debits_positive_credits_negative"` | yes |  |
| `sourceRevision` | object | yes | Version vector and content address for the exact saved projection. |
| `sourceRevision.classifiedReportVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiAssignmentsVersion` | integer, at least 0 | yes |  |
| `sourceRevision.lastModifiedAt` | string (date-time) | yes |  |
| `sourceRevision.snapshotDigest` | string, matching `^sha256:[0-9a-f]{64}$` | yes |  |
| `availability` | one of `available`, `empty`, `not_imported` | yes |  |
| `projection` | object | yes | Semantic sentinels that prevent consumers from assuming extra state. |
| `projection.savedBookBalancesIncluded` | boolean, always `true` | yes |  |
| `projection.gifiAssignmentsIncluded` | boolean, always `true` | yes |  |
| `projection.archivedAccountsIncluded` | boolean, always `false` | yes |  |
| `projection.postedBookAdjustmentsIncluded` | boolean, always `false` | yes |  |
| `projection.taxAdjustmentsIncluded` | boolean, always `false` | yes |  |
| `projection.classificationIncluded` | boolean, always `false` | yes |  |
| `projection.computationEvaluated` | boolean, always `false` | yes |  |
| `projection.lineageIncluded` | boolean, always `false` | yes |  |
| `projection.readinessEvaluated` | boolean, always `false` | yes |  |
| `totalStoredAccountCount` | integer, at least 0 | yes |  |
| `archivedAccountCount` | integer, at least 0 | yes |  |
| `data` | array of objects, up to 200 items | yes |  |
| `data[].id` | string, 1 to 128 characters | yes |  |
| `data[].accountCode` | nullable string, up to 128 characters | yes |  |
| `data[].accountName` | string, up to 512 characters | yes |  |
| `data[].currentYearBalance` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `data[].priorYearBalance` | nullable decimal string, 1 to 96 characters | yes |  |
| `data[].gifiCode` | nullable string, matching `^[0-9]{4}$` | yes |  |
| `data[].changeStatus` | one of `new`, `removed`, `significant_increase`, `significant_decrease`, `minor_change`, `unchanged`, `unknown` | yes |  |
| `pagination` | object | yes |  |
| `pagination.limit` | integer, 1 to 200 | yes |  |
| `pagination.total` | integer, at least 0 | yes |  |
| `pagination.nextCursor` | nullable string | yes |  |
| `pagination.hasMore` | boolean | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `400`: The pagination cursor is malformed or invalid.
- `404`: The engagement does not exist in the caller's organization.
- `409`: The saved trial balance is inconsistent or changed between pages.

## Get a saved engagement account

`GET /api/v1/engagements/{engagement_id}/accounts/{account_id}`

Returns one active saved trial-balance account with an allowlisted classification, accepted GIFI mapping provenance, current chart-of-accounts metadata, and a bounded adjustment summary. Book AJEs are re-evaluated before posting. Workpaper tax amounts are counted as saved sources only and are never allocated or totalled per account.

Scope: `tax-data:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/accounts/$ACCOUNT_ID \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
ACCOUNT_ID = "<account-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/accounts/{ACCOUNT_ID}",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const ACCOUNT_ID = "<account-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/accounts/${ACCOUNT_ID}`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |
| `account_id` | path | string, 1 to 128 characters | yes |  |

#### Response

`200`

```json
{
  "context": {
    "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "yearEnd": "2025-12-31",
    "revisionNumber": 1,
    "status": "<in_progress | review | complete>",
    "source": "<prepared | imported>",
    "filedAt": "2026-07-14T12:00:00Z",
    "referenceOnly": false,
    "reportingCurrency": "<string>",
    "currencyBasis": "<canadian_currency | functional_currency | reversionary>",
    "balanceConvention": "debits_positive_credits_negative"
  },
  "sourceRevision": {
    "classifiedReportVersion": 0,
    "gifiAssignmentsVersion": 0,
    "gifiCarriedForwardVersion": 0,
    "gifiAutoAppliedAccountIdsVersion": 0,
    "ajeEntriesVersion": 0,
    "lastModifiedAt": "2026-07-14T12:00:00Z",
    "workpaperRevisionDigest": "<string>",
    "snapshotDigest": "<string>"
  },
  "account": {
    "id": "<string>",
    "accountCode": "<string>",
    "accountName": "<string>",
    "currentYearBalance": "125000.5",
    "priorYearBalance": "-4200",
    "changeStatus": "<new | removed | significant_increase | significant_decrease | minor_change | unchanged | unknown>"
  },
  "classification": {
    "availability": "<classified | not_classified>",
    "userStatus": "<pending | modified | accepted>",
    "ruleId": "<string>",
    "source": "<rule | prior_year | llm | llm_failed | manual>",
    "confidence": "<decimal>",
    "assumption": "<string>",
    "bookTreatment": "<accept_as_booked | reclassify | accrue_adjust | write_off | requires_review | unclassified>",
    "taxTreatment": "<fully_deductible | non_deductible_full | partially_deductible | capital_cca | timing_difference | deduct_other_schedule | non_taxable | disclosure_only | informational | unclassified>",
    "bookTreatmentSource": "<derived | manual>",
    "taxTreatmentSource": "<derived | manual>",
    "s1Line": "<string>",
    "feedsSchedule": "<string>",
    "taxAssumptionNote": "<string>",
    "derivationRuleId": "<string>",
    "adjustmentType": "<addition | deduction>",
    "deductibilityRule": "<string>",
    "deductibilityPercentage": "<decimal>",
    "incomeType": "<active_business | property | rental | capital>",
    "incomeTypeSource": "<derived | manual>",
    "foreignSource": false,
    "subtype": "<string>",
    "conditionalOn": "<string>",
    "templateId": "<string>",
    "itaReferences": [
      "<string>"
    ]
  },
  "gifiMapping": {
    "assignedGifiCode": "<string>",
    "carriedForward": false,
    "machineApplied": false,
    "relationToCurrentDefault": "<unassigned | no_default | matches_default | overrides_default>",
    "chartAccount": {
      "id": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "naturalKey": "<string>",
      "accountType": "<asset | liability | equity | revenue | expense | unassigned>",
      "accountSubtype": "<string>",
      "subtypeSource": "<string>",
      "accountTypeSource": "<inferred | firm_template | connector | coa_file | user>",
      "isContra": false,
      "isActive": false,
      "defaultGifiCode": "<string>",
      "defaultGifiSource": "<inferred | firm_template | carried | connector | coa_file | user>",
      "parentAccountCode": "<string>",
      "updatedAt": "2026-07-14T12:00:00Z"
    }
  },
  "adjustmentSummary": {
    "postedBookAdjustmentTotal": "125000.5",
    "adjustedBookBalance": "-4200",
    "postedBookAdjustmentCount": 0,
    "blockedBookAdjustmentCount": 0,
    "workpaperTaxAdjustmentSourceCount": 0,
    "schedule1ImpactEvaluated": false
  },
  "projection": {
    "savedStateOnly": true,
    "classificationIncluded": true,
    "gifiMappingIncluded": true,
    "postedBookAdjustmentsSummarized": true,
    "workpaperTaxAdjustmentsSummarized": true,
    "workpaperAmountsAllocatedToAccount": false,
    "schedule1ImpactEvaluated": false,
    "computationEvaluated": false,
    "lineageIncluded": false,
    "readinessEvaluated": false,
    "storageMetadataIncluded": false
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `context` | object | yes |  |
| `context.engagementId` | string (uuid) | yes |  |
| `context.yearEnd` | string (date) | yes |  |
| `context.revisionNumber` | integer, at least 1 | yes |  |
| `context.status` | one of `in_progress`, `review`, `complete` | yes |  |
| `context.source` | one of `prepared`, `imported` | yes |  |
| `context.filedAt` | nullable string (date-time) | yes |  |
| `context.referenceOnly` | boolean | yes |  |
| `context.reportingCurrency` | string, matching `^[A-Z]{3}$` | yes |  |
| `context.currencyBasis` | one of `canadian_currency`, `functional_currency`, `reversionary` | yes |  |
| `context.balanceConvention` | string, always `"debits_positive_credits_negative"` | yes |  |
| `sourceRevision` | object | yes |  |
| `sourceRevision.classifiedReportVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiAssignmentsVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiCarriedForwardVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiAutoAppliedAccountIdsVersion` | integer, at least 0 | yes |  |
| `sourceRevision.ajeEntriesVersion` | integer, at least 0 | yes |  |
| `sourceRevision.lastModifiedAt` | string (date-time) | yes |  |
| `sourceRevision.workpaperRevisionDigest` | string, matching `^sha256:[0-9a-f]{64}$` | yes |  |
| `sourceRevision.snapshotDigest` | string, matching `^sha256:[0-9a-f]{64}$` | yes |  |
| `account` | object | yes |  |
| `account.id` | string, 1 to 128 characters | yes |  |
| `account.accountCode` | nullable string, up to 128 characters | yes |  |
| `account.accountName` | string, up to 512 characters | yes |  |
| `account.currentYearBalance` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `account.priorYearBalance` | nullable decimal string, 1 to 96 characters | yes |  |
| `account.changeStatus` | one of `new`, `removed`, `significant_increase`, `significant_decrease`, `minor_change`, `unchanged`, `unknown` | yes |  |
| `classification` | object | yes |  |
| `classification.availability` | one of `classified`, `not_classified` | yes |  |
| `classification.userStatus` | nullable one of `pending`, `modified`, `accepted` | yes |  |
| `classification.ruleId` | nullable string, up to 256 characters | yes |  |
| `classification.source` | nullable one of `rule`, `prior_year`, `llm`, `llm_failed`, `manual` | yes |  |
| `classification.confidence` | nullable decimal string, 1 to 96 characters | yes |  |
| `classification.assumption` | nullable string, up to 4000 characters | yes |  |
| `classification.bookTreatment` | nullable one of `accept_as_booked`, `reclassify`, `accrue_adjust`, `write_off`, `requires_review`, `unclassified` | yes |  |
| `classification.taxTreatment` | nullable one of `fully_deductible`, `non_deductible_full`, `partially_deductible`, `capital_cca`, `timing_difference`, `deduct_other_schedule`, `non_taxable`, `disclosure_only`, `informational`, `unclassified` | yes |  |
| `classification.bookTreatmentSource` | nullable one of `derived`, `manual` | yes |  |
| `classification.taxTreatmentSource` | nullable one of `derived`, `manual` | yes |  |
| `classification.s1Line` | nullable string, up to 32 characters | yes |  |
| `classification.feedsSchedule` | nullable string, up to 32 characters | yes |  |
| `classification.taxAssumptionNote` | nullable string, up to 4000 characters | yes |  |
| `classification.derivationRuleId` | nullable string, up to 256 characters | yes |  |
| `classification.adjustmentType` | nullable one of `addition`, `deduction` | yes |  |
| `classification.deductibilityRule` | nullable string, up to 2000 characters | yes |  |
| `classification.deductibilityPercentage` | nullable decimal string, 1 to 96 characters | yes |  |
| `classification.incomeType` | nullable one of `active_business`, `property`, `rental`, `capital` | yes |  |
| `classification.incomeTypeSource` | nullable one of `derived`, `manual` | yes |  |
| `classification.foreignSource` | nullable boolean | yes |  |
| `classification.subtype` | nullable string, up to 64 characters | yes |  |
| `classification.conditionalOn` | nullable string, up to 2000 characters | yes |  |
| `classification.templateId` | nullable string, up to 256 characters | yes |  |
| `classification.itaReferences` | array of strings, up to 32 items | yes |  |
| `gifiMapping` | object | yes |  |
| `gifiMapping.assignedGifiCode` | nullable string, matching `^[0-9]{4}$` | yes |  |
| `gifiMapping.carriedForward` | boolean | yes |  |
| `gifiMapping.machineApplied` | boolean | yes |  |
| `gifiMapping.relationToCurrentDefault` | one of `unassigned`, `no_default`, `matches_default`, `overrides_default` | yes |  |
| `gifiMapping.chartAccount` | nullable object | yes |  |
| `gifiMapping.chartAccount.id` | string (uuid) | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.naturalKey` | string, 1 to 517 characters | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.accountType` | one of `asset`, `liability`, `equity`, `revenue`, `expense`, `unassigned` | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.accountSubtype` | nullable string, up to 256 characters | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.subtypeSource` | nullable string, up to 64 characters | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.accountTypeSource` | one of `inferred`, `firm_template`, `connector`, `coa_file`, `user` | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.isContra` | boolean | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.isActive` | boolean | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.defaultGifiCode` | nullable string, matching `^[0-9]{4}$` | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.defaultGifiSource` | nullable one of `inferred`, `firm_template`, `carried`, `connector`, `coa_file`, `user` | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.parentAccountCode` | nullable string, up to 128 characters | when `chartAccount` is set |  |
| `gifiMapping.chartAccount.updatedAt` | string (date-time) | when `chartAccount` is set |  |
| `adjustmentSummary` | object | yes |  |
| `adjustmentSummary.postedBookAdjustmentTotal` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `adjustmentSummary.adjustedBookBalance` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `adjustmentSummary.postedBookAdjustmentCount` | integer, at least 0 | yes |  |
| `adjustmentSummary.blockedBookAdjustmentCount` | integer, at least 0 | yes |  |
| `adjustmentSummary.workpaperTaxAdjustmentSourceCount` | integer, at least 0 | yes |  |
| `adjustmentSummary.schedule1ImpactEvaluated` | boolean, always `false` | yes |  |
| `projection` | object | yes |  |
| `projection.savedStateOnly` | boolean, always `true` | yes |  |
| `projection.classificationIncluded` | boolean, always `true` | yes |  |
| `projection.gifiMappingIncluded` | boolean, always `true` | yes |  |
| `projection.postedBookAdjustmentsSummarized` | boolean, always `true` | yes |  |
| `projection.workpaperTaxAdjustmentsSummarized` | boolean, always `true` | yes |  |
| `projection.workpaperAmountsAllocatedToAccount` | boolean, always `false` | yes |  |
| `projection.schedule1ImpactEvaluated` | boolean, always `false` | yes |  |
| `projection.computationEvaluated` | boolean, always `false` | yes |  |
| `projection.lineageIncluded` | boolean, always `false` | yes |  |
| `projection.readinessEvaluated` | boolean, always `false` | yes |  |
| `projection.storageMetadataIncluded` | boolean, always `false` | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `404`: The engagement or active account does not exist in the caller's organization.
- `409`: The saved account data cannot be represented safely.

## List saved account adjustments

`GET /api/v1/engagements/{engagement_id}/accounts/{account_id}/adjustments`

Returns posted or blocked book AJEs affecting the requested account and separately lists linked workpaper tax-adjustment sources. Only requested-account AJE lines are exposed. A shared workpaper amount is the whole workpaper amount, not an allocation to this account, and Schedule 1 routing is not evaluated by this saved-state read.

Scope: `tax-data:read`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/accounts/$ACCOUNT_ID/adjustments \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
ACCOUNT_ID = "<account-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/accounts/{ACCOUNT_ID}/adjustments",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const ACCOUNT_ID = "<account-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/accounts/${ACCOUNT_ID}/adjustments`, {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |
| `account_id` | path | string, 1 to 128 characters | yes |  |

#### Response

`200`

```json
{
  "context": {
    "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "yearEnd": "2025-12-31",
    "revisionNumber": 1,
    "status": "<in_progress | review | complete>",
    "source": "<prepared | imported>",
    "filedAt": "2026-07-14T12:00:00Z",
    "referenceOnly": false,
    "reportingCurrency": "<string>",
    "currencyBasis": "<canadian_currency | functional_currency | reversionary>",
    "balanceConvention": "debits_positive_credits_negative"
  },
  "sourceRevision": {
    "classifiedReportVersion": 0,
    "gifiAssignmentsVersion": 0,
    "gifiCarriedForwardVersion": 0,
    "gifiAutoAppliedAccountIdsVersion": 0,
    "ajeEntriesVersion": 0,
    "lastModifiedAt": "2026-07-14T12:00:00Z",
    "workpaperRevisionDigest": "<string>",
    "snapshotDigest": "<string>"
  },
  "account": {
    "id": "<string>",
    "accountCode": "<string>",
    "accountName": "<string>",
    "currentYearBalance": "125000.5",
    "priorYearBalance": "-4200",
    "changeStatus": "<new | removed | significant_increase | significant_decrease | minor_change | unchanged | unknown>"
  },
  "projection": {
    "postedBookAdjustmentsIncluded": true,
    "blockedBookAdjustmentsIncluded": true,
    "workpaperTaxAdjustmentSourcesIncluded": true,
    "unrelatedBookAdjustmentLinesIncluded": false,
    "workpaperAmountsAllocatedToAccount": false,
    "schedule1ImpactEvaluated": false,
    "computationEvaluated": false,
    "readinessEvaluated": false,
    "storageMetadataIncluded": false
  },
  "postedBookAdjustmentTotal": "125000.5",
  "adjustedBookBalance": "-4200",
  "bookAdjustments": [
    {
      "kind": "book_aje",
      "id": "<string>",
      "number": 1,
      "name": "<string>",
      "description": "<string>",
      "entryType": "<adjusting | reclassifying | tax_provision | potential>",
      "source": "<preparer | client>",
      "entryDate": "2025-12-31",
      "recurring": false,
      "postingStatus": "<posted | blocked | excluded>",
      "blockReason": "<unbalanced | unlinked_account>",
      "totalDebits": "125000.5",
      "totalCredits": "-4200",
      "accountEffect": "0",
      "requestedAccountLines": [
        {
          "id": "<string>",
          "type": "<debit | credit>",
          "accountId": "<string>",
          "accountCode": "<string>",
          "accountName": "<string>",
          "amount": "125000.5"
        }
      ]
    }
  ],
  "workpaperTaxAdjustments": [
    {
      "kind": "workpaper_tax_adjustment",
      "workpaperId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
      "templateId": "<string>",
      "displayName": "<string>",
      "version": 1,
      "lifecycleStatus": "<string>",
      "tieOutStatus": "<matched | difference | pending | incomplete>",
      "adjustmentAmount": "125000.5",
      "adjustmentType": "<addition | deduction>",
      "adjustmentStatus": "<string>",
      "legacyStatusDefaulted": false,
      "requiresManualReview": false,
      "linkedAccountCount": 1,
      "linkedAccountIds": [
        "<string>"
      ],
      "allocationBasis": "workpaper_total_not_account_allocated",
      "schedule1ImpactEvaluated": false
    }
  ]
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `context` | object | yes |  |
| `context.engagementId` | string (uuid) | yes |  |
| `context.yearEnd` | string (date) | yes |  |
| `context.revisionNumber` | integer, at least 1 | yes |  |
| `context.status` | one of `in_progress`, `review`, `complete` | yes |  |
| `context.source` | one of `prepared`, `imported` | yes |  |
| `context.filedAt` | nullable string (date-time) | yes |  |
| `context.referenceOnly` | boolean | yes |  |
| `context.reportingCurrency` | string, matching `^[A-Z]{3}$` | yes |  |
| `context.currencyBasis` | one of `canadian_currency`, `functional_currency`, `reversionary` | yes |  |
| `context.balanceConvention` | string, always `"debits_positive_credits_negative"` | yes |  |
| `sourceRevision` | object | yes |  |
| `sourceRevision.classifiedReportVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiAssignmentsVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiCarriedForwardVersion` | integer, at least 0 | yes |  |
| `sourceRevision.gifiAutoAppliedAccountIdsVersion` | integer, at least 0 | yes |  |
| `sourceRevision.ajeEntriesVersion` | integer, at least 0 | yes |  |
| `sourceRevision.lastModifiedAt` | string (date-time) | yes |  |
| `sourceRevision.workpaperRevisionDigest` | string, matching `^sha256:[0-9a-f]{64}$` | yes |  |
| `sourceRevision.snapshotDigest` | string, matching `^sha256:[0-9a-f]{64}$` | yes |  |
| `account` | object | yes |  |
| `account.id` | string, 1 to 128 characters | yes |  |
| `account.accountCode` | nullable string, up to 128 characters | yes |  |
| `account.accountName` | string, up to 512 characters | yes |  |
| `account.currentYearBalance` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `account.priorYearBalance` | nullable decimal string, 1 to 96 characters | yes |  |
| `account.changeStatus` | one of `new`, `removed`, `significant_increase`, `significant_decrease`, `minor_change`, `unchanged`, `unknown` | yes |  |
| `projection` | object | yes |  |
| `projection.postedBookAdjustmentsIncluded` | boolean, always `true` | yes |  |
| `projection.blockedBookAdjustmentsIncluded` | boolean, always `true` | yes |  |
| `projection.workpaperTaxAdjustmentSourcesIncluded` | boolean, always `true` | yes |  |
| `projection.unrelatedBookAdjustmentLinesIncluded` | boolean, always `false` | yes |  |
| `projection.workpaperAmountsAllocatedToAccount` | boolean, always `false` | yes |  |
| `projection.schedule1ImpactEvaluated` | boolean, always `false` | yes |  |
| `projection.computationEvaluated` | boolean, always `false` | yes |  |
| `projection.readinessEvaluated` | boolean, always `false` | yes |  |
| `projection.storageMetadataIncluded` | boolean, always `false` | yes |  |
| `postedBookAdjustmentTotal` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `adjustedBookBalance` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `bookAdjustments` | array of objects, up to 5000 items | yes |  |
| `bookAdjustments[].kind` | string, always `"book_aje"` | yes |  |
| `bookAdjustments[].id` | string, 1 to 128 characters | yes |  |
| `bookAdjustments[].number` | integer, at least 1 | yes |  |
| `bookAdjustments[].name` | string, up to 512 characters | yes |  |
| `bookAdjustments[].description` | string, up to 4000 characters | yes |  |
| `bookAdjustments[].entryType` | one of `adjusting`, `reclassifying`, `tax_provision`, `potential` | yes |  |
| `bookAdjustments[].source` | one of `preparer`, `client` | yes |  |
| `bookAdjustments[].entryDate` | nullable string (date) | yes |  |
| `bookAdjustments[].recurring` | boolean | yes |  |
| `bookAdjustments[].postingStatus` | one of `posted`, `blocked`, `excluded` | yes |  |
| `bookAdjustments[].blockReason` | nullable one of `unbalanced`, `unlinked_account` | yes |  |
| `bookAdjustments[].totalDebits` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `bookAdjustments[].totalCredits` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `bookAdjustments[].accountEffect` | nullable decimal string, 1 to 96 characters | yes |  |
| `bookAdjustments[].requestedAccountLines` | array of objects, up to 2000 items | yes |  |
| `bookAdjustments[].requestedAccountLines[].id` | string, 1 to 128 characters | yes |  |
| `bookAdjustments[].requestedAccountLines[].type` | one of `debit`, `credit` | yes |  |
| `bookAdjustments[].requestedAccountLines[].accountId` | string, 1 to 128 characters | yes |  |
| `bookAdjustments[].requestedAccountLines[].accountCode` | nullable string, up to 128 characters | yes |  |
| `bookAdjustments[].requestedAccountLines[].accountName` | string, up to 512 characters | yes |  |
| `bookAdjustments[].requestedAccountLines[].amount` | decimal string, 1 to 96 characters | yes | Exact base-10 amount in the engagement reporting currency. |
| `workpaperTaxAdjustments` | array of objects, up to 2000 items | yes |  |
| `workpaperTaxAdjustments[].kind` | string, always `"workpaper_tax_adjustment"` | yes |  |
| `workpaperTaxAdjustments[].workpaperId` | string (uuid) | yes |  |
| `workpaperTaxAdjustments[].templateId` | nullable string, up to 256 characters | yes |  |
| `workpaperTaxAdjustments[].displayName` | nullable string, up to 512 characters | yes |  |
| `workpaperTaxAdjustments[].version` | integer, at least 1 | yes |  |
| `workpaperTaxAdjustments[].lifecycleStatus` | string, 1 to 64 characters | yes |  |
| `workpaperTaxAdjustments[].tieOutStatus` | nullable one of `matched`, `difference`, `pending`, `incomplete` | yes |  |
| `workpaperTaxAdjustments[].adjustmentAmount` | nullable decimal string, 1 to 96 characters | yes |  |
| `workpaperTaxAdjustments[].adjustmentType` | nullable one of `addition`, `deduction` | yes |  |
| `workpaperTaxAdjustments[].adjustmentStatus` | string, 1 to 128 characters | yes |  |
| `workpaperTaxAdjustments[].legacyStatusDefaulted` | boolean | yes |  |
| `workpaperTaxAdjustments[].requiresManualReview` | boolean | yes |  |
| `workpaperTaxAdjustments[].linkedAccountCount` | integer, at least 1 | yes |  |
| `workpaperTaxAdjustments[].linkedAccountIds` | array of strings, 1 to 20000 items | yes |  |
| `workpaperTaxAdjustments[].allocationBasis` | string, always `"workpaper_total_not_account_allocated"` | yes |  |
| `workpaperTaxAdjustments[].schedule1ImpactEvaluated` | boolean, always `false` | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `404`: The engagement or active account does not exist in the caller's organization.
- `409`: The saved account data cannot be represented safely.

## Compute an engagement's saved state with cells replaced

`POST /api/v1/engagements/{engagement_id}/computations/scenario`

Runs the requested computation targets against the engagement's own saved inputs, replacing only the cells this request names. Cells the request omits keep their saved values, so a what-if holds everything else equal without the caller reassembling the engagement's facts. The saved inputs are never returned; the response carries the computed results and the lineage hash of the state they came from, so two responses are comparable exactly when their hashes match. Nothing is persisted, and readiness is not evaluated: this is engine output, not a filing verdict.

Scopes: `tax-data:read` + `tax:compute`.

#### Request

```bash
curl --request POST https://api.filemark.ca/api/v1/engagements/$ENGAGEMENT_ID/computations/scenario \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "part_i_tax"
    ],
    "inputs": {
      "isCCPC": true
    }
  }'
```

```python
import os
import requests

ENGAGEMENT_ID = "<engagement-id>"
FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    f"https://api.filemark.ca/api/v1/engagements/{ENGAGEMENT_ID}/computations/scenario",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "part_i_tax",
        ],
        "inputs": {
            "isCCPC": True,
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const ENGAGEMENT_ID = "<engagement-id>";
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch(`https://api.filemark.ca/api/v1/engagements/${ENGAGEMENT_ID}/computations/scenario`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "part_i_tax"
    ],
    "inputs": {
      "isCCPC": true
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `engagement_id` | path | string (uuid) | yes |  |

#### Request body

Targets to compute from an engagement's saved data, named cells replaced.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `compute` | array of strings, 1 to 100 items | yes | Schedule/result keys to compute; dependencies run automatically. |
| `inputs` | object | no | Input cells to replace on the engagement's saved computation body; every cell the request omits keeps its saved value. A member replaces its whole top-level cell rather than merging into it, and explicit null is the unanswered-fact sentinel rather than a deletion. Membership and JSON type are checked against the same published cells the batch boundary admits. The cells that identify the engagement's taxation period and its server-authored filing lineage cannot be replaced. |
| `inputs.*` | any | no | Members not listed here. |

#### Response

`200`. Versioned saved-engagement computation shared by REST and MCP.

```json
{
  "data": {
    "engagementId": "3f1a5b2c-9d4e-4f8a-b1c2-0a1b2c3d4e5f",
    "sourceStateSha256": "<string>",
    "appliedOverrides": [
      "<string>"
    ],
    "results": {
      "<member>": "<any>"
    }
  },
  "computeVersion": "<string>",
  "engineSchemaVersion": "<string>",
  "ratesVersion": "<string>",
  "timestamp": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | object | yes | One deterministic computation over an engagement's saved inputs. |
| `data.engagementId` | string (uuid) | yes |  |
| `data.sourceStateSha256` | string | yes | Lineage hash of the engagement's saved state this computation was built from. Two responses carrying the same hash were computed from the same saved facts and are comparable; a different hash means the engagement changed in between. |
| `data.appliedOverrides` | array of strings | yes | The input cells this request replaced, in sorted order. Every other cell came from the engagement's saved inputs. |
| `data.results` | object | yes | Engine output for the requested targets and their automatic dependencies. It is a computation, not a filing verdict: readiness is not evaluated here. |
| `data.results.*` | any | no | The target's output cells; see the [computation reference](/computations). |
| `computeVersion` | string | yes |  |
| `engineSchemaVersion` | string | yes |  |
| `ratesVersion` | string | yes |  |
| `timestamp` | string (date-time) | yes |  |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `404`: The engagement does not exist in the caller's organization.
- `409`: The saved engagement state cannot be computed.

## List computation targets

`GET /api/v1/computations`

Scope: `tax:compute`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/computations \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/computations",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations", {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Response

`200`

```json
{
  "data": {
    "batchTargets": [
      "<string>"
    ],
    "batchDependencies": {
      "<key>": [
        "<string>"
      ]
    },
    "rolloverTargets": [
      "<string>"
    ]
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | object | yes |  |
| `data.batchTargets` | array of strings | yes |  |
| `data.batchDependencies` | map of array of strings | yes |  |
| `data.batchDependencies.{key}` | array of strings | per key |  |
| `data.rolloverTargets` | array of strings | yes |  |

#### Errors

The shared codes only; see [error codes](/errors).

## Get a computation target contract

`GET /api/v1/computations/targets/{target_id}`

Returns every input cell one computation target accepts and every output cell its result carries, with JSON types, the exact `payloadContract` selector, and the target's executed example request. The input cells are the same published dictionary the computation boundary admits against, so a cell listed here is a cell `POST /api/v1/computations/batch` accepts. Cell values stay unvalidated without a `payloadContract`.

Scope: `tax:compute`.

#### Request

```bash
curl https://api.filemark.ca/api/v1/computations/targets/part_i_tax \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN"
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.get(
    "https://api.filemark.ca/api/v1/computations/targets/part_i_tax",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/targets/part_i_tax", {
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
  },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `target_id` | path | string, 1 to 64 characters, matching `^[a-z][a-z0-9_-]*$` | yes | Batch or rollover target id from the computation catalog. |

#### Response

`200`. One target's published contract, shared by REST and MCP.

```json
{
  "data": {
    "id": "<string>",
    "kind": "<batch | rollover>",
    "program": "<string>",
    "jurisdiction": "<string>",
    "status": "<string>",
    "supportedTaxYears": [
      {
        "first": 0,
        "last": 0
      }
    ],
    "contract": {
      "boundaryProfileId": "<string>",
      "payloadSchemaVersion": "<string>"
    },
    "inputs": [
      {
        "path": "<string>",
        "types": [
          "<string>"
        ],
        "required": false,
        "requiredOnDefaultBoundary": false,
        "strictPinned": false,
        "<output cell>": "<any>"
      }
    ],
    "outputs": [
      {
        "path": "<string>",
        "types": [
          "<string>"
        ],
        "<output cell>": "<any>"
      }
    ],
    "exampleInput": {
      "<member>": "<any>"
    },
    "dependencies": [
      "<string>"
    ]
  }
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | object | yes | The cells one computation target accepts and returns. |
| `data.id` | string | yes |  |
| `data.kind` | one of `batch`, `rollover` | yes |  |
| `data.program` | nullable string | no |  |
| `data.jurisdiction` | nullable string | no |  |
| `data.status` | nullable string | no | Contract lifecycle status of the target profile. It is not a filing, CRA-acceptance, or tax-semantics determination. |
| `data.supportedTaxYears` | nullable array of objects | no | Inclusive taxation-year windows for schedule targets; null where a year window does not apply, as for rollover targets. |
| `data.supportedTaxYears[].first` | integer | when `supportedTaxYears` is set |  |
| `data.supportedTaxYears[].last` | nullable integer | when `supportedTaxYears` is set | Last supported taxation year; null means open-ended. |
| `data.contract` | nullable object | no | The exact selector to send as `payloadContract` to validate a request against this target's pinned schema pair. |
| `data.contract.boundaryProfileId` | string, 1 to 128 characters, matching `^[a-z][a-z0-9_.-]*$` | when `contract` is set | Exact strict computation boundary profile identifier. |
| `data.contract.payloadSchemaVersion` | string, up to 64 characters, matching `^[0-9]+\.[0-9]+\.[0-9]+$` | when `contract` is set | Exact semantic version of the target payload schema pair. |
| `data.inputs` | array of objects | yes |  |
| `data.inputs[].path` | string | yes | Dotted path of this cell inside the request's `inputs` object; a `[]` segment addresses the elements of an array. |
| `data.inputs[].types` | array of strings | yes | Every JSON type the boundary admits at this position. |
| `data.inputs[].required` | boolean | yes | Whether the strict payload contract requires this cell. On the default boundary only the cells flagged `requiredOnDefaultBoundary` are required. |
| `data.inputs[].requiredOnDefaultBoundary` | boolean | yes | Whether every request needs this cell: the default boundary (no `payloadContract`) refuses the request when it is omitted or null. True for a batch target's `taxYear` and for the statutory scope facts a rollover cannot answer on the caller's behalf. |
| `data.inputs[].strictPinned` | boolean | yes | Whether the strict profile admits exactly one value here. A pinned cell constrains only a request that names a `payloadContract`; the default boundary leaves values free. |
| `data.inputs[].*` | any | no | Members not listed here. |
| `data.outputs` | array of objects | yes |  |
| `data.outputs[].path` | string | yes | Dotted path of this cell inside the target's result object; a `[]` segment addresses the elements of an array. |
| `data.outputs[].types` | array of strings | yes | Every JSON type this result position can carry. |
| `data.outputs[].*` | any | no | Members not listed here. |
| `data.exampleInput` | nullable object | no | The target's executed, admission-checked golden request body: the value a caller sends as `inputs`. |
| `data.exampleInput.*` | any | no | Members not listed here. |
| `data.dependencies` | nullable array of strings | no | Batch targets that run automatically with this one, whose input cells the request may therefore also carry. Null for rollovers. |

#### Errors

Beyond the shared codes in [error codes](/errors):

- `404`: The computation target is not in the public catalog.

## Compute tax schedules

`POST /api/v1/computations/batch`

Scope: `tax:compute`.

#### Request

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/batch \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "compute": [
      "part_i_tax"
    ],
    "inputs": {
      "schedule1": {},
      "taxYear": 2025,
      "fiscalStart": "2025-01-01",
      "fiscalEnd": "2025-12-31",
      "isCCPC": true,
      "daysInYear": 365
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/batch",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "compute": [
            "part_i_tax",
        ],
        "inputs": {
            "schedule1": {},
            "taxYear": 2025,
            "fiscalStart": "2025-01-01",
            "fiscalEnd": "2025-12-31",
            "isCCPC": True,
            "daysInYear": 365,
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/batch", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "compute": [
      "part_i_tax"
    ],
    "inputs": {
      "schedule1": {},
      "taxYear": 2025,
      "fiscalStart": "2025-01-01",
      "fiscalEnd": "2025-12-31",
      "isCCPC": true,
      "daysInYear": 365
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Request body

A bounded set of schedule targets plus their canonical engine inputs.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `compute` | array of strings, 1 to 100 items | yes | Schedule/result keys to compute; dependencies run automatically. |
| `inputs` | object | no | Canonical batch-engine inputs. Every member must be a published input cell of a requested target or of a dependency that runs automatically, with the published JSON type; unpublished members and wrong-typed cells are rejected with per-field details. Cell values beyond their JSON type are validated only under a payloadContract selector. |
| `inputs.*` | any | no | Members not listed here. |
| `vendorInput` | object | no | Optional vendor-cell input adapter. Each cell must resolve unambiguously through the versioned handoff mapping to an approved one-to-one canonical input path. Omit for canonical inputs only; null is not valid. |
| `vendorInput.vendor` | one of `taxcycle`, `taxprep` | when `vendorInput` is set | Vendor vocabulary used by every key in cells. |
| `vendorInput.cells` | object | when `vendorInput` is set | Exact, case-sensitive TaxCycle field codes or Taxprep cell IDs. Values retain their canonical Filemark JSON types and are never decoded, signed, rounded, or otherwise coerced. |
| `vendorInput.cells.*` | any | no | Members not listed here. |
| `payloadContract` | object | no | Optional exact strict target contract. Omit this property to use the published legacy computation boundary; null is not valid. |
| `payloadContract.boundaryProfileId` | string, 1 to 128 characters, matching `^[a-z][a-z0-9_.-]*$` | when `payloadContract` is set | Exact strict computation boundary profile identifier. |
| `payloadContract.payloadSchemaVersion` | string, up to 64 characters, matching `^[0-9]+\.[0-9]+\.[0-9]+$` | when `payloadContract` is set | Exact semantic version of the target payload schema pair. |
| `handoff` | object | no | Optional handoff projection. Formats 'json' and 'file' carry the selected vendor's import identifiers and encoded schedule values, byte-identical to the Filemark companion files, or as those files themselves, plus coverage warnings and mapping provenance. Format 'gfi' takes no vendor and returns the universal RC4088 file from computed Schedule 100/125 amounts; corporationName and businessNumber are required for that format. T2-jacket and S141 vendor-cell rows are out of stateless scope. A safety gate that would block a companion-file export returns data.handoff.blocked with the reason while data.results stays intact. Verify cell identifiers: the build they were mapped against is reported as data.handoff.vendorEdition, confirm your install matches it before importing. Omit this property for no projection; null is not valid. |
| `handoff.vendor` | one of `taxcycle`, `taxprep`, `ifirm` | when `handoff` is set | Receiving product whose import identifiers the response's data.handoff block carries: 'taxcycle' (per-form Excel Import Forms field codes), 'taxprep' (Corporate Taxprep .csv cell IDs), or 'ifirm' (CCH iFirm cells/setdata cell paths). Required for formats 'json' and 'file'; omit it for format 'gfi'. |
| `handoff.format` | one of `json`, `file`, `gfi` | when `handoff` is set | Container for those cells. 'json' (the default) returns them as structured data: data.handoff.cells, or data.handoff.forms for TaxCycle. 'file' returns the receiving product's own import file instead, base64-encoded in data.handoff.files. Taxprep and CCH iFirm take one .csv; TaxCycle takes one .xlsx workbook per form. 'gfi' returns the universal RC4088 .gfi file and takes no vendor. |
| `handoff.language` | one of `en`, `fr` | when `handoff` is set | Taxprep import-file language: 'en' declares [Filemark\|0\|0] and 'fr' declares [Filemark\|0\|1]. It applies to Taxprep and CCH iFirm format 'file' projections and defaults to English, matching the persisted handoff-package route. |
| `handoff.corporationName` | string, 1 to 200 characters | when `handoff` is set | Corporation name used to identify a format 'gfi' artifact. Optional on the selector, but format 'gfi' refuses when absent. |
| `handoff.businessNumber` | string, 9 to 32 characters | when `handoff` is set | Corporation BN9 or RC program-account number for the format 'gfi' header. Optional on the selector, but format 'gfi' refuses when absent or malformed. |

#### Response

`200`. Versioned computation output shared by REST and MCP.

```json
{
  "data": {
    "results": {
      "part_i_tax": {
        "ready": false,
        "provisional": false,
        "warnings": [],
        "<output cell>": "<any>"
      }
    },
    "result": {
      "ready": false,
      "provisional": false,
      "warnings": [],
      "<output cell>": "<any>"
    },
    "handoff": {
      "blocked": null,
      "warnings": [],
      "<output cell>": "<any>"
    },
    "vendorInput": {
      "vendor": "<taxcycle | taxprep>",
      "mappingTableVersion": "<string>",
      "vendorEdition": "<string>",
      "fieldMapVersion": "<string>",
      "applied": [
        {
          "cell": "<string>",
          "schedule": "<string>",
          "filemarkConcept": "<string>",
          "inputPath": "<string>",
          "cardinality": "one_to_one"
        }
      ]
    },
    "readiness": {
      "ready": false,
      "<output cell>": "<any>"
    },
    "<output cell>": "<any>"
  },
  "computeVersion": "<string>",
  "engineSchemaVersion": "<string>",
  "ratesVersion": "<string>",
  "timestamp": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | object | yes | Computed target results and any requested handoff projection. Target results can publish ready, provisional, and warnings; saved-filing responses may also publish readiness. A handoff projection reports blocked when draft or unready results cannot be exported safely. |
| `data.results` | map of object | no |  |
| `data.results.{key}` | object | per key |  |
| `data.results.{key}.ready` | boolean | per key |  |
| `data.results.{key}.provisional` | boolean | per key |  |
| `data.results.{key}.warnings` | array of any | per key |  |
| `data.results.{key}.*` | any | no | The target's output cells; see the [computation reference](/computations). |
| `data.result` | object | no |  |
| `data.result.ready` | boolean | when `result` is set |  |
| `data.result.provisional` | boolean | when `result` is set |  |
| `data.result.warnings` | array of any | when `result` is set |  |
| `data.result.*` | any | no | The target's output cells; see the [computation reference](/computations). |
| `data.handoff` | object | no |  |
| `data.handoff.blocked` | nullable object | when `handoff` is set |  |
| `data.handoff.warnings` | array of any | when `handoff` is set |  |
| `data.handoff.*` | any | no | Members not listed here. |
| `data.vendorInput` | object | no | Mapping provenance for accepted vendor cells; present only when vendorInput was submitted. Values are never echoed. |
| `data.vendorInput.vendor` | one of `taxcycle`, `taxprep` | when `vendorInput` is set |  |
| `data.vendorInput.mappingTableVersion` | string | when `vendorInput` is set |  |
| `data.vendorInput.vendorEdition` | nullable string | when `vendorInput` is set |  |
| `data.vendorInput.fieldMapVersion` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied` | array of objects | when `vendorInput` is set |  |
| `data.vendorInput.applied[].cell` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].schedule` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].filemarkConcept` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].inputPath` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].cardinality` | string, always `"one_to_one"` | when `vendorInput` is set |  |
| `data.readiness` | object | no |  |
| `data.readiness.ready` | boolean | when `readiness` is set |  |
| `data.readiness.*` | any | no | Members not listed here. |
| `data.*` | any | no | Members not listed here. |
| `computeVersion` | string | yes |  |
| `engineSchemaVersion` | string | yes |  |
| `ratesVersion` | string | yes | Content hash of the rate-table sources and their verification manifest: the same pin the filing lane records. Two responses with equal computeVersion AND ratesVersion were computed on identical engine code and identical rate tables. |
| `timestamp` | string (date-time) | yes |  |

#### Errors

The shared codes only; see [error codes](/errors).

## Compute a rollover or reorganization

`POST /api/v1/computations/rollovers/{target}`

Scope: `tax:compute`.

#### Request

```bash
curl --request POST https://api.filemark.ca/api/v1/computations/rollovers/section-22 \
  --header "Authorization: Bearer $FILEMARK_ACCESS_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "inputs": {
      "receivables": {
        "faceValue": 100000,
        "electedAmount": 80000,
        "vendorClaimedS20_1_pBefore": 0,
        "fairMarketValue": null,
        "vendorPriorS20_1_pDeductions": null
      },
      "party": {
        "jointElectionFiled": true,
        "soldAllOrSubstantiallyAllBusinessProperty": true,
        "purchaserProposesToContinueBusiness": true,
        "nonArmsLength": false
      }
    }
  }'
```

```python
import os
import requests

FILEMARK_ACCESS_TOKEN = os.environ["FILEMARK_ACCESS_TOKEN"]

response = requests.post(
    "https://api.filemark.ca/api/v1/computations/rollovers/section-22",
    headers={
        "Authorization": f"Bearer {FILEMARK_ACCESS_TOKEN}",
    },
    json={
        "inputs": {
            "receivables": {
                "faceValue": 100000,
                "electedAmount": 80000,
                "vendorClaimedS20_1_pBefore": 0,
                "fairMarketValue": None,
                "vendorPriorS20_1_pDeductions": None,
            },
            "party": {
                "jointElectionFiled": True,
                "soldAllOrSubstantiallyAllBusinessProperty": True,
                "purchaserProposesToContinueBusiness": True,
                "nonArmsLength": False,
            },
        },
    },
)
response.raise_for_status()
print(response.json())
```

```javascript
const FILEMARK_ACCESS_TOKEN = process.env.FILEMARK_ACCESS_TOKEN;

const response = await fetch("https://api.filemark.ca/api/v1/computations/rollovers/section-22", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${FILEMARK_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "inputs": {
      "receivables": {
        "faceValue": 100000,
        "electedAmount": 80000,
        "vendorClaimedS20_1_pBefore": 0,
        "fairMarketValue": null,
        "vendorPriorS20_1_pDeductions": null
      },
      "party": {
        "jointElectionFiled": true,
        "soldAllOrSubstantiallyAllBusinessProperty": true,
        "purchaserProposesToContinueBusiness": true,
        "nonArmsLength": false
      }
    }
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
```

#### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `target` | path | string | yes |  |

#### Request body

Inputs for one rollover, reorganization, or screening engine.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `inputs` | object | no | Canonical rollover-engine inputs. Every member must be a published input cell of the target, with the published JSON type; unpublished members and wrong-typed cells are rejected with per-field details. Cell values beyond their JSON type are validated only under a payloadContract selector. |
| `inputs.*` | any | no | Members not listed here. |
| `payloadContract` | object | no | Optional exact strict target contract. Omit this property to use the published legacy computation boundary; null is not valid. |
| `payloadContract.boundaryProfileId` | string, 1 to 128 characters, matching `^[a-z][a-z0-9_.-]*$` | when `payloadContract` is set | Exact strict computation boundary profile identifier. |
| `payloadContract.payloadSchemaVersion` | string, up to 64 characters, matching `^[0-9]+\.[0-9]+\.[0-9]+$` | when `payloadContract` is set | Exact semantic version of the target payload schema pair. |

#### Response

`200`. Versioned computation output shared by REST and MCP.

```json
{
  "data": {
    "results": {
      "section-22": {
        "ready": false,
        "provisional": false,
        "warnings": [],
        "<output cell>": "<any>"
      }
    },
    "result": {
      "ready": false,
      "provisional": false,
      "warnings": [],
      "<output cell>": "<any>"
    },
    "handoff": {
      "blocked": null,
      "warnings": [],
      "<output cell>": "<any>"
    },
    "vendorInput": {
      "vendor": "<taxcycle | taxprep>",
      "mappingTableVersion": "<string>",
      "vendorEdition": "<string>",
      "fieldMapVersion": "<string>",
      "applied": [
        {
          "cell": "<string>",
          "schedule": "<string>",
          "filemarkConcept": "<string>",
          "inputPath": "<string>",
          "cardinality": "one_to_one"
        }
      ]
    },
    "readiness": {
      "ready": false,
      "<output cell>": "<any>"
    },
    "<output cell>": "<any>"
  },
  "computeVersion": "<string>",
  "engineSchemaVersion": "<string>",
  "ratesVersion": "<string>",
  "timestamp": "2026-07-14T12:00:00Z"
}
```

#### Response fields

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `data` | object | yes | Computed target results and any requested handoff projection. Target results can publish ready, provisional, and warnings; saved-filing responses may also publish readiness. A handoff projection reports blocked when draft or unready results cannot be exported safely. |
| `data.results` | map of object | no |  |
| `data.results.{key}` | object | per key |  |
| `data.results.{key}.ready` | boolean | per key |  |
| `data.results.{key}.provisional` | boolean | per key |  |
| `data.results.{key}.warnings` | array of any | per key |  |
| `data.results.{key}.*` | any | no | The target's output cells; see the [computation reference](/computations). |
| `data.result` | object | no |  |
| `data.result.ready` | boolean | when `result` is set |  |
| `data.result.provisional` | boolean | when `result` is set |  |
| `data.result.warnings` | array of any | when `result` is set |  |
| `data.result.*` | any | no | The target's output cells; see the [computation reference](/computations). |
| `data.handoff` | object | no |  |
| `data.handoff.blocked` | nullable object | when `handoff` is set |  |
| `data.handoff.warnings` | array of any | when `handoff` is set |  |
| `data.handoff.*` | any | no | Members not listed here. |
| `data.vendorInput` | object | no | Mapping provenance for accepted vendor cells; present only when vendorInput was submitted. Values are never echoed. |
| `data.vendorInput.vendor` | one of `taxcycle`, `taxprep` | when `vendorInput` is set |  |
| `data.vendorInput.mappingTableVersion` | string | when `vendorInput` is set |  |
| `data.vendorInput.vendorEdition` | nullable string | when `vendorInput` is set |  |
| `data.vendorInput.fieldMapVersion` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied` | array of objects | when `vendorInput` is set |  |
| `data.vendorInput.applied[].cell` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].schedule` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].filemarkConcept` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].inputPath` | string | when `vendorInput` is set |  |
| `data.vendorInput.applied[].cardinality` | string, always `"one_to_one"` | when `vendorInput` is set |  |
| `data.readiness` | object | no |  |
| `data.readiness.ready` | boolean | when `readiness` is set |  |
| `data.readiness.*` | any | no | Members not listed here. |
| `data.*` | any | no | Members not listed here. |
| `computeVersion` | string | yes |  |
| `engineSchemaVersion` | string | yes |  |
| `ratesVersion` | string | yes | Content hash of the rate-table sources and their verification manifest: the same pin the filing lane records. Two responses with equal computeVersion AND ratesVersion were computed on identical engine code and identical rate tables. |
| `timestamp` | string (date-time) | yes |  |

#### Errors

The shared codes only; see [error codes](/errors).

# Rate limits

A request counts against the same budget whether it arrives over REST or MCP. "API client" below means the OAuth client, not a client record.

| Limit | Per | Covers |
| --- | --- | --- |
| 120 requests per rolling minute | API client | Reads outside the computation domain |
| 60 requests per rolling minute | API client | The computation domain: the catalog, target-contract reads, batch and rollover execution, and saved-state scenarios |
| 240 requests per rolling minute | Principal, MCP only | Every MCP request after the bearer token is verified, including `initialize`, tool and resource listing, and notifications |
| 30 attempts per rolling minute | API client (verified), across source IPs; per practitioner and workspace for delegated grants | Token minting |
| 90 requests per rolling minute | Source IP | Pre-authentication work on REST and the OAuth endpoints, plus rejected MCP authentication attempts |
| 500 requests per five minutes | Source IP | All traffic |

Delegated-user tokens ([delegated access](/delegated-access)) draw on the read and computation budgets per practitioner and workspace rather than per application, so two hosts authorized by the same user share that user's allowance.

The source-IP budgets are raised for the published address ranges of interactive AI hosts, where many users share a few addresses: 1,000 per minute for pre-authentication work and 5,000 per five minutes for all traffic. On REST and the OAuth endpoints an independent budget of 240 per minute per presented bearer token also applies, wherever the token is sent from; both must pass.

Exhausting a budget is a `429`. Token-minting exhaustion carries the OAuth error `temporarily_unavailable`; the MCP transport budget carries `{"error": "rate_limit_exceeded"}`; read or computation exhaustion inside an MCP tool call is a tool error with retry guidance rather than an HTTP status.

# Error codes

The REST API and the MCP server return these HTTP status codes:

| Status | Meaning |
| --- | --- |
| `400` or `422` | The request or one of its parameters is invalid. |
| `401` | The token is missing, invalid, expired, or unknown. |
| `403` | The client is disabled or the effective scope is insufficient. |
| `404` | The route or organization-scoped resource was not found. |
| `405` | The HTTP method is not supported for the public resource. |
| `409` | The operation conflicts with the current saved state or lifecycle state. |
| `413` | The request body exceeds the [size limit](/conventions#requests), or a computation payload contains an array longer than 500 items. |
| `429` | A request budget was exceeded. Respect `Retry-After`. |
| `500` | An unexpected server error occurred. |
| `502` | A required upstream service failed to complete the operation. |
| `503` | Authentication or a required service is temporarily unavailable. Respect `Retry-After` when present. |

Every error the API returns has the same shape: a `requestId` and an `error` object. `error.code` is for your code and `error.message` is for people. An oversized body (`413`) and a malformed `Content-Length` header (`400`) are rejected before the request reaches the API, so they return `{"error": "<message>"}` with no request ID; on `/oauth2/*` those two use the OAuth shape with `error` set to `invalid_request`.

| `error.code` | Meaning |
| --- | --- |
| `invalid_request` | `400` or `422`; `error.details` names the failing fields when there are any. |
| `unauthorized` | `401`. |
| `forbidden` | `403`, the client is disabled. |
| `insufficient_scope` | `403`, the token lacks a scope the operation requires. |
| `not_found` | `404`. |
| `method_not_allowed` | `405`. |
| `conflict` | `409`. |
| `request_too_large` | `413`. |
| `rate_limit_exceeded` | `429`. |
| `result_not_representable` | `422`; a strict `payloadContract` admitted the request but cannot express the result. See [Pin a strict contract](/run-computations#pin-a-strict-contract). |
| `internal_error` | Any `5xx`. |
| `temporarily_unavailable` | `503`. |
| `request_failed` | Any other status. |

The token endpoint uses the OAuth 2.0 error shape instead; its codes are under [Authentication](/authentication#token-endpoint-errors). MCP tool errors carry the same envelope inside the tool result; see [Connect over MCP](/mcp#errors-and-request-ids).

## Validation details

`error.details` is present, one entry per failing field, on:

- `422`: a request parameter failed validation.
- `400`: the default computation boundary refused an `inputs` cell.
- `400`: a strict `payloadContract` refused the request.
- `400`: a saved-state scenario named a cell the engagement owns.

```json
{
  "requestId": "2f711c6917484e93b3c45a034a405c91",
  "error": {
    "code": "invalid_request",
    "message": "The computation input does not satisfy the selected strict contract.",
    "details": [
      {
        "location": "body.inputs.partnership.priorInterestAcb",
        "message": "Does not satisfy the 'maximum' constraint of the selected strict input schema.",
        "code": "maximum"
      }
    ]
  }
}
```

Each entry has three fields:

- `location` is the dotted path to the field in your request. An array element appears as its index, so the second element of an array named `rows` is `body.inputs.rows.1`.
- `message` says what was wrong, in one sentence.
- `code` names the check that failed. On a `422` it is the parameter validator's error type, such as `missing` or `less_than_equal`. On a `400` it is a JSON Schema keyword, which you can check against the cell's entry in the [computation reference](/computations).

The default boundary reports these keywords:

| `code` | Meaning |
| --- | --- |
| `additionalProperties` | The cell is not published for the requested targets, or, in a scenario, the saved engagement owns it. |
| `type` | The value is not the cell's published JSON type. |
| `required` | A rollover fact the computation needs was omitted or `null`. The computation reference marks these cells as always required. |
| `not` | Two facts in the request contradict each other. |

A strict contract can report any keyword in the cell's strict profile, such as `required`, `maximum`, or `pattern`.

Submitted values are never echoed back in an error response.

Every `/api/v1` response carries an `X-Request-Id` header, and MCP carries the same identifier in `_meta["ca.filemark/requestId"]`. Quote it when you write to [support@filemark.ca](mailto:support@filemark.ca) about a failed request. Never include credentials or access tokens.

# Computation target reference

## Batch targets

| Target | Covers | Tax years | Input cells | Output cells |
| --- | --- | --- | --- | --- |
| division_c | Filemark T2 batch computation internal aggregate | — | 9 | 114 |
| part_i_tax | Filemark T2 batch computation internal aggregate | — | 6 | 105 |
| pool_tracking | Filemark T2 batch computation internal aggregate | — | 13 | 117 |
| sbd | Filemark T2 batch computation internal aggregate | — | 32 | 82 |
| schedule1 | T2 Corporation Income Tax Return | 2023 and later | 89 | 220 |
| schedule10 | T2 Corporation Income Tax Return | 2016–2017 | 45 | 122 |
| schedule100 | T2 Corporation Income Tax Return | 1998 and later | 21 | 53 |
| schedule101 | T2 Corporation Income Tax Return | 1998 and later | 19 | 48 |
| schedule11 | T2 Corporation Income Tax Return | 1998 and later | 9 | 49 |
| schedule125 | T2 Corporation Income Tax Return | 2010 and later | 42 | 98 |
| schedule13 | T2 Corporation Income Tax Return | 2011 and later | 71 | 106 |
| schedule130 | T2 Corporation Income Tax Return | 2023 and later | 242 | 263 |
| schedule14 | T2 Corporation Income Tax Return | 1998 and later | 11 | 50 |
| schedule15 | T2 Corporation Income Tax Return | 2013 and later | 20 | 46 |
| schedule17 | T2 Corporation Income Tax Return | 2022 and later | 46 | 110 |
| schedule18 | T2 Corporation Income Tax Return | 2019 and later | 52 | 74 |
| schedule2 | T2 Corporation Income Tax Return | 2023 and later | 161 | 154 |
| schedule20 | T2 Corporation Income Tax Return | 2017 and later | 90 | 97 |
| schedule21 | T2 Corporation Income Tax Return | 2023 and later | 145 | 149 |
| schedule23 | T2 Corporation Income Tax Return | 2019 and later | 17 | 32 |
| schedule24 | T2 Corporation Income Tax Return | 2023 and later | 15 | 46 |
| schedule25 | T2 Corporation Income Tax Return | 1998 and later | 11 | 145 |
| schedule27 | T2 Corporation Income Tax Return | 2022 and later | 90 | 133 |
| schedule28 | T2 Corporation Income Tax Return | 2016 and later | 16 | 215 |
| schedule29 | T2 Corporation Income Tax Return | 1998 and later | 8 | 40 |
| schedule3 | T2 Corporation Income Tax Return | 2019 and later | 102 | 159 |
| schedule31 | T2 Corporation Income Tax Return | 2024 and later | 168 | 322 |
| schedule33 | T2 Corporation Income Tax Return | 2014 and later | 45 | 107 |
| schedule34 | T2 Corporation Income Tax Return | 2014 and later | 37 | 95 |
| schedule35 | T2 Corporation Income Tax Return | 2023 and later | 55 | 196 |
| schedule38 | T2 Corporation Income Tax Return | 2008 and later | 95 | 115 |
| schedule39 | T2 Corporation Income Tax Return | 2019 and later | 13 | 40 |
| schedule4 | T2 Corporation Income Tax Return | 2024 and later | 92 | 247 |
| schedule42 | T2 Corporation Income Tax Return | 2011 and later | 25 | 79 |
| schedule43 | T2 Corporation Income Tax Return | 2019 and later | 37 | 84 |
| schedule44 | T2 Corporation Income Tax Return | 2006 and later | 31 | 26 |
| schedule45 | T2 Corporation Income Tax Return | 2005 and later | 22 | 44 |
| schedule49 | T2 Corporation Income Tax Return | 2024 and later | 26 | 38 |
| schedule5 | T2 Corporation Income Tax Return | 2025 and later | 51 | 123 |
| schedule50 | T2 Corporation Income Tax Return | 2006 and later | 12 | 178 |
| schedule513 | T2 Corporation Income Tax Return | 2009 and later | 12 | 48 |
| schedule53 | T2 Corporation Income Tax Return | 2019 and later | 75 | 89 |
| schedule54 | T2 Corporation Income Tax Return | 2022 and later | 51 | 123 |
| schedule55 | T2 Corporation Income Tax Return | 2006 and later | 54 | 53 |
| schedule56 | T2 Corporation Income Tax Return | 2024 and later | 16 | 32 |
| schedule58 | T2 Corporation Income Tax Return | 2023 and later | 31 | 56 |
| schedule6 | T2 Corporation Income Tax Return | 2011 and later | 69 | 255 |
| schedule63 | T2 Corporation Income Tax Return | 2024–2025 | 48 | 390 |
| schedule67 | T2 Corporation Income Tax Return | 2022–2026 | 33 | 55 |
| schedule68 | T2 Corporation Income Tax Return | 2022 and later | 36 | 42 |
| schedule7 | T2 Corporation Income Tax Return | 2022 and later | 87 | 173 |
| schedule71 | T2 Corporation Income Tax Return | 2011 and later | 68 | 95 |
| schedule72 | T2 Corporation Income Tax Return | 2019 and later | 77 | 169 |
| schedule73 | T2 Corporation Income Tax Return | 2019 and later | 83 | 86 |
| schedule74 | T2 Corporation Income Tax Return | 2023 and later | 99 | 134 |
| schedule75 | T2 Corporation Income Tax Return | 2023 and later | 85 | 109 |
| schedule76 | T2 Corporation Income Tax Return | 2024 and later | 76 | 80 |
| schedule78 | T2 Corporation Income Tax Return | 2022 and later | 98 | 127 |
| schedule8 | T2 Corporation Income Tax Return | 2025 and later | 100 | 166 |
| schedule88 | T2 Corporation Income Tax Return | 2013 and later | 5 | 74 |
| schedule89 | T2 Corporation Income Tax Return | 2022 and later | 77 | 99 |
| schedule9 | T2 Corporation Income Tax Return | 2011 and later | 11 | 47 |
| schedule91 | T2 Corporation Income Tax Return | 2008 and later | 53 | 36 |
| schedule92 | T2 Corporation Income Tax Return | 2023–2027 | 17 | 41 |
| schedule97 | T2 Corporation Income Tax Return | 2011 and later | 10 | 39 |
| t2142 | T2 Corporation Income Tax Return | 2025 and later | 54 | 292 |
| t661 | T2 Corporation Income Tax Return | 1985 and later | 157 | 88 |

## Rollover, reorganization, and screening targets

| Target | Covers | Tax years | Input cells | Output cells |
| --- | --- | --- | --- | --- |
| butterfly | Filemark T2 rollover and reorganization preview | — | 34 | 60 |
| capital-dividend-account | Filemark T2 rollover and reorganization preview | — | 39 | 68 |
| debt-forgiveness | Filemark T2 rollover and reorganization preview | — | 55 | 68 |
| gaar-screen | Filemark T2 rollover and reorganization preview | — | 9 | 26 |
| mdr-screen | Filemark T2 rollover and reorganization preview | — | 41 | 47 |
| post-mortem | Filemark T2 rollover and reorganization preview | — | 18 | 53 |
| replacement-property | Filemark T2 rollover and reorganization preview | — | 31 | 49 |
| section-212-1 | Filemark T2 rollover and reorganization preview | — | 41 | 45 |
| section-22 | Filemark T2 rollover and reorganization preview | — | 9 | 38 |
| section-51 | Filemark T2 rollover and reorganization preview | — | 22 | 44 |
| section-84-1 | Filemark T2 rollover and reorganization preview | — | 36 | 47 |
| section-85 | Filemark T2 rollover and reorganization preview | — | 60 | 118 |
| section-85-1 | Filemark T2 rollover and reorganization preview | — | 24 | 47 |
| section-86 | Filemark T2 rollover and reorganization preview | — | 16 | 49 |
| section-87 | Filemark T2 rollover and reorganization preview | — | 41 | 60 |
| section-88 | Filemark T2 rollover and reorganization preview | — | 29 | 56 |
| section-97 | Filemark T2 rollover and reorganization preview | — | 49 | 77 |

# division_c

Filemark T2 batch computation internal aggregate

- Kind: batch
- Supported tax years: —
- Strict profile: division_c_exact_2025_default_branch_v1
- Payload schema version: 8.0.0
- Dependencies (run automatically): schedule1, schedule2, schedule3, schedule4, schedule43

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "division_c"
  ],
  "inputs": {
    "schedule1": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (9)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| division_c.divisionBIncome | number |  |
| division_c.rawTaxableIncome | number |  |
| division_c.taxableIncome | number |  |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule1 | object | strict |
| taxYear | number \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 9 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (114)

| Cell | Types |
| --- | --- |
| deductions.line340_creditUnionAllocation | number |
| deductions.line352_nqSecurityEmployerDeduction | number |
| deductions.line355_section110_5Additions | number |
| dividendDeductions.line311_s112 | number |
| dividendDeductions.line313_partVI1 | number |
| dividendDeductions.line315_prospector | number |
| dividendDeductions.line320_subtotal | number |
| divisionBIncome | number |
| donationDeductions.line314_ecologicalGifts | number |
| donationDeductions.line315_medicineGifts | number |
| donationDeductions.line325_charitable | number |
| donationDeductions.line335_culturalGifts | number |
| donationDeductions.line340_subtotal | number |
| excessDeductions | number |
| lossDeductions.line350_losses | number |
| provisional | boolean |
| rawTaxableIncome | number |
| taxableIncome | number |
| warnings[].accountBalance | null \| number \| string |
| warnings[].accountCode | null \| string |
| warnings[].accountId | array \| boolean \| null \| number \| object \| string |
| warnings[].accountName | null \| string |
| warnings[].actual | number |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.display | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.kind | string |
| warnings[].citation.rule | string |
| warnings[].citation.section | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].expected | array \| boolean \| null \| number \| object \| string |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| warnings[].severity | string |
| warnings[].source | string |
| warnings[].templateId | null \| string |
| warnings[].message | string |
| warnings[].route | null \| string |
| warnings[].amount | number |
| warnings[].field | string |
| warnings[].line | string |
| warnings[] | object |
| warnings[].controlledAffiliateCount | integer |
| warnings[].workpaperId | null \| string |
| warnings[].gifiCodes[] | string |
| warnings[].owner | string |
| warnings[].replacedTotal | number |
| warnings[].producerKey | string |
| warnings[].schedule1Line | null \| string |
| warnings[].section | string |
| warnings[].type | string |
| warnings[].yearOfOrigin | integer \| null \| string |
| warnings[].adjustmentAmount | number |
| warnings[].coveredByPostedAje | boolean |
| warnings[].postedAjeAccountIds[] | string |
| warnings[].inferredCategory | string |
| warnings[].itaReferences[] | string |
| warnings[].taxTreatment | null \| string |
| warnings[].competingS1Lines[] | string |
| warnings[].competingTemplateIds[] | string |
| warnings[].computedDirection | null \| string |
| warnings[].pairedLine | null \| string |
| warnings[].pairedLineFeedsSchedule | null \| string |
| warnings[].registeredDirection | null \| string |
| warnings[].receiver | string |
| warnings[].conditionalOn | string |
| warnings[].conflictingLines[] | string |
| warnings[].incomeAmountCount | integer |
| warnings[].incomeAmountId | string |
| warnings[].lineDefaultTax | null \| string |
| warnings[].treatment | null \| string |
| warnings[].unreadableEntryCount | integer |
| warnings[].status | null \| string |
| warnings[].unfundedAccountIds[] | string |
| warnings[].taxYear | integer |
| warnings[].acceptedByClaim | object |
| warnings[].requestedByClaim | object |
| warnings[].payerName | string |
| warnings[].rowIndex | integer \| null |
| warnings[].payerYearEnd | null \| string |
| warnings[].rowIndices[] | integer \| null |
| warnings[].notes | string |
| warnings[].unappliedByClaim | object |
| warnings[].businessId | string |
| warnings[].originPools[].amount | number |
| warnings[].originPools[].type | string |
| warnings[].originPools[].yearOfOrigin | integer |
| warnings[].claims[].amountAccepted | null \| number |
| warnings[].claims[].amountRequested | null \| number |
| warnings[].claims[].lossType | null \| string |
| warnings[].claims[].reason | null \| string |
| warnings[].claims[].targetYear | integer \| null |
| warnings[].claims[].yearOfOrigin | integer \| null |
| warnings[].fields[] | string |
| warnings[].higherPriorityTypes[] | string |
| warnings[].poolId | null \| string |
| warnings[].poolIds[] | string |
| warnings[].subsidiaryLossYearEnd | null \| string |
| warnings[].subsidiaryYearOfOrigin | integer |
| warnings[].taxationYearsElapsed | integer |
| warnings[].accountNumber | string |
| warnings[].pool.remainingBalance | number |
| warnings[].pool.type | string |
| warnings[].pool.yearOfOrigin | integer |
| warnings[].olderYears[] | integer \| null \| string |
| warnings[].targetYear | integer \| null |
| warnings[].yearOfOriginBeforeElection | integer \| null |

### Output cell notes

- `warnings[].accountBalance`: The dollar amount the finding is about. Null where the engine refuses to echo a malformed or non-finite value back, and the caller's own unparsed string where the finding echoes the account balance as supplied.
- `warnings[].accountCode`: The account's code as supplied, or the Schedule 1 pseudo-code the engine uses for a finding that belongs to no account row ("S1", "S3", "S4-P4").
- `warnings[].accountName`: The account's name as supplied, or the label the engine gives a finding that belongs to no account row.
- `warnings[].code`: The finding's machine-readable code. Optional: Schedule 1's account-scoped notices are identified by 'kind' alone, and only the batch dependency-hold disclosure carries a code.
- `warnings[].kind`: The finding's family: classification, coverage, cross_schedule, form_projection, formula, provenance, reconciliation, routing, validation, workpaper, or dependency_hold.
- `warnings[].severity`: The finding's severity. Optional for the same reason as 'code'.
- `warnings[].source`: The dependency schedule that raised this finding.
- `warnings[].templateId`: The workpaper template or classification rule the account's classification names, on the routing notices that name one. Null when the classification states neither.
- `warnings[].message`: The same preparer sentence as 'reason'. Optional: not every Schedule 1 notice states both.
- `warnings[].field`: The request path of the cell the finding is about, in the wire shape the request itself used. The two identity notices publish it because a row that states no id can be addressed no other way: an account row by its ordinal and id, and a workpaper by its ordinal and id when the request sent a list, or by its workpaper key and id when it sent the mapping keyed by workpaper id. The balance and posted-adjustment validation notices publish the cell they could not read, 'accounts.<accountId>.currentYearBalance' or 'combinedAdjustments.<accountId>'. Absent on every notice that names its subject by account or workpaper id instead.
- `warnings[].line`: The Schedule 1 line whose amount a canonical producer replaced, on the cross-schedule finding that names the replacement.
- `warnings[]`: A schedule1 finding re-published verbatim by Division C with `source` naming the schedule that raised it. Division C propagates its dependency schedules' findings so the provisional flag and the blocking reasons travel with the taxable-income result.
- `warnings[].controlledAffiliateCount`: The number of box 300 code 1 selections Schedule 25 reports, on the ITA 91(1) foreign accrual property income finding.
- `warnings[].workpaperId`: The workpaper the finding is about, on the workpaper-scoped notices that name one. Null when the workpaper states no id: that is the whole subject of the workpaper-identity notice, which addresses it by ordinal in 'field' instead.
- `warnings[].owner`: The schedule that owns the replaced Schedule 1 line, on the cross-schedule replacement finding.
- `warnings[].replacedTotal`: The account-derived total the canonical producer's amount replaced.
- `warnings[].producerKey`: The canonical producer whose amount replaced the account-derived one, on the cross-schedule replacement finding.
- `warnings[].schedule1Line`: The Schedule 1 line the finding is about. Null where the classification or the registry names none, which is itself the subject of several of these findings.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].adjustmentAmount`: The dollar amount the finding is about, on the routing and slip-reconciliation notices that name one. Absent on every notice that does not.
- `warnings[].coveredByPostedAje`: True on the reconciliation finding raised when a posted adjusting entry already moved the accounts a GL-built workpaper measures, so letting both amounts post would reconcile the same item twice.
- `warnings[].inferredCategory`: The Schedule 1 category the engine inferred for an amount whose classification named no line.
- `warnings[].taxTreatment`: The tax treatment the classification states. Null when it states none.
- `warnings[].computedDirection`: The addition/deduction direction the workpaper or classification computed, on the routing findings that refuse it against the registered direction of the line.
- `warnings[].pairedLine`: The opposite-direction Schedule 1 line registered for the same concept, when one exists. Null when the registry pairs none.
- `warnings[].pairedLineFeedsSchedule`: The schedule the paired line is printed as sourced from, which is why the amount cannot simply be re-anchored there. Null when the registry pairs no line.
- `warnings[].registeredDirection`: The direction the Schedule 1 line registry records for the line the amount was routed to. Null when the line is not in the registry.
- `warnings[].receiver`: The canonical receiver that must carry this concept's opposite-direction amount, on the canonical-receiver refusal.
- `warnings[].conditionalOn`: The statutory fact a conditional classification turns on and that the return has not resolved. Nothing is posted while it is open.
- `warnings[].incomeAmountCount`: How many foreign accrual income amounts share the affiliate class the prior-year claim was recorded against.
- `warnings[].incomeAmountId`: The foreign accrual income amount the finding is about, as the engine keys it.
- `warnings[].lineDefaultTax`: The default tax treatment the chosen Schedule 1 line registers. Null when the line registers none, or when no line was chosen.
- `warnings[].treatment`: The classification's Schedule 1 treatment verdict. Null when the classification states none.
- `warnings[].unreadableEntryCount`: How many foreign accrual ledger entries could not be read, on the coverage finding that refuses to treat them as absent.
- `warnings[].status`: The workpaper's stated adjustment status, on the formula findings that refuse an adjustment the workpaper did not compute cleanly. Null when the workpaper states none.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.

# part_i_tax

Filemark T2 batch computation internal aggregate

- Kind: batch
- Supported tax years: —
- Strict profile: part_i_tax_exact_2025_default_branch_v1
- Payload schema version: 6.0.0
- Dependencies (run automatically): bc_manufacturing_processing_itc, division_c, ontario_shortline_railway_credit, sbd, schedule1, schedule17, schedule21, schedule23, schedule24, schedule27, schedule28, schedule3, schedule305, schedule352, schedule4, schedule5, schedule502, schedule510, schedule511, schedule512, schedule572, schedule68, schedule7, schedule74, schedule75, schedule78, schedule9

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "part_i_tax"
  ],
  "inputs": {
    "schedule1": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (6)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule1 | object | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 6 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (105)

| Cell | Types |
| --- | --- |
| artAmount | number |
| artBase | number |
| bankDeduction641 | number |
| bankDeduction641Claimed | number |
| baseTax | number |
| effectiveRate | number |
| federalAbatement | number |
| federalLoggingTaxCredit640 | number |
| federalLoggingTaxCredit640Claimed | number |
| federalTaxAfterCredits | number |
| federalTaxOtherwisePayableForItc | number |
| fiscalEnd | array \| boolean \| null \| number \| object \| string |
| fiscalStart | array \| boolean \| null \| number \| object \| string |
| foreignTaxCreditBusiness | number |
| foreignTaxCreditBusinessClaimed | number |
| foreignTaxCreditNonBusiness | number |
| foreignTaxCreditNonBusinessClaimed | number |
| generalRateReduction | number |
| grrAiiCarveOut | number |
| grrFullRateTaxableIncome | number |
| grrMpCarveOut | number |
| investmentCorporationDeduction620 | number |
| investmentCorporationDeduction620Claimed | number |
| investmentTaxCredits | number |
| investmentTaxCreditsClaimed | number |
| itcRecapture602 | number |
| itcRefund780 | number |
| mpProfitsDeduction616 | number |
| netFederalTax | number |
| netFederalTaxBeforeFloor | number |
| provincialFarmerFoodDonationCredits | object |
| provincialTax | object |
| provincialTaxBeforeFarmerFoodDonationCredits | object |
| provincialTaxDetail | object |
| provisional | boolean |
| psbAdditionalTax | number |
| psbGRRReversal | number |
| psbTaxableIncome | number |
| qcDPE | array \| boolean \| null \| number \| object \| string |
| qetCredit648 | number |
| qetCredit648Claimed | number |
| ready | boolean |
| s68AdditionalTax565 | number |
| sbdAmount | number |
| taxableIncome | number |
| totalPartITax | number |
| totalProvincialTax | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].producers[] | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].notes | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].action | string |
| warnings[].allowed | number |
| warnings[].amountAtStake | number |
| warnings[].applied | number |
| warnings[].at1Schedule1Line | string |
| warnings[].box | string |
| warnings[].citation | any |
| warnings[].citation.display | string |
| warnings[].citation.section | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].citations[].authority | string |
| warnings[].citations[].jurisdiction | string |
| warnings[].citations[].line | string |
| warnings[].citations[].section | string |
| warnings[].claimed | number |
| warnings[].fallback | string |
| warnings[].field | string |
| warnings[].fields[] | string |
| warnings[].filingDisposition | string |
| warnings[].findingCode | string |
| warnings[].gate_id | string |
| warnings[].jurisdiction | string |
| warnings[].jurisdictions[] | string |
| warnings[].otherBasis | string |
| warnings[].otherTaxAmount | number |
| warnings[].prescribedFormFactor | number |
| warnings[].prescribedFormTaxAmount | number |
| warnings[].provision | string |
| warnings[].regulation | string |
| warnings[].schedule5Line | string |
| warnings[].selectedBasis | null \| string |
| warnings[].selectedTaxAmount | number |
| warnings[].source | string |
| warnings[].statutoryFactor | number |
| warnings[].statutoryTaxAmount | number |
| warnings[].t2Line | string |
| warnings[].unansweredMeasures[] | string |
| warnings[].unapplied | number |
| provincialFinancialInstitutionCapitalTaxes.byProvince | object |
| provincialFinancialInstitutionCapitalTaxes.incompleteSchedules | array |
| provincialFinancialInstitutionCapitalTaxes.totalApplied | number |

### Output cell notes

- `ready`: False when the result is held and must not be filed as computed. The member is present only on a result that carries a rate-authority finding; a result held for any other reason states that through `provisional` and its findings.
- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `warnings[].action`: What the preparer does to clear the finding.
- `warnings[].allowed`: The amount the statute allows, where a claim was clamped to it.
- `warnings[].amountAtStake`: The difference between the two candidate provincial amounts.
- `warnings[].applied`: The amount actually applied after the clamp.
- `warnings[].box`: The form box the finding is about, where a registered gate raised it.
- `warnings[].citation`: The authority the finding rests on: either the statutory provision the Part I tax computation cites, or the registered gate citation a provincial helper travels with.
- `warnings[].claimed`: The amount claimed before the clamp.
- `warnings[].fallback`: The determinate state the computation held the amount at while the fact is unanswered.
- `warnings[].field`: The single request field the finding is about.
- `warnings[].filingDisposition`: How this finding routes the filing: block, disclose or info. The filing-disposition registry owns the value; the finding carries the resolved one.
- `warnings[].findingCode`: The policy identity of this branch, where one transport code carries branches with different filing dispositions.
- `warnings[].gate_id`: Identifier of the registered gate that raised the finding; travels with `citation`.
- `warnings[].jurisdiction`: The province or territory the finding is about.
- `warnings[].otherBasis`: The provincial factor basis that was not selected.
- `warnings[].otherTaxAmount`: The provincial tax the basis that was not selected would produce.
- `warnings[].provision`: The provincial statute the finding rests on, stated in full.
- `warnings[].schedule5Line`: The Schedule 5 line the claim was entered on.
- `warnings[].selectedBasis`: The provincial factor basis in use, or null while none is selected.
- `warnings[].selectedTaxAmount`: The provincial tax the selected basis produces.
- `warnings[].source`: Where the unanswered fact is entered.
- `warnings[].t2Line`: The T2 jacket line the finding is about.
- `warnings[].unapplied`: The part of the claim that lapsed because the clamp bound it.

# pool_tracking

Filemark T2 batch computation internal aggregate

- Kind: batch
- Supported tax years: —
- Strict profile: pool_tracking_exact_2025_default_branch_v1
- Payload schema version: 7.0.0
- Dependencies (run automatically): aoc, dividend_pool_status, division_c, part_i_tax, sbd, schedule24, schedule3, schedule31, schedule43, schedule53, schedule54, schedule55, schedule6, schedule7

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "pool_tracking"
  ],
  "inputs": {
    "schedule1": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterIncorporation": true,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    },
    "daysInYear": 365
  }
}
```

## Input cells (13)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| pool_tracking.provisional | boolean |  |
| pool_tracking.totalDividendRefund | number |  |
| pool_tracking.warnings | array |  |
| pyPools | object |  |
| schedule1 | object | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | number \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `pyPools`: Prior-year balances for the corporation's tax pools, keyed by pool name (cda, erdtoh, nerdtoh). Each value is an object carrying opening, closingBalance or priorClosing as a number or plain decimal string; a bare amount is also read. Omit the key entirely when there is no prior year rather than sending an explicit null, which raises.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 13 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (117)

| Cell | Types |
| --- | --- |
| carryforwardMovementLedger.pools[].closing | null \| number |
| carryforwardMovementLedger.pools[].ita_reference | string |
| carryforwardMovementLedger.pools[].label | string |
| carryforwardMovementLedger.pools[].movements[].amount | null \| number |
| carryforwardMovementLedger.pools[].movements[].label | string |
| carryforwardMovementLedger.pools[].opening | null \| number |
| carryforwardMovementLedger.pools[].pool_id | string |
| carryforwardMovementLedger.pools[].reconciliation_complete | boolean |
| carryforwardMovementLedger.pools[].reconciliation_note | null \| string |
| carryforwardMovementLedger.pools[].warnings[] | string |
| carryforwardMovementLedger.schemaVersion | integer |
| cda.capitalDividendsPaid | number |
| cda.capitalDividendsReceived | number |
| cda.capitalGainsAddition | number |
| cda.closing | number |
| cda.closingParagraphA | number |
| cda.deemedNilAmount_131_11_e | number |
| cda.deemedNilUnder_131_11_e | boolean |
| cda.lifeInsuranceNet | number |
| cda.lifeInsurancePolicies | array |
| cda.opening | number |
| cda.openingParagraphA | number |
| cda.openingParagraphAWasSupplied | boolean |
| cda.paragraphH | number |
| cda.paragraphHOmittedUnder_93_4_3 | boolean |
| cda.reset_89_1_1 | number |
| cda.reset_89_1_2 | number |
| cda.trustDistributions | array |
| cda.trustParagraphAI1 | number |
| cda.trustParagraphF | number |
| cda.trustParagraphG | number |
| cda.aocTimingAdjustment111_4_f | number |
| cda.successorContinuityEstablished | boolean |
| cda.successorContinuityEvents | array |
| cda.successorContinuityParagraphA | number |
| cda.successorContinuityTransfer | number |
| cda.authority.asOf | string |
| cda.authority.established | boolean |
| cda.authority.status | string |
| cda.authority.unestablishedReasons[] | string |
| cda.paragraphHStatus.a1Limb | number |
| cda.paragraphHStatus.amount | number |
| cda.paragraphHStatus.ccpcThroughoutYear | array \| boolean \| null \| number \| object \| string |
| cda.paragraphHStatus.effectiveFiscalStart | string |
| cda.paragraphHStatus.election93_4_3Made | array \| boolean \| null \| number \| object \| string |
| cda.paragraphHStatus.established | boolean |
| cda.paragraphHStatus.fiscalStart | string |
| cda.paragraphHStatus.lowRtfLimb | number |
| cda.paragraphHStatus.material | boolean |
| cda.paragraphHStatus.status | string |
| cda.paragraphHStatus.substantiveCcpcAnytime | array \| boolean \| null \| number \| object \| string |
| cda.capitalDividendElections | array |
| cda.closingParagraphARunning | number |
| cda.openingParagraphARunning | number |
| cda.closingRunning | number |
| continuityChecks | array |
| dividendPool.authority | array \| boolean \| null \| number \| object \| string |
| dividendPool.closing | array \| boolean \| null \| number \| object \| string |
| dividendPool.regime | string |
| dividendPool.status | string |
| dividendPool.trigger | array \| boolean \| null \| number \| object \| string |
| dividendRefundInputs.eligibleDividendsPaid | number |
| dividendRefundInputs.nonEligibleDividendsPaid | number |
| dividendRefundStatus | string |
| erdtoh.additions | number |
| erdtoh.closing | number |
| erdtoh.eligibleDividendRefund | number |
| erdtoh.nonEligibleRefundDrawFromERDTOH | number |
| erdtoh.opening | number |
| erdtoh.openingEntered | number |
| erdtoh.partIV1Reduction | number |
| erdtoh.partIVConnected | number |
| erdtoh.partIVEligible | number |
| erdtoh.priorYearDividendRefund | number |
| erdtoh.transfer | number |
| erdtoh.partIVAmountC | number |
| erdtoh.partIVAmountD | number |
| erdtoh.partIVAmountE | number |
| erdtoh.partIVAmountQ | number |
| grip | array \| boolean \| null \| number \| object \| string |
| lrip | array \| boolean \| null \| number \| object \| string |
| nerdtoh.additions | number |
| nerdtoh.closing | number |
| nerdtoh.nonEligibleDividendRefund | number |
| nerdtoh.nonEligibleDividendsPaid | number |
| nerdtoh.opening | number |
| nerdtoh.openingEntered | number |
| nerdtoh.partIV1Reduction | number |
| nerdtoh.partIVConnected | number |
| nerdtoh.partIVNonEligible | number |
| nerdtoh.priorYearDividendRefund | number |
| nerdtoh.refundablePartI | number |
| nerdtoh.refundablePartIAmountE | number |
| nerdtoh.refundablePartIAmountL | number |
| nerdtoh.refundablePartIAmountM | null \| number |
| nerdtoh.transfer | number |
| nerdtoh.partIVAmountI | number |
| nerdtoh.partIVAmountL | number |
| nerdtoh.partIVAmountO | number |
| nerdtoh.partIVAmountP | number |
| poolOpeningsSupplied.cda | boolean |
| poolOpeningsSupplied.erdtoh | boolean |
| poolOpeningsSupplied.nerdtoh | boolean |
| provisional | boolean |
| totalDividendRefund | number |
| warnings[] | string |
| warnings[].code | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].pool | string |
| warnings[].expectedAsOf | null \| string |
| warnings[].reportedAsOf | null \| string |
| warnings[].reportedMember | string |
| warnings[].reportedAmount | boolean \| null \| number \| string |
| warnings[].actual | number |
| warnings[].expected | number |
| warnings[].unreconciledAmount | number |

# sbd

Filemark T2 batch computation internal aggregate

- Kind: batch
- Supported tax years: —
- Strict profile: sbd_exact_2025_default_branch_v1
- Payload schema version: 8.0.0
- Dependencies (run automatically): division_c, schedule21, schedule23, schedule28, schedule33, schedule34, schedule35, schedule49, schedule5, schedule7, schedule9

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "sbd"
  ],
  "inputs": {
    "schedule1": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (32)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| associatedGroup.allocated_limit | integer | strict |
| associatedGroup.filer_bn_root | string | strict |
| associatedGroup.matched_business_number | string | strict |
| associatedGroup.source | string | strict |
| currentYearTCEC | null \| number \| string |  |
| currentYearTCECMeta | null \| object |  |
| daysInYear | integer | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| isCCPC | boolean |  |
| priorYearGroupTCEC | null \| number \| string |  |
| priorYearGroupTCECMeta | null \| object |  |
| sbd.aaiiGrind | object |  |
| sbd.abi | number |  |
| sbd.baseBusinessLimit | number |  |
| sbd.eligibilityReason | null \| string |  |
| sbd.finalBusinessLimit | number |  |
| sbd.isCcpc | boolean |  |
| sbd.isEligible | boolean |  |
| sbd.isPSB | boolean |  |
| sbd.provisional | boolean |  |
| sbd.s89_11ElectionActive | boolean |  |
| sbd.sbd | number |  |
| sbd.sbdEligibleIncome | number |  |
| sbd.sbdRate | number |  |
| sbd.shortYearProration | null \| number |  |
| sbd.taxableIncome | number |  |
| sbd.warnings | array |  |
| schedule1 | object | strict |
| taxYear | number \| string | always |
| wasAssociatedInPrecedingYear | null \| boolean |  |

### Input cell notes

- `currentYearTCEC`: Taxable capital employed in Canada for the current taxation year. It must be finite and non-negative.
- `currentYearTCECMeta`: Provenance for currentYearTCEC. When sent, all four members must be present and correct: basis is current_tax_year, asOf is the current taxation-year end, source names where the figure came from, and confirmed is true. Anything less leaves the amount an unattested assertion.
- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `priorYearGroupTCEC`: Taxable capital employed in Canada for the preceding period required by ITA s.125(5.1)(a). The accompanying metadata basis decides whether it is the corporation's own preceding taxation year or the associated group's preceding calendar year. An explicit zero is valid; omitting it fails closed with a full capital grind.
- `priorYearGroupTCECMeta`: Provenance for priorYearGroupTCEC. When sent, basis is standalone_preceding_tax_year or associated_group_preceding_calendar_year, asOf is the exact period end that basis implies, source names where the figure came from, and confirmed is true.
- `sbd.abi`: S7 Part 6 amount DD — income eligible for the SBD (s.125(1)(a)).
- `sbd.isCcpc`: Corporation-type fact; never infer this from SBD eligibility.
- `sbd.s89_11ElectionActive`: Present on the CCPC branch when the current-year election fact is known.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.
- `wasAssociatedInPrecedingYear`: Whether the corporation was associated with another corporation in its preceding taxation year, selecting which ITA s.125(5.1)(a) period the taxable-capital figure belongs to. Send null deliberately when unknown: the engine then blocks rather than inferring a period.

### Strict profile accepted values (9 of 32 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| associatedGroup.allocated_limit | -1000000000000000 to 1000000000000000 |
| associatedGroup.filer_bn_root | 0 to 20000 characters |
| associatedGroup.matched_business_number | 0 to 20000 characters |
| associatedGroup.source | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| sbd.eligibilityReason | one of "s89_11_election" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (82)

| Cell | Types |
| --- | --- |
| aaiiGrind.aaii | number |
| aaiiGrind.grindedLimit | number |
| aaiiGrind.reduction | number |
| abi | number |
| baseBusinessLimit | number |
| businessLimitAssigned | number |
| businessLimitAssignmentApplied | number |
| businessLimitBeforeAssignment | number |
| businessLimitDeemedNilBy256_2 | array \| boolean \| null \| number \| object \| string |
| businessLimitSource | string |
| capitalGrind.authoritativeInputProvided | boolean |
| capitalGrind.basisMode | string |
| capitalGrind.ceiling | number |
| capitalGrind.floor | number |
| capitalGrind.grindedLimit | number |
| capitalGrind.inputMetadata.asOf | array \| boolean \| null \| number \| object \| string |
| capitalGrind.inputMetadata.basis | array \| boolean \| null \| number \| object \| string |
| capitalGrind.inputMetadata.confirmed | boolean |
| capitalGrind.inputMetadata.expectedAsOf | string |
| capitalGrind.inputMetadata.expectedBasis | string |
| capitalGrind.inputMetadata.source | array \| boolean \| null \| number \| object \| string |
| capitalGrind.inputRequired | boolean |
| capitalGrind.inputSource | string |
| capitalGrind.line415Factor | array \| boolean \| null \| number \| object \| string |
| capitalGrind.line415FactorDenominator | null \| number |
| capitalGrind.reduction | number |
| capitalGrind.reportedTcec | array \| boolean \| null \| number \| object \| string |
| capitalGrind.tcec | number |
| capitalGrind.line415FactorCurrency | string |
| capitalGrind.line415FactorRail | string |
| eligibilityReason | array \| boolean \| null \| number \| object \| string |
| finalBusinessLimit | number |
| hypotheticalSbdEligibleIncome | array \| boolean \| null \| number \| object \| string |
| isEligible | boolean |
| isPSB | boolean |
| matchedSchedule23BusinessNumber | null \| string |
| provisional | boolean |
| s125_5aFirstYearLimitCap | array \| boolean \| null \| number \| object \| string |
| s89_11ElectionActive | boolean |
| sbd | number |
| sbdAssignment.activeRowCount | integer |
| sbdAssignment.appliedToBusinessLimit | number |
| sbdAssignment.businessLimitAssigned | number |
| sbdAssignment.errors | array |
| sbdAssignment.incomePaidClauseBTotal | number |
| sbdAssignment.valid | boolean |
| sbdAssignment.assigningCorpTaxYearEnd | string |
| sbdEligibleIncome | number |
| sbdRate | number |
| sbdTaxableIncome405 | number |
| shortYearProration | array \| boolean \| null \| number \| object \| string |
| taxableIncome | number |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].source | string |
| warnings[].upstreamSource | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| matchedSchedule23Allocation | null \| number |
| associationReconciliation.associated | array |
| associationReconciliation.findings | array |
| associationReconciliation.reconciled | boolean |
| associationReconciliation.sources.corporate_group | boolean |
| associationReconciliation.sources.schedule23 | boolean |
| associationReconciliation.sources.schedule9 | boolean |
| s125_5aFirstYearLimitIsPreShortYearProration | array \| boolean \| null \| number \| object \| string |
| isCcpc | boolean |

# schedule1

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s1_2025_line103_reconciliation_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): foreign_affiliate_analysis, reserve_continuity, schedule10, schedule13, schedule130, schedule15, schedule17, schedule21, schedule25, schedule3, schedule6, schedule73, schedule8, t661

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule1"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "accounts": [
      {
        "id": "acct-revenue-target",
        "accountCode": "8000",
        "accountName": "Cedar Ridge sales revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "treatment": "no_adjustment",
          "deductibility": "100%",
          "assumption": "Caller-supplied book-income fact"
        }
      },
      {
        "id": "acct-tax-penalty-target",
        "accountCode": "9000",
        "accountName": "Interest and penalties on taxes",
        "currentYearBalance": 1000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": true,
          "adjustmentType": "addition",
          "treatment": "full_addition",
          "deductibility": "0%",
          "assumption": "Caller-supplied line-103 classification; legal deductibility not verified",
          "s1Line": "103"
        }
      }
    ],
    "incomeStatementFlags": {
      "acct-revenue-target": true,
      "acct-tax-penalty-target": true
    },
    "workpapers": [],
    "isCCPC": true,
    "daysInYear": 365,
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    }
  }
}
```

## Input cells (89)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts | array |  |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.adjustmentType | null \| string |  |
| accounts[].classification.assumption | string | strict |
| accounts[].classification.deductibility | string | strict |
| accounts[].classification.deductibilityPercentage | null \| number \| string |  |
| accounts[].classification.deductibilityRule | null \| string |  |
| accounts[].classification.ruleId | null \| string |  |
| accounts[].classification.s1Line | null \| string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].classification.templateId | null \| string |  |
| accounts[].classification.treatment | null \| string | strict |
| accounts[].currentYearBalance | integer \| null \| number \| string | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| combinedAdjustments | null \| object |  |
| daysInYear | integer | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| gifiAssignments | null \| object |  |
| incomeStatementFlags | object |  |
| incomeStatementFlags.acct-revenue-target | boolean \| null | strict |
| incomeStatementFlags.acct-tax-penalty-target | boolean \| null | strict |
| isCCPC | boolean |  |
| pyLossPools | array |  |
| schedule1.additions | array |  |
| schedule1.additions[].accounts | array |  |
| schedule1.additions[].category | string |  |
| schedule1.additions[].schedule1Line | null \| string |  |
| schedule1.additions[].totalAmount | number |  |
| schedule1.deductions | array |  |
| schedule1.deductions[].accounts | array |  |
| schedule1.deductions[].category | string |  |
| schedule1.deductions[].schedule1Line | null \| string |  |
| schedule1.deductions[].totalAmount | number |  |
| schedule1.form | object |  |
| schedule1.form.amountA | number |  |
| schedule1.form.amountB | number |  |
| schedule1.form.amountC | number |  |
| schedule1.form.amountD | number |  |
| schedule1.form.amountE | number |  |
| schedule1.form.formWarnings | array |  |
| schedule1.form.otherAdditionsFromPage3_199 | number |  |
| schedule1.form.otherAdditionsTable | array |  |
| schedule1.form.otherAdditionsTableTotal_296 | number |  |
| schedule1.form.otherAdditionsTable[].amount | number |  |
| schedule1.form.otherAdditionsTable[].description | string |  |
| schedule1.form.otherDeductionsFromPage4_499 | number |  |
| schedule1.form.otherDeductionsTable | array |  |
| schedule1.form.otherDeductionsTableTotal_396 | number |  |
| schedule1.form.otherDeductionsTable[].amount | number |  |
| schedule1.form.otherDeductionsTable[].description | string |  |
| schedule1.form.totalAdditions_500 | number |  |
| schedule1.form.totalDeductions_510 | number |  |
| schedule1.netIncomePerFS | number |  |
| schedule1.s1_line_233_feed | null \| number |  |
| schedule1.section31RestrictedFarmLoss | null \| object |  |
| schedule1.section31RestrictedFarmLoss.applies | boolean \| null |  |
| schedule1.section31RestrictedFarmLoss.blockedReason | null \| string |  |
| schedule1.section31RestrictedFarmLoss.farmingPresence | boolean |  |
| schedule1.section31RestrictedFarmLoss.functionalCurrencyContext | object |  |
| schedule1.section31RestrictedFarmLoss.heldRestrictedFarmLoss | number |  |
| schedule1.section31RestrictedFarmLoss.restrictedFarmLoss | null \| number |  |
| schedule1.section31RestrictedFarmLoss.schemaVersion | integer |  |
| schedule1.section31RestrictedFarmLoss.worksheet | object |  |
| schedule1.section31RestrictedFarmLoss.worksheet.amount_4A | null \| number |  |
| schedule1.section31RestrictedFarmLoss.worksheet.amount_4B | null \| number |  |
| schedule1.section31RestrictedFarmLoss.worksheet.amount_4C | null \| number |  |
| schedule1.section31RestrictedFarmLoss.worksheet.amount_4D | null \| number |  |
| schedule1.section31RestrictedFarmLoss.worksheet.amount_4E | null \| number |  |
| schedule1.section31RestrictedFarmLoss.worksheet.applies | boolean \| null |  |
| schedule1.section31RestrictedFarmLoss.worksheet.blocked | boolean |  |
| schedule1.section31RestrictedFarmLoss.worksheet.chiefSourceStatus | string |  |
| schedule1.section31RestrictedFarmLoss.worksheet.line_485 | null \| number |  |
| schedule1.taxableIncome | number |  |
| schedule1.totalAdditions | number |  |
| schedule1.totalDeductions | number |  |
| schedule1.warnings | array |  |
| schedule125 | object |  |
| schedule125.insuranceUnderwritingType | null \| string |  |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |
| workpapers | object |  |
| workpapers[] | boolean \| null \| number \| string | strict |

### Input cell notes

- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `combinedAdjustments`: Posted adjusting journal entries, as a map from account id to the net amount posted against that account. Each amount may be a number or a numeric string. It is added to the trial-balance balance before the account is measured, and an unreadable entry is reported as an error rather than filed as zero.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `gifiAssignments`: Map of account id to the accepted GIFI code, folded onto accounts before consumers read them. An assignment overrides an account's embedded gifiCode and an empty string clears it. The merged view drives statutory paths including Schedule 1's lines 239/347 OCI treatment and Schedule 4's farming-presence signal, as well as Schedule 33's reference panel and prefill.
- `incomeStatementFlags.acct-revenue-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `incomeStatementFlags.acct-tax-penalty-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule1.form.formWarnings`: Tie-out mismatches and grid-overflow notes (an "other" grid holding more than its 4 printed rows; 296/396 still total every item). Rendered, so nothing is silently truncated.
- `schedule1.section31RestrictedFarmLoss.functionalCurrencyContext`: Present only for a functional-currency determination; omitted for the established CAD schema-version-1 projection.
- `schedule125.insuranceUnderwritingType`: The insurance underwriting subtype, read with isInsuranceCorp to decide whether the RC4088 Rev.23 p.5 PDF financial statement supplement advisory fires. Send it whenever isInsuranceCorp is true, using non_underwriting for brokerages, MGAs, agency subsidiaries and non-underwriting holding companies. No enum is published because the engine routes every unrecognized string to the ordinary-filer branch rather than rejecting it.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (21 of 89 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.adjustmentType | 0 to 20000 characters |
| accounts[].classification.assumption | 0 to 20000 characters |
| accounts[].classification.deductibility | 0 to 20000 characters |
| accounts[].classification.deductibilityPercentage | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| accounts[].classification.deductibilityRule | 0 to 20000 characters |
| accounts[].classification.ruleId | 0 to 20000 characters |
| accounts[].classification.s1Line | 0 to 20000 characters |
| accounts[].classification.templateId | 0 to 20000 characters |
| accounts[].classification.treatment | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule1.section31RestrictedFarmLoss.blockedReason | one of "chief_source_unanswered", "line_485_missing" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |
| workpapers[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |

## Output cells (220)

| Cell | Types |
| --- | --- |
| additions[].accounts[].accountBalance | integer |
| additions[].accounts[].accountCode | string |
| additions[].accounts[].accountId | string |
| additions[].accounts[].accountName | string |
| additions[].accounts[].adjustmentAmount | number |
| additions[].accounts[].adjustmentStatus | string |
| additions[].accounts[].assumption | string |
| additions[].accounts[].deductibilityRule | string |
| additions[].accounts[].description | string |
| additions[].accounts[].estimatedDeductibility | boolean |
| additions[].accounts[].formula_id | array \| boolean \| null \| number \| object \| string |
| additions[].accounts[].inputs_used | array |
| additions[].accounts[].itaReferences | array |
| additions[].accounts[].reviewed | boolean |
| additions[].accounts[].source | string |
| additions[].accounts[].templateId | array \| boolean \| null \| number \| object \| string |
| additions[].accounts[].workpaperName | array \| boolean \| null \| number \| object \| string |
| additions[].category | string |
| additions[].schedule1Line | string |
| additions[].totalAmount | number |
| deductions | array |
| form.amountA | number |
| form.amountB | number |
| form.amountC | number |
| form.amountD | number |
| form.amountE | number |
| form.formWarnings | array |
| form.line_101 | number |
| form.line_102 | number |
| form.line_103 | number |
| form.line_104 | number |
| form.line_105 | number |
| form.line_106 | number |
| form.line_107 | number |
| form.line_110 | number |
| form.line_111 | number |
| form.line_112 | number |
| form.line_113 | number |
| form.line_114 | number |
| form.line_115 | number |
| form.line_116 | number |
| form.line_117 | number |
| form.line_118 | number |
| form.line_119 | number |
| form.line_120 | number |
| form.line_121 | number |
| form.line_122 | number |
| form.line_123 | number |
| form.line_124 | number |
| form.line_125 | number |
| form.line_126 | number |
| form.line_127 | number |
| form.line_128 | number |
| form.line_129 | number |
| form.line_130 | number |
| form.line_131 | number |
| form.line_132 | number |
| form.line_201 | number |
| form.line_202 | number |
| form.line_203 | number |
| form.line_204 | number |
| form.line_206 | number |
| form.line_208 | number |
| form.line_209 | number |
| form.line_210 | number |
| form.line_211 | number |
| form.line_212 | number |
| form.line_213 | number |
| form.line_214 | number |
| form.line_215 | number |
| form.line_216 | number |
| form.line_217 | number |
| form.line_218 | number |
| form.line_219 | number |
| form.line_220 | number |
| form.line_221 | number |
| form.line_222 | number |
| form.line_224 | number |
| form.line_226 | number |
| form.line_227 | number |
| form.line_228 | number |
| form.line_229 | number |
| form.line_230 | number |
| form.line_231 | number |
| form.line_232 | number |
| form.line_233 | number |
| form.line_234 | number |
| form.line_235 | number |
| form.line_236 | number |
| form.line_237 | number |
| form.line_238 | number |
| form.line_239 | number |
| form.line_248 | number |
| form.line_249 | number |
| form.line_250 | number |
| form.line_251 | number |
| form.line_252 | number |
| form.line_253 | number |
| form.line_254 | number |
| form.line_300 | number |
| form.line_301 | number |
| form.line_302 | number |
| form.line_303 | number |
| form.line_304 | number |
| form.line_306 | number |
| form.line_307 | number |
| form.line_309 | number |
| form.line_310 | number |
| form.line_311 | number |
| form.line_312 | number |
| form.line_313 | number |
| form.line_314 | number |
| form.line_315 | number |
| form.line_316 | number |
| form.line_340 | number |
| form.line_341 | number |
| form.line_342 | number |
| form.line_344 | number |
| form.line_345 | number |
| form.line_347 | number |
| form.line_348 | number |
| form.line_349 | number |
| form.line_350 | number |
| form.line_401 | number |
| form.line_402 | number |
| form.line_403 | number |
| form.line_404 | number |
| form.line_406 | number |
| form.line_407 | number |
| form.line_408 | number |
| form.line_409 | number |
| form.line_410 | number |
| form.line_411 | number |
| form.line_413 | number |
| form.line_414 | number |
| form.line_416 | number |
| form.line_417 | number |
| form.line_418 | number |
| form.otherAdditionsFromPage3_199 | number |
| form.otherAdditionsTable | array |
| form.otherAdditionsTableTotal_296 | number |
| form.otherDeductionsFromPage4_499 | number |
| form.otherDeductionsTable | array |
| form.otherDeductionsTableTotal_396 | number |
| form.totalAdditions_500 | number |
| form.totalDeductions_510 | number |
| lineageErrors | array |
| netIncomePerFS | number |
| provisional | boolean |
| ready | boolean |
| taxableIncome | number |
| totalAdditions | number |
| totalDeductions | number |
| warnings[].accountBalance | null \| number \| string |
| warnings[].accountCode | null \| string |
| warnings[].accountId | array \| boolean \| null \| number \| object \| string |
| warnings[].accountName | null \| string |
| warnings[].adjustmentAmount | number |
| warnings[].code | string |
| warnings[].competingS1Lines[] | string |
| warnings[].competingTemplateIds[] | string |
| warnings[].computedDirection | null \| string |
| warnings[].conditionalOn | string |
| warnings[].conflictingLines[] | string |
| warnings[].controlledAffiliateCount | integer |
| warnings[].coveredByPostedAje | boolean |
| warnings[].field | string |
| warnings[].gifiCodes[] | string |
| warnings[].incomeAmountCount | integer |
| warnings[].incomeAmountId | string |
| warnings[].inferredCategory | string |
| warnings[].itaReferences[] | string |
| warnings[].kind | string |
| warnings[].line | string |
| warnings[].lineDefaultTax | null \| string |
| warnings[].message | string |
| warnings[].owner | string |
| warnings[].pairedLine | null \| string |
| warnings[].pairedLineFeedsSchedule | null \| string |
| warnings[].postedAjeAccountIds[] | string |
| warnings[].producerKey | string |
| warnings[].producers[] | string |
| warnings[].reason | string |
| warnings[].receiver | string |
| warnings[].registeredDirection | null \| string |
| warnings[].replacedTotal | number |
| warnings[].schedule1Line | null \| string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].source | string |
| warnings[].status | null \| string |
| warnings[].taxTreatment | null \| string |
| warnings[].templateId | null \| string |
| warnings[].treatment | null \| string |
| warnings[].unfundedAccountIds[] | string |
| warnings[].unreadableEntryCount | integer |
| warnings[].workpaperId | null \| string |
| warnings[].notes | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| s1_line_233_feed | number |
| section31RestrictedFarmLoss.applies | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.blockedReason | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.chiefSourceStatus | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.farmingPresence | boolean |
| section31RestrictedFarmLoss.heldRestrictedFarmLoss | number |
| section31RestrictedFarmLoss.restrictedFarmLoss | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.schemaVersion | integer |
| section31RestrictedFarmLoss.worksheet.amount_4A | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.amount_4B | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.amount_4C | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.amount_4D | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.amount_4E | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.applies | array \| boolean \| null \| number \| object \| string |
| section31RestrictedFarmLoss.worksheet.blocked | boolean |
| section31RestrictedFarmLoss.worksheet.chiefSourceStatus | string |
| section31RestrictedFarmLoss.worksheet.line_485 | array \| boolean \| null \| number \| object \| string |
| section149FirstPostEventReserveReceipts | array |
| section149PropertyAdjustmentReceipts | array |

### Output cell notes

- `ready`: False when the result is held and must not be filed as computed. The member is present only on a result that carries a rate-authority finding; a result held for any other reason states that through `provisional` and its findings.
- `warnings[].accountBalance`: The dollar amount the finding is about. Null where the engine refuses to echo a malformed or non-finite value back, and the caller's own unparsed string where the finding echoes the account balance as supplied.
- `warnings[].accountCode`: The account's code as supplied, or the Schedule 1 pseudo-code the engine uses for a finding that belongs to no account row ("S1", "S3", "S4-P4").
- `warnings[].accountName`: The account's name as supplied, or the label the engine gives a finding that belongs to no account row.
- `warnings[].adjustmentAmount`: The dollar amount the finding is about, on the routing and slip-reconciliation notices that name one. Absent on every notice that does not.
- `warnings[].code`: The finding's machine-readable code. Optional: Schedule 1's account-scoped notices are identified by 'kind' alone, and only the batch dependency-hold disclosure carries a code.
- `warnings[].computedDirection`: The addition/deduction direction the workpaper or classification computed, on the routing findings that refuse it against the registered direction of the line.
- `warnings[].conditionalOn`: The statutory fact a conditional classification turns on and that the return has not resolved. Nothing is posted while it is open.
- `warnings[].controlledAffiliateCount`: The number of box 300 code 1 selections Schedule 25 reports, on the ITA 91(1) foreign accrual property income finding.
- `warnings[].coveredByPostedAje`: True on the reconciliation finding raised when a posted adjusting entry already moved the accounts a GL-built workpaper measures, so letting both amounts post would reconcile the same item twice.
- `warnings[].field`: The request path of the cell the finding is about, in the wire shape the request itself used. The two identity notices publish it because a row that states no id can be addressed no other way: an account row by its ordinal and id, and a workpaper by its ordinal and id when the request sent a list, or by its workpaper key and id when it sent the mapping keyed by workpaper id. The balance and posted-adjustment validation notices publish the cell they could not read, 'accounts.<accountId>.currentYearBalance' or 'combinedAdjustments.<accountId>'. Absent on every notice that names its subject by account or workpaper id instead.
- `warnings[].incomeAmountCount`: How many foreign accrual income amounts share the affiliate class the prior-year claim was recorded against.
- `warnings[].incomeAmountId`: The foreign accrual income amount the finding is about, as the engine keys it.
- `warnings[].inferredCategory`: The Schedule 1 category the engine inferred for an amount whose classification named no line.
- `warnings[].kind`: The finding's family: classification, coverage, cross_schedule, form_projection, formula, provenance, reconciliation, routing, validation, workpaper, or dependency_hold.
- `warnings[].line`: The Schedule 1 line whose amount a canonical producer replaced, on the cross-schedule finding that names the replacement.
- `warnings[].lineDefaultTax`: The default tax treatment the chosen Schedule 1 line registers. Null when the line registers none, or when no line was chosen.
- `warnings[].message`: The same preparer sentence as 'reason'. Optional: not every Schedule 1 notice states both.
- `warnings[].owner`: The schedule that owns the replaced Schedule 1 line, on the cross-schedule replacement finding.
- `warnings[].pairedLine`: The opposite-direction Schedule 1 line registered for the same concept, when one exists. Null when the registry pairs none.
- `warnings[].pairedLineFeedsSchedule`: The schedule the paired line is printed as sourced from, which is why the amount cannot simply be re-anchored there. Null when the registry pairs no line.
- `warnings[].producerKey`: The canonical producer whose amount replaced the account-derived one, on the cross-schedule replacement finding.
- `warnings[].receiver`: The canonical receiver that must carry this concept's opposite-direction amount, on the canonical-receiver refusal.
- `warnings[].registeredDirection`: The direction the Schedule 1 line registry records for the line the amount was routed to. Null when the line is not in the registry.
- `warnings[].replacedTotal`: The account-derived total the canonical producer's amount replaced.
- `warnings[].schedule1Line`: The Schedule 1 line the finding is about. Null where the classification or the registry names none, which is itself the subject of several of these findings.
- `warnings[].section`: The statute the finding rests on, on the section 31 restricted farm loss blockers Schedule 1 carries through from Schedule 4 Part 4.
- `warnings[].severity`: The finding's severity. Optional for the same reason as 'code'.
- `warnings[].source`: The canonical producer's source label, on the cross-schedule replacement finding.
- `warnings[].status`: The workpaper's stated adjustment status, on the formula findings that refuse an adjustment the workpaper did not compute cleanly. Null when the workpaper states none.
- `warnings[].taxTreatment`: The tax treatment the classification states. Null when it states none.
- `warnings[].templateId`: The workpaper template or classification rule the account's classification names, on the routing notices that name one. Null when the classification states neither.
- `warnings[].treatment`: The classification's Schedule 1 treatment verdict. Null when the classification states none.
- `warnings[].unreadableEntryCount`: How many foreign accrual ledger entries could not be read, on the coverage finding that refuses to treat them as absent.
- `warnings[].workpaperId`: The workpaper the finding is about, on the workpaper-scoped notices that name one. Null when the workpaper states no id: that is the whole subject of the workpaper-identity notice, which addresses it by ordinal in 'field' instead.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule10

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2016–2017
- Strict profile: s10_2017_straddle_zero_balance_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule10"
  ],
  "inputs": {
    "taxYear": 2017,
    "fiscalStart": "2016-07-01",
    "fiscalEnd": "2017-06-30",
    "schedule10": {
      "line_200_cec_opening_balance": 0,
      "line_425_prior_cec_deductions_unrecaptured": 0
    }
  }
}
```

## Input cells (45)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule10.acquired_control_during_year | boolean \| null |  |
| schedule10.amount_15_work_amount | null \| number |  |
| schedule10.amount_16_work_amount | null \| number |  |
| schedule10.amount_EE_total_capital_cost_plus_C | null \| number |  |
| schedule10.amount_FF_total_capital_cost | null \| number |  |
| schedule10.amount_GG_amount_A | null \| number |  |
| schedule10.amount_K_cec_balance | null \| number \| string |  |
| schedule10.amount_MM_work_amount | null \| number |  |
| schedule10.amount_NN_work_amount | null \| number |  |
| schedule10.line_101_elect_13_38_d_iv | null \| string |  |
| schedule10.line_102_elect_13_38_d_iii | null \| string |  |
| schedule10.line_200_cec_opening_balance | null \| number \| string | strict |
| schedule10.line_222_ecp_acquired_before_2017 | null \| number |  |
| schedule10.line_224_amalgamation_transfer | null \| number |  |
| schedule10.line_226_other_adjustments_before_2017 | null \| number |  |
| schedule10.line_228_nal_gain_half | null \| number |  |
| schedule10.line_230_subtotal_A_plus_D_plus_E | null \| number |  |
| schedule10.line_242_proceeds_disposition_before_2017 | null \| number |  |
| schedule10.line_244_s_80_7_forgiven_debt_reduction | null \| number |  |
| schedule10.line_246_other_adjustments_dispositions | null \| number |  |
| schedule10.line_248_subtotal_GHI_times_3_4 | null \| number |  |
| schedule10.line_249_cec_for_disposed_business | null \| number |  |
| schedule10.line_250_current_year_deduction | null \| number |  |
| schedule10.line_300_cec_closing_balance | null \| number |  |
| schedule10.line_400_total_prior_cec_deductions_post_jun_1988 | null \| number |  |
| schedule10.line_401_total_s_80_7_reductions | null \| number |  |
| schedule10.line_402_total_cec_deductions_pre_jul_1988 | null \| number |  |
| schedule10.line_408_negative_balances_into_income_pre_jul_1988 | null \| number |  |
| schedule10.line_409_subtotal | null \| number |  |
| schedule10.line_410_income_inclusion | null \| number |  |
| schedule10.line_420_cec_balance_at_jan_1_2017 | null \| number |  |
| schedule10.line_425_prior_cec_deductions_unrecaptured | null \| number | strict |
| schedule10.line_430_amount_S_times_3_2 | null \| number |  |
| schedule10.line_435_deemed_capital_cost | null \| number |  |
| schedule10.line_440_deemed_para_20_1_a_allowance | null \| number |  |
| schedule10.line_450_post_2016_acquisitions | null \| number |  |
| schedule10.line_455_half_of_JJ | null \| number |  |
| schedule10.line_460_lesser_of_12_and_13 | null \| number |  |
| schedule10.line_465_amount_14_times_2 | null \| number |  |
| schedule10.line_470_reduced_capital_cost | null \| number |  |
| schedule10.line_475_income_inclusion_13_38_d_iii | null \| number |  |
| schedule10.line_480_proceeds_disposition_13_38_d_ii | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule10.amount_K_cec_balance`: Part 1 amount K, the cumulative eligible capital balance carried into Parts 2 and 3. It is a check figure, not an input: the engine computes K as amount F minus amount J and reports an error when the supplied value differs by more than one dollar.
- `schedule10.line_230_subtotal_A_plus_D_plus_E`: Part 2 subtotal of amounts A, D and E. The engine computes it from those amounts; a supplied value is not read.
- `schedule10.line_248_subtotal_GHI_times_3_4`: Part 2 subtotal of amounts G, H and I multiplied by three quarters. The engine computes it; a supplied value is not read.
- `schedule10.line_420_cec_balance_at_jan_1_2017`: Part 3 cumulative eligible capital balance at 1 January 2017. The engine derives it from the Part 1 continuity; a supplied value is not read.
- `schedule10.line_425_prior_cec_deductions_unrecaptured`: Box 425 / amount W, the historical amount determined for variable B in ITA 13(38)(a). The sweep made a blank blocking because W increases amount X, amount BB, line 435 and the Class 14.1 UCC at line 445; the witness states the confirmed nil.
- `schedule10.line_430_amount_S_times_3_2`: Part 3 amount S multiplied by three halves. The engine computes it; a supplied value is not read.
- `schedule10.line_455_half_of_JJ`: Part 4 one half of amount JJ. The engine computes it; a supplied value is not read.
- `schedule10.line_465_amount_14_times_2`: Part 4 amount 14 doubled. The engine computes it; a supplied value is not read.
- `schedule10.line_470_reduced_capital_cost`: Part 4 reduced capital cost. The engine computes it; a supplied value is not read.
- `schedule10.line_475_income_inclusion_13_38_d_iii`: Part 4 income inclusion under ITA subparagraph 13(38)(d)(iii). The engine computes it; a supplied value is not read.
- `schedule10.line_480_proceeds_disposition_13_38_d_ii`: Part 4 proceeds of disposition under ITA subparagraph 13(38)(d)(ii). The engine computes it; a supplied value is not read.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (7 of 45 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule10.line_101_elect_13_38_d_iv | one of "Y", "N" |
| schedule10.line_102_elect_13_38_d_iii | one of "Y", "N" |
| schedule10.line_200_cec_opening_balance | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule10.line_425_prior_cec_deductions_unrecaptured | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (122)

| Cell | Types |
| --- | --- |
| amount_A | number |
| amount_AA | number |
| amount_B | number |
| amount_BB | number |
| amount_C | number |
| amount_CC | number |
| amount_D | number |
| amount_DD | number |
| amount_E | number |
| amount_EE | number |
| amount_F | number |
| amount_FF | number |
| amount_G | number |
| amount_GG | number |
| amount_H | number |
| amount_HH | number |
| amount_I | number |
| amount_II | number |
| amount_J | number |
| amount_JJ | number |
| amount_K | number |
| amount_KK | number |
| amount_L | number |
| amount_LL | number |
| amount_M | number |
| amount_MM | number |
| amount_N | number |
| amount_NN | number |
| amount_O | number |
| amount_OO | number |
| amount_P | number |
| amount_PP | number |
| amount_Q | number |
| amount_R | number |
| amount_S | number |
| amount_T | number |
| amount_U | number |
| amount_V | number |
| amount_W | number |
| amount_X | number |
| amount_Y | number |
| amount_Z | number |
| coverageStatus | string |
| filed_form_applicable | boolean |
| fired_gates | object |
| is_in_transitional_window | boolean |
| is_pre_2017_year | boolean |
| line_101 | array \| boolean \| null \| number \| object \| string |
| line_102 | array \| boolean \| null \| number \| object \| string |
| line_200 | number |
| line_222 | number |
| line_224 | number |
| line_226 | number |
| line_228 | number |
| line_230 | number |
| line_242 | number |
| line_244 | number |
| line_246 | number |
| line_248 | number |
| line_249 | number |
| line_250 | number |
| line_300 | number |
| line_400 | number |
| line_401 | number |
| line_402 | number |
| line_408 | number |
| line_409 | number |
| line_410 | number |
| line_420 | number |
| line_425 | number |
| line_430 | number |
| line_435 | number |
| line_440 | number |
| line_445 | number |
| line_450 | number |
| line_455 | number |
| line_460 | number |
| line_465 | number |
| line_470 | number |
| line_475 | number |
| line_480 | number |
| part_1_triggered | boolean |
| part_2_triggered | boolean |
| part_3_and_4_applicable | boolean |
| part_3_triggered | boolean |
| part_4_election_d_iii_active | boolean |
| part_4_election_d_iv_active | boolean |
| pool_math_kernel_result | array \| boolean \| null \| number \| object \| string |
| proration_days | integer |
| provisional | boolean |
| ready | boolean |
| s1_line_108_feed | array \| boolean \| null \| number \| object \| string |
| s1_line_405_feed | array \| boolean \| null \| number \| object \| string |
| s6_part_4_line_420_feed | array \| boolean \| null \| number \| object \| string |
| s8_line_201_feed | array \| boolean \| null \| number \| object \| string |
| s8_line_203_feed | array \| boolean \| null \| number \| object \| string |
| s8_line_205_feed | array \| boolean \| null \| number \| object \| string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].taxYear | integer |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].actual | number |
| warnings[].citation.form | string |
| warnings[].citation.reference | string |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| year_ends_after_cec_regime | boolean |

### Output cell notes

- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].citation.form`: The pinned CRA form revision identifier.
- `warnings[].citation.reference`: The lines on that face the opening and closing balances are read from.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule100

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: schedule100_exact_2025_default_branch_v1
- Payload schema version: 7.0.0
- Dependencies (run automatically): schedule1

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule100"
  ],
  "inputs": {
    "schedule100": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (21)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| functionalCurrencyIso | null \| string |  |
| isCCPC | boolean |  |
| schedule100 | object |  |
| schedule100.businessNumber | null \| string |  |
| schedule100.corporationName | null \| string |  |
| schedule100.currentYear | object |  |
| schedule100.currentYearEnd | null \| string |  |
| schedule100.functionalCurrencyT1296OnFile | boolean \| null |  |
| schedule100.insuranceUnderwritingType | null \| string |  |
| schedule100.isAmalgamationSuccessor | boolean \| null |  |
| schedule100.isFinancialInstitution | boolean \| null |  |
| schedule100.isFirstYearT2 | boolean \| null |  |
| schedule100.isInactiveCorp | boolean \| null |  |
| schedule100.isInsuranceCorp | boolean \| null |  |
| schedule100.isPartnership | boolean \| null |  |
| schedule100.priorYearClosingManualOverride | null \| object |  |
| schedule100.priorYearRetainedEarningsEvidence | null \| string |  |
| taxYear | number \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `functionalCurrencyIso`: T2 jacket box 079 ISO-4217 currency code for an ITA s.261 functional-currency election. Send it only when the return is reported in a currency other than CAD, in which case Schedule 100 will not compute until schedule100.functionalCurrencyT1296OnFile is true and the T1296 acceptance letter is on file.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule100.businessNumber`: 9-digit BN or 15-char RC account (e.g. "123456789RC0001").
- `schedule100.corporationName`: Corporation legal name (header line in .gfi handoff).
- `schedule100.currentYear`: GIFI code → amount map in VALIDATOR-SIGN convention: ordinary assets, liabilities and equity match natural sign, while retained-earnings reductions 3700/3701/3702/3741 are positive magnitudes because S100 subtracts them.
- `schedule100.currentYearEnd`: TY-end date YYYY-MM-DD.
- `schedule100.functionalCurrencyT1296OnFile`: ITA s.261 functional-currency election evidence flag. When the T2 jacket box 079 functionalCurrencyIso is set to any non-CAD currency (USD/GBP/EUR/JPY/AUD), the engine STRICT-BLOCKS S100 / S101 / S125 / S141 compute unless this flag is true AND the practitioner has uploaded the T1296 acceptance letter to the binder. Functional-currency returns are exempt from mandatory e-file per CRA — they must be paper-filed as bar-code returns; the engine therefore also flips the export-mode flag downstream when this gate fires. CAD-functional corps leave this null.
- `schedule100.insuranceUnderwritingType`: Narrower underwriter subtype per the 2026-05-24 RC4088 + vendor survey. Only the four underwriter categories trigger the PDF F/S supplement warning; "non_underwriting" (brokerage / MGA / agency sub / non-underwriting HoldCo) gets treated as an ordinary GIFI filer. Null when isInsuranceCorp is null/false.
- `schedule100.isAmalgamationSuccessor`: s.87 amalgamation successor — no prior BS to carry.
- `schedule100.isFinancialInstitution`: Bank / credit union / trust — specialised GIFI codes apply.
- `schedule100.isFirstYearT2`: First T2 — must also file Schedule 101 (opening BS).
- `schedule100.isInactiveCorp`: T2 line 280 inactive flag — abbreviated GIFI permitted.
- `schedule100.isInsuranceCorp`: RC4088 p.5 insurance carve-out (broad category — does the corp operate in the insurance industry at all?). Combined with insuranceUnderwritingType to determine whether the PDF F/S supplement advisory fires.
- `schedule100.isPartnership`: Partnership (T5013) — uses 3575/3585 instead of 3620/3640.
- `schedule100.priorYearClosingManualOverride`: Optional practitioner-entered prior-year closing balances used ONLY when no carryforward sidecar is available (new engagement migrated from TaxCycle / Taxprep / iFirm, no prior Filemark filing). A linked prior-year Filemark return's carryforward sidecar wins when both are present. Empty record / null = no manual override. Codes map directly to RC4088 (e.g., {"2599": 1500000, "3499": 600000, "3620": 900000, "3849": 850000}). Only the four mandatory anchors (2599 / 3499 / 3620 / 3849) are practically needed for the RE-start continuity check; detail codes are accepted but optional.
- `schedule100.priorYearRetainedEarningsEvidence`: Why no prior-year GIFI 3849 reached the engine. Send "linked" when the prior-year Filemark return is linked and supplies the carryforward sidecar, "manual" when there is no linked prior year and the closing anchors are keyed into `priorYearClosingManualOverride` above, or "explicitly-none" to attest there is no prior-year GIFI 3849 to reconcile against. null is unanswered and blocks filing readiness; "linked" and "manual" block too when the named channel then delivers nothing, so only "explicitly-none" leaves the return filable without a prior-year closing balance sheet.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (6 of 21 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule100.insuranceUnderwritingType | one of "life", "deposit", "p_and_c", "reinsurance_underwriter", "non_underwriting" |
| schedule100.priorYearRetainedEarningsEvidence | one of "linked", "manual", "explicitly-none", null |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (53)

| Cell | Types |
| --- | --- |
| bs_tie_out_delta_cy | number |
| businessNumber | array \| boolean \| null \| number \| object \| string |
| corporationName | array \| boolean \| null \| number \| object \| string |
| currentYear | object |
| currentYearEnd | array \| boolean \| null \| number \| object \| string |
| fired_gates | object |
| form.assetsTable | array |
| form.equityTable | array |
| form.formWarnings | array |
| form.liabilitiesTable | array |
| form.line_2599 | number |
| form.line_3499 | number |
| form.line_3620 | number |
| form.line_3640 | number |
| form.line_3640_code | string |
| form.line_3849 | number |
| form.retainedEarningsTable | array |
| isAmalgamationSuccessor | array \| boolean \| null \| number \| object \| string |
| isFinancialInstitution | array \| boolean \| null \| number \| object \| string |
| isFirstYearT2 | array \| boolean \| null \| number \| object \| string |
| isInactiveCorp | array \| boolean \| null \| number \| object \| string |
| isInsuranceCorp | array \| boolean \| null \| number \| object \| string |
| line_2599_total_assets_cy | number |
| line_3499_total_liabilities_cy | number |
| line_3620_total_shareholder_equity_cy | number |
| line_3640_total_liab_and_equity_cy | number |
| line_3680_net_income_cy | number |
| line_3849_re_end_cy | number |
| missing_required[] | string |
| provisional | boolean |
| re_continuity_delta_cy | number |
| re_expected_end_cy | number |
| ready | boolean |
| section_sum_assets_cy | number |
| section_sum_equity_cy | number |
| section_sum_liabilities_cy | number |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].box_form | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].gifiCodes[] | string |
| warnings[].message | string |
| warnings[].producers[] | string |
| warnings[].severity | string |

### Output cell notes

- `warnings[].box_form`: The form the box code belongs to when it is not Schedule 100 itself. The s.261 functional-currency finding cites T2 jacket line 079.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.

# schedule101

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: schedule101_exact_2025_default_branch_v1
- Payload schema version: 8.0.0
- Dependencies (run automatically): schedule100, schedule125

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule101"
  ],
  "inputs": {
    "schedule101": {},
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (19)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule101 | object | strict |
| schedule101.businessNumber | null \| string |  |
| schedule101.corporationName | null \| string |  |
| schedule101.currentYearEnd | null \| string |  |
| schedule101.insuranceUnderwritingType | null \| string |  |
| schedule101.isAmalgamationSuccessor | boolean \| null |  |
| schedule101.isFinancialInstitution | boolean \| null |  |
| schedule101.isFirstYearT2 | boolean \| null |  |
| schedule101.isInactiveCorp | boolean \| null |  |
| schedule101.isInsuranceCorp | boolean \| null |  |
| schedule101.isPartnership | boolean \| null |  |
| schedule101.isWindupSuccessor | boolean \| null |  |
| schedule101.openingPeriod | object |  |
| schedule101.predecessorTerminalBs | null \| object |  |
| taxYear | number \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule101.businessNumber`: 9-digit BN or 15-char RC account (e.g. "123456789RC0001").
- `schedule101.corporationName`: Corporation legal name (header line in .gfi handoff).
- `schedule101.currentYearEnd`: Tax Year End YYYY-MM-DD — the only date printed on the S101 header. Canonically stamped from the tax-year record and equal to the S100 currentYearEnd for the same return.
- `schedule101.insuranceUnderwritingType`: The insurance underwriting subtype, read with isInsuranceCorp to decide whether the RC4088 Rev.23 p.5 PDF financial statement supplement advisory fires. Send it whenever isInsuranceCorp is true, using non_underwriting for brokerages, MGAs, agency subsidiaries and non-underwriting holding companies. No enum is published because the engine routes every unrecognized string to the ordinary-filer branch rather than rejecting it.
- `schedule101.isAmalgamationSuccessor`: s.87 amalgamation successor (opening = predecessor terminal).
- `schedule101.isFinancialInstitution`: Bank / credit union / trust — specialised GIFI codes apply.
- `schedule101.isFirstYearT2`: First T2 (opening BS at incorporation date).
- `schedule101.isInactiveCorp`: T2 line 280 inactive flag — abbreviated GIFI permitted.
- `schedule101.isInsuranceCorp`: RC4088 p.5 insurance carve-out — file F/S as PDF instead.
- `schedule101.isPartnership`: Partnership (T5013) — uses 3575/3585 instead of 3620/3640.
- `schedule101.isWindupSuccessor`: s.88(1) wind-up successor (opening at wind-up effective date).
- `schedule101.openingPeriod`: GIFI code → amount map for the opening period in VALIDATOR-SIGN, identical to Schedule100Data.currentYear: ordinary assets, liabilities and equity match natural sign, while retained-earnings reductions are positive magnitudes. Non-zero RE-block rows (3660/3680/3700-02/3720/ 3740/3741/3742-45) draw a review advisory rather than a hard gate, because those rows do appear on the printed S101.
- `schedule101.predecessorTerminalBs`: Consolidated predecessor terminal-period GIFI map for the advisory s.87 opening-anchor comparison. Null/absent means no sidecar supplied.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 19 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (48)

| Cell | Types |
| --- | --- |
| bs_tie_out_delta | number |
| businessNumber | array \| boolean \| null \| number \| object \| string |
| corporationName | array \| boolean \| null \| number \| object \| string |
| currentYearEnd | array \| boolean \| null \| number \| object \| string |
| fired_gates | object |
| form.assetsTable | array |
| form.equityTable | array |
| form.formWarnings | array |
| form.liabilitiesTable | array |
| form.line_2599 | number |
| form.line_3499 | number |
| form.line_3620 | number |
| form.line_3640 | number |
| form.line_3640_code | string |
| form.line_3849 | number |
| form.retainedEarningsTable | array |
| isAmalgamationSuccessor | array \| boolean \| null \| number \| object \| string |
| isFinancialInstitution | array \| boolean \| null \| number \| object \| string |
| isFirstYearT2 | array \| boolean \| null \| number \| object \| string |
| isInactiveCorp | array \| boolean \| null \| number \| object \| string |
| isInsuranceCorp | array \| boolean \| null \| number \| object \| string |
| isPartnership | array \| boolean \| null \| number \| object \| string |
| isWindupSuccessor | array \| boolean \| null \| number \| object \| string |
| line_2599_total_assets | number |
| line_3499_total_liabilities | number |
| line_3620_total_shareholder_equity | number |
| line_3640_total_liab_and_equity | number |
| line_3849_re_end | number |
| missing_required[] | string |
| openingPeriod | object |
| provisional | boolean |
| ready | boolean |
| section_sum_assets | number |
| section_sum_equity | number |
| section_sum_liabilities | number |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |

# schedule11

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: s11_versioned_profile_target_value_v1
- Payload schema version: 0.4.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule11"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule11": {
      "rows": [
        {
          "relationshipCode": 1,
          "payments": 50000,
          "reimbursement": null,
          "loansReceivable": 0,
          "assetsSoldOrPurchased": 300000,
          "section85Applies": "Yes",
          "section85TransferorType": "taxpayer"
        }
      ]
    }
  }
}
```

## Input cells (9)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule11.rows | array |  |
| schedule11.rows[].assetsSoldOrPurchased | null \| number |  |
| schedule11.rows[].loansReceivable | null \| number |  |
| schedule11.rows[].payments | null \| number |  |
| schedule11.rows[].reimbursement | null \| number |  |
| schedule11.rows[].relationshipCode | integer \| null \| object | strict |
| schedule11.rows[].section85Applies | null \| string |  |
| schedule11.rows[].section85TransferorType | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule11.rows`: The printed form has 12 rows. Empty rows (all fields null) are allowed; the engine treats them as no-op. Filemark preserves rows beyond 12 and blocks readiness for filing-method review because the current S11 page and PDF do not prescribe an overflow procedure.
- `schedule11.rows[].assetsSoldOrPurchased`: A JSON number or explicit null. Numeric strings, blanks, booleans, non-finite values, and magnitudes beyond the existing public guard are rejected.
- `schedule11.rows[].loansReceivable`: A JSON number or explicit null. Numeric strings, blanks, booleans, non-finite values, and magnitudes beyond the existing public guard are rejected.
- `schedule11.rows[].payments`: A JSON number or explicit null. Numeric strings, blanks, booleans, non-finite values, and magnitudes beyond the existing public guard are rejected.
- `schedule11.rows[].reimbursement`: A JSON number or explicit null. Numeric strings, blanks, booleans, non-finite values, and magnitudes beyond the existing public guard are rejected.
- `schedule11.rows[].relationshipCode`: CRA box 100: 1 shareholder, 2 officer, or 3 employee.
- `schedule11.rows[].section85Applies`: CRA box 550. Null or omission remains an unanswered semantic state; the engine returns an unready target when a non-zero box 500 amount lacks an answer.
- `schedule11.rows[].section85TransferorType`: Identifies the section 85 transferor so the prescribed election form can be determined: 'taxpayer' gives the subsection 85(1) joint election on Form T2057, 'partnership' gives the subsection 85(2) election on Form T2058. When section85Applies is 'Yes' and this fact is null, omitted, or unrecognized, the engine returns an unready target with an error-severity warning on box 550. It is never inferred from relationshipCode, because a partnership can be a shareholder.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (8 of 9 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule11.rows[].assetsSoldOrPurchased | -1000000000000000 to 1000000000000000 |
| schedule11.rows[].loansReceivable | -1000000000000000 to 1000000000000000 |
| schedule11.rows[].payments | -1000000000000000 to 1000000000000000 |
| schedule11.rows[].reimbursement | -1000000000000000 to 1000000000000000 |
| schedule11.rows[].relationshipCode | one of 1, 2, 3 |
| schedule11.rows[].section85Applies | one of "Yes", "No", null |
| schedule11.rows[].section85TransferorType | one of "taxpayer", "partnership", null |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (49)

| Cell | Types |
| --- | --- |
| rows_count | integer |
| rows[].row_label | integer |
| rows[].relationshipCode | null \| number |
| rows[].payments | null \| number |
| rows[].reimbursement | null \| number |
| rows[].loansReceivable | null \| number |
| rows[].assetsSoldOrPurchased | null \| number |
| rows[].section85Applies | null \| string |
| column_totals.200 | number |
| column_totals.300 | number |
| column_totals.400 | number |
| column_totals.500 | number |
| relationship_breakdown.1 | integer |
| relationship_breakdown.2 | integer |
| relationship_breakdown.3 | integer |
| s85_election_rows[] | integer |
| s85_prescribed_forms | object |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | null \| string |
| warnings[].citation | null \| object |
| fired_gates.box_200_payments_not_remuneration | object |
| fired_gates.box_300_reimbursement_other_than_expenses | object |
| fired_gates.box_400_loans_not_repaid_by_year_end | object |
| fired_gates.box_500_assets_sold_or_purchased | object |
| fired_gates.box_550_section_85_election_applies | object |
| provisional | boolean |
| ready | boolean |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| fired_gates | object |

### Output cell notes

- `column_totals.200`: The engine's total over at most twelve inputs, each bounded to 1e15.
- `column_totals.300`: The engine's total over at most twelve inputs, each bounded to 1e15.
- `column_totals.400`: The engine's total over at most twelve inputs, each bounded to 1e15.
- `column_totals.500`: The engine's total over at most twelve inputs, each bounded to 1e15.
- `s85_prescribed_forms`: Maps each printed row label to the prescribed section 85 election form, resolved from the row's explicit transferor-type fact: 'taxpayer' gives T2057 under subsection 85(1), 'partnership' gives T2058 under subsection 85(2). Object keys are strings, even where the row labels are numbers. A box 550 Yes row with no resolvable transferor fact appears in warnings at error severity instead of in this map.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier.

# schedule125

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2010 and later
- Strict profile: s125_2025_synthetic_balanced_income_statement_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): schedule1, schedule100

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule125"
  ],
  "inputs": {
    "schedule125": {
      "businessNumber": "123456782",
      "corporationName": "Cedar Ridge Manufacturing Inc.",
      "currentYear": {
        "8000": 100000,
        "8520": 30000,
        "8523": 10000,
        "8670": 10000,
        "9970": 50000,
        "9990": 5000,
        "9999": 45000
      },
      "currentYearEnd": "2025-12-31",
      "priorYear": {
        "8000": 80000,
        "8520": 25000,
        "8523": 9000,
        "8670": 8000,
        "9970": 38000,
        "9990": 4000,
        "9999": 34000
      },
      "priorYearEnd": "2024-12-31"
    },
    "schedule1BookNetIncome": 45000,
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "isCCPC": true
  }
}
```

## Input cells (42)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule125 | object |  |
| schedule125.businessNumber | null \| string | strict |
| schedule125.corporationName | null \| string | strict |
| schedule125.currentYear | object |  |
| schedule125.currentYear.8000 | integer | strict |
| schedule125.currentYear.8520 | integer | strict |
| schedule125.currentYear.8523 | integer | strict |
| schedule125.currentYear.8670 | integer | strict |
| schedule125.currentYear.9970 | null \| number \| string | strict |
| schedule125.currentYear.9975 | null \| number \| string |  |
| schedule125.currentYear.9976 | null \| number \| string |  |
| schedule125.currentYear.9980 | null \| number \| string |  |
| schedule125.currentYear.9985 | null \| number \| string |  |
| schedule125.currentYear.9990 | integer \| null \| number | strict |
| schedule125.currentYear.9995 | null \| number \| string |  |
| schedule125.currentYear.9998 | null \| number \| string |  |
| schedule125.currentYear.9999 | integer | strict |
| schedule125.currentYearEnd | null \| string | strict |
| schedule125.insuranceUnderwritingType | null \| string |  |
| schedule125.internetAttributableGifiCodes | array |  |
| schedule125.isAmalgamationSuccessor | boolean \| null |  |
| schedule125.isFarmCorp | boolean \| null |  |
| schedule125.isFinancialInstitution | boolean \| null |  |
| schedule125.isFirstYearT2 | boolean \| null |  |
| schedule125.isInactiveCorp | boolean \| null |  |
| schedule125.isInsuranceCorp | boolean \| null |  |
| schedule125.isPartnership | boolean \| null |  |
| schedule125.priorYear | object |  |
| schedule125.priorYear.8000 | integer | strict |
| schedule125.priorYear.8520 | integer | strict |
| schedule125.priorYear.8523 | integer | strict |
| schedule125.priorYear.8670 | integer | strict |
| schedule125.priorYear.9970 | integer | strict |
| schedule125.priorYear.9990 | integer | strict |
| schedule125.priorYear.9999 | integer | strict |
| schedule125.priorYearEnd | null \| string | strict |
| schedule1BookNetIncome | integer \| null \| number \| string | strict |
| taxYear | number \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count tied to fiscalStart/fiscalEnd for the settled Part I dependency closure.
- `fiscalEnd`: Canonical taxation-year end required by the settled Part I dependency closure.
- `fiscalStart`: Canonical taxation-year start required by the settled Part I dependency closure.
- `isCCPC`: Exact corporation-status fact carried by this positive witness.
- `schedule125.businessNumber`: 9-digit BN or 15-char RC account (e.g. "123456789RC0001").
- `schedule125.corporationName`: Corporation legal name (header line in .gfi handoff).
- `schedule125.currentYear`: GIFI 8000-9999 code → validator-sign amount map for the current year. In the S125 range this is numerically identical to natural sign.
- `schedule125.currentYear.9970`: GIFI 9970, net income or loss before taxes and extraordinary items, equal to GIFI 9369 plus 9899. A mandatory form-face anchor: RC4088 requires it even at nil, so enter 0 rather than leaving it out.
- `schedule125.currentYear.9975`: GIFI 9975, extraordinary items, in the net income summary block between GIFI 9970 and 9999.
- `schedule125.currentYear.9976`: GIFI 9976, legal settlements, in the net income summary block between GIFI 9970 and 9999.
- `schedule125.currentYear.9980`: GIFI 9980, unrealized gains and losses, in the net income summary block between GIFI 9970 and 9999.
- `schedule125.currentYear.9985`: GIFI 9985, unusual items, in the net income summary block between GIFI 9970 and 9999.
- `schedule125.currentYear.9995`: GIFI 9995, deferred income tax expense, in the net income summary block between GIFI 9970 and 9999.
- `schedule125.currentYear.9998`: GIFI 9998, total other comprehensive income, the sum of GIFI 7000 through 7020.
- `schedule125.currentYearEnd`: CY end date YYYY-MM-DD.
- `schedule125.insuranceUnderwritingType`: The insurance underwriting subtype, read with isInsuranceCorp to decide whether the RC4088 Rev.23 p.5 PDF financial statement supplement advisory fires. Send it whenever isInsuranceCorp is true, using non_underwriting for brokerages, MGAs, agency subsidiaries and non-underwriting holding companies. No enum is published because the engine routes every unrecognized string to the ordinary-filer branch rather than rejecting it.
- `schedule125.internetAttributableGifiCodes`: Practitioner-tagged GIFI codes deemed internet-attributable, for the S88 cross-feed. Must be revenue-range codes (8000-8299, exclusive of subtotals 8089/8299). Every code is opted in explicitly; nothing is tagged by default.
- `schedule125.isAmalgamationSuccessor`: Legacy compatibility metadata; inert in the S125 calculation.
- `schedule125.isFarmCorp`: Farm corp — GIFI 9370-9899 farm bands are populated. Advisory.
- `schedule125.isFinancialInstitution`: Bank / credit union / trust — specialised GIFI codes apply.
- `schedule125.isFirstYearT2`: Legacy compatibility metadata; inert in the S125 calculation.
- `schedule125.isInactiveCorp`: T2 line 280 inactive flag — abbreviated GIFI permitted.
- `schedule125.isInsuranceCorp`: RC4088 p.5 insurance carve-out — file F/S as PDF instead.
- `schedule125.isPartnership`: Partnership (T5013) — uses partnership IS GIFI layout.
- `schedule125.priorYear`: Optional Filemark prior-period comparative map, same validator-sign convention. It is not rendered as a second CRA S125 amount column and never gates readiness.
- `schedule125.priorYearEnd`: Optional Filemark comparative period end; not a CRA S125 field.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (23 of 42 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule125.businessNumber | 0 to 20000 characters |
| schedule125.corporationName | 0 to 20000 characters |
| schedule125.currentYear.8000 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYear.8520 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYear.8523 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYear.8670 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYear.9970 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule125.currentYear.9990 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYear.9999 | -1000000000000000 to 1000000000000000 |
| schedule125.currentYearEnd | 0 to 20000 characters |
| schedule125.priorYear.8000 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.8520 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.8523 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.8670 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.9970 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.9990 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYear.9999 | -1000000000000000 to 1000000000000000 |
| schedule125.priorYearEnd | 0 to 20000 characters |
| schedule1BookNetIncome | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (98)

| Cell | Types |
| --- | --- |
| businessNumber | null \| string |
| corporationName | null \| string |
| currentYear.8000 | integer |
| currentYear.8520 | integer |
| currentYear.8523 | integer |
| currentYear.8670 | integer |
| currentYear.9970 | integer |
| currentYear.9990 | integer |
| currentYear.9999 | integer |
| currentYearEnd | null \| string |
| fired_gates | object |
| form.cogsTable | array |
| form.extraordinaryTable[].amount | number |
| form.extraordinaryTable[].code | string |
| form.farmExpensesTable | array |
| form.farmRevenueTable | array |
| form.formWarnings | array |
| form.line_8299 | number |
| form.line_9368 | number |
| form.line_9369 | number |
| form.line_9659 | number |
| form.line_9898 | number |
| form.line_9899 | number |
| form.line_9970 | number |
| form.line_9998 | number |
| form.line_9999 | number |
| form.operatingExpensesTable[].amount | number |
| form.operatingExpensesTable[].code | string |
| form.revenueTable[].amount | number |
| form.revenueTable[].code | string |
| form.ociTable | array |
| form.schedule140Line9970 | array \| boolean \| null \| number \| object \| string |
| form.schedule140Line9999 | array \| boolean \| null \| number \| object \| string |
| form.schedule140Table | array |
| formula_9999_delta_cy | null \| number |
| formula_9999_expected_cy | number |
| gifi_9998 | number |
| gifi_9999 | number |
| impairment_candidate_ni_sum_cy | number |
| impairment_candidate_oci_sum_cy | number |
| internet_attributable_gifi_codes | array \| boolean \| null \| number \| object \| string |
| internet_revenue_cy | number |
| internet_revenue_pct_cy | null \| number |
| isAmalgamationSuccessor | array \| boolean \| null \| number \| object \| string |
| isFarmCorp | array \| boolean \| null \| number \| object \| string |
| isFinancialInstitution | array \| boolean \| null \| number \| object \| string |
| isFirstYearT2 | array \| boolean \| null \| number \| object \| string |
| isInactiveCorp | array \| boolean \| null \| number \| object \| string |
| isInsuranceCorp | array \| boolean \| null \| number \| object \| string |
| line_8089_total_sales_cy | number |
| line_8299_total_revenue_cy | number |
| line_8518_cost_of_sales_cy | number |
| line_8519_gross_profit_cy | number |
| line_9367_total_operating_expenses_cy | number |
| line_9368_total_expenses_cy | number |
| line_9369_net_nonfarm_cy | number |
| line_9659_total_farm_revenue_cy | number |
| line_9898_total_farm_expenses_cy | number |
| line_9899_net_farm_cy | number |
| line_9970_net_income_before_tax_cy | number |
| line_9998_oci_total_cy | number |
| line_9999_net_income_after_tax_cy | number |
| missing_required[] | string |
| net_income_after_tax | number |
| oci_total | number |
| priorYear.8000 | integer |
| priorYear.8520 | integer |
| priorYear.8523 | integer |
| priorYear.8670 | integer |
| priorYear.9970 | integer |
| priorYear.9990 | integer |
| priorYear.9999 | integer |
| priorYearEnd | null \| string |
| provisional | boolean |
| ready | boolean |
| section_sum_cogs_cy | number |
| section_sum_farm_expenses_cy | number |
| section_sum_farm_revenue_cy | number |
| section_sum_operating_expenses_cy | number |
| section_sum_operating_expenses_py | number |
| section_sum_revenue_cy | number |
| section_sum_revenue_py | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].producers[] | string |
| warnings[].severity | string |
| warnings[].kind | string |

### Output cell notes

- `businessNumber`: Schedule 125's header cell for the corporation's CRA program account. Null when the request did not supply it; the finding that names the cell is then raised and the cell name is listed in `missing_required`.
- `corporationName`: Schedule 125's header cell for the corporation's name. Null when the request did not supply it; the finding that names the cell is then raised and the cell name is listed in `missing_required`.
- `currentYearEnd`: Schedule 125's header cell for the current tax year-end (YYYY-MM-DD). Null when the request did not supply it; the finding that names the cell is then raised and the cell name is listed in `missing_required`.
- `priorYearEnd`: Schedule 125's header cell for the prior tax year-end (YYYY-MM-DD). Null when the request did not supply it; the finding that names the cell is then raised and the cell name is listed in `missing_required`.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].kind`: The finding family, on the findings that publish one. The form projection integrity finding carries `form_projection`.

# schedule13

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s13_exact_single_request_target_value_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): reserve_continuity, schedule24

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule13"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule13": {
      "part1CapitalGainsReserves": [],
      "part2DoubtfulDebts": {
        "openingBalance": 5000,
        "amalgamationTransfer": 0,
        "closingBalance": 5500
      }
    }
  }
}
```

## Input cells (71)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule13.line008TotalOpening | null \| number \| string |  |
| schedule13.line010TotalClosing | null \| number \| string |  |
| schedule13.part1CapitalGainsReserves | array |  |
| schedule13.part1CapitalGainsReserves[].amalgamationTransfer | null \| number |  |
| schedule13.part1CapitalGainsReserves[].closingBalance | null \| number |  |
| schedule13.part1CapitalGainsReserves[].description | null \| string |  |
| schedule13.part1CapitalGainsReserves[].dispositionDate | null \| string |  |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserve | null \| string |  |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserveEligibilityConfirmed | null \| string |  |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserveProvision | null \| string |  |
| schedule13.part1CapitalGainsReserves[].isActiveAsset | null \| string |  |
| schedule13.part1CapitalGainsReserves[].isForeignSource | null \| string |  |
| schedule13.part1CapitalGainsReserves[].openingBalance | null \| number |  |
| schedule13.part1CapitalGainsReserves[].originalGain | null \| number |  |
| schedule13.part1CapitalGainsReserves[].precedingTaxationYearsEndingAfterDisposition | null \| number |  |
| schedule13.part1CapitalGainsReserves[].proceedsNotDueAfterYearEnd | null \| number |  |
| schedule13.part1CapitalGainsReserves[].proceedsOfDisposition | null \| number |  |
| schedule13.part1CapitalGainsReserves[].purchaserControlRelationship | null \| string |  |
| schedule13.part1CapitalGainsReserves[].purchaserMajorityInterestPartnership | null \| string |  |
| schedule13.part1CapitalGainsReserves[].taxpayerNonResident | null \| string |  |
| schedule13.part1CapitalGainsReserves[].taxpayerTaxExempt | null \| string |  |
| schedule13.part1CapitalGainsReserves[].yearOfDisposition | null \| number |  |
| schedule13.part2DoubtfulDebts | object |  |
| schedule13.part2DoubtfulDebts.amalgamationTransfer | null \| number | strict |
| schedule13.part2DoubtfulDebts.closingBalance | null \| number | strict |
| schedule13.part2DoubtfulDebts.isActiveAsset | boolean \| null |  |
| schedule13.part2DoubtfulDebts.isForeignSource | boolean \| null |  |
| schedule13.part2DoubtfulDebts.openingBalance | null \| number \| string | strict |
| schedule13.part2DoubtfulDebts.statutoryBasis | null \| string |  |
| schedule13.part2DoubtfulDebts.statutoryProvision | null \| string |  |
| schedule13.part2OtherTaxReserves | object |  |
| schedule13.part2OtherTaxReserves.amalgamationTransfer | null \| number |  |
| schedule13.part2OtherTaxReserves.closingBalance | null \| number |  |
| schedule13.part2OtherTaxReserves.isActiveAsset | boolean \| null |  |
| schedule13.part2OtherTaxReserves.isForeignSource | boolean \| null |  |
| schedule13.part2OtherTaxReserves.openingBalance | null \| number |  |
| schedule13.part2OtherTaxReserves.statutoryBasis | null \| string |  |
| schedule13.part2OtherTaxReserves.statutoryProvision | null \| string |  |
| schedule13.part2PrepaidRent | object |  |
| schedule13.part2PrepaidRent.amalgamationTransfer | null \| number |  |
| schedule13.part2PrepaidRent.closingBalance | null \| number |  |
| schedule13.part2PrepaidRent.isActiveAsset | boolean \| null |  |
| schedule13.part2PrepaidRent.isForeignSource | boolean \| null |  |
| schedule13.part2PrepaidRent.openingBalance | null \| number |  |
| schedule13.part2PrepaidRent.statutoryBasis | null \| string |  |
| schedule13.part2PrepaidRent.statutoryProvision | null \| string |  |
| schedule13.part2ReturnableContainers | object |  |
| schedule13.part2ReturnableContainers.amalgamationTransfer | null \| number |  |
| schedule13.part2ReturnableContainers.closingBalance | null \| number |  |
| schedule13.part2ReturnableContainers.isActiveAsset | boolean \| null |  |
| schedule13.part2ReturnableContainers.isForeignSource | boolean \| null |  |
| schedule13.part2ReturnableContainers.openingBalance | null \| number |  |
| schedule13.part2ReturnableContainers.statutoryBasis | null \| string |  |
| schedule13.part2ReturnableContainers.statutoryProvision | null \| string |  |
| schedule13.part2UndeliveredGoodsAndServices | object |  |
| schedule13.part2UndeliveredGoodsAndServices.amalgamationTransfer | null \| number |  |
| schedule13.part2UndeliveredGoodsAndServices.closingBalance | null \| number |  |
| schedule13.part2UndeliveredGoodsAndServices.isActiveAsset | boolean \| null |  |
| schedule13.part2UndeliveredGoodsAndServices.isForeignSource | boolean \| null |  |
| schedule13.part2UndeliveredGoodsAndServices.openingBalance | null \| number |  |
| schedule13.part2UndeliveredGoodsAndServices.statutoryBasis | null \| string |  |
| schedule13.part2UndeliveredGoodsAndServices.statutoryProvision | null \| string |  |
| schedule13.part2UnpaidAmounts | object |  |
| schedule13.part2UnpaidAmounts.amalgamationTransfer | null \| number |  |
| schedule13.part2UnpaidAmounts.closingBalance | null \| number |  |
| schedule13.part2UnpaidAmounts.isActiveAsset | boolean \| null |  |
| schedule13.part2UnpaidAmounts.isForeignSource | boolean \| null |  |
| schedule13.part2UnpaidAmounts.openingBalance | null \| number |  |
| schedule13.part2UnpaidAmounts.statutoryBasis | null \| string |  |
| schedule13.part2UnpaidAmounts.statutoryProvision | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule13.line008TotalOpening`: Part 1 box 008, the total of the opening column across the capital gains reserve rows. The engine computes it from the rows, so send it only to reconcile an imported figure; a difference over one dollar is reported as an error.
- `schedule13.line010TotalClosing`: Part 1 box 010, the total of the closing column across the capital gains reserve rows, which the form footer routes to Schedule 6 line 885.
- `schedule13.part1CapitalGainsReserves`: Part 1 capital gains reserves (per-row). Empty array is valid for a corp with no capital-gains-reserve continuity.
- `schedule13.part1CapitalGainsReserves[].amalgamationTransfer`: Box 003 — Transfer on an amalgamation (ITA s.87(2)(g)/(m)) or the wind-up of a subsidiary (s.88(1)(e.1)). Normally null/zero unless the corp had a successor event in the tax year.
- `schedule13.part1CapitalGainsReserves[].closingBalance`: Box 004 — Balance at the end of the year. The fresh CY-end reserve the practitioner claims; tied to S6 per-disposition reserve calc.
- `schedule13.part1CapitalGainsReserves[].description`: Box 001 — Description of property. Required when the row has any non-zero amount in boxes 002/003/004.
- `schedule13.part1CapitalGainsReserves[].extendedTenYearReserve`: ITA 40(1.1) to (1.4) — "Yes" when the disposition is one for which s.40(1)(a)(iii) is read with "1/10" and "9": to the taxpayer's child of family farm/fishing property or a QSBC share (1.1), a qualifying intergenerational transfer under s.84.1(2.31)/(2.32) (1.2), a qualifying business transfer to an employee ownership trust (1.3), or a qualifying cooperative conversion (1.4). Read through norm_yes_no; blank is UNANSWERED and blocks, never an implicit "No".
- `schedule13.part1CapitalGainsReserves[].isActiveAsset`: Non-printed s.125(7) character of the property whose gain carries the reserve. Blank is unanswered and blocks a non-zero reserve swing.
- `schedule13.part1CapitalGainsReserves[].isForeignSource`: Non-printed s.129(4) source character of that same property.
- `schedule13.part1CapitalGainsReserves[].openingBalance`: Box 002 — Balance at the beginning of the year. Must equal the prior-year closing balance per the continuity-of-reserves semantics; the carryforward function auto-rolls PY closing → CY opening.
- `schedule13.part1CapitalGainsReserves[].originalGain`: Statutory gain base for clauses (C)/(D): ordinarily the ITA 40(1)(a)(i) gain. On an inherited box-003 reserve, ITA 87(2)(m)(ii) instead deems the predecessor's claimed reserve to be that amount.
- `schedule13.part1CapitalGainsReserves[].precedingTaxationYearsEndingAfterDisposition`: OPTIONAL override for N itself — "the number of preceding taxation years of the taxpayer ending after the disposition of the property". Normally derived as (filing year − yearOfDisposition), which is exact while the corporation's taxation years map one-to-one onto year labels. A short year (or two year-ends in one calendar year) makes the derived count too low and the cap too generous, so the practitioner may state the statutory count and it governs. Exception: a proven predecessor reserve in box 003 uses N = 1 under ITA 87(2)(m)(i) (also applied to a qualifying wind-up by 88(1)(e.2)); a…
- `schedule13.part1CapitalGainsReserves[].proceedsNotDueAfterYearEnd`: ITA 40(1)(a)(iii)(C) — "such of the proceeds of disposition of the property that are payable to the taxpayer after the end of the year". Measured at EACH year end, so it is re-answered every year and the carryforward resets it.
- `schedule13.part1CapitalGainsReserves[].proceedsOfDisposition`: ITA 40(1)(a)(iii)(C) — the property's TOTAL proceeds of disposition, the denominator of the clause (C) portion. Fixed at the sale.
- `schedule13.part1CapitalGainsReserves[].purchaserControlRelationship`: ITA 40(2)(a)(ii) — the purchaser is a corporation that, immediately after the sale, (A) was controlled by the taxpayer, (B) was controlled by the person or group controlling the taxpayer, or (C) controlled the taxpayer. Fixed at the sale; carried forward.
- `schedule13.part1CapitalGainsReserves[].purchaserMajorityInterestPartnership`: ITA 40(2)(a)(iii) — the purchaser is a partnership in which the taxpayer was, immediately after the sale, a majority-interest partner. Fixed at the sale; carried forward.
- `schedule13.part1CapitalGainsReserves[].taxpayerNonResident`: ITA 40(2)(a)(i) — the taxpayer, at the end of the year or at any time in the immediately following year, was not resident in Canada.
- `schedule13.part1CapitalGainsReserves[].taxpayerTaxExempt`: ITA 40(2)(a)(i) — ... or was exempt from tax under any provision of this Part.
- `schedule13.part1CapitalGainsReserves[].yearOfDisposition`: ITA 40(1)(a)(iii)(D) — the taxation year in which the property was disposed of, as the same integer year label the engine files under. N (the preceding taxation years ending after the disposition) is derived from it; nil in the year of disposition.
- `schedule13.part2DoubtfulDebts`: Box 110/115/120 — Reserve for doubtful debts (ITA s.20(1)(l)).
- `schedule13.part2DoubtfulDebts.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2DoubtfulDebts.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `schedule13.part2OtherTaxReserves`: Box 230/235/240 — Other tax reserves (T4012 catch-all: s.20(1)(o) special shipping surveys, s.20(1)(oo)/(pp) salary-deferral amounts, s.32(1) unearned non-life-insurance commissions, etc.).
- `schedule13.part2OtherTaxReserves.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2OtherTaxReserves.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `schedule13.part2PrepaidRent`: Box 150/155/160 — Reserve for prepaid rent (ITA s.20(1)(m)(iii) applied to amounts forced-included under s.12(1)(a) for advance rent or other use-of-property payments).
- `schedule13.part2PrepaidRent.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2PrepaidRent.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `schedule13.part2ReturnableContainers`: Box 190/195/200 — Reserve for returnable containers (ITA s.20(1)(m)(iv) for non-bottle deposits; bottle deposits fall outside (m)(iv) by statutory carve-out and are reported under s.20(1)(m.2) per CRA administrative practice).
- `schedule13.part2ReturnableContainers.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2ReturnableContainers.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `schedule13.part2UndeliveredGoodsAndServices`: Box 130/135/140 — Reserve for undelivered goods and services not rendered (ITA s.20(1)(m)).
- `schedule13.part2UndeliveredGoodsAndServices.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2UndeliveredGoodsAndServices.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `schedule13.part2UnpaidAmounts`: Box 210/215/220 — Reserve for unpaid amounts (ITA s.20(1)(n) instalment-sale reserve; NOT the s.78 unpaid-expense add-back).
- `schedule13.part2UnpaidAmounts.isActiveAsset`: ITA 40(2)(a) / s.125(5.1) character declarations on the reserve swing — tri-state; a row persisted before these existed normalizes to null (unanswered), never "No" (TXE-727 family).
- `schedule13.part2UnpaidAmounts.statutoryProvision`: Non-printed support for a manually entered reserve. The catchall row cannot be linked to a generic workpaper because its statutory tests vary by provision; absent values remain unanswered and block a non-zero row.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (23 of 71 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule13.part1CapitalGainsReserves[].amalgamationTransfer | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].closingBalance | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].description | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].dispositionDate | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserve | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserveEligibilityConfirmed | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].extendedTenYearReserveProvision | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].isActiveAsset | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].isForeignSource | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].openingBalance | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].originalGain | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].precedingTaxationYearsEndingAfterDisposition | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].proceedsNotDueAfterYearEnd | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].proceedsOfDisposition | -1000000000000000 to 1000000000000000 |
| schedule13.part1CapitalGainsReserves[].purchaserControlRelationship | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].purchaserMajorityInterestPartnership | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].taxpayerNonResident | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].taxpayerTaxExempt | 0 to 20000 characters |
| schedule13.part1CapitalGainsReserves[].yearOfDisposition | -1000000000000000 to 1000000000000000 |
| schedule13.part2DoubtfulDebts.amalgamationTransfer | -1000000000000000 to 1000000000000000 |
| schedule13.part2DoubtfulDebts.closingBalance | -1000000000000000 to 1000000000000000 |
| schedule13.part2DoubtfulDebts.openingBalance | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (106)

| Cell | Types |
| --- | --- |
| fired_gates | object |
| form.cell_110 | number |
| form.cell_115 | number |
| form.cell_120 | number |
| form.cell_130 | number |
| form.cell_135 | number |
| form.cell_140 | number |
| form.cell_150 | number |
| form.cell_155 | number |
| form.cell_160 | number |
| form.cell_190 | number |
| form.cell_195 | number |
| form.cell_200 | number |
| form.cell_210 | number |
| form.cell_215 | number |
| form.cell_220 | number |
| form.cell_230 | number |
| form.cell_235 | number |
| form.cell_240 | number |
| form.form_warnings | array |
| form.line_008 | number |
| form.line_009 | number |
| form.line_010 | number |
| form.line_270 | number |
| form.line_275 | number |
| form.line_280 | number |
| form.part1OverflowRows | array |
| form.part1PrintedRowCapacity | integer |
| form.part1RowCount | integer |
| form.part1Table | array |
| line_880_posting | string |
| line_885_posting | string |
| part_1.line_008_total_opening | string |
| part_1.line_009_total_amalgamation_transfer | string |
| part_1.line_010_total_closing | string |
| part_1.per_row_reserve_cap_proven | boolean |
| part_1.rows | array |
| part_2.doubtful_debts.amalgamationTransfer | null \| string |
| part_2.doubtful_debts.closingBalance | null \| string |
| part_2.doubtful_debts.openingBalance | null \| string |
| part_2.doubtful_debts.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.doubtful_debts.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| part_2.line_270_total_opening | string |
| part_2.line_275_total_amalgamation_transfer | string |
| part_2.line_280_total_closing | string |
| part_2.other_tax_reserves.amalgamationTransfer | array \| boolean \| null \| number \| object \| string |
| part_2.other_tax_reserves.closingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.other_tax_reserves.openingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.other_tax_reserves.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.other_tax_reserves.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| part_2.prepaid_rent.amalgamationTransfer | array \| boolean \| null \| number \| object \| string |
| part_2.prepaid_rent.closingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.prepaid_rent.openingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.prepaid_rent.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.prepaid_rent.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| part_2.reserve_continuity | object |
| part_2.reserves[].amalgamationTransfer | null \| string |
| part_2.reserves[].closingBalance | null \| string |
| part_2.reserves[].openingBalance | null \| string |
| part_2.reserves[].reserveType | string |
| part_2.returnable_containers.amalgamationTransfer | array \| boolean \| null \| number \| object \| string |
| part_2.returnable_containers.closingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.returnable_containers.openingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.returnable_containers.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.returnable_containers.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| part_2.undelivered_goods_and_services.amalgamationTransfer | array \| boolean \| null \| number \| object \| string |
| part_2.undelivered_goods_and_services.closingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.undelivered_goods_and_services.openingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.undelivered_goods_and_services.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.undelivered_goods_and_services.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| part_2.unpaid_amounts.amalgamationTransfer | array \| boolean \| null \| number \| object \| string |
| part_2.unpaid_amounts.closingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.unpaid_amounts.openingBalance | array \| boolean \| null \| number \| object \| string |
| part_2.unpaid_amounts.statutoryBasis | array \| boolean \| null \| number \| object \| string |
| part_2.unpaid_amounts.statutoryProvision | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| ready | boolean |
| s1_line_125_feed | string |
| s1_line_413_feed | string |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].actual | number |
| warnings[].citation.form | string |
| warnings[].citation.reference | string |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| s1_written_off_20_1_p_feed | string |

### Output cell notes

- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].citation.form`: The pinned CRA form revision identifier.
- `warnings[].citation.reference`: The lines on that face the opening and closing balances are read from.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule130

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s130_2025_zero_ife_ati_projection_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule130"
  ],
  "inputs": {
    "daysInYear": 365,
    "fiscalEnd": "2025-12-31",
    "fiscalStart": "2025-01-01",
    "schedule130": {
      "currentYearCapacityProvenance": [
        {
          "amount": 150000,
          "capacityType": "excess",
          "eventSide": "post_event",
          "originTaxpayerId": "cedar-ridge-manufacturing",
          "sourceReference": "strict target excess-capacity workpaper"
        }
      ],
      "line079TaxableIncome": 500000,
      "lossRestrictionEventFacts": {
        "actualControlAcquired": "no",
        "determinationStatus": "confirmed_absent",
        "reviewed": true,
        "s256_1DeemedControl": "no",
        "s256_7ControlAcquired": "no",
        "s256_8DeemedControl": "no",
        "schemaVersion": 1,
        "sourceReference": "strict target reviewed no-event witness"
      },
      "taxpayerId": "cedar-ridge-manufacturing",
      "taxYearStartDate": "2025-01-01"
    },
    "taxYear": 2025
  }
}
```

## Input cells (242)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule130 | null \| object |  |
| schedule130.allocatedGroupRatioAmount | null \| number |  |
| schedule130.borrowingsRows | array |  |
| schedule130.borrowingsRows[].relationship | string |  |
| schedule130.borrowingsRows[].totalNotionalDerivatives | null \| number |  |
| schedule130.borrowingsRows[].totalPrincipal | null \| number |  |
| schedule130.borrowingsRows[].variableA_para_a | null \| number |  |
| schedule130.borrowingsRows[].variableA_para_e | null \| number |  |
| schedule130.borrowingsRows[].variableB_para_a | null \| number |  |
| schedule130.capitalizedIfeRows | array |  |
| schedule130.capitalizedIfeRows[].businessCeasedAtYearEnd | boolean \| null |  |
| schedule130.capitalizedIfeRows[].classNumber | null \| string |  |
| schedule130.capitalizedIfeRows[].ifeCcaClaimed | null \| number |  |
| schedule130.capitalizedIfeRows[].ifeClosingUcc | null \| number |  |
| schedule130.capitalizedIfeRows[].ifeCostAdjustments | null \| number |  |
| schedule130.capitalizedIfeRows[].ifeOpeningUcc | null \| number |  |
| schedule130.capitalizedIfeRows[].ifeTerminalLoss | null \| number |  |
| schedule130.capitalizedIfeRows[].ifeUcc | null \| number |  |
| schedule130.capitalizedIfeRows[].propertyRemainingStatus | string |  |
| schedule130.capitalizedIfeRows[].section13_4_3FormerPropertyApplies | boolean \| null |  |
| schedule130.ccpcGroupTaxableCapitalEmployedInCanada | null \| number |  |
| schedule130.cfaDeniedRows | array |  |
| schedule130.cfaDeniedRows[].affiliateVariableA | null \| number |  |
| schedule130.cfaDeniedRows[].cfaName | null \| string |  |
| schedule130.cfaDeniedRows[].corpsShareOfDeniedAmount | null \| number |  |
| schedule130.cfaDeniedRows[].deniedAmount | null \| number |  |
| schedule130.cfaDeniedRows[].proportionG | null \| number |  |
| schedule130.cfaDeniedRows[].specifiedParticipatingPct | null \| number |  |
| schedule130.cfaPartnershipInclusionRows | array |  |
| schedule130.cfaPartnershipInclusionRows[].amountFapiInclusion | null \| number |  |
| schedule130.cfaPartnershipInclusionRows[].cfaName | null \| string |  |
| schedule130.cfaPartnershipInclusionRows[].corpsShareOfInclusion | null \| number |  |
| schedule130.cfaPartnershipInclusionRows[].specifiedParticipatingPct | null \| number |  |
| schedule130.claim111_1_aNotReducingTaxableIncome | null \| number |  |
| schedule130.consolidatedStatementsAudited | boolean \| null |  |
| schedule130.cuecRows | array |  |
| schedule130.cuecRows[].amountsAbsorbed | null \| number |  |
| schedule130.cuecRows[].amountsTransferred | null \| number |  |
| schedule130.cuecRows[].capacityProvenance | array |  |
| schedule130.cuecRows[].capacityProvenance[].amount | null \| number |  |
| schedule130.cuecRows[].capacityProvenance[].capacityType | string |  |
| schedule130.cuecRows[].capacityProvenance[].electionReference | null \| string |  |
| schedule130.cuecRows[].capacityProvenance[].eventSide | string |  |
| schedule130.cuecRows[].capacityProvenance[].originTaxpayerId | null \| string |  |
| schedule130.cuecRows[].capacityProvenance[].sourceReference | null \| string |  |
| schedule130.cuecRows[].capacityProvenance[].sourceTaxYearEnd | null \| string |  |
| schedule130.cuecRows[].capacityProvenance[].transfereeTaxpayerId | null \| string |  |
| schedule130.cuecRows[].capacityProvenance[].transferorTaxpayerId | null \| string |  |
| schedule130.cuecRows[].excessCapacity | null \| number |  |
| schedule130.cuecRows[].label | string |  |
| schedule130.cuecRows[].netAvailable | null \| number |  |
| schedule130.cuecRows[].precedingYearEnd | null \| string |  |
| schedule130.currentYearCapacityProvenance | array |  |
| schedule130.currentYearCapacityProvenance[].amount | null \| number | strict |
| schedule130.currentYearCapacityProvenance[].capacityType | string | strict |
| schedule130.currentYearCapacityProvenance[].electionReference | null \| string |  |
| schedule130.currentYearCapacityProvenance[].eventSide | string | strict |
| schedule130.currentYearCapacityProvenance[].originTaxpayerId | null \| string | strict |
| schedule130.currentYearCapacityProvenance[].sourceReference | null \| string | strict |
| schedule130.currentYearCapacityProvenance[].sourceTaxYearEnd | null \| string |  |
| schedule130.currentYearCapacityProvenance[].transfereeTaxpayerId | null \| string |  |
| schedule130.currentYearCapacityProvenance[].transferorTaxpayerId | null \| string |  |
| schedule130.currentYearRifeComponents | array |  |
| schedule130.currentYearRifeComponents[].amount | null \| number |  |
| schedule130.currentYearRifeComponents[].businessId | null \| string |  |
| schedule130.currentYearRifeComponents[].componentType | string |  |
| schedule130.currentYearRifeComponents[].eventSide | string |  |
| schedule130.currentYearRifeComponents[].sourceReference | null \| string |  |
| schedule130.currentYearRifeComponents[].vintageId | null \| string |  |
| schedule130.excludedEntityParagraph | null \| string |  |
| schedule130.excludedInterestElectionMade | boolean \| null |  |
| schedule130.exemptIfeRows | array |  |
| schedule130.exemptIfeRows[].ifeIncurred | null \| number |  |
| schedule130.exemptIfeRows[].incomeFromFundedActivities | null \| number |  |
| schedule130.exemptIfeRows[].lossFromFundedActivities | null \| number |  |
| schedule130.exemptIfeRows[].principalAmount | null \| number |  |
| schedule130.exemptIfeRows[].publicSectorAuthority | null \| string |  |
| schedule130.fairValueAdjustmentsElectionMade | boolean \| null |  |
| schedule130.filedT2225GroupRatioElection | boolean \| null |  |
| schedule130.filedT2228PreRegimeLossElection | boolean \| null |  |
| schedule130.filedT2229ForgoFaplElection | boolean \| null |  |
| schedule130.groupAdjustedNetBookIncome | null \| number |  |
| schedule130.groupAggregateIfeAndExemptIfe | null \| number |  |
| schedule130.groupAggregateIfrExcludingFinancialInstitutionGroup | null \| number |  |
| schedule130.groupMemberAtiTotal | null \| number |  |
| schedule130.groupMemberAtiTotalPre257 | null \| number |  |
| schedule130.groupNetInterestExpense | null \| number |  |
| schedule130.groupRatio | null \| number |  |
| schedule130.groupRatioAllocationRows | array |  |
| schedule130.groupRatioAllocationRows[].accountNumber | null \| string |  |
| schedule130.groupRatioAllocationRows[].allocatedAmount | null \| number |  |
| schedule130.groupRatioAllocationRows[].isFilingCorporation | boolean \| null |  |
| schedule130.groupRatioAllocationRows[].memberName | null \| string |  |
| schedule130.groupRatioAmendmentConditionsMetOrNotApplicable | boolean \| null |  |
| schedule130.groupRatioElectionFiledOnTime | boolean \| null |  |
| schedule130.groupRatioElectionMade | boolean \| null |  |
| schedule130.groupRatioNoAmendedElectionFiled | boolean \| null |  |
| schedule130.hasExemptIfe | boolean \| null |  |
| schedule130.hasReceivedCapacity | boolean \| null |  |
| schedule130.isCcpcThroughoutYear | boolean \| null |  |
| schedule130.isExcludedEntity | boolean \| null |  |
| schedule130.isResidentInCanada | boolean \| null |  |
| schedule130.line028InterestPaidOther | null \| number |  |
| schedule130.line029_20_1_e_amounts | null \| number |  |
| schedule130.line034LossDeductible | null \| number |  |
| schedule130.line035CapitalLoss | null \| number |  |
| schedule130.line036ExpenseFee_para_e | null \| number |  |
| schedule130.line037ExpenseFee_variableB_reducer | null \| number |  |
| schedule130.line038LeaseFinancing | null \| number |  |
| schedule130.line040Portion_111_1_e_attributable | null \| number |  |
| schedule130.line041CfaRaife | null \| number |  |
| schedule130.line043GainIncludedInIncome | null \| number |  |
| schedule130.line044PartnershipShare | null \| number |  |
| schedule130.line058InterestReceived | null \| number |  |
| schedule130.line059_12_9_or_17_1 | null \| number |  |
| schedule130.line060GuaranteeFeeIncome | null \| number |  |
| schedule130.line062GainIncluded | null \| number |  |
| schedule130.line063LeaseFinancingIncome | null \| number |  |
| schedule130.line064PartnershipShareIfr | null \| number |  |
| schedule130.line065CfaRaifr | null \| number |  |
| schedule130.line067LossDeductible | null \| number |  |
| schedule130.line068CapitalLoss | null \| number |  |
| schedule130.line069PartnershipShare | null \| number |  |
| schedule130.line070ShelteredByFtc | null \| number |  |
| schedule130.line071ExemptFromPartI | null \| number |  |
| schedule130.line079TaxableIncome | null \| number | strict |
| schedule130.line080NonCapitalLossForYear | null \| number |  |
| schedule130.line081CfaVariableE | null \| number |  |
| schedule130.line082PartnershipCfaVariableE | null \| number |  |
| schedule130.line084CcaResourceDeductions | null \| number |  |
| schedule130.line085TerminalLossNotInIfe | null \| number |  |
| schedule130.line086PartnershipCcaShare | null \| number |  |
| schedule130.line087Portion_111_1_e_partnership | null \| number |  |
| schedule130.line088Deduction_110_1_k | null \| number |  |
| schedule130.line090SpecifiedPreRegimeLossPortion | null \| number |  |
| schedule130.line091AdditionalCfaFapi | null \| number |  |
| schedule130.line093PartnershipExemptIfeLossShare | null \| number \| string |  |
| schedule130.line094ItcRecapture | null \| number |  |
| schedule130.line095_12_1_x_reducer | null \| number |  |
| schedule130.line097RecaptureCca | null \| number |  |
| schedule130.line098PartnershipRecaptureShare | null \| number |  |
| schedule130.line099_59_1_or_59_1_b | null \| number |  |
| schedule130.line100ForeignIncomeShelteredByFtc | null \| number |  |
| schedule130.line101_110_5_addback | null \| number |  |
| schedule130.line102_104_13_less_104_19 | null \| number |  |
| schedule130.line103TaxableIncomeNotPartI | null \| number |  |
| schedule130.line105PartnershipExemptIfeIncomeShare | null \| number |  |
| schedule130.line128RifeFromPriorYears | null \| number |  |
| schedule130.line140VariableAIfeAdjusted | null \| number |  |
| schedule130.loansRows | array |  |
| schedule130.loansRows[].relationship | string |  |
| schedule130.loansRows[].totalNotionalDerivatives | null \| number |  |
| schedule130.loansRows[].totalPrincipal | null \| number |  |
| schedule130.loansRows[].variableA_para_d | null \| number |  |
| schedule130.loansRows[].variableB_para_a | null \| number |  |
| schedule130.lossRestrictionEventDate | null \| string |  |
| schedule130.lossRestrictionEventFacts | object |  |
| schedule130.lossRestrictionEventFacts.actualControlAcquired | string | strict |
| schedule130.lossRestrictionEventFacts.determinationStatus | string | strict |
| schedule130.lossRestrictionEventFacts.effectiveAt | null \| string |  |
| schedule130.lossRestrictionEventFacts.eventTaxpayerId | null \| string |  |
| schedule130.lossRestrictionEventFacts.reviewed | boolean | strict |
| schedule130.lossRestrictionEventFacts.s256_1DeemedControl | string | strict |
| schedule130.lossRestrictionEventFacts.s256_7ControlAcquired | string | strict |
| schedule130.lossRestrictionEventFacts.s256_8DeemedControl | string | strict |
| schedule130.lossRestrictionEventFacts.s256_9ElectionFiled | string |  |
| schedule130.lossRestrictionEventFacts.s256_9Timing | string |  |
| schedule130.lossRestrictionEventFacts.schemaVersion | integer | strict |
| schedule130.lossRestrictionEventFacts.sourceReference | null \| string | strict |
| schedule130.nonCapitalLossRows | array |  |
| schedule130.nonCapitalLossRows[].amountDeducted_111_1_a | null \| number |  |
| schedule130.nonCapitalLossRows[].amountVariableJ_ii | null \| number |  |
| schedule130.nonCapitalLossRows[].attributableToIfe | null \| number |  |
| schedule130.nonCapitalLossRows[].nonCapitalLossOriginYear | null \| number |  |
| schedule130.nonCapitalLossRows[].taxYearOfOrigin | null \| string |  |
| schedule130.nonCapitalLossRows[].variableJ | null \| number |  |
| schedule130.paragraphCForeignAffiliateLimitMet | boolean \| null |  |
| schedule130.paragraphCIfeRecipientsNotTaxIndifferent | boolean \| null |  |
| schedule130.paragraphCNoNonResidentSpecifiedShareholder | boolean \| null |  |
| schedule130.paragraphCSubstantiallyAllBusinessInCanada | boolean \| null |  |
| schedule130.partnershipIfeRows | array |  |
| schedule130.partnershipIfeRows[].partnershipAccountNumber | null \| string |  |
| schedule130.partnershipIfeRows[].partnershipName | null \| string |  |
| schedule130.partnershipIfeRows[].partnership_ife_para_h | null \| number |  |
| schedule130.partnershipIfeRows[].portion_12_1_l_1 | null \| number |  |
| schedule130.partnershipIfeRows[].portion_non_deductible_96_2_1 | null \| number |  |
| schedule130.partnershipIfeRows[].shareOfPartnershipIfeVariableA | null \| number |  |
| schedule130.ratioOfPermissibleExpenses | null \| number |  |
| schedule130.receivedCapacityRows | array |  |
| schedule130.receivedCapacityRows[].accountNumber | null \| string |  |
| schedule130.receivedCapacityRows[].amountOfCapacityReceived | null \| number |  |
| schedule130.receivedCapacityRows[].electionT2226FiledByTransferor | boolean \| null |  |
| schedule130.receivedCapacityRows[].eligibleGroupEntityAtYearEnd | boolean \| null |  |
| schedule130.receivedCapacityRows[].groupEntityName | null \| string |  |
| schedule130.receivedCapacityRows[].paragraphCFinancialInstitutionConditionMetOrNotApplicable | boolean \| null |  |
| schedule130.receivedCapacityRows[].paragraphFFinancialHoldingConditionMetOrNotApplicable | boolean \| null |  |
| schedule130.receivedCapacityRows[].paragraphGSpecialPurposeLossConditionMetOrNotApplicable | boolean \| null |  |
| schedule130.receivedCapacityRows[].paragraphHConditionMet | boolean \| null |  |
| schedule130.receivedCapacityRows[].paragraphIAmendmentConditionMetOrNotApplicable | boolean \| null |  |
| schedule130.receivedCapacityRows[].paragraphJInformationReturnFiled | boolean \| null |  |
| schedule130.receivedCapacityRows[].taxYearEnd | null \| string |  |
| schedule130.receivedCapacityRows[].transfereeIsTaxableCanadianCorpOrFictThroughoutYear | boolean \| null |  |
| schedule130.receivedCapacityRows[].transferorCumulativeUnusedExcessCapacity | null \| number |  |
| schedule130.receivedCapacityRows[].transferorIsTaxableCanadianCorpOrFictThroughoutYear | boolean \| null |  |
| schedule130.receivedCapacityRows[].transferorTotalTransferredCapacity | null \| number |  |
| schedule130.resourcePoolRows | array |  |
| schedule130.resourcePoolRows[].ifeAvailableBeforeClaim | null \| number |  |
| schedule130.resourcePoolRows[].ifeClosingBalance | null \| number |  |
| schedule130.resourcePoolRows[].ifeCurrentYearClaim | null \| number |  |
| schedule130.resourcePoolRows[].ifeOpeningBalance | null \| number |  |
| schedule130.resourcePoolRows[].ifePoolAdjustments | null \| number |  |
| schedule130.resourcePoolRows[].poolType | string |  |
| schedule130.rifeSurvivalFacts | null \| object |  |
| schedule130.rifeSurvivalFacts.schemaVersion | integer |  |
| schedule130.rifeSurvivalFacts.vintages | array |  |
| schedule130.rifeSurvivalFacts.vintages[].businessAttributableAmount | null \| number |  |
| schedule130.rifeSurvivalFacts.vintages[].businessId | null \| string |  |
| schedule130.rifeSurvivalFacts.vintages[].eventAdjustmentPreviouslyApplied | boolean \| null |  |
| schedule130.rifeSurvivalFacts.vintages[].eventSide | string |  |
| schedule130.rifeSurvivalFacts.vintages[].originalAmount | number |  |
| schedule130.rifeSurvivalFacts.vintages[].priorDeductions | number |  |
| schedule130.rifeSurvivalFacts.vintages[].profitOrReopThroughoutYear | string |  |
| schedule130.rifeSurvivalFacts.vintages[].remainingAmount | number |  |
| schedule130.rifeSurvivalFacts.vintages[].sameBusinessContinues | string |  |
| schedule130.rifeSurvivalFacts.vintages[].sameBusinessIncome | null \| number |  |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows | array |  |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].businessId | null \| string |  |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].income | null \| number |  |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].similarityStatus | string |  |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].substantiallyAllIncomeStatus | string |  |
| schedule130.rifeSurvivalFacts.vintages[].sourceReference | null \| string |  |
| schedule130.rifeSurvivalFacts.vintages[].sourceTaxYearEnd | string |  |
| schedule130.rifeSurvivalFacts.vintages[].sourceTaxpayerId | string |  |
| schedule130.rifeSurvivalFacts.vintages[].vintageId | string |  |
| schedule130.taxYearStartDate | null \| string | strict |
| schedule130.taxpayerId | null \| string | strict |
| schedule130.transferredOutCapacity18_2_4 | null \| number \| string |  |
| schedule130.transitionalGroupCapacityElectionMade | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule130`: Schedule 130 (EIFEL) practitioner-entered blob — feeds the schedule130 batch node, whose result posts S1 lines 251/252.
- `schedule130.allocatedGroupRatioAmount`: When ``groupRatioElectionMade = true``, the practitioner-entered allocated group-ratio amount (line 118 / line 132). The engine uses this as the s.18.2(2) numerator instead of ATI × ratio.
- `schedule130.borrowingsRows[].totalNotionalDerivatives`: Box 013 — Total notional of related derivatives.
- `schedule130.borrowingsRows[].totalPrincipal`: Box 012 — Total principal of borrowings at any point in the year.
- `schedule130.borrowingsRows[].variableA_para_a`: Box 014 — Amounts under para (a) of variable A of IFE in respect of this borrowing.
- `schedule130.borrowingsRows[].variableA_para_e`: Box 015 — Amounts under para (e) of variable A of IFE (other than a loss or capital loss).
- `schedule130.borrowingsRows[].variableB_para_a`: Box 016 — Amounts under para (a) of variable B of IFE (other than a dividend / exempt IFE / gain).
- `schedule130.capitalizedIfeRows[].businessCeasedAtYearEnd`: Class 14.1 exception operand under s.20(16.1)(c).
- `schedule130.capitalizedIfeRows[].classNumber`: Box 046 — CCA class number.
- `schedule130.capitalizedIfeRows[].ifeCcaClaimed`: Box 051 — IFE in CCA claimed (capped by box 049).
- `schedule130.capitalizedIfeRows[].ifeClosingUcc`: Box 052 — Derived: 049 − 051 floor 0.
- `schedule130.capitalizedIfeRows[].ifeCostAdjustments`: Box 048 — IFE in cost of acquisitions / adjustments / dispositions.
- `schedule130.capitalizedIfeRows[].ifeOpeningUcc`: Box 047 — IFE in opening UCC.
- `schedule130.capitalizedIfeRows[].ifeTerminalLoss`: Box 050 — IFE in terminal loss (see form note 2).
- `schedule130.capitalizedIfeRows[].ifeUcc`: Box 049 — Derived: 047 ± 048 floor 0.
- `schedule130.capitalizedIfeRows[].propertyRemainingStatus`: Off-form s.20(16)(b) fact; ``unknown`` until answered.
- `schedule130.capitalizedIfeRows[].section13_4_3FormerPropertyApplies`: Whether ss.13(4.3)/20(16.1)(b) exclude the class.
- `schedule130.ccpcGroupTaxableCapitalEmployedInCanada`: Paragraph (a): the amount determined for C in s.125(5.1)(a) — the ASSOCIATED-GROUP taxable capital employed in Canada aggregate, not the filer's own. Must be below the statutory threshold; equal is not excluded ("less than").
- `schedule130.cfaDeniedRows[].affiliateVariableA`: Box 145 — Amount under variable A IFE for the affiliate.
- `schedule130.cfaDeniedRows[].cfaName`: Box 144 — Name of CFA.
- `schedule130.cfaDeniedRows[].corpsShareOfDeniedAmount`: Box 149 — Derived: 147 × 148.
- `schedule130.cfaDeniedRows[].deniedAmount`: Box 147 — Derived: 145 × 146.
- `schedule130.cfaDeniedRows[].proportionG`: Box 146 — Proportion G from Part 2K (echoed for display).
- `schedule130.cfaDeniedRows[].specifiedParticipatingPct`: Box 148 — Specified participating percentage (as a fraction 0-1 internally; form prints %).
- `schedule130.cfaPartnershipInclusionRows[].amountFapiInclusion`: Box 152 — Amount under subclause D(II) in CFA's FAPI.
- `schedule130.cfaPartnershipInclusionRows[].cfaName`: Box 151 — Name of CFA that is a partnership member.
- `schedule130.cfaPartnershipInclusionRows[].corpsShareOfInclusion`: Box 154 — Derived: 152 × 153.
- `schedule130.cfaPartnershipInclusionRows[].specifiedParticipatingPct`: Box 153 — Specified participating percentage (fraction 0-1).
- `schedule130.claim111_1_aNotReducingTaxableIncome`: Boxless — the part of the year's paragraph 111(1)(a) claim that did NOT reduce taxable income, under paragraph (a.1) of variable E in the ITA 18.2(1) "adjusted taxable income" definition. Nil unless taxable income (line 079) is nil, since every dollar of the claim reduced a positive taxable income. Enter 0 when the whole claim reduced it. The split is a Division C ordering fact and is never inferred, so leaving it blank while line 079 is nil and 111(1)(a) losses are claimed blocks. Applies to taxation years ending after August 15, 2025.
- `schedule130.cuecRows[].amountsAbsorbed`: Box 124 — Amounts previously absorbed under s.18.2(2).
- `schedule130.cuecRows[].amountsTransferred`: Box 123 — Amounts previously transferred under s.18.2(4).
- `schedule130.cuecRows[].excessCapacity`: Box 122 — Excess capacity computed for that preceding year.
- `schedule130.cuecRows[].netAvailable`: Box 125 — Derived: col 1 − col 2 − col 3 floor 0.
- `schedule130.cuecRows[].precedingYearEnd`: End date (yyyy-mm-dd) of the preceding tax year this row covers. When a loss-restriction event date is set, the engine auto-zeroes rows whose precedingYearEnd is on or before the event — the s.18.2(1) "cumulative unused excess capacity" post-LRE reset, picking up the s.251.2 "loss restriction event" defined term.
- `schedule130.currentYearRifeComponents[].componentType`: The statutory source category of the current-year restricted interest and financing expense component.
- `schedule130.excludedEntityParagraph`: Which limb of the s.18.2(1) "excluded entity" definition the claim relies on. The flag above cannot carry the exemption on its own: the claim fails closed at error severity until a limb is named AND substantiated by the operands below, because excluded-entity status removes the entire s.18.2(2) denial.
- `schedule130.excludedInterestElectionMade`: Confirms the excluded interest election under ITA s.18.2(1) was filed on T2227. Setting it records the election as made; the engine reads it only through a truthiness test, so any non-true value reads as not made.
- `schedule130.exemptIfeRows[].ifeIncurred`: Box 009 — IFE incurred on the column 2 amount (see form note 1).
- `schedule130.exemptIfeRows[].incomeFromFundedActivities`: Box 010 — Income from activities the column 2 borrowing funded.
- `schedule130.exemptIfeRows[].lossFromFundedActivities`: Box 011 — Loss from activities the column 2 borrowing funded (entered as positive).
- `schedule130.exemptIfeRows[].principalAmount`: Box 008 — Principal amount of the borrowing / other financing.
- `schedule130.exemptIfeRows[].publicSectorAuthority`: Box 007 — Name of the public-sector authority.
- `schedule130.fairValueAdjustmentsElectionMade`: Confirms the fair value adjustments election under ITA s.18.21(4) was filed on T2225. Setting it records the election as made.
- `schedule130.filedT2228PreRegimeLossElection`: Whether the practitioner has filed Form T2228 to make the specified-pre-regime-loss election. Gates the line 090 entry per form note 4.
- `schedule130.filedT2229ForgoFaplElection`: Confirms form T2229 was filed to forgo a foreign accrual property loss under ITA clause 95(2)(f.11)(ii)(D). Filemark does not build T2229, so when line 150 or line 155 carries an amount and this is not set the return is held provisional until you confirm the election was filed and attach it.
- `schedule130.groupAggregateIfeAndExemptIfe`: Paragraph (b) variable A: IFE + exempt IFE of the taxpayer AND of every Canadian-resident eligible group entity. A GROUP total — the filer's own IFE can never satisfy the limb.
- `schedule130.groupAggregateIfrExcludingFinancialInstitutionGroup`: Paragraph (b) variable B: the corresponding interest and financing REVENUE total, excluding a financial-institution group entity's IFR. The entity is excluded when A − B is at or below the de minimis amount.
- `schedule130.groupRatio`: s.18.21 group-ratio computation and allocation evidence.
- `schedule130.groupRatioAmendmentConditionsMetOrNotApplicable`: s.18.21(2)(e) — amended-election conditions are met, or this is not an amended election.
- `schedule130.groupRatioElectionMade`: Practitioner assertion the corp made the group-ratio election under s.18.21(2) for the year. When true, the engine zeroes excess capacity (per Part 2G header rule) and routes via the allocated group-ratio amount in Part 2K line 132 / Part 2H line 118.
- `schedule130.groupRatioNoAmendedElectionFiled`: s.18.21(2)(d) — no amended election has been filed in accordance with the section.
- `schedule130.hasExemptIfe`: Box 006 — Did the corp incur any exempt IFE in the year?
- `schedule130.hasReceivedCapacity`: Box 001 — Does the corp have received capacity in the year?
- `schedule130.isCcpcThroughoutYear`: Paragraph (a): CCPC "throughout the particular year" — not at any moment in it.
- `schedule130.isExcludedEntity`: Practitioner assertion that the corp meets the s.18.2(1) "excluded entity" definition for the year under one complete pathway: (a) small CCPC group TCEC < $50M; (b) group net IFE ≤ $1M; or (c) all four conjunctive tests, including (c)(iv)'s requirement that substantially all IFE recipients are not non-arm's-length tax-indifferent persons/partnerships. When true, the validator skips the s.18.2(2) denial computation and surfaces a soft warning that filing S130 is still recommended for audit protection. Defaults to null (not asserted).
- `schedule130.isResidentInCanada`: Paragraphs (b) and (c): "resident in Canada". Distinct from the jacket residency box because the group test reads on the particular taxpayer.
- `schedule130.line028InterestPaidOther`: Line 028 — Interest paid / payable — other (not on Part 1C).
- `schedule130.line029_20_1_e_amounts`: Line 029 — Amounts deductible under 20(1)(e)(ii)/(ii.1)/(ii.2)/ (e.1)/(e.2)/(f).
- `schedule130.line034LossDeductible`: Line 034 — Loss deductible (other than under 20(1)(e)(i)).
- `schedule130.line035CapitalLoss`: Line 035 — Capital loss that reduces para 3(b) or taxable income.
- `schedule130.line036ExpenseFee_para_e`: Line 036 — Expense / fee payable giving rise to para (e) variable A IFE.
- `schedule130.line037ExpenseFee_variableB_reducer`: Line 037 — Expense / fee payable that reduces IFE under variable B.
- `schedule130.line038LeaseFinancing`: Line 038 — Lease financing amount (other than excluded lease / excluded interest).
- `schedule130.line040Portion_111_1_e_attributable`: Line 040 — Portion of 111(1)(e) denied under 96(2.1) attributable to IFE.
- `schedule130.line041CfaRaife`: Line 041 — CFA relevant affiliate IFE × specified participating %.
- `schedule130.line043GainIncludedInIncome`: Line 043 — Gain included in income (variable B).
- `schedule130.line044PartnershipShare`: Line 044 — Partnership share of 042/043-equivalent amounts.
- `schedule130.line058InterestReceived`: Line 058 — Interest received (other than 137(4.1) / excluded).
- `schedule130.line059_12_9_or_17_1`: Line 059 — Amount under 12(9) or s.17.1.
- `schedule130.line060GuaranteeFeeIncome`: Line 060 — Guarantee / credit-support fee income.
- `schedule130.line062GainIncluded`: Line 062 — Gain included in income.
- `schedule130.line063LeaseFinancingIncome`: Line 063 — Lease financing in income (non-excluded lease).
- `schedule130.line064PartnershipShareIfr`: Line 064 — Partnership share of IFR (T5013 box 248 etc.).
- `schedule130.line065CfaRaifr`: Line 065 — CFA relevant affiliate IFR × specified participating % (less FAT deduction).
- `schedule130.line067LossDeductible`: Line 067 — Loss deductible against IFR (variable B).
- `schedule130.line068CapitalLoss`: Line 068 — Capital loss reducing para 3(b).
- `schedule130.line069PartnershipShare`: Line 069 — Partnership share of 066/067/068-equivalent amounts.
- `schedule130.line070ShelteredByFtc`: Line 070 — IFR sheltered by foreign tax credit (non-withholding).
- `schedule130.line071ExemptFromPartI`: Line 071 — IFR exempt from Part I.
- `schedule130.line079TaxableIncome`: Line 079 — Taxable income (NR: TI earned in Canada).
- `schedule130.line080NonCapitalLossForYear`: Line 080 — Non-capital loss for the year (variable A).
- `schedule130.line081CfaVariableE`: Line 081 — CFA paragraph (b) of variable E of ATI total.
- `schedule130.line082PartnershipCfaVariableE`: Line 082 — Partnership-CFA paragraph (b) of variable E total.
- `schedule130.line084CcaResourceDeductions`: Line 084 — CCA / resource / depletion deductions not in IFE.
- `schedule130.line085TerminalLossNotInIfe`: Line 085 — Terminal loss under s.20(16) not in IFE.
- `schedule130.line086PartnershipCcaShare`: Line 086 — Partnership CCA / TL share (less 96(2.1) denied).
- `schedule130.line087Portion_111_1_e_partnership`: Line 087 — Portion of 111(1)(e) attributable to partnership CCA/TL.
- `schedule130.line088Deduction_110_1_k`: Line 088 — Amount deducted under 110(1)(k).
- `schedule130.line090SpecifiedPreRegimeLossPortion`: Line 090 — 25% × specified pre-regime loss deducted under 111(1)(a) (requires T2228 election).
- `schedule130.line091AdditionalCfaFapi`: Line 091 — Additional CFA FAPI under para (j) variable B formula L × M / N.
- `schedule130.line093PartnershipExemptIfeLossShare`: Part 2F line 093, variable B paragraph (k), the corporation's share of a partnership loss from activities funded by a borrowing that produces exempt interest and financing expenses, entered as a positive amount. It is a separate fact from line 092 and is never folded into it.
- `schedule130.line094ItcRecapture`: Line 094 — ITC recapture amounts under 127(5)/(6)/127.44(3)/etc.
- `schedule130.line095_12_1_x_reducer`: Line 095 — Amount under 12(1)(x)(i)(C) or 12(1)(x)(ii) reducing cost / capital cost.
- `schedule130.line097RecaptureCca`: Line 097 — Recapture under s.13(1).
- `schedule130.line098PartnershipRecaptureShare`: Line 098 — Partnership share of recapture.
- `schedule130.line099_59_1_or_59_1_b`: Line 099 — Amount under 59(1)/(3.2) or 59.1(b).
- `schedule130.line100ForeignIncomeShelteredByFtc`: Line 100 — Foreign-source income sheltered by 126(1)/(2) FTC.
- `schedule130.line101_110_5_addback`: Line 101 — Amount included under s.110.5.
- `schedule130.line102_104_13_less_104_19`: Line 102 — Amount under 104(13) less 104(19) designations.
- `schedule130.line103TaxableIncomeNotPartI`: Line 103 — Taxable income not subject to Part I (per Act of Parliament).
- `schedule130.line105PartnershipExemptIfeIncomeShare`: Line 105 — Partnership share of exempt-IFE-funded income.
- `schedule130.line128RifeFromPriorYears`: Line 128 — RIFE pool from previous tax years. Carryforward chain source: prior-year Part 2O total minus any deduction taken under 111(1)(a.1) in the prior return.
- `schedule130.line140VariableAIfeAdjusted`: Line 140 — Variable A IFE adjusted to remove CFA RAIFE. Used when IFE includes any CFA amount under variable B. Otherwise engine populates line 139 (Variable A IFE total) for the denominator.
- `schedule130.loansRows[].totalNotionalDerivatives`: Box 018 — Total notional of related derivatives.
- `schedule130.loansRows[].totalPrincipal`: Box 017 — Total principal of loans at any point in the year.
- `schedule130.loansRows[].variableA_para_d`: Box 019 — Amounts under para (d) of variable A of IFR.
- `schedule130.loansRows[].variableB_para_a`: Box 020 — Amounts under para (a) of variable B of IFR (other than a loss or capital loss).
- `schedule130.lossRestrictionEventDate`: When the corp is subject to a loss-restriction event under s.111(4) / s.111(5) during the year, the CUEC carryforward for any tax year AFTER the event is computed without regard to pre-event excess / absorbed / transferred capacity. Set to the date (yyyy-mm-dd) of the event or null.
- `schedule130.lossRestrictionEventFacts.s256_9ElectionFiled`: A s.256(9) election is what preserves the actual acquisition time; without it the event is deemed to occur at the beginning of the day.
- `schedule130.nonCapitalLossRows[].amountDeducted_111_1_a`: Box 077 — Amount deducted under 111(1)(a) in the year.
- `schedule130.nonCapitalLossRows[].amountVariableJ_ii`: Box 075 — Amount under variable J (ii).
- `schedule130.nonCapitalLossRows[].attributableToIfe`: Box 078 — Derived: 077 × 076 / 074 → para (h) variable B ATI.
- `schedule130.nonCapitalLossRows[].nonCapitalLossOriginYear`: Box 074 — Non-capital loss for the year (variable J (i)).
- `schedule130.nonCapitalLossRows[].taxYearOfOrigin`: Box 073 — Tax year of origin of the non-capital loss.
- `schedule130.nonCapitalLossRows[].variableJ`: Box 076 — Derived: variable J = lesser(074, 075).
- `schedule130.paragraphCForeignAffiliateLimitMet`: Paragraph (c)(ii) — the foreign-affiliate / foreign-property limit.
- `schedule130.paragraphCIfeRecipientsNotTaxIndifferent`: Paragraph (c)(iv) — substantially all IFE paid or payable to persons or partnerships other than non-arm's-length tax-indifferent ones.
- `schedule130.paragraphCNoNonResidentSpecifiedShareholder`: Paragraph (c)(iii) — no non-resident specified shareholder or specified beneficiary condition breached.
- `schedule130.paragraphCSubstantiallyAllBusinessInCanada`: Paragraph (c)(i) — all or substantially all businesses and undertakings of the taxpayer and each eligible group entity carried on in Canada.
- `schedule130.partnershipIfeRows[].partnershipAccountNumber`: Box 022 — Partnership account number (blank if non-resident partnership).
- `schedule130.partnershipIfeRows[].partnershipName`: Box 021 — Name of the partnership.
- `schedule130.partnershipIfeRows[].partnership_ife_para_h`: Box 026 — Derived: column 3 − column 4 − column 5 → para (h) variable A IFE.
- `schedule130.partnershipIfeRows[].portion_12_1_l_1`: Box 024 — Portion in column 3 to which para 12(1)(l.1) applies.
- `schedule130.partnershipIfeRows[].portion_non_deductible_96_2_1`: Box 025 — Portion non-deductible per s.96(2.1).
- `schedule130.partnershipIfeRows[].shareOfPartnershipIfeVariableA`: Box 023 — Share of partnership's variable A IFE (T5013 box 247 if applicable).
- `schedule130.ratioOfPermissibleExpenses`: Line 108/112/120/134 — ratio of permissible expenses (printed on the form; engine determines from tax-year start date). Storing the practitioner-asserted value lets the engine cross-check.
- `schedule130.receivedCapacityRows[].accountNumber`: Box 003 — Business / account number of the transferor entity.
- `schedule130.receivedCapacityRows[].amountOfCapacityReceived`: Box 005 — Amount of capacity received from this entity.
- `schedule130.receivedCapacityRows[].electionT2226FiledByTransferor`: Supplemental s.18.2(4)(b)/(d) attestations; no printed S130 boxes.
- `schedule130.receivedCapacityRows[].groupEntityName`: Box 002 — Name of the eligible group entity transferring capacity.
- `schedule130.receivedCapacityRows[].paragraphCFinancialInstitutionConditionMetOrNotApplicable`: Strict per-election s.18.2(4)(c), (f)–(j) facts.
- `schedule130.receivedCapacityRows[].taxYearEnd`: Box 004 — Transferor's tax year end (yyyy/mm/dd).
- `schedule130.receivedCapacityRows[].transferorCumulativeUnusedExcessCapacity`: Supplemental s.18.2(4)(e) evidence; no printed S130 box.
- `schedule130.resourcePoolRows[].ifeAvailableBeforeClaim`: Box 055 — Derived: 053 ± 054 floor 0.
- `schedule130.resourcePoolRows[].ifeClosingBalance`: Box 057 — Derived: 055 − 056 floor 0.
- `schedule130.resourcePoolRows[].ifeCurrentYearClaim`: Box 056 — IFE in current-year claim (capped by box 055).
- `schedule130.resourcePoolRows[].ifeOpeningBalance`: Box 053 — IFE in opening balance.
- `schedule130.resourcePoolRows[].ifePoolAdjustments`: Box 054 — IFE in additions / deductions during the year.
- `schedule130.taxYearStartDate`: Practitioner-confirmed tax-year start date (yyyy-mm-dd). Used by the engine to pick the 40% (start in [2023-10-01, 2024-01-01)) or 30% (start ≥ 2024-01-01) ratio of permissible expenses per the form header.
- `schedule130.taxpayerId`: Stable taxpayer identifier used to bind current-year restricted interest and financing expense vintages to the corporation. The canonical identity supplied by the batch caller wins when available.
- `schedule130.transferredOutCapacity18_2_4`: Total cumulative unused excess capacity the corporation designated to other eligible group entities as transferor under ITA s.18.2(4). It has no printed box because the T2226 election carries it, it cannot be negative, it cannot exceed the Part 2I amount C cap in s.18.2(4)(e), and it seeds next year's Part 2I column 2.
- `schedule130.transitionalGroupCapacityElectionMade`: Confirms the EIFEL transitional group capacity election was filed on T2224. Setting it records the election as made.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (36 of 242 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule130.borrowingsRows[].relationship | one of "canadian_arms_length", "canadian_non_arms_length", "non_resident_arms_length", "non_resident_non_arms_length" |
| schedule130.capitalizedIfeRows[].propertyRemainingStatus | one of "property_remains", "no_property_left", "unknown" |
| schedule130.cuecRows[].capacityProvenance[].capacityType | one of "excess", "transferred", "absorbed" |
| schedule130.cuecRows[].capacityProvenance[].eventSide | one of "pre_event", "post_event", "unknown" |
| schedule130.cuecRows[].label | one of "third_preceding", "second_preceding", "first_preceding" |
| schedule130.currentYearCapacityProvenance[].amount | -1000000000000000 to 1000000000000000 |
| schedule130.currentYearCapacityProvenance[].capacityType | one of "excess", "transferred", "absorbed" |
| schedule130.currentYearCapacityProvenance[].eventSide | one of "pre_event", "post_event", "unknown" |
| schedule130.currentYearCapacityProvenance[].originTaxpayerId | 0 to 20000 characters |
| schedule130.currentYearCapacityProvenance[].sourceReference | 0 to 20000 characters |
| schedule130.currentYearRifeComponents[].componentType | one of "interest_denial", "partnership_addback", "cfa_direct", "cfa_partnership" |
| schedule130.currentYearRifeComponents[].eventSide | one of "pre_event", "post_event", "unknown" |
| schedule130.excludedEntityParagraph | one of "a", "b", "c" |
| schedule130.line079TaxableIncome | -1000000000000000 to 1000000000000000 |
| schedule130.loansRows[].relationship | one of "canadian_arms_length", "canadian_non_arms_length", "non_resident_arms_length", "non_resident_non_arms_length" |
| schedule130.lossRestrictionEventFacts.actualControlAcquired | one of "yes", "no", "unknown" |
| schedule130.lossRestrictionEventFacts.determinationStatus | one of "occurred", "confirmed_absent", "unknown" |
| schedule130.lossRestrictionEventFacts.s256_1DeemedControl | one of "yes", "no", "unknown" |
| schedule130.lossRestrictionEventFacts.s256_7ControlAcquired | one of "yes", "no", "unknown" |
| schedule130.lossRestrictionEventFacts.s256_8DeemedControl | one of "yes", "no", "unknown" |
| schedule130.lossRestrictionEventFacts.s256_9ElectionFiled | one of "yes", "no", "unknown" |
| schedule130.lossRestrictionEventFacts.s256_9Timing | one of "beginning_of_day", "actual_time", "unknown" |
| schedule130.lossRestrictionEventFacts.schemaVersion | -1000000000000000 to 1000000000000000 |
| schedule130.lossRestrictionEventFacts.sourceReference | 0 to 20000 characters |
| schedule130.resourcePoolRows[].poolType | one of "CCEE_regular", "CCEE_successor", "CCDE_regular", "CCDE_successor", "CCOGPE_regular", "CCOGPE_successor", "FEDE_regular", "FEDE_successor", "CFRE_regular", "CFRE_successor" |
| schedule130.rifeSurvivalFacts.vintages[].eventSide | one of "pre_event", "post_event", "unknown" |
| schedule130.rifeSurvivalFacts.vintages[].profitOrReopThroughoutYear | one of "yes", "no", "unknown" |
| schedule130.rifeSurvivalFacts.vintages[].sameBusinessContinues | one of "yes", "no", "unknown" |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].similarityStatus | one of "yes", "no", "unknown" |
| schedule130.rifeSurvivalFacts.vintages[].similarBusinessRows[].substantiallyAllIncomeStatus | one of "yes", "no", "unknown" |
| schedule130.taxYearStartDate | 0 to 20000 characters |
| schedule130.taxpayerId | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (263)

| Cell | Types |
| --- | --- |
| absorbed_capacity_line_d | number |
| amount_total_partnership_ife | number |
| amount_total_received_capacity | number |
| ati_line_106 | number |
| ati_variable_e_para_a_1 | number |
| borrowingsRows[].relationship | string |
| borrowingsRows[].totalNotionalDerivatives | number |
| borrowingsRows[].totalPrincipal | number |
| borrowingsRows[].variableA_para_a | number |
| borrowingsRows[].variableA_para_e | number |
| borrowingsRows[].variableB_para_a | number |
| capitalizedIfeRows | array |
| cfaDeniedRows | array |
| cfaPartnershipInclusionRows | array |
| cfa_denied_line_150 | number |
| cfa_partnership_inclusion_line_155 | number |
| cuecRows[].amountsAbsorbed | number |
| cuecRows[].amountsTransferred | number |
| cuecRows[].excessCapacity | number |
| cuecRows[].label | string |
| cuecRows[].netAvailable | number |
| cuecRows[].precedingYearEnd | array \| boolean \| null \| number \| object \| string |
| cuecRows[].capacityProvenance | array |
| cuec_line_c | number |
| excess_capacity_line_115 | number |
| excess_ife_line_2l_b | number |
| exemptIfeRows | array |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| fired_gates | object |
| ife_total_line_045 | number |
| ifr_total_line_072 | number |
| line_001 | boolean |
| line_002 | array \| boolean \| null \| number \| object \| string |
| line_003 | array \| boolean \| null \| number \| object \| string |
| line_004 | array \| boolean \| null \| number \| object \| string |
| line_005 | number |
| line_006 | boolean |
| line_007 | array \| boolean \| null \| number \| object \| string |
| line_008 | number |
| line_009 | number |
| line_010 | number |
| line_011 | number |
| line_012 | number |
| line_013 | number |
| line_014 | number |
| line_015 | number |
| line_016 | number |
| line_017 | number |
| line_018 | number |
| line_019 | number |
| line_020 | number |
| line_021 | array \| boolean \| null \| number \| object \| string |
| line_022 | array \| boolean \| null \| number \| object \| string |
| line_023 | number |
| line_024 | number |
| line_025 | number |
| line_026 | number |
| line_027 | number |
| line_028 | number |
| line_029 | number |
| line_030 | number |
| line_031 | number |
| line_032 | number |
| line_033 | number |
| line_034 | number |
| line_035 | number |
| line_036 | number |
| line_037 | number |
| line_038 | number |
| line_039 | number |
| line_040 | number |
| line_041 | number |
| line_042 | number |
| line_043 | number |
| line_044 | number |
| line_045 | number |
| line_046 | array \| boolean \| null \| number \| object \| string |
| line_047 | number |
| line_048 | number |
| line_049 | number |
| line_050 | number |
| line_051 | number |
| line_052 | number |
| line_053 | number |
| line_054 | number |
| line_055 | number |
| line_056 | number |
| line_057 | number |
| line_058 | number |
| line_059 | number |
| line_060 | number |
| line_061 | number |
| line_062 | number |
| line_063 | number |
| line_064 | number |
| line_065 | number |
| line_066 | number |
| line_067 | number |
| line_068 | number |
| line_069 | number |
| line_070 | number |
| line_071 | number |
| line_072 | number |
| line_073 | array \| boolean \| null \| number \| object \| string |
| line_074 | number |
| line_075 | number |
| line_076 | number |
| line_077 | number |
| line_078 | number |
| line_079 | number |
| line_080 | number |
| line_081 | number |
| line_082 | number |
| line_083 | number |
| line_084 | number |
| line_085 | number |
| line_086 | number |
| line_087 | number |
| line_088 | number |
| line_089 | number |
| line_090 | number |
| line_091 | number |
| line_092 | number |
| line_093 | number |
| line_094 | number |
| line_095 | number |
| line_096 | number |
| line_097 | number |
| line_098 | number |
| line_099 | number |
| line_100 | number |
| line_101 | number |
| line_102 | number |
| line_103 | number |
| line_104 | number |
| line_105 | number |
| line_106 | number |
| line_107 | number |
| line_108 | number |
| line_109 | number |
| line_110 | number |
| line_111 | number |
| line_112 | number |
| line_113 | number |
| line_114 | number |
| line_115 | number |
| line_116 | number |
| line_117 | number |
| line_118 | number |
| line_119 | number |
| line_120 | number |
| line_121 | number |
| line_122 | number |
| line_123 | number |
| line_124 | number |
| line_125 | number |
| line_126 | number |
| line_127 | number |
| line_128 | number |
| line_129 | number |
| line_130 | number |
| line_131 | number |
| line_132 | number |
| line_133 | number |
| line_134 | number |
| line_135 | number |
| line_136 | number |
| line_137 | number |
| line_138 | number |
| line_139 | number |
| line_140 | number |
| line_141 | number |
| line_142 | number |
| line_143 | number |
| line_144 | array \| boolean \| null \| number \| object \| string |
| line_145 | number |
| line_146 | number |
| line_147 | number |
| line_148 | number |
| line_149 | number |
| line_150 | number |
| line_151 | array \| boolean \| null \| number \| object \| string |
| line_152 | number |
| line_153 | number |
| line_154 | number |
| line_155 | number |
| line_156 | number |
| line_157 | number |
| line_158 | number |
| line_159 | number |
| line_160 | number |
| line_161 | number |
| line_162 | number |
| loansRows[].relationship | string |
| loansRows[].totalNotionalDerivatives | number |
| loansRows[].totalPrincipal | number |
| loansRows[].variableA_para_d | number |
| loansRows[].variableB_para_a | number |
| missing_required[] | string |
| nonCapitalLossRows | array |
| partnershipIfeRows | array |
| partnership_addback_line_158 | number |
| proportion_g_18_2_2 | number |
| provisional | boolean |
| provisionalReasons[] | string |
| ratio_of_permissible_expenses_used | number |
| ready | boolean |
| receivedCapacityRows | array |
| resourcePoolRows[].ifeAvailableBeforeClaim | number |
| resourcePoolRows[].ifeClosingBalance | number |
| resourcePoolRows[].ifeCurrentYearClaim | number |
| resourcePoolRows[].ifeOpeningBalance | number |
| resourcePoolRows[].ifePoolAdjustments | number |
| resourcePoolRows[].poolType | string |
| rife_deducted_line_b | number |
| rife_pool_total_line_2o_a | number |
| s1_addback_excess_ife | number |
| s1_addback_partnership_ife | number |
| warnings[].code | string |
| warnings[].severity | string |
| warnings[].section | string |
| warnings[].message | string |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| prior_tax_year_end | string |
| transferred_out_capacity_18_2_4 | number |
| ife_variable_a_denominator_line_2k_f | number |
| received_capacity_excess_line_2k_c | number |
| currentYearCapacityProvenance[].amount | number |
| currentYearCapacityProvenance[].capacityType | string |
| currentYearCapacityProvenance[].eventSide | string |
| currentYearCapacityProvenance[].originTaxpayerId | string |
| currentYearCapacityProvenance[].sourceReference | string |
| currentYearCapacityProvenance[].sourceTaxYearEnd | string |
| lossRestrictionEvent.effectiveAt | array \| boolean \| null \| number \| object \| string |
| lossRestrictionEvent.ready | boolean |
| lossRestrictionEvent.reasonCodes[] | string |
| lossRestrictionEvent.ruleCodes | array |
| lossRestrictionEvent.schemaVersion | integer |
| lossRestrictionEvent.status | string |
| lossRestrictionEvent.taxpayerId | array \| boolean \| null \| number \| object \| string |
| rifePoolVintagesClosing | array |
| rifeSurvival.closingVintages | array |
| rifeSurvival.deductible | number |
| rifeSurvival.permanentAdjustment | number |
| rifeSurvival.ready | boolean |
| rifeSurvival.schemaVersion | integer |
| rifeSurvival.warnings | array |
| rife_permanent_adjustment_line_750 | number |

# schedule14

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: s14_versioned_profile_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule14"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule14": {
      "rows": [
        {
          "name": "Cedar Ridge Holdings Inc.",
          "address": "100 King Street West, Toronto, ON M5X 1A9",
          "payeeIsCanadianResident": true,
          "royalties": null,
          "rAndDFees": null,
          "managementFees": 50000,
          "technicalAssistanceFees": null,
          "similarPayments": null
        }
      ]
    }
  }
}
```

## Input cells (11)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule14.rows | array |  |
| schedule14.rows[].address | null \| string | strict |
| schedule14.rows[].managementFees | null \| number | strict |
| schedule14.rows[].name | null \| string | strict |
| schedule14.rows[].payeeIsCanadianResident | boolean \| null |  |
| schedule14.rows[].rAndDFees | null \| number | strict |
| schedule14.rows[].royalties | null \| number | strict |
| schedule14.rows[].similarPayments | null \| number | strict |
| schedule14.rows[].t5FiledForRoyalties | boolean \| null |  |
| schedule14.rows[].technicalAssistanceFees | null \| number | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule14.rows`: Rows of resident payees. Empty rows are elided by the backend.
- `schedule14.rows[].address`: A string with at least one non-whitespace character. The engine trims surrounding whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA form limit.
- `schedule14.rows[].managementFees`: A reportable amount or an explicitly empty category.
- `schedule14.rows[].name`: A string with at least one non-whitespace character. The engine trims surrounding whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA form limit.
- `schedule14.rows[].payeeIsCanadianResident`: Tri-state Filemark practitioner fact (NOT a CRA box): true / false / null. Omitting the key, or sending null, means UNANSWERED — the engine then refuses the row at error severity rather than assuming an answer. Only a strict JSON boolean counts as an answer; the engine coerces anything else to null.
- `schedule14.rows[].rAndDFees`: A reportable amount or an explicitly empty category.
- `schedule14.rows[].royalties`: A reportable amount or an explicitly empty category.
- `schedule14.rows[].similarPayments`: A reportable amount or an explicitly empty category.
- `schedule14.rows[].t5FiledForRoyalties`: Tri-state Filemark practitioner fact (NOT a CRA box): true / false / null. Omitting the key, or sending null, means UNANSWERED — the engine then refuses the row at error severity rather than assuming an answer. Only a strict JSON boolean counts as an answer; the engine coerces anything else to null.
- `schedule14.rows[].technicalAssistanceFees`: A reportable amount or an explicitly empty category.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (8 of 11 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule14.rows[].address | matches \S; 1 to 10000 characters |
| schedule14.rows[].managementFees | -1000000000000000 to 1000000000000000 |
| schedule14.rows[].name | matches \S; 1 to 10000 characters |
| schedule14.rows[].rAndDFees | -1000000000000000 to 1000000000000000 |
| schedule14.rows[].royalties | -1000000000000000 to 1000000000000000 |
| schedule14.rows[].similarPayments | -1000000000000000 to 1000000000000000 |
| schedule14.rows[].technicalAssistanceFees | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (50)

| Cell | Types |
| --- | --- |
| rows[].name | null \| string |
| rows[].address | null \| string |
| rows[].payeeIsCanadianResident | boolean \| null |
| rows[].t5FiledForRoyalties | boolean \| null |
| rows[].royalties | null \| number |
| rows[].rAndDFees | null \| number |
| rows[].managementFees | null \| number |
| rows[].technicalAssistanceFees | null \| number |
| rows[].similarPayments | null \| number |
| rows[].rowTotal | number |
| column_totals.300 | number |
| column_totals.400 | number |
| column_totals.500 | number |
| column_totals.600 | number |
| column_totals.700 | number |
| grand_total | string |
| row_count | integer |
| input_row_count | integer |
| de_minimis_excluded | array |
| fired_gates.box_300_royalties_t5_exempt_only | object |
| fired_gates.filing_required_for_misc_payments_to_residents | object |
| fired_gates.non_resident_payee_belongs_on_s29_not_s14 | object |
| fired_gates.payee_residence_assertion_required | object |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation | object |
| provisional | boolean |
| ready | boolean |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| fired_gates | object |

### Output cell notes

- `rows[].payeeIsCanadianResident`: Tri-state Filemark practitioner fact (not a CRA box): true / false / null when unanswered. The engine coerces any non-boolean input to null.
- `rows[].t5FiledForRoyalties`: Tri-state Filemark practitioner fact (not a CRA box): true / false / null when unanswered. The engine coerces any non-boolean input to null.
- `grand_total`: A positive amount, returned as a string in ordinary or scientific notation.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier.

# schedule15

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2013 and later
- Strict profile: s15_versioned_profile_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule15"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule15": {
      "corpDeductedPlanContributions": true,
      "planRows": [
        {
          "planType": 4,
          "contributionAmount": 1000,
          "epspTrustName": "Employee Profit Sharing Trust",
          "epspTrustAddress": "100 Main Street, Toronto ON",
          "epspTrustIsResident": true,
          "epspPaymentDate": "2025-06-30"
        }
      ],
      "amountB": 250
    }
  }
}
```

## Input cells (20)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule15.amountB | null \| number | strict |
| schedule15.borrowedToFundContributions | boolean \| null |  |
| schedule15.corpDeductedPlanContributions | boolean \| null | strict |
| schedule15.dpspNonComplianceConcern | boolean \| null |  |
| schedule15.planRows | array |  |
| schedule15.planRows[].contributionAmount | null \| number \| string | strict |
| schedule15.planRows[].dpspPaymentDate | null \| string |  |
| schedule15.planRows[].epspPaymentDate | null \| string | strict |
| schedule15.planRows[].epspTrustAddress | null \| string | strict |
| schedule15.planRows[].epspTrustIsResident | boolean \| null |  |
| schedule15.planRows[].epspTrustName | null \| string | strict |
| schedule15.planRows[].planType | null \| number | strict |
| schedule15.planRows[].prppPaymentDate | null \| string |  |
| schedule15.planRows[].registrationNumber | null \| string |  |
| schedule15.planRows[].rppPaymentDate | null \| string |  |
| schedule15.planRows[].rsubpPaymentDate | null \| string |  |
| schedule15.planRows[].t4psFiledBy | integer \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `fiscalEnd`: Exact taxation-year end used to test the EPSP payment window.
- `fiscalStart`: Exact taxation-year start used to test the EPSP payment window.
- `schedule15.amountB`: The financial-statement deduction, pinned to one exact value by this profile.
- `schedule15.borrowedToFundContributions`: Legacy compatibility field; ignored by the current Schedule 15 validator.
- `schedule15.corpDeductedPlanContributions`: Submitted true form-applicability assertion only; it does not independently prove statutory deduction eligibility.
- `schedule15.dpspNonComplianceConcern`: Legacy compatibility field; ignored by the current Schedule 15 validator.
- `schedule15.planRows[].contributionAmount`: The column 200 amount, pinned to one exact value by this profile. Sending it does not establish that every condition in ITA 144(5) and paragraph 20(1)(w) is met.
- `schedule15.planRows[].dpspPaymentDate`: DPSP rows (code 3) — ITA 147(8) via 20(1)(y): "an amount paid by the employer in the year or within 120 days after the end of the year to a trustee under a deferred profit sharing plan".
- `schedule15.planRows[].epspPaymentDate`: Exact in-period EPSP payment date used with fiscalStart and fiscalEnd to test ITA 144(5).
- `schedule15.planRows[].epspTrustAddress`: A single line of text with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a trust-residence determination, or a legal-identity check.
- `schedule15.planRows[].epspTrustIsResident`: Whether the trust that governs this EPSP is resident in Canada. Strict tri-state, and all three answers are admitted here. true leaves line 600 correctly blank, because the T2 SCH 15 E (13) column-600 instruction asks for the T4PS filer code only where the trust is not resident. false meets that condition, so a missing filer code then blocks at error severity. null is unanswered and also blocks at error severity: the residence answer is what decides whether box 600 is prescribed information for the row, so a blank box 600 cannot be read as complete while it is undetermined. A trust address does not establish residence, and an answer here does not establish T4PS compliance.
- `schedule15.planRows[].epspTrustName`: A single line of text with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a trust-residence determination, or a legal-identity check.
- `schedule15.planRows[].planType`: Exact printed code 4 for EPSP.
- `schedule15.planRows[].prppPaymentDate`: PRPP rows (code 5) — ITA 147.5(10) via 20(1)(q): "a contribution made by the taxpayer in the year or within 120 days after the end of the year to a PRPP".
- `schedule15.planRows[].registrationNumber`: Column 300. Used for codes 1/2/3/5; not used for code 4 (EPSP).
- `schedule15.planRows[].rppPaymentDate`: RPP rows (code 1) — ITA 147.2(1) via 20(1)(q): "a contribution made by the employer after 1990 and either in the taxation year or within 120 days after the end of the taxation year to a registered pension plan".
- `schedule15.planRows[].rsubpPaymentDate`: RSUBP rows (code 2) — ITA 145(5): "An amount paid by an employer to a trustee under a registered supplementary unemployment benefit plan during a taxation year or within 30 days thereafter may be deducted".
- `schedule15.planRows[].t4psFiledBy`: Column 600. For a non-resident EPSP trust, last-calendar-year T4PS filer: 1=Trustee, 2=Employer.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (9 of 20 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule15.amountB | -1000000000000000 to 1000000000000000 |
| schedule15.planRows[].contributionAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule15.planRows[].epspPaymentDate | 0 to 20000 characters |
| schedule15.planRows[].epspTrustAddress | matches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule15.planRows[].epspTrustName | matches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule15.planRows[].planType | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (46)

| Cell | Types |
| --- | --- |
| line_100 | integer |
| line_200 | number |
| line_300 | null |
| line_400 | string |
| line_500 | string |
| line_600 | null |
| planRows[].planType | integer |
| planRows[].planTypeLabel | string |
| planRows[].contributionAmount | number |
| planRows[].registrationNumber | null |
| planRows[].rsubpPaymentDate | null |
| planRows[].epspTrustName | string |
| planRows[].epspTrustAddress | string |
| planRows[].epspTrustIsResident | boolean \| null |
| planRows[].t4psFiledBy | null |
| planRows[].planPaymentDate | string |
| planRows[].paymentWindowBreached | boolean |
| plan_row_count | integer |
| counts_by_plan_type | object |
| contributions_by_plan_type | object |
| amount_a | number |
| amount_b | number |
| amount_c | number |
| line_on_s1 | integer |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation | object |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| missing_required[] | string |
| amount_a_excluded_out_of_window | number |
| amountB | number |
| warnings | array |
| missing_required | array |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |

### Output cell notes

- `line_400`: The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.
- `line_500`: The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.
- `line_600`: Null is the exact observed current engine output for this branch. With the residence fact unanswered, the input does not establish whether the form's non-resident-trust condition applies, so null is not proof of correctness, completeness, or T4PS compliance.
- `planRows[].rsubpPaymentDate`: Null is the exact observed current engine output for this EPSP branch. The RSUBP payment-date field is only carried for plan code 2.
- `planRows[].epspTrustName`: The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.
- `planRows[].epspTrustAddress`: The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.
- `planRows[].epspTrustIsResident`: Tri-state Filemark practitioner fact (not a CRA box). Null on this branch: the residence conclusion is UNANSWERED, which is not proof of trust residence either way. The answered states are their own result branches — epspRowResidentTrust and epspRowNonResidentTrust.
- `planRows[].planPaymentDate`: The admitted EPSP payment date used to test the ITA 144(5) timing limb.
- `planRows[].paymentWindowBreached`: Whether the row's payment date fell outside its own statutory window, in which case its column-200 amount is excluded from amount A. False here because 2025-06-30 is inside the admitted 2025 taxation year.
- `warnings[].box`: Null is exact current engine output: the demand is row-scoped, not box-scoped, because box 600 is not yet known to apply.
- `fired_gates`: Exact current metadata for the ten gates an EPSP row reaches once the box-600 question is live. Both residence states that leave a blank box 600 unexplained reach it: an answered NON-RESIDENT trust, and an UNANSWERED fact, which consults the gate in order to raise its error-severity demand.
- `ready`: Mechanical engine readiness only; it is not proof of trust residence, legal eligibility, filing completeness, or T4PS compliance.
- `amount_a_excluded_out_of_window`: Column-200 amounts kept OUT of amount A because their statutory payment window was breached. Amount A plus this equals the roster total in contributions_by_plan_type. 0 here because the admitted payment date is inside the supplied taxation year.
- `amountB`: Echo of the consumed s15:amountB preparer input (equals amount_b; F-B2 close-out: published so the form's schedule-input reference-integrity check resolves).
- `warnings`: No findings are emitted: trust residence is answered and the admitted payment date is inside the supplied taxation year.

# schedule17

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s17_2022_single_part1_rows_target_value_v1
- Payload schema version: 0.5.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule17"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "isCCPC": true,
    "schedule17": {
      "isCreditUnion": true,
      "part1AllocationRows": [
        {
          "line_100_interest_payable_by_members": 5000,
          "line_200_money_borrowed_by_members": 100000,
          "line_300_allocation_in_proportion_to_borrowing": 2000
        }
      ],
      "part1BonusInterestRows": [
        {
          "line_110_interest_payable_to_members": 8000,
          "line_210_money_on_deposit_by_members": 150000,
          "line_310_bonus_interest_payments": 4000
        }
      ]
    }
  }
}
```

## Input cells (46)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean | strict |
| schedule17.amount_1a_part1_total_deduction | null \| number \| string |  |
| schedule17.amount_2a_pra_opening_on_bc | null \| number |  |
| schedule17.amount_2f_sbd_for_tax_year | null \| number |  |
| schedule17.amount_3a_pra_opening_mb | null \| number |  |
| schedule17.amount_3d_s383_amount_1e | null \| number |  |
| schedule17.amount_3j_s383_amount_1f | null \| number |  |
| schedule17.hasPermanentEstablishmentBritishColumbia | boolean \| null |  |
| schedule17.hasPermanentEstablishmentManitoba | boolean \| null |  |
| schedule17.hasPermanentEstablishmentOntario | boolean \| null |  |
| schedule17.isCreditUnion | boolean \| null | strict |
| schedule17.line_305 | null \| number |  |
| schedule17.line_315 | null \| number |  |
| schedule17.line_501 | null \| number |  |
| schedule17.line_502 | null \| number |  |
| schedule17.line_601 | null \| number |  |
| schedule17.line_602 | null \| number |  |
| schedule17.line_626 | null \| number |  |
| schedule17.line_651 | null \| number |  |
| schedule17.line_652 | null \| number |  |
| schedule17.line_701 | null \| number |  |
| schedule17.line_702 | null \| number |  |
| schedule17.line_751 | null \| number |  |
| schedule17.line_752 | null \| number |  |
| schedule17.line_801 | null \| number |  |
| schedule17.line_802 | null \| number |  |
| schedule17.part1AllocationRows | array |  |
| schedule17.part1AllocationRows[].classDescription | null \| string |  |
| schedule17.part1AllocationRows[].line_100_interest_payable_by_members | null \| number | strict |
| schedule17.part1AllocationRows[].line_200_money_borrowed_by_members | null \| number | strict |
| schedule17.part1AllocationRows[].line_300_allocation_in_proportion_to_borrowing | null \| number \| string | strict |
| schedule17.part1AllocationRows[].paymentDate | null \| string |  |
| schedule17.part1AllocationRows[].sameRateAttestation | boolean \| null |  |
| schedule17.part1AllocationRows[].wasDeductibleInPriorYear | boolean \| null |  |
| schedule17.part1BonusInterestRows | array |  |
| schedule17.part1BonusInterestRows[].classDescription | null \| string |  |
| schedule17.part1BonusInterestRows[].line_110_interest_payable_to_members | null \| number | strict |
| schedule17.part1BonusInterestRows[].line_210_money_on_deposit_by_members | null \| number | strict |
| schedule17.part1BonusInterestRows[].line_310_bonus_interest_payments | null \| number | strict |
| schedule17.part1BonusInterestRows[].paymentDate | null \| string |  |
| schedule17.part1BonusInterestRows[].sameRateAttestation | boolean \| null |  |
| schedule17.part1BonusInterestRows[].wasDeductibleInPriorYear | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period. TXE-680 routed the single-target schedule17 request through the same two-phase SBD seam as the filing batch, whose Part I closure requires the complete canonical taxation-period trio.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: Canadian-controlled private corporation status, the T2 box 040 fact the SBD closure requires. The witness credit union is a CCPC; s.137(7) deems a credit union not a private corporation except for the enumerated provisions, and the s.125 deduction reaches it through s.137(4)/(3).
- `schedule17.amount_1a_part1_total_deduction`: Part 1 amount 1A, line 305 plus line 315, the credit union's total payments-to-members deduction flowing to Schedule 1 line 315. The engine computes it from the per-class rows, so send it only to reconcile an imported total.
- `schedule17.amount_2a_pra_opening_on_bc`: Amount 2A — PRA at end of PY incl. transfers (= 2E from PY S17, or zero if first-time ON/BC PE filer). Carries forward from line 801 via carryforward_schedule17.
- `schedule17.amount_2f_sbd_for_tax_year`: Amount 2F — SBD claimed for tax year (= T2 line 430).
- `schedule17.amount_3a_pra_opening_mb`: Amount 3A — MB opening PRA incl. transfers.
- `schedule17.amount_3d_s383_amount_1e`: Amount 3D — MB SBD claimed (= S383 amount 1E).
- `schedule17.amount_3j_s383_amount_1f`: Amount 3J — = S383 amount 1F.
- `schedule17.hasPermanentEstablishmentBritishColumbia`: True iff the corp has a permanent establishment in British Columbia.
- `schedule17.hasPermanentEstablishmentManitoba`: True iff the corp has a permanent establishment in Manitoba. Drives Part 3 applicability.
- `schedule17.hasPermanentEstablishmentOntario`: True iff the corp has a permanent establishment in Ontario. Drives Part 2 applicability (along with hasPermanentEstablishmentBritishColumbia).
- `schedule17.isCreditUnion`: Whether the filer is a credit union (ITA s.137). Used when this target runs on its own, standing in for the T2 jacket's credit-union status. If the two disagree, the engine blocks.
- `schedule17.line_305`: Line 305 — Total allocations in proportion to borrowing (sum of col 300 across rows). Practitioner may override the computed sum or leave null to defer to the engine.
- `schedule17.line_315`: Line 315 — Total bonus interest payments (sum of col 310 across rows). Practitioner may override or defer to engine.
- `schedule17.line_501`: Line 501 — Taxable income for tax year (= T2 line 360).
- `schedule17.line_502`: Line 502 — MB taxable income (= S383 amount 1A).
- `schedule17.line_601`: Line 601 — 4/3 × maximum cumulative reserve at end of tax year. MCR per s.137(6) is 5% × (debts to members + members' shares).
- `schedule17.line_602`: Line 602 — 4/3 × MCR at end of tax year (typically equal to line 601).
- `schedule17.line_626`: Line 626 — Min of T2 lines 400, 405, 410, 428 (federal SBD-eligibility floor that grinds the year's PRA addition).
- `schedule17.line_651`: Line 651 — Amount 2D × 19% (engine-computed; override allowed).
- `schedule17.line_652`: Line 652 — Amount 3H × 12% (engine-computed; feeds S383 amount 2B).
- `schedule17.line_701`: Line 701 — PRA at end of PY (= PY line 801).
- `schedule17.line_702`: Line 702 — MB PRA at end of PY (= PY line 802).
- `schedule17.line_751`: Line 751 — PRA transferred on amalgamation or wind-up (s.87 / s.88 continuity; default zero).
- `schedule17.line_752`: Line 752 — MB PRA transferred on amalgamation or wind-up.
- `schedule17.line_801`: Line 801 — PRA at end of tax year (= 2E + 2I, engine-computed).
- `schedule17.line_802`: Line 802 — MB PRA at end of tax year (= 3I + 3J + 3K, engine-computed).
- `schedule17.part1AllocationRows`: Per-class rows for allocations in proportion to borrowing. Each row's col 300 sums into line 305.
- `schedule17.part1AllocationRows[].classDescription`: Optional practitioner notes for this class row.
- `schedule17.part1AllocationRows[].line_100_interest_payable_by_members`: Col 100 — Interest payable BY all members of class (reference input).
- `schedule17.part1AllocationRows[].line_200_money_borrowed_by_members`: Col 200 — Amount of money borrowed BY all members of class (reference input).
- `schedule17.part1AllocationRows[].line_300_allocation_in_proportion_to_borrowing`: Col 300 — Allocation in proportion to borrowing for the class (deductible).
- `schedule17.part1AllocationRows[].paymentDate`: Date the payment was made to members (ISO YYYY-MM-DD). ITA s.137(2) deducts only payments "made by the credit union within the year or within 12 months thereafter". null = unanswered.
- `schedule17.part1AllocationRows[].sameRateAttestation`: Were the payments to members of this class computed at the SAME RATE? ITA s.137(6) "allocation in proportion to borrowing" admits only same-rate classes. false excludes the row from the total; null = unanswered.
- `schedule17.part1AllocationRows[].wasDeductibleInPriorYear`: Was this amount DEDUCTIBLE in computing income for a preceding tax year? ITA s.137(2) opening words. true removes the row from this year's total whether or not it was actually claimed; null = unanswered.
- `schedule17.part1BonusInterestRows`: Per-class rows for bonus interest payments. Each row's col 310 sums into line 315.
- `schedule17.part1BonusInterestRows[].classDescription`: Optional practitioner notes for this class row.
- `schedule17.part1BonusInterestRows[].line_110_interest_payable_to_members`: Col 110 — Interest payable TO all members of class (reference input).
- `schedule17.part1BonusInterestRows[].line_210_money_on_deposit_by_members`: Col 210 — Amount of money on deposit BY all members of class (reference input).
- `schedule17.part1BonusInterestRows[].line_310_bonus_interest_payments`: Col 310 — Bonus interest payment for the class (deductible).
- `schedule17.part1BonusInterestRows[].paymentDate`: Date the bonus interest was paid to members (ISO YYYY-MM-DD). ITA s.137(2) year-or-12-months window. null = unanswered.
- `schedule17.part1BonusInterestRows[].sameRateAttestation`: Were the bonus interest payments to this class computed at the SAME RATE? ITA s.137(6). null = unanswered.
- `schedule17.part1BonusInterestRows[].wasDeductibleInPriorYear`: Was this amount DEDUCTIBLE in computing income for a preceding tax year? ITA s.137(2). null = unanswered.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 46 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule17.part1AllocationRows[].line_100_interest_payable_by_members | -1000000000000000 to 1000000000000000 |
| schedule17.part1AllocationRows[].line_200_money_borrowed_by_members | -1000000000000000 to 1000000000000000 |
| schedule17.part1AllocationRows[].line_300_allocation_in_proportion_to_borrowing | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule17.part1BonusInterestRows[].line_110_interest_payable_to_members | -1000000000000000 to 1000000000000000 |
| schedule17.part1BonusInterestRows[].line_210_money_on_deposit_by_members | -1000000000000000 to 1000000000000000 |
| schedule17.part1BonusInterestRows[].line_310_bonus_interest_payments | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (110)

| Cell | Types |
| --- | --- |
| amount_1a_part1_total_deduction | string |
| amount_2a_pra_opening_on_bc | string |
| amount_2b_remaining_mcr_on_bc | string |
| amount_2c_feeds_s500_line_4a_or_s427_line_1f | string |
| amount_2c_lesser_ti_or_2b | string |
| amount_2d_2c_less_626 | string |
| amount_2e_701_plus_751 | string |
| amount_2f_sbd_for_tax_year | string |
| amount_2g_line_651 | string |
| amount_2h_2f_plus_2g | string |
| amount_2i_2h_div_19pct | string |
| amount_3a_pra_opening_mb | string |
| amount_3b_remaining_mcr_mb | string |
| amount_3c_lesser_mb_ti_or_3b | string |
| amount_3d_s383_amount_1e | string |
| amount_3e_3c_less_3d | string |
| amount_3f_2021_days_at_40pct | string |
| amount_3g_2022_days_at_20pct | string |
| amount_3h_3f_plus_3g | string |
| amount_3i_702_plus_752 | string |
| amount_3j_s383_amount_1f | string |
| amount_3k_amount_3h | string |
| fired_gates | object |
| form.amount_1a | number |
| form.amount_2a | number |
| form.amount_2b | number |
| form.amount_2c | number |
| form.amount_2d | number |
| form.amount_2e | number |
| form.amount_2f | number |
| form.amount_2g | number |
| form.amount_2h | number |
| form.amount_2i | number |
| form.amount_3a | number |
| form.amount_3b | number |
| form.amount_3c | number |
| form.amount_3d | number |
| form.amount_3e | number |
| form.amount_3f | number |
| form.amount_3g | number |
| form.amount_3h | number |
| form.amount_3i | number |
| form.amount_3j | number |
| form.amount_3k | number |
| form.days_2021 | number |
| form.days_2022 | number |
| form.formWarnings | array |
| form.line_305 | number |
| form.line_315 | number |
| form.line_501 | number |
| form.line_502 | number |
| form.line_601 | number |
| form.line_602 | number |
| form.line_626 | number |
| form.line_651 | number |
| form.line_652 | number |
| form.line_701 | number |
| form.line_702 | number |
| form.line_751 | number |
| form.line_752 | number |
| form.line_801 | number |
| form.line_802 | number |
| form.part1AllocationContinuationTable | array |
| form.part1AllocationTable[].col_100 | number |
| form.part1AllocationTable[].col_200 | number |
| form.part1AllocationTable[].col_300 | number |
| form.part1BonusContinuationTable | array |
| form.part1BonusTable[].col_110 | number |
| form.part1BonusTable[].col_210 | number |
| form.part1BonusTable[].col_310 | number |
| form.total_days | number |
| has_pe_british_columbia | boolean \| null |
| has_pe_manitoba | boolean \| null |
| has_pe_ontario | boolean \| null |
| is_credit_union | boolean \| null |
| line_305 | string |
| line_315 | string |
| line_501 | string |
| line_502 | string |
| line_601 | string |
| line_602 | string |
| line_626 | string |
| line_651 | string |
| line_652 | string |
| line_701 | string |
| line_702 | string |
| line_751 | string |
| line_752 | string |
| line_801 | string |
| line_802 | string |
| manitoba_credit_flows_to_s383_amount_2b | string |
| manitoba_day_counts.days_in_2021 | integer |
| manitoba_day_counts.days_in_2022 | integer |
| manitoba_day_counts.total_days_in_tax_year | integer |
| part1_deduction_flows_to_s1_line_315 | string |
| provisional | boolean |
| ready | boolean |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |

# schedule18

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s18_2025_six_line_projection_v1
- Payload schema version: 0.10.0
- Dependencies (run automatically): division_c, part_i_tax, schedule31, schedule4, schedule5, schedule6

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule18"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "t2Jacket": {
      "additionalInfo": {
        "returnFiledWithinThreeYears": true
      },
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    },
    "schedule18": {
      "line120_taxed_capital_gains": 1000,
      "line160_rcgtoh_before_refund": 500,
      "line190_federal_capital_gains_refund": 100,
      "line260_ontario_capital_gains_refund": 0,
      "line262_manitoba_capital_gains_refund": 0,
      "line290_total_provincial_capital_gains_refund": 0,
      "totalTaxableIncome": 1000,
      "perProvinceRows": {}
    },
    "isCCPC": true
  }
}
```

## Input cells (52)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| isCCPC | boolean |  |
| schedule18.amount4A_ontario_allocation_factor | null \| number |  |
| schedule18.amount5C_ontario_income_tax_payable | null \| number |  |
| schedule18.amount5D_ontario_refundable_tax_credits | null \| number |  |
| schedule18.amount7A_manitoba_tax_rate | null \| number |  |
| schedule18.amount8A_manitoba_allocation_factor | null \| number |  |
| schedule18.amount9C_manitoba_income_tax_payable | null \| number |  |
| schedule18.amount9D_manitoba_refundable_tax_credits | null \| number |  |
| schedule18.corporationType | null \| string |  |
| schedule18.incorporatedWithinTwoYearsOfTestTime | boolean \| null |  |
| schedule18.lastModifiedAt | string |  |
| schedule18.lastModifiedBy | string |  |
| schedule18.line101_rcgtoh_opening | null \| number |  |
| schedule18.line120_taxed_capital_gains | null \| number | strict |
| schedule18.line144_rcgtoh_amalg_transfer | null \| number |  |
| schedule18.line151_federal_cgr_previous_year | null \| number |  |
| schedule18.line160_rcgtoh_before_refund | null \| number | strict |
| schedule18.line162_fmv_issued_shares | null \| number |  |
| schedule18.line164_fmv_debts | null \| number |  |
| schedule18.line166_total_cost_amounts | null \| number |  |
| schedule18.line168_money_on_hand | null \| number |  |
| schedule18.line169_amount_paid_redeem | null \| number |  |
| schedule18.line170_capital_gains_redemptions | null \| number |  |
| schedule18.line171_fmv_share_exchanges_131_4_1 | null \| number |  |
| schedule18.line180_capital_gains_dividends_60d_window | null \| number |  |
| schedule18.line190_federal_capital_gains_refund | null \| number | strict |
| schedule18.line192_orcgtoh_opening | null \| number |  |
| schedule18.line194_orcgtoh_amalg_transfer | null \| number |  |
| schedule18.line196_ontario_cgr_previous_year | null \| number |  |
| schedule18.line198_orcgtoh_before_refund | null \| number |  |
| schedule18.line260_ontario_capital_gains_refund | null \| number | strict |
| schedule18.line262_manitoba_capital_gains_refund | null \| number | strict |
| schedule18.line290_total_provincial_capital_gains_refund | null \| number | strict |
| schedule18.line300_mrcgtoh_opening | null \| number |  |
| schedule18.line310_manitoba_cgr_previous_year | null \| number |  |
| schedule18.line320_mrcgtoh_before_refund | null \| number |  |
| schedule18.ontario_basic_rate_of_tax_note6 | null \| number |  |
| schedule18.perProvinceRows | null \| object | strict |
| schedule18.prescribedLsvcc | boolean \| null |  |
| schedule18.reitControlledOnApril16_2024 | boolean \| null |  |
| schedule18.specifiedPersonsControlCorporation | boolean \| null |  |
| schedule18.specifiedPersonsShareFmv | null \| number \| string |  |
| schedule18.specifiedPersonsShareFmvPercentage | null \| number \| string |  |
| schedule18.totalTaxableIncome | null \| number | strict |
| t2Jacket.additionalInfo.returnFiledWithinThreeYears | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year, tied to the inclusive fiscalStart-to-fiscalEnd span. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this schedule feeds are day-weighted, so the engine requires the stated count instead of assuming a calendar year.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule18.amount4A_ontario_allocation_factor`: Amount 4A — Ontario allocation factor (0-1). Notes 4/5: the amount allocated to Ontario from column F in Part 1 of Schedule 5 over T2 line 360; enter 1 when line 750 is Ontario.
- `schedule18.amount5C_ontario_income_tax_payable`: Amount 5C — "Ontario corporate income tax payable. Amount 5G from Part 2 of Schedule 5" (form-face tooltip, T2 SCH 18 E (19) page 2).
- `schedule18.amount5D_ontario_refundable_tax_credits`: Amount 5D — "Ontario refundable tax credits. Amount 5J from Part 2 of Schedule 5". Amount 5E is 5C minus 5D, floored at nil ("if negative, enter 0" = the statute's "the amount, if any, by which").
- `schedule18.amount7A_manitoba_tax_rate`: Amount 7A — the higher Manitoba tax rate for the year (0-1) from Schedule 383, Part 7. Where different rates apply to different periods, the form's own R x A1 / A2 day weighting applies.
- `schedule18.amount8A_manitoba_allocation_factor`: Amount 8A — Manitoba allocation factor (0-1), Notes 9/10; the Ontario rule read for Manitoba.
- `schedule18.amount9C_manitoba_income_tax_payable`: Amount 9C — "Manitoba corporate income tax payable. Amount 6B from Part 2 of Schedule 5" (form-face tooltip, T2 SCH 18 E (19) page 3).
- `schedule18.amount9D_manitoba_refundable_tax_credits`: Amount 9D — "Manitoba refundable tax credits. Amount 6C from Part 2 of Schedule 5". Amount 9E is 9C minus 9D, floored at nil.
- `schedule18.incorporatedWithinTwoYearsOfTestTime`: Whether the corporation was incorporated within the two years before the test time, the ITA s.131(8.3) recent-incorporation exception. Consulted only once specified persons both control the corporation and hold more than 10 percent of total share fair market value. null leaves mutual-fund-corporation status unproved and releases no Schedule 18 refund; false disqualifies the corporation under s.131(8.2).
- `schedule18.ontario_basic_rate_of_tax_note6`: Note 6 — the Ontario basic rate of tax (0-1), "the rate calculated in Part 1 of Schedule 500".
- `schedule18.perProvinceRows`: Province-keyed taxable-income and capital-gains-refund operands used to allocate the Schedule 18 provincial refund. The object uses the persisted public Schedule 18 row names.
- `schedule18.prescribedLsvcc`: ITA 131(8): the corporation was a prescribed labour-sponsored venture capital corporation throughout the tax year. Null is unanswered.
- `schedule18.reitControlledOnApril16_2024`: Whether the corporation was controlled by a real estate investment trust on April 16, 2024. Read only on a return whose taxation year starts in 2025: S.C. 2026 c.3 s.62(3) defers ITA s.131(8.2) for that class until years beginning after 2025, so true keeps the substantial-interest rule off this year. null leaves the coming-into-force branch unresolved and releases no Schedule 18 refund.
- `schedule18.specifiedPersonsControlCorporation`: Whether specified persons control the corporation, the first limb of the ITA s.131(8.2) substantial-interest test. Read whenever that rule reaches the taxation year, together with specifiedPersonsShareFmvPercentage. null leaves mutual-fund-corporation status and its capital gains refund unproved.
- `schedule18.specifiedPersonsShareFmv`: Aggregate fair market value of the shares held by specified persons, tested against the $5,000,000 ceiling in the ITA s.131(8.3) exception. Consulted only once that exception is otherwise in play. It must not be negative, and an absent amount leaves mutual-fund-corporation status unproved.
- `schedule18.specifiedPersonsShareFmvPercentage`: Share of total share fair market value held by specified persons, as a 0-to-100 percentage. The second limb of the ITA s.131(8.2) substantial-interest test: above 10 percent, with specified-person control, the s.131(8.3) exception decides the outcome. A value outside 0 to 100, or an absent one, leaves the status unproved.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (12 of 52 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule18.corporationType | one of "investment", "mutualFund" |
| schedule18.line120_taxed_capital_gains | -1000000000000000 to 1000000000000000 |
| schedule18.line160_rcgtoh_before_refund | -1000000000000000 to 1000000000000000 |
| schedule18.line190_federal_capital_gains_refund | -1000000000000000 to 1000000000000000 |
| schedule18.line260_ontario_capital_gains_refund | -1000000000000000 to 1000000000000000 |
| schedule18.line262_manitoba_capital_gains_refund | -1000000000000000 to 1000000000000000 |
| schedule18.line290_total_provincial_capital_gains_refund | -1000000000000000 to 1000000000000000 |
| schedule18.totalTaxableIncome | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (74)

| Cell | Types |
| --- | --- |
| answered_count | integer |
| federal_parts_1_to_3.computed_lines.160 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.computed_lines.170 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.computed_lines.190 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.corporation_type | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.corporation_type_supplied | boolean |
| federal_parts_1_to_3.line_120 | null \| number |
| federal_parts_1_to_3.part_1.amount_1a | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.amount_1b | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.amount_1c | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.amount_1d | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.amount_1e | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.computed | boolean |
| federal_parts_1_to_3.part_1.line_101 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.line_144 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.line_151 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.line_160 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_1.missing_inputs[] | string |
| federal_parts_1_to_3.part_2.amount_2a | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.amount_2b | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.amount_2c | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.amount_2d | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.amount_2e | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.amount_2f | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.computed | boolean |
| federal_parts_1_to_3.part_2.line_170 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_2.missing_inputs[] | string |
| federal_parts_1_to_3.part_2.not_applicable | boolean |
| federal_parts_1_to_3.part_2.notes | array |
| federal_parts_1_to_3.part_3.amount_3a | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_3.amount_3b | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_3.computed | boolean |
| federal_parts_1_to_3.part_3.line_190 | array \| boolean \| null \| number \| object \| string |
| federal_parts_1_to_3.part_3.missing_inputs[] | string |
| federal_parts_1_to_3.sources.120 | string |
| federal_parts_1_to_3.sources.160 | string |
| federal_parts_1_to_3.sources.170 | string |
| federal_parts_1_to_3.sources.190 | string |
| fired_gates | object |
| line_120 | integer |
| line_160 | integer |
| line_190 | integer |
| line_260 | integer |
| line_262 | integer |
| line_290 | integer |
| missing_required[] | string |
| part_11_detail | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| ready | boolean |
| t2_line_788_feed | null \| number |
| t2_line_808_feed | null \| number |
| total_count | integer |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].province | string |
| warnings[].code | string |
| warnings[].tax_year | integer \| null |
| provincial_pools.computed_lines.198 | array \| boolean \| null \| number \| object \| string |
| provincial_pools.computed_lines.320 | array \| boolean \| null \| number \| object \| string |
| provincial_pools.continuity_break | boolean |
| corporation_type | array \| boolean \| null \| number \| object \| string |
| perProvinceRows | array |
| prescribed_lsvcc | array \| boolean \| null \| number \| object \| string |

# schedule2

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s2_2025_single_charitable_gift_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): schedule1, schedule17, schedule3, schedule43, schedule6, schedule8

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule2"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "claimMaximumDonations": true,
    "accounts": [
      {
        "id": "acct-revenue-target",
        "accountCode": "8000",
        "accountName": "Cedar Ridge sales revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "treatment": "no_adjustment",
          "deductibility": "100%",
          "assumption": "Caller-supplied book-income fact"
        }
      },
      {
        "id": "acct-tax-penalty-target",
        "accountCode": "9000",
        "accountName": "Interest and penalties on taxes",
        "currentYearBalance": 1000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": true,
          "adjustmentType": "addition",
          "treatment": "full_addition",
          "deductibility": "0%",
          "assumption": "Caller-supplied line-103 classification; legal deductibility not verified",
          "s1Line": "103"
        }
      }
    ],
    "incomeStatementFlags": {
      "acct-revenue-target": true,
      "acct-tax-penalty-target": true
    },
    "workpapers": [
      {
        "id": "wp-donation-target",
        "templateId": "donations",
        "linkedAccountIds": [],
        "customName": "Cedar Ridge 2025 donations",
        "rows": [
          {
            "charityName": "Ontario Community Foundation",
            "qualifiedDoneeClass": "crown-canada-or-province",
            "receiptNumber": "RCPT-2025-0001",
            "donationDate": "2025-06-01",
            "amountCY": 10000,
            "eligibleAmount": 10000,
            "advantage": 0,
            "donationType": "charitable",
            "nonQualifyingSecurity": "No"
          }
        ],
        "sectionRows": {},
        "assumption": "Caller-stated donee class, receipt, eligible amount and advantage; no independent verification"
      }
    ],
    "isCCPC": true,
    "daysInYear": 365,
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    }
  }
}
```

## Input cells (161)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts | array |  |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.adjustmentType | null \| string |  |
| accounts[].classification.assumption | string | strict |
| accounts[].classification.deductibility | string | strict |
| accounts[].classification.deductibilityPercentage | null \| number \| string |  |
| accounts[].classification.deductibilityRule | string |  |
| accounts[].classification.ruleId | null \| string |  |
| accounts[].classification.s1Line | string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].classification.templateId | null \| string |  |
| accounts[].classification.treatment | string | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| claimMaximumDonations | boolean | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.acct-revenue-target | boolean | strict |
| incomeStatementFlags.acct-tax-penalty-target | boolean | strict |
| isCCPC | boolean |  |
| schedule2.amalgamationTransferEvidence | array |  |
| schedule2.amalgamationTransferEvidence[].enteredTotal | number |  |
| schedule2.amalgamationTransferEvidence[].linked | boolean |  |
| schedule2.amalgamationTransferEvidence[].predecessorId | string |  |
| schedule2.charitableCarryforwardYears | array |  |
| schedule2.charitableCarryforwardYears[].amountAvailable | number |  |
| schedule2.charitableCarryforwardYears[].amountClaimed | number |  |
| schedule2.charitableCarryforwardYears[].originDate | string |  |
| schedule2.charitableCarryforwardYears[].year | number |  |
| schedule2.culturalDeduction | number |  |
| schedule2.currentYearDonations | array |  |
| schedule2.currentYearDonations[].advantage | number |  |
| schedule2.currentYearDonations[].amount | number |  |
| schedule2.currentYearDonations[].charityName | string |  |
| schedule2.currentYearDonations[].donationDate | null \| string |  |
| schedule2.currentYearDonations[].eligibleAmount | number |  |
| schedule2.currentYearDonations[].isCrownTagged | boolean |  |
| schedule2.currentYearDonations[].registrationNumber | string |  |
| schedule2.currentYearDonations[].source | string |  |
| schedule2.currentYearDonations[].type | string |  |
| schedule2.currentYearDonations[].workpaperInstanceId | string |  |
| schedule2.ecologicalLandDeduction | number |  |
| schedule2.medicineDeduction | number |  |
| schedule2.netIncomeForTax | number |  |
| schedule2.part1 | object |  |
| schedule2.part1.amalgamationTransfers_250 | number |  |
| schedule2.part1.aocAdjustment_255 | number |  |
| schedule2.part1.closingBalance_280 | number |  |
| schedule2.part1.currentYearCrownTagged | number |  |
| schedule2.part1.currentYear_210 | number |  |
| schedule2.part1.deduction_260 | number |  |
| schedule2.part1.expiredCarryforward_239 | number |  |
| schedule2.part1.openingBalance_1A | number |  |
| schedule2.part1.openingNet_240 | number |  |
| schedule2.part1.subtotal_1B | number |  |
| schedule2.part1.subtotal_1C | number |  |
| schedule2.part1.totalAvailable_1D | number |  |
| schedule2.part2 | object |  |
| schedule2.part2.capGainsOnGifts_225 | number |  |
| schedule2.part2.capitalCost_2C | number |  |
| schedule2.part2.ccaRecapture_230 | number |  |
| schedule2.part2.lesser_230_235_2D | number |  |
| schedule2.part2.lesser_2B_2C_235 | number |  |
| schedule2.part2.maxAllowableDeduction_2H | number |  |
| schedule2.part2.netIncomeTimes75_2A | number |  |
| schedule2.part2.nqsCapGain_227 | number |  |
| schedule2.part2.proceedsLessOutlays_2B | number |  |
| schedule2.part2.subtotal_2E | number |  |
| schedule2.part2.subtotal_2G | number |  |
| schedule2.part2.uplift25pct_2F | number |  |
| schedule2.part3 | object |  |
| schedule2.part3.amalgamationTransfers_450 | number |  |
| schedule2.part3.aocAdjustment_455 | number |  |
| schedule2.part3.closingBalance_480 | number |  |
| schedule2.part3.currentYear_410 | number |  |
| schedule2.part3.deduction_460 | number |  |
| schedule2.part3.expiredCarryforward_439 | number |  |
| schedule2.part3.openingBalance_3A | number |  |
| schedule2.part3.openingNet_440 | number |  |
| schedule2.part3.subtotal_3B | number |  |
| schedule2.part3.subtotal_3C | number |  |
| schedule2.part4 | object |  |
| schedule2.part4.amalgamationTransfers_550 | number |  |
| schedule2.part4.aocAdjustment_555 | number |  |
| schedule2.part4.closingBalance_580 | number |  |
| schedule2.part4.currentYear_520 | number |  |
| schedule2.part4.deduction_560 | number |  |
| schedule2.part4.expiredCarryforward_539 | number |  |
| schedule2.part4.openingBalance_4A | number |  |
| schedule2.part4.openingNet_540 | number |  |
| schedule2.part4.subtotal_4B | number |  |
| schedule2.part4.subtotal_4C | number |  |
| schedule2.part5 | object |  |
| schedule2.part5.additionalDeduction_610 | number |  |
| schedule2.part5.amalgamationTransfers_650 | number |  |
| schedule2.part5.amount_5C | number |  |
| schedule2.part5.aocAdjustment_655 | number |  |
| schedule2.part5.closingBalance_680_NOT_CF | number |  |
| schedule2.part5.cost_601 | number |  |
| schedule2.part5.deduction_660 | number |  |
| schedule2.part5.eligibleAmount_600 | number |  |
| schedule2.part5.expiredCarryforward_639 | number |  |
| schedule2.part5.formulaA | number |  |
| schedule2.part5.formulaB | number |  |
| schedule2.part5.formulaC | number |  |
| schedule2.part5.openingBalance_5A | number |  |
| schedule2.part5.openingNet_640 | number |  |
| schedule2.part5.proceeds_602 | number |  |
| schedule2.part5.subtotal_5B | number |  |
| schedule2.part5.subtotal_5D | number |  |
| schedule2.part5.subtotal_5E | number |  |
| schedule2.provisional | boolean |  |
| schedule2.warnings | array |  |
| schedule2.warnings[].citation | object |  |
| schedule2.warnings[].code | string |  |
| schedule2.warnings[].field | string |  |
| schedule2.warnings[].kind | string |  |
| schedule2.warnings[].reason | string |  |
| schedule2.warnings[].rowAmount | number |  |
| schedule2.warnings[].rowIndex | number |  |
| schedule2.warnings[].severity | string |  |
| schedule2.warnings[].templateId | string |  |
| schedule2.warnings[].workpaperId | null \| string |  |
| schedule2.yearOfOriginCarryforward | array |  |
| schedule2.yearOfOriginCarryforwardTotals | object |  |
| schedule2.yearOfOriginCarryforwardTotals.charitable | number |  |
| schedule2.yearOfOriginCarryforwardTotals.cultural | number |  |
| schedule2.yearOfOriginCarryforwardTotals.ecoLandPost2014 | number |  |
| schedule2.yearOfOriginCarryforwardTotals.ecoLandPre2014 | number |  |
| schedule2.yearOfOriginCarryforward[].charitable | number |  |
| schedule2.yearOfOriginCarryforward[].cultural | number |  |
| schedule2.yearOfOriginCarryforward[].ecoLandPost2014 | number |  |
| schedule2.yearOfOriginCarryforward[].ecoLandPre2014 | number |  |
| schedule2.yearOfOriginCarryforward[].originDate | null \| string |  |
| schedule2.yearOfOriginCarryforward[].total | number |  |
| schedule2.yearOfOriginCarryforward[].year | number |  |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |
| workpapers[].adjustmentAmount | null \| number \| string |  |
| workpapers[].assumption | string | strict |
| workpapers[].customName | string | strict |
| workpapers[].id | string | strict |
| workpapers[].linkedAccountIds[] | boolean \| null \| number \| string | strict |
| workpapers[].rows[].advantage | integer | strict |
| workpapers[].rows[].amountCY | integer | strict |
| workpapers[].rows[].charityName | string | strict |
| workpapers[].rows[].donationDate | string | strict |
| workpapers[].rows[].donationType | string | strict |
| workpapers[].rows[].eligibleAmount | integer | strict |
| workpapers[].rows[].nonQualifyingSecurity | string | strict |
| workpapers[].rows[].qualifiedDoneeClass | string | strict |
| workpapers[].rows[].receiptNumber | string | strict |
| workpapers[].rows[].registrationNumber | string |  |
| workpapers[].sectionRows | object | strict |
| workpapers[].templateId | string | strict |

### Input cell notes

- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `claimMaximumDonations`: Explicit instruction to claim the maximum Schedule 2 donation deduction supported by the admitted gift and income facts; silence is not an election.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `incomeStatementFlags.acct-revenue-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `incomeStatementFlags.acct-tax-penalty-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule2.charitableCarryforwardYears`: Charitable Part 1 opening pool as normalised by the engine.
- `schedule2.charitableCarryforwardYears[].originDate`: End of the taxation year of origin, YYYY-MM-DD (Part 6 column 1).
- `schedule2.part1.currentYearCrownTagged`: Memo: the Crown-tagged portion of line 210 (display/handoff detail — post-2014 Crown gifts sit inside the charitable pool).
- `schedule2.part5.formulaA`: Line-610 printed working boxes a/b/c (a × b/c). Optional: emitted by the engine from 2026-06; bound on the form as curated codes 610A/610B/610C.
- `schedule2.provisional`: True when any warning is `error` or `warning` severity — `info` traces never make the schedule provisional.
- `schedule2.yearOfOriginCarryforwardTotals`: Canonical engine totals for the four printed Part 6 total-row cells.
- `schedule2.yearOfOriginCarryforward[].originDate`: Exact taxation-year end printed in Part 6; null holds filing.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.
- `workpapers[].rows[].advantage`: ITA 248(32): the total value of any property, service, compensation, use or other benefit received, obtained or enjoyed in consideration for, in gratitude for, or otherwise related to the gift, plus any limited-recourse debt. Zero on this witness, stated rather than inferred from silence.
- `workpapers[].rows[].amountCY`: Gross outlay — the fair market value of the property that is the subject of the gift, before the ITA 248(31) reduction.
- `workpapers[].rows[].charityName`: Free-text donee name. This is the one donee fact the profile does NOT stand behind; the statutory condition is the qualified-donee class below.
- `workpapers[].rows[].eligibleAmount`: ITA 248(31): the amount by which the fair market value of the property that is the subject of the gift exceeds the amount of the advantage, if any. This is the deductible figure, not the gross outlay.
- `workpapers[].rows[].nonQualifyingSecurity`: Explicit No answer to the ITA 118.1(13)/(19) non-qualifying-security question; silence cannot establish ordinary-gift treatment.
- `workpapers[].rows[].qualifiedDoneeClass`: The ITA 149.1(1) class that makes the recipient a qualified donee. ITA 110.1(1)(a) admits the eligible amount of a gift only where it is made 'to a qualified donee', so the class is a condition of the deduction rather than a label. The witness states 'crown-canada-or-province' (paragraph (d) of the definition), which is why the registration number below is empty: a Crown donee holds no charity registration number.
- `workpapers[].rows[].receiptNumber`: ITA 110.1(2)(a) receipt evidence. An eligible amount is not included in determining the subsection (1) deduction unless the making of the gift is evidenced by filing a receipt containing prescribed information, so the row carries the receipt identifier. The profile does not verify that the receipt contains the prescribed information.
- `workpapers[].rows[].registrationNumber`: CRA charity registration number. The witness's donee is a Crown donee, which holds none, so the row OMITS the field: the engine reads an absent value and an empty string identically, and a required blank would be boilerplate rather than a stated fact. The qualified-donee class above is what carries the ITA 110.1(1)(a) condition.

### Strict profile accepted values (38 of 161 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.adjustmentType | 0 to 20000 characters |
| accounts[].classification.assumption | 0 to 20000 characters |
| accounts[].classification.deductibility | 0 to 20000 characters |
| accounts[].classification.deductibilityPercentage | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| accounts[].classification.deductibilityRule | 0 to 20000 characters |
| accounts[].classification.ruleId | 0 to 20000 characters |
| accounts[].classification.s1Line | 0 to 20000 characters |
| accounts[].classification.templateId | 0 to 20000 characters |
| accounts[].classification.treatment | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule2.currentYearDonations[].source | one of "workpaper", "manual" |
| schedule2.currentYearDonations[].type | one of "charitable", "cultural", "ecoLand", "medicine" |
| schedule2.warnings[].severity | one of "error", "warning", "info" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |
| workpapers[].adjustmentAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| workpapers[].assumption | 0 to 20000 characters |
| workpapers[].customName | 0 to 20000 characters |
| workpapers[].id | 0 to 20000 characters |
| workpapers[].linkedAccountIds[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| workpapers[].rows[].advantage | -1000000000000000 to 1000000000000000 |
| workpapers[].rows[].amountCY | -1000000000000000 to 1000000000000000 |
| workpapers[].rows[].charityName | 0 to 20000 characters |
| workpapers[].rows[].donationDate | 0 to 20000 characters |
| workpapers[].rows[].donationType | 0 to 20000 characters |
| workpapers[].rows[].eligibleAmount | -1000000000000000 to 1000000000000000 |
| workpapers[].rows[].nonQualifyingSecurity | 0 to 20000 characters |
| workpapers[].rows[].qualifiedDoneeClass | 0 to 20000 characters |
| workpapers[].rows[].receiptNumber | 0 to 20000 characters |
| workpapers[].rows[].registrationNumber | 0 to 20000 characters |
| workpapers[].templateId | 0 to 20000 characters |

## Output cells (154)

| Cell | Types |
| --- | --- |
| charitableCarryforwardYears | array |
| culturalDeduction | number |
| currentYearDonations[].advantage | number |
| currentYearDonations[].amount | number |
| currentYearDonations[].charityName | string |
| currentYearDonations[].donationDate | string |
| currentYearDonations[].eligibleAmount | number |
| currentYearDonations[].isCrownTagged | boolean |
| currentYearDonations[].registrationNumber | string |
| currentYearDonations[].source | string |
| currentYearDonations[].type | string |
| currentYearDonations[].workpaperInstanceId | string |
| donationReconciliation.advantage.charitable | number |
| donationReconciliation.advantage.cultural | number |
| donationReconciliation.advantage.ecoLand | number |
| donationReconciliation.advantage.total | number |
| donationReconciliation.currentYearEligible.charitable | number |
| donationReconciliation.currentYearEligible.cultural | number |
| donationReconciliation.currentYearEligible.ecoLand | number |
| donationReconciliation.currentYearEligible.total | number |
| donationReconciliation.currentYearGross.charitable | number |
| donationReconciliation.currentYearGross.cultural | number |
| donationReconciliation.currentYearGross.ecoLand | number |
| donationReconciliation.currentYearGross.total | number |
| ecologicalLandDeduction | number |
| manualPoolDenials | object |
| medicineDeduction | number |
| netIncomeForTax | number |
| nonQualifyingSecurityDeferrals | array |
| part1.amalgamationTransfers_250 | number |
| part1.aocAdjustment_255 | number |
| part1.closingBalance_280 | number |
| part1.currentYearCrownTagged | number |
| part1.currentYear_210 | number |
| part1.deduction_260 | number |
| part1.expiredCarryforward_239 | number |
| part1.openingBalance_1A | number |
| part1.openingNet_240 | number |
| part1.subtotal_1B | number |
| part1.subtotal_1C | number |
| part1.totalAvailable_1D | number |
| part2.capGainsOnGifts_225 | number |
| part2.capitalCost_2C | number |
| part2.ccaRecapture_230 | number |
| part2.lesser_230_235_2D | number |
| part2.lesser_2B_2C_235 | number |
| part2.maxAllowableDeduction_2H | number |
| part2.netIncomeTimes75_2A | number |
| part2.nqsCapGain_227 | number |
| part2.proceedsLessOutlays_2B | number |
| part2.subtotal_2E | number |
| part2.subtotal_2G | number |
| part2.uplift25pct_2F | number |
| part3.amalgamationTransfers_450 | number |
| part3.aocAdjustment_455 | number |
| part3.closingBalance_480 | number |
| part3.currentYear_410 | number |
| part3.deduction_460 | number |
| part3.expiredCarryforward_439 | number |
| part3.openingBalance_3A | number |
| part3.openingNet_440 | number |
| part3.subtotal_3B | number |
| part3.subtotal_3C | number |
| part3.subtotal_3D | number |
| part4.amalgamationTransfers_550 | number |
| part4.aocAdjustment_555 | number |
| part4.closingBalance_580 | number |
| part4.currentYear_520 | number |
| part4.deduction_560 | number |
| part4.expiredCarryforward_539 | number |
| part4.openingBalance_4A | number |
| part4.openingNet_540 | number |
| part4.subPools.postFeb2014_10yrCF.currentYear | number |
| part4.subPools.postFeb2014_10yrCF.expired | number |
| part4.subPools.postFeb2014_10yrCF.opening | number |
| part4.subPools.preFeb2014_5yrCF.currentYear | number |
| part4.subPools.preFeb2014_5yrCF.expired | number |
| part4.subPools.preFeb2014_5yrCF.opening | number |
| part4.subtotal_4B | number |
| part4.subtotal_4C | number |
| part4.subtotal_4D | number |
| part5.additionalDeduction_610 | number |
| part5.amalgamationTransfers_650 | number |
| part5.amount_5C | number |
| part5.aocAdjustment_655 | number |
| part5.closingBalance_680_NOT_CF | number |
| part5.cost_601 | number |
| part5.deduction_660 | number |
| part5.eligibleAmount_600 | number |
| part5.expiredCarryforward_639 | number |
| part5.formulaA | number |
| part5.formulaB | number |
| part5.formulaC | number |
| part5.openingBalance_5A | number |
| part5.openingNet_640 | number |
| part5.proceeds_602 | number |
| part5.subtotal_5B | number |
| part5.subtotal_5D | number |
| part5.subtotal_5E | number |
| part5.subtotal_5F | number |
| provincialFarmerCredits.britishColumbia.citation | string |
| provincialFarmerCredits.britishColumbia.credit | number |
| provincialFarmerCredits.britishColumbia.qualifyingAmount_265 | number |
| provincialFarmerCredits.britishColumbia.s5_line | string |
| provincialFarmerCredits.novaScotia.citation | string |
| provincialFarmerCredits.novaScotia.credit | number |
| provincialFarmerCredits.novaScotia.qualifyingAmount_263 | number |
| provincialFarmerCredits.novaScotia.s5_line | string |
| provincialFarmerCredits.ontario.citation | string |
| provincialFarmerCredits.ontario.credit | number |
| provincialFarmerCredits.ontario.qualifyingAmount_262 | number |
| provincialFarmerCredits.ontario.s5_line | string |
| provisional | boolean |
| ready | boolean |
| schedule1Addback.line210_charitable | number |
| schedule1Addback.line410_cultural | number |
| schedule1Addback.line520_ecoLand | number |
| schedule1Addback.total | number |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].kind | string |
| warnings[].reason | string |
| warnings[].severity | string |
| warnings[].templateId | string |
| warnings[].category | string |
| warnings[].filingDisposition | string |
| warnings[].maximumAllowable | number |
| warnings[].actual | number |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].expected | null \| number |
| warnings[].key | string |
| yearOfOriginCarryforward[].year | integer |
| yearOfOriginCarryforward[].originDate | string |
| yearOfOriginCarryforward[].charitable | number |
| yearOfOriginCarryforward[].cultural | number |
| yearOfOriginCarryforward[].ecoLandPre2014 | number |
| yearOfOriginCarryforward[].ecoLandPost2014 | number |
| yearOfOriginCarryforward[].total | number |
| yearOfOriginCarryforwardTotals.charitable | number |
| yearOfOriginCarryforwardTotals.cultural | number |
| yearOfOriginCarryforwardTotals.ecoLandPost2014 | number |
| yearOfOriginCarryforwardTotals.ecoLandPre2014 | number |
| amalgamationTransferEvidence | array |
| controlArrangementGiftDenials | array |

### Output cell notes

- `warnings[].code`: Which continuity obligation this row is about.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].filingDisposition`: How this finding routes the filing: block, disclose or info. The filing-disposition registry owns the value; the finding carries the resolved one.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].citation.display`: The citation as it is shown to a preparer.
- `warnings[].citation.kind`: The authority family the section belongs to.
- `warnings[].citation.section`: The cited provision.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.

# schedule20

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2017 and later
- Strict profile: s20_exact_single_request_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): division_c, part_i_tax, schedule31, schedule38, schedule5

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule20"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "schedule20": {
      "amountA": 100000,
      "line_510": 0,
      "line_500": 0,
      "isFirstTimeFiler": false
    },
    "isCCPC": true
  }
}
```

## Input cells (90)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule20.amountA | null \| number \| string | strict |
| schedule20.amount_b_total_tax_payable | null \| number \| string |  |
| schedule20.carryingOnBusinessInCanadaAtYearEnd | boolean \| null |  |
| schedule20.ceasedAllOrSubstantiallyAllInsuranceBusinessInCanada | boolean \| null |  |
| schedule20.exemptCorpType | null \| string |  |
| schedule20.isAuthorizedForeignBank | boolean |  |
| schedule20.isFirstTimeFiler | boolean \| null | strict |
| schedule20.line_099 | null \| string |  |
| schedule20.line_100 | null \| string |  |
| schedule20.line_101 | null \| string |  |
| schedule20.line_103 | null \| string |  |
| schedule20.line_104 | null \| string |  |
| schedule20.line_105 | null \| string |  |
| schedule20.line_106 | null \| string |  |
| schedule20.line_107 | null \| string |  |
| schedule20.line_108 | null \| string |  |
| schedule20.line_109 | null \| string |  |
| schedule20.line_110 | null \| string |  |
| schedule20.line_111 | null \| string |  |
| schedule20.line_112 | null \| string |  |
| schedule20.line_113 | null \| string |  |
| schedule20.line_114 | null \| string |  |
| schedule20.line_115 | null \| string |  |
| schedule20.line_116 | null \| string |  |
| schedule20.line_117 | null \| string |  |
| schedule20.line_118 | null \| string |  |
| schedule20.line_120 | null \| string |  |
| schedule20.line_121 | null \| string |  |
| schedule20.line_122 | null \| string |  |
| schedule20.line_123 | null \| string |  |
| schedule20.line_124 | null \| string |  |
| schedule20.line_125 | null \| string |  |
| schedule20.line_126 | null \| string |  |
| schedule20.line_500 | null \| number \| string | strict |
| schedule20.line_510 | null \| number \| string | strict |
| schedule20.line_520 | null \| string |  |
| schedule20.line_650 | null \| string |  |
| schedule20.line_655 | null \| string |  |
| schedule20.line_660 | null \| string |  |
| schedule20.line_665 | null \| string |  |
| schedule20.part5 | null \| object |  |
| schedule20.part5.line_200 | null \| string |  |
| schedule20.part5.line_201 | null \| string |  |
| schedule20.part5.line_203 | null \| string |  |
| schedule20.part5.line_204 | null \| string |  |
| schedule20.part5.line_205 | null \| string |  |
| schedule20.part5.line_206 | null \| string |  |
| schedule20.part5.line_207 | null \| string |  |
| schedule20.part5.line_208 | null \| string |  |
| schedule20.part5.line_210 | null \| string |  |
| schedule20.part5.line_211 | null \| string |  |
| schedule20.part5.line_212 | null \| string |  |
| schedule20.part5.line_213 | null \| string |  |
| schedule20.part5.line_214 | null \| string |  |
| schedule20.part5.line_215 | null \| string |  |
| schedule20.part5.line_216 | null \| string |  |
| schedule20.part5.line_217 | null \| string |  |
| schedule20.part5.line_218 | null \| string |  |
| schedule20.part5.line_219 | null \| string |  |
| schedule20.part5.line_221 | null \| string |  |
| schedule20.part5.line_222 | null \| string |  |
| schedule20.part5.line_223 | null \| string |  |
| schedule20.part6PeriodSeriesConfirmed | boolean \| null |  |
| schedule20.part6Periods | array |  |
| schedule20.part6Periods[].col_a_period_end | null \| string |  |
| schedule20.part6Periods[].col_b_bank_assets | null \| string |  |
| schedule20.part6Periods[].col_d_cost_amount | null \| string |  |
| schedule20.part6Periods[].col_e_liabilities | null \| string |  |
| schedule20.part6Periods[].col_f_branch_advances | null \| string |  |
| schedule20.part6Periods[].col_h_amount_claimed_s_20_2 | null \| string |  |
| schedule20.principalBusinessThroughoutYear | null \| string |  |
| schedule20.treatyContext | null \| object |  |
| schedule20.treatyContext.accumulatedEarningsExemptionConfirmed | boolean \| null |  |
| schedule20.treatyContext.agreementAppliesOnTaxYearEnd | boolean \| null |  |
| schedule20.treatyContext.agreementHasForceOfLawInCanada | boolean \| null |  |
| schedule20.treatyContext.country | null \| string |  |
| schedule20.treatyContext.firstTimePartXivFilerConfirmed | boolean \| null |  |
| schedule20.treatyContext.legalBasis | null \| string |  |
| schedule20.treatyContext.paragraph219_2aSatisfied | boolean \| null |  |
| schedule20.treatyContext.paragraph219_2bSatisfied | boolean \| null |  |
| schedule20.treatyContext.provision | null \| string |  |
| schedule20.treatyContext.treatyEntitlementConfirmed | boolean \| null |  |
| schedule20.treatyContext.verifiedAccumulatedEarningsExemptionLimit | null \| string |  |
| schedule20.treatyContext.verifiedBranchTaxRatePct | null \| string |  |
| schedule20.treatyRatePct | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year, tied to the inclusive fiscalStart-to-fiscalEnd span. 2024 is a leap year, so the exact witness period is 366 days.
- `fiscalEnd`: Last day of the taxation year. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this request's dependency closure computes are day-weighted, so the engine requires the stated period instead of assuming a calendar year.
- `fiscalStart`: First day of the taxation year, stated for the same reason as fiscalEnd.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule20.amountA`: Amount A — Taxable income earned in Canada (brought in from T2 line 360 / amount Z).
- `schedule20.amount_b_total_tax_payable`: Amount B, line 114 plus line 115, total federal plus provincial and territorial income tax payable, which the branch-tax calculation pro-rates at line 116. The engine computes it from lines 114 and 115.
- `schedule20.carryingOnBusinessInCanadaAtYearEnd`: ITA 219(1)(j): whether the corporation carried on business in Canada at the end of the taxation year. This is narrower than jacket box 220, which establishes the Schedule 20 attachment branch without stating the year-end test. Optional so legacy persisted blobs hydrate unanswered.
- `schedule20.ceasedAllOrSubstantiallyAllInsuranceBusinessInCanada`: Independent s.219(5.1) fact for a non-resident insurer. False is required before the s.219(4) no-tax route is available. True means the separate ceasing-business tax must be completed outside the current engine; null or absent is unanswered and blocks.
- `schedule20.exemptCorpType`: When set, the corp is exempt from Part XIV under s.219(2) and no other field is required. Mutually exclusive with all other fields.
- `schedule20.isAuthorizedForeignBank`: True when the corp is an authorized foreign bank (ITA s.218.2) — routes computation to Part 6 instead of Part 5.
- `schedule20.isFirstTimeFiler`: The filer's statement that this is the first taxation year subject to Part XIV branch tax. On its own it does not waive the prior-year line 510 and 112 openings: only a confirmed schedule20.treatyContext.firstTimePartXivFilerConfirmed selects the opening treatment, and an unconfirmed true raises s20_first_time_status_unproven.
- `schedule20.line_650`: 650 — Average of column K across periods. Computed.
- `schedule20.line_655`: 655 — Total Reg 808(8)(b) liabilities (excluding liabilities already in last-period col E).
- `schedule20.line_660`: 660 — Qualified AFB investments = max(0, 650 − 655). Computed.
- `schedule20.line_665`: 665 - Elective AFB allowance claim from nil through the computed ceiling; flows to line 118.
- `schedule20.part5.line_200`: 200 — Cost of land in Canada (excluding excluded land).
- `schedule20.part5.line_201`: 201 — Cost of depreciable property in Canada.
- `schedule20.part5.line_203`: 203 — Non-principal-business corp undeducted CEE.
- `schedule20.part5.line_204`: 204 — Cumulative CDE at YE less s.66.2(2) deduction.
- `schedule20.part5.line_205`: 205 — Cumulative COGPE at YE less s.66.4(2) deduction.
- `schedule20.part5.line_206`: 206 — Cost of debts receivable on lines 200/201 dispositions.
- `schedule20.part5.line_207`: 207 — Cost of inventory property (non-Canadian-resource).
- `schedule20.part5.line_208`: 208 — Cost of debts receivable / loans in lending business.
- `schedule20.part5.line_210`: 210 — Cash + short-term Canadian-arm's-length cost amounts.
- `schedule20.part5.line_211`: 211 — 4/3 × average monthly cost of line-210 property.
- `schedule20.part5.line_212`: 212 — Allowable liquid assets = min(210, 211). Computed.
- `schedule20.part5.line_213`: 213 — Subtotal of lines 200-212. Computed.
- `schedule20.part5.line_214`: 214 — Doubtful debts / guarantees / unpaid amounts reserve.
- `schedule20.part5.line_215`: 215 — Reserves for capital gains on line-206 debt.
- `schedule20.part5.line_216`: 216 — Amounts owing re acquisitions / expenses.
- `schedule20.part5.line_217`: 217 — Proportion of interest-bearing obligation × deductible-interest ratio.
- `schedule20.part5.line_218`: 218 — Unpaid federal Part I tax.
- `schedule20.part5.line_219`: 219 — Unpaid provincial / territorial income tax.
- `schedule20.part5.line_221`: 221 — Subtotal of lines 214-219. Computed.
- `schedule20.part5.line_222`: 222 — Qualified investments = max(0, 213 − 221). Computed.
- `schedule20.part5.line_223`: 223 - Elective allowance claim from nil through the computed ceiling; flows to line 118.
- `schedule20.part6PeriodSeriesConfirmed`: ITA 20.2(1): confirmation that Part 6 contains the complete calculation- period designation for the year and satisfies the prior-year consistency condition or a written Ministerial agreement. null = unanswered.
- `schedule20.part6Periods[].col_a_period_end`: Column A — Period end date (yyyy-mm-dd).
- `schedule20.part6Periods[].col_b_bank_assets`: Column B — Bank's assets at end of period.
- `schedule20.part6Periods[].col_d_cost_amount`: Column D — Cost amount at end of period.
- `schedule20.part6Periods[].col_e_liabilities`: Column E — Liabilities to other persons / partnerships at end.
- `schedule20.part6Periods[].col_f_branch_advances`: Column F — Branch advances at end.
- `schedule20.part6Periods[].col_h_amount_claimed_s_20_2`: Column H — Amount claimed under s.20.2(3)(b)(ii)(A) (≤ B − (C + G)).
- `schedule20.principalBusinessThroughoutYear`: The ITA 219(2)(b) principal-business finding, throughout the year. Not a CRA box, and not a mirror of `exemptCorpType`: subsection 219(2) exempts only a corporation whose principal business was, throughout the year, transportation, communications or mining iron ore in Canada, and the `exemptCorpType` dropdown is a routing label that proves neither the finding nor its persistence. null is unanswered and leaves Part XIV computed on the ordinary basis; it is never read as agreement with `exemptCorpType`.
- `schedule20.treatyContext`: NRES-A — the trusted evidence proving the line 500 claim and the rate G reduction. Not a CRA box: it is the practitioner's record of the treaty text and findings the engine gates on. null = no evidence, which keeps the 25% statutory rate and neutralizes a line 500 claim.
- `schedule20.treatyContext.accumulatedEarningsExemptionConfirmed`: Direct-treaty track only — the agreement grants an accumulated-earnings exemption (Canada-US Article X(6)(d)).
- `schedule20.treatyContext.agreementAppliesOnTaxYearEnd`: Relief is year-specific: the agreement must apply "on the last day of that year" (ITA 219.2).
- `schedule20.treatyContext.agreementHasForceOfLawInCanada`: ITA 219.2's opening words require an agreement "that has the force of law in Canada"; the direct-treaty track needs the same.
- `schedule20.treatyContext.country`: The other Contracting State.
- `schedule20.treatyContext.firstTimePartXivFilerConfirmed`: Explicit filing-history attestation. False is an answered "No"; null is unanswered and cannot open the first-year allowance.
- `schedule20.treatyContext.legalBasis`: Which of the two mutually exclusive tracks the relief rests on.
- `schedule20.treatyContext.paragraph219_2aSatisfied`: ITA 219.2(a) — the agreement "does not limit the rate of tax under this Part on corporations resident in that other country".
- `schedule20.treatyContext.paragraph219_2bSatisfied`: ITA 219.2(b) — the agreement "provides that, where a dividend is paid by a corporation resident in Canada to a corporation resident in that other country that owns all of the shares of the capital stock of the corporation resident in Canada, the rate of tax imposed on the dividend shall not exceed a specified rate".
- `schedule20.treatyContext.provision`: The operative provision, protocols included.
- `schedule20.treatyContext.treatyEntitlementConfirmed`: This corporation is entitled to the relief under that agreement.
- `schedule20.treatyContext.verifiedAccumulatedEarningsExemptionLimit`: The verified remaining exemption. Article X(6)(d) states "$500,000 ... less any amounts deducted by the company, or by an associated company with respect to the same or a similar business, under this subparagraph (d)" — a cumulative drawdown shared across associated companies, not a fresh annual amount, so this is a ceiling on the line 500 claim.
- `schedule20.treatyContext.verifiedBranchTaxRatePct`: The verified branch-tax rate as a decimal percent in [0, 25]. Governs; a disagreeing raw rate G blocks (`s20_treaty_rate_context_mismatch`).
- `schedule20.treatyRatePct`: Amount G — Treaty rate as decimal percent in [0, 25]. Default 25 (s.219(1)); override per s.219.2 treaty mechanism. COMPARISON-ONLY: `treatyContext.verifiedBranchTaxRatePct` governs, and a disagreement between the two blocks filing.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 90 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule20.amountA | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule20.exemptCorpType | one of "transportation", "communications", "iron_ore_mining", "s149_exempt", "insurance_not_electing" |
| schedule20.line_500 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule20.line_510 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule20.principalBusinessThroughoutYear | one of "transportation", "communications", "iron_ore_mining", "other" |
| schedule20.treatyContext.legalBasis | one of "direct_treaty", "section_219_2" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (97)

| Cell | Types |
| --- | --- |
| amount_a_taxable_income_earned_in_canada | string |
| amount_b_total_tax_payable | string |
| amount_c_purchaser_consideration_sum | string |
| amount_d_base_amount_with_additions | string |
| amount_e_deductions | string |
| amount_f_taxable_base | string |
| amount_g_tax_rate_decimal | string |
| amount_g_tax_rate_pct | string |
| amount_h_exemption_claimed | string |
| amount_l_part_6_column_k_total | string |
| exempt_corp_type | array \| boolean \| null \| number \| object \| string |
| fired_gates | object |
| flows_to_t2_jacket_line_728 | string |
| is_authorized_foreign_bank | boolean |
| line_099 | string |
| line_100 | string |
| line_101 | string |
| line_103 | string |
| line_104 | string |
| line_105 | string |
| line_106 | string |
| line_107 | string |
| line_108 | string |
| line_109 | string |
| line_110 | string |
| line_111 | string |
| line_112 | string |
| line_113 | string |
| line_114 | string |
| line_115 | string |
| line_116 | string |
| line_117 | string |
| line_118 | string |
| line_120 | string |
| line_121 | string |
| line_122 | string |
| line_123 | string |
| line_124 | string |
| line_125 | string |
| line_126 | string |
| line_223 | string |
| line_500 | string |
| line_510 | string |
| line_520 | string |
| line_665 | string |
| part5_projection.line_200 | string |
| part5_projection.line_201 | string |
| part5_projection.line_203 | string |
| part5_projection.line_204 | string |
| part5_projection.line_205 | string |
| part5_projection.line_206 | string |
| part5_projection.line_207 | string |
| part5_projection.line_208 | string |
| part5_projection.line_210 | string |
| part5_projection.line_211 | string |
| part5_projection.line_212 | string |
| part5_projection.line_213 | string |
| part5_projection.line_214 | string |
| part5_projection.line_215 | string |
| part5_projection.line_216 | string |
| part5_projection.line_217 | string |
| part5_projection.line_218 | string |
| part5_projection.line_219 | string |
| part5_projection.line_221 | string |
| part5_projection.line_222 | string |
| part5_projection.line_223 | string |
| part6_projection.amount_l_part_6_column_k_total | string |
| part6_projection.line_650 | string |
| part6_projection.line_655 | string |
| part6_projection.line_660 | string |
| part6_projection.line_665 | string |
| part6_projection.periods | array |
| part_xiv_tax_payable | string |
| provisional | boolean |
| ready | boolean |
| warnings[].box | string |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].code | string |
| warnings[].gate_id | array \| boolean \| null \| number \| object \| string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].actual | number |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |

### Output cell notes

- `warnings[].box`: The printed line the reconciliation is about.
- `warnings[].citation.display`: The citation as it is shown to a preparer.
- `warnings[].citation.kind`: The authority family the section belongs to.
- `warnings[].citation.section`: The cited provision.
- `warnings[].code`: Which continuity obligation this row is about.
- `warnings[].gate_id`: Always null: the obligation is cited to its authority, not to a registered form gate.
- `warnings[].message`: The preparer-facing statement of the break.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule21

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s21_2025_synthetic_federal_fnbi_credit_v1
- Payload schema version: 0.10.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule21"
  ],
  "inputs": {
    "accounts": [
      {
        "accountCode": "4000",
        "accountName": "Cedar Ridge foreign-source revenue",
        "classification": {
          "assumption": "Synthetic exact contract witness only",
          "deductibility": "100%",
          "deductibilityPercentage": 100,
          "schedule1Relevant": false,
          "treatment": "no_adjustment"
        },
        "currentYearBalance": -500000,
        "id": "s21-income",
        "reviewStatus": "default",
        "userStatus": "default"
      }
    ],
    "combinedAdjustments": {},
    "incomeStatementFlags": {
      "s21-income": true
    },
    "schedule21": {
      "isAuthorizedForeignBank": false,
      "line6aNetIncomeForTaxPurposes": 500000,
      "line6bNetCapitalLossesClaimed": 0,
      "line6cS112_113DividendsDeductible": 0,
      "line6dS20_12Deductions": 0,
      "line6gOtherAdjustments": 0,
      "line7aBaseT2Line550": 190000,
      "line7bAbatementT2Line608": 0,
      "line7cInvCorpDeductionT2Line620": 0,
      "line7dGeneralTaxReductionT2Line639": 0,
      "line7fRecaptureITCT2Line602": 0,
      "line7gCCPCRefundableTaxInvIncomeT2Line604": 0,
      "part1Rows": [
        {
          "col1b_netForeignNonBusinessIncome": 50000,
          "col1c_foreignNonBusinessTaxPaid": 20000,
          "col1d_s20_12Deduction": 0,
          "foreignAffiliateShareIncome": "No",
          "s126_4TaxCreditGeneratorApplies": false,
          "s126_4_1NoEconomicProfitApplies": false,
          "s126_4_11PartnershipMismatchApplies": false,
          "s126_4_2ShortTermSecurityCapApplies": false,
          "country": "US"
        }
      ],
      "part2Rows": [],
      "part3Rows": [],
      "part4Rows": [],
      "part9Rows": [],
      "line6gS110_5AddBack": 0
    },
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "workpapers": [],
    "isCCPC": true,
    "t2Jacket": {
      "identification": {
        "isResidentOfCanada": true
      },
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    }
  }
}
```

## Input cells (145)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.adjustmentType | null \| string |  |
| accounts[].classification.assumption | string | strict |
| accounts[].classification.deductibility | string | strict |
| accounts[].classification.deductibilityPercentage | integer \| null \| number \| string | strict |
| accounts[].classification.deductibilityRule | string |  |
| accounts[].classification.ruleId | null \| string |  |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].classification.templateId | null \| string |  |
| accounts[].classification.treatment | string | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| combinedAdjustments | object | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.s21-income | boolean | strict |
| isCCPC | boolean |  |
| schedule21 | null \| object |  |
| schedule21.canadianBankingBusinessReview | null \| object |  |
| schedule21.canadianBankingBusinessReview.businessCarriedOnThroughCanadianPe | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.businessConductedThroughRepresentativeOffice | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.isAuthorizedForeignBank | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.line300IncomeRestrictedToCanadianBankingBusiness | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.measureRestrictedToCanadianBankingBusiness | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts | null \| object |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.controlledSubsidiaryOnly | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.employeeOrAgentEstablishedAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.fixedPlaceJurisdiction | null \| string |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.generalContractingAuthorityAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.hasFixedPlaceOfBusiness | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.independentAgentOnly | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.insurerRegisteredOrLicensedJurisdictions | array |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.isInsurer | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.personOwnedStockAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.principalPlaceOfBusinessAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.purchaseOnlyOfficeOnly | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.regularlyFillsOrdersFromStockAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.substantialMachineryOrEquipmentUsedAtTarget | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.treatyExists | boolean \| null |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.treatyPermanentEstablishmentArticle | null \| string |  |
| schedule21.canadianBankingBusinessReview.reg8201Facts.treatyPermanentEstablishmentConclusion | boolean \| null |  |
| schedule21.isAuthorizedForeignBank | boolean \| null | strict |
| schedule21.isCCPC | boolean \| null |  |
| schedule21.line6aNetIncomeForTaxPurposes | null \| number | strict |
| schedule21.line6bNetCapitalLossesClaimed | null \| number | strict |
| schedule21.line6cS112_113DividendsDeductible | null \| number | strict |
| schedule21.line6dProspectorGrubstakerShares | null \| number |  |
| schedule21.line6dS20_12Deductions | integer | strict |
| schedule21.line6eEmployerDeductionNQSecurities | null \| number |  |
| schedule21.line6gOtherAdjustments | integer | strict |
| schedule21.line6gS110_5AddBack | null \| number | strict |
| schedule21.line6iTaxableIncomeInCanada | null \| number |  |
| schedule21.line6jCanadianBankingIncome | null \| number |  |
| schedule21.line6kS115AddBack | null \| number |  |
| schedule21.line7aBaseT2Line550 | null \| number | strict |
| schedule21.line7bAbatementT2Line608 | null \| number | strict |
| schedule21.line7cInvCorpDeductionT2Line620 | null \| number | strict |
| schedule21.line7dGeneralTaxReductionT2Line639 | null \| number | strict |
| schedule21.line7fAdditionalTaxPSBT2Line560 | null \| number |  |
| schedule21.line7fRecaptureITCT2Line602 | null \| number | strict |
| schedule21.line7gAdditionalTaxBanksLifeT2Line565 | null \| number |  |
| schedule21.line7gCCPCRefundableTaxInvIncomeT2Line604 | null \| number | strict |
| schedule21.line7hLabourRequirementsAdditionT2Line580 | null \| number |  |
| schedule21.line8aBaseT2Line550 | null \| number |  |
| schedule21.line8bInvCorpDeductionT2Line620 | null \| number |  |
| schedule21.line8cCCPCGeneralTaxReductionT2Line638 | null \| number |  |
| schedule21.line8dGeneralTaxReductionT2Line639 | null \| number |  |
| schedule21.line8fAdditionalTaxPSBT2Line560 | null \| number |  |
| schedule21.line8fRecaptureITCT2Line602 | null \| number |  |
| schedule21.line8gAdditionalTaxBanksLifeT2Line565 | null \| number |  |
| schedule21.line8hLabourRequirementsAdditionT2Line580 | null \| number |  |
| schedule21.part1Rows | array |  |
| schedule21.part1Rows[].claimedAmountOverride | null \| number \| string |  |
| schedule21.part1Rows[].col1b_netForeignNonBusinessIncome | integer \| null \| number \| object | strict |
| schedule21.part1Rows[].col1c_foreignNonBusinessTaxPaid | integer \| null \| number | strict |
| schedule21.part1Rows[].col1d_s20_12Deduction | integer \| null \| number | strict |
| schedule21.part1Rows[].country | null \| string | strict |
| schedule21.part1Rows[].foreignAffiliateShareIncome | null \| string | strict |
| schedule21.part1Rows[].s126_4TaxCreditGeneratorApplies | boolean \| null | strict |
| schedule21.part1Rows[].s126_4_11PartnershipMismatchApplies | boolean \| null | strict |
| schedule21.part1Rows[].s126_4_1NoEconomicProfitApplies | boolean \| null | strict |
| schedule21.part1Rows[].s126_4_2ShortTermSecurityCapApplies | boolean \| null | strict |
| schedule21.part1Rows[].s126_4_3ShortTermSecurityCapExceptionApplies | boolean |  |
| schedule21.part2Rows | array |  |
| schedule21.part2Rows[].claimedAmountOverride | null \| number |  |
| schedule21.part2Rows[].col2b_netForeignBusinessIncome | number | strict |
| schedule21.part2Rows[].col2c_foreignBusinessTaxPaid | number | strict |
| schedule21.part2Rows[].col2d_unusedFTCPreviousYears | number | strict |
| schedule21.part2Rows[].country | string | strict |
| schedule21.part2Rows[].s126_4TaxCreditGeneratorApplies | boolean | strict |
| schedule21.part2Rows[].s126_4_11PartnershipMismatchApplies | boolean | strict |
| schedule21.part2Rows[].s126_4_1NoEconomicProfitApplies | boolean | strict |
| schedule21.part2Rows[].s126_4_2ShortTermSecurityCapApplies | boolean | strict |
| schedule21.part2Rows[].s126_4_3ShortTermSecurityCapExceptionApplies | boolean |  |
| schedule21.part3Rows | array |  |
| schedule21.part3Rows[].col3l_originYearBreakdown | array \| null |  |
| schedule21.part3Rows[].col3l_originYearBreakdown[].amount | null \| number |  |
| schedule21.part3Rows[].col3l_originYearBreakdown[].originYear | null \| number |  |
| schedule21.part3Rows[].col3l_originYearBreakdown[].originYearEnd | null \| string |  |
| schedule21.part3Rows[].col3l_priorYearClosingBalance | null \| number |  |
| schedule21.part3Rows[].col3m_amountExpiredInYear | null \| number |  |
| schedule21.part3Rows[].col3o_amalgamationOrWindupTransfer | null \| number |  |
| schedule21.part3Rows[].col3o_originYearBreakdown | array \| null |  |
| schedule21.part3Rows[].col3o_originYearBreakdown[].amount | null \| number |  |
| schedule21.part3Rows[].col3o_originYearBreakdown[].originYear | null \| number |  |
| schedule21.part3Rows[].col3o_originYearBreakdown[].originYearEnd | null \| string |  |
| schedule21.part3Rows[].col3p_currentYearTaxPaidOverride | null \| number |  |
| schedule21.part3Rows[].col3q_currentYearCreditDeductedOverride | null \| number |  |
| schedule21.part3Rows[].country | string |  |
| schedule21.part4Rows | array |  |
| schedule21.part4Rows[].col4u_unusedFTCOverride | null \| number |  |
| schedule21.part4Rows[].col4v_carrybackPrev1 | null \| number |  |
| schedule21.part4Rows[].col4w_carrybackPrev2 | null \| number |  |
| schedule21.part4Rows[].col4x_carrybackPrev3 | null \| number |  |
| schedule21.part4Rows[].country | string |  |
| schedule21.part4Rows[].targetYearEvidence | array \| null |  |
| schedule21.part4Rows[].targetYearEvidence[].carriedOnBusinessInCountry | boolean \| null |  |
| schedule21.part4Rows[].targetYearEvidence[].s126_2AmountAlreadyDeducted | null \| number |  |
| schedule21.part4Rows[].targetYearEvidence[].s126_2_bLimitForCountry | null \| number |  |
| schedule21.part4Rows[].targetYearEvidence[].s126_2_cTaxRemainingAfterS126_1 | null \| number |  |
| schedule21.part4Rows[].targetYearEvidence[].targetYearOffset | integer |  |
| schedule21.part4Rows[].targetYearEvidence[].taxationYearEnd | null \| string |  |
| schedule21.part5BcIncomeFromLogging | null \| number |  |
| schedule21.part5BcLoggingTaxPaid | null \| number |  |
| schedule21.part5OtherProvinces | array \| null |  |
| schedule21.part5QcIncomeFromLogging | null \| number |  |
| schedule21.part5QcLoggingTaxPaid | null \| number |  |
| schedule21.part5TaxableIncomeOverride | null \| number |  |
| schedule21.part9Rows | array |  |
| schedule21.part9Rows[].country | string |  |
| schedule21.part9Rows[].province | string |  |
| schedule21.part9Rows[].provinceTaxableIncomeAllocationOverride | null \| number |  |
| schedule21.part9Rows[].provincialTaxRate | null \| number |  |
| schedule21.part9TaxableIncomeOutsideCanadaOverride | null \| number \| string |  |
| schedule21.part9TotalTaxableIncomeOverride | null \| number |  |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| taxYear | integer \| string | always |
| workpapers[] | boolean \| null \| number \| string | strict |

### Input cell notes

- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `incomeStatementFlags.s21-income`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule21`: Schedule 21 practitioner-input blob. The completed batch result is rebuilt after Schedule 5 so all consumers see the same allocation and post-Division-C taxable-income inputs.
- `schedule21.canadianBankingBusinessReview.measureRestrictedToCanadianBankingBusiness`: Consumer-specific confirmations; only the owning schedule reads the relevant member.
- `schedule21.isAuthorizedForeignBank`: The filer is an authorized foreign bank; the T2 SCH 21 header admits corporations resident in Canada and authorized foreign banks, and the s.20(12) deduction feed is withheld until one status is established.
- `schedule21.isCCPC`: Whether the corporation was a Canadian-controlled private corporation, used only as one signal in the Schedule 21 CCPC inference when the T2 jacket corporation type is absent. The jacket answer governs when it is supplied.
- `schedule21.line6aNetIncomeForTaxPurposes`: Cell 6A — T2 line 300 NIFTP. Auto-fills from S1.taxableIncome (Filemark S1 names this field 'taxableIncome' but its semantic is Division B net income for tax purposes per the validator).
- `schedule21.line6bNetCapitalLossesClaimed`: Cell 6B — T2 line 332 net capital losses claimed under s.111(1)(b).
- `schedule21.line6cS112_113DividendsDeductible`: Cell 6C — Taxable dividends deductible under ss.112/113. Auto-fills from S3.totalTaxableDividendsDeductible (future wiring).
- `schedule21.line6dProspectorGrubstakerShares`: Cell 6D — T2 line 350 prospector / grubstaker shares.
- `schedule21.line6eEmployerDeductionNQSecurities`: Cell 6E — employer deduction for non-qualified securities (line 352).
- `schedule21.line6gS110_5AddBack`: Part 6 cell 6H, the ITA s.110.5 addition carried from T2 line 355. The sweep made a blank cell blocking; the witness states an explicit nil.
- `schedule21.line7aBaseT2Line550`: Cell 7A — T2 line 550 base Part I tax. Auto-fills from part_i_tax.baseTax (future wiring).
- `schedule21.line7bAbatementT2Line608`: Cell 7B — T2 line 608 federal tax abatement.
- `schedule21.line7cInvCorpDeductionT2Line620`: Cell 7C — T2 line 620 investment corporation deduction.
- `schedule21.line7dGeneralTaxReductionT2Line639`: Cell 7D — T2 line 639 general tax reduction.
- `schedule21.line7fAdditionalTaxPSBT2Line560`: Cells 7F-7H — rev-26 tax add-backs from T2 lines 560/565/580.
- `schedule21.line7fRecaptureITCT2Line602`: Cell 7I — T2 line 602 recapture of ITC.
- `schedule21.line7gCCPCRefundableTaxInvIncomeT2Line604`: Cell 7J — T2 line 604 refundable tax on CCPC investment income (s.123.3 ART).
- `schedule21.line8aBaseT2Line550`: Cells 8A/8B/8D/8F/8G/8H/8I default to matching Part 7 sources if left null. Cell 8C is the CCPC-specific general tax reduction (T2 line 638) — a SEPARATE deduction from 8D.
- `schedule21.line8fAdditionalTaxPSBT2Line560`: Cells 8F-8H — explicit overrides; null inherits the matching Part 7 value.
- `schedule21.part1Rows[].s126_4TaxCreditGeneratorApplies`: ITA s.126(4) foreign-tax-credit-generator exclusion. Mandatory Yes/No: the engine computes no exclusion, so an unanswered fact refuses Column 1C rather than reading as No.
- `schedule21.part1Rows[].s126_4_3ShortTermSecurityCapExceptionApplies`: ITA s.126(4.3) exception, demanded only when s126_4_2ShortTermSecurityCapApplies is true. Optional here because this witness answers the cap fact No.
- `schedule21.part2Rows[].s126_4TaxCreditGeneratorApplies`: ITA s.126(4) foreign-tax-credit-generator exclusion.
- `schedule21.part2Rows[].s126_4_11PartnershipMismatchApplies`: ITA s.126(4.11) partnership-allocation exclusion.
- `schedule21.part2Rows[].s126_4_1NoEconomicProfitApplies`: ITA s.126(4.1) no-economic-profit exclusion.
- `schedule21.part2Rows[].s126_4_2ShortTermSecurityCapApplies`: ITA s.126(4.2) short-term-security cap.
- `schedule21.part2Rows[].s126_4_3ShortTermSecurityCapExceptionApplies`: ITA s.126(4.3) exception, demanded only when s126_4_2ShortTermSecurityCapApplies is true.
- `schedule21.part3Rows[].col3l_originYearBreakdown`: Column 3L origin-year attribution. ITA 126(2)(a) counts TAXATION years ("the 10 taxation years immediately preceding") and s.126(7) defines the unused foreign tax credit FOR A TAXATION YEAR, so a positive Column 3L opening must be attributed to the years it arose in before any of it can be claimed — the engine holds an unvintaged positive pool. `null` / omitted = no attribution supplied.
- `schedule21.part3Rows[].col3l_priorYearClosingBalance`: Column 3L — Balance at end of previous tax year. Auto-fills from PY S21 Part 3 Column 3S.
- `schedule21.part3Rows[].col3m_amountExpiredInYear`: Column 3M — Amount expired in the year (10-year window per s.111(8) "unused foreign tax credit"). Practitioner-managed today; per-origination-year tracking is a future enhancement.
- `schedule21.part3Rows[].col3o_amalgamationOrWindupTransfer`: Column 3O — Credits transferred via amalgamation (s.87(2.2)) or wind-up of subsidiary (s.88(1.5)).
- `schedule21.part3Rows[].col3o_originYearBreakdown`: Column 3O origin-year attribution — the SECOND arrival route into the Part 3 opening. A succession transfer-in under s.87(2)(z) / s.88(1)(e.7) keeps the predecessor's vintages: s.126(2)(a)'s ten-year clock runs from the year the credit AROSE, not the year of the amalgamation, so a transferred pool needs its own attribution exactly as Column 3L does.
- `schedule21.part3Rows[].col3p_currentYearTaxPaidOverride`: Optional override of Column 3P (CY tax paid). When null, engine auto-pulls from Part 2 Column 2C for the same country.
- `schedule21.part3Rows[].col3q_currentYearCreditDeductedOverride`: Optional override of Column 3Q (CY credit deducted). When null, the engine auto-pulls Part 2 Column 2J for the same country — the printed least-of (2E / 2H / 2I), NOT the amount the corporation elected to claim. s.126(7) "unused foreign tax credit" measures the pool against the amount that "was deductible", so a lesser election does not bank the difference.
- `schedule21.part4Rows[].col4u_unusedFTCOverride`: Column 4U override — by default the engine computes 3P - 3Q for the same country. Override is for cases where the practitioner is restating a prior carryback request.
- `schedule21.part4Rows[].col4v_carrybackPrev1`: Column 4V — Carryback to 1st previous tax year.
- `schedule21.part4Rows[].col4w_carrybackPrev2`: Column 4W — Carryback to 2nd previous tax year.
- `schedule21.part4Rows[].col4x_carrybackPrev3`: Column 4X — Carryback to 3rd previous tax year.
- `schedule21.part4Rows[].targetYearEvidence`: The target-year facts backing every requested column, one entry per target year. A request without its entry is accepted at $0.00 and blocks the filing; the boxes 901-903 the engine files are the ACCEPTED amounts, not the raw request. Two rows for one country concatenate into one list, so a repeated `targetYearOffset` is a contradiction.
- `schedule21.part4Rows[].targetYearEvidence[].carriedOnBusinessInCountry`: Did the corporation carry on business in this country in that year? Only boolean `true` answers it: s.126(2) is available to "a taxpayer who was resident in Canada at any time in a taxation year" in respect of the "business-income tax paid ... in respect of businesses carried on by the taxpayer in that country", so with no business there the target year can absorb nothing. Unanswered blocks; it is never read as a Yes.
- `schedule21.part4Rows[].targetYearEvidence[].s126_2AmountAlreadyDeducted`: Amount already deducted under s.126(2) against that year for this country (s.126(2.3)(c)). Enter 0 where none: it is subtracted from both the (b) and (c) limbs, so a blank is not nil.
- `schedule21.part4Rows[].targetYearEvidence[].s126_2_bLimitForCountry`: The target year's s.126(2)(b) limit for this country.
- `schedule21.part4Rows[].targetYearEvidence[].s126_2_cTaxRemainingAfterS126_1`: The target year's Part I tax remaining after its s.126(1) credits — the s.126(2)(c) operand. s.126(2.3)(a) applies the s.126(1) credits first, which is why the room is measured after them.
- `schedule21.part4Rows[].targetYearEvidence[].targetYearOffset`: Which preceding taxation year this entry describes: 1 = first preceding (Column 4V, box 901), 2 = second (4W, box 902), 3 = third (4X, box 903). Two entries naming the same offset is a contradiction and blocks.
- `schedule21.part4Rows[].targetYearEvidence[].taxationYearEnd`: ISO YYYY-MM-DD end of that target taxation year. It must equal the Nth preceding year end in the corporation's own taxation-year chain; a calendar-year label is not the unit of account.
- `schedule21.part5OtherProvinces`: Logging-tax claims for provinces other than British Columbia and Quebec, as rows of province, incomeFromLogging and loggingTaxPaid. The form has no lines for them: any row only raises a warning that only BC and Quebec impose a tax declared under Regulation 700(3), and the amounts never enter the credit.
- `schedule21.part5TaxableIncomeOverride`: Explicit POST-DIVISION-C taxable income for the line 5H cap (used by non-residents per the form parenthetical). When null, the engine pulls from Schedule 5 line-360 taxable income. Schedule 1 net income and Part 6 adjusted net income are pre-Division-C DISPLAY proxies only: with a live logging credit (5G > 0) neither is a value source, and the engine withholds the credit rather than over-stating the ITA s.127(1) cap.
- `schedule21.part9Rows[].country`: Two-letter country code matching a Part 1 row.
- `schedule21.part9Rows[].province`: Two-letter province/territory code (ON, BC, AB, SK, MB, QC, NB, NS, PE, NL, YT, NT, NU).
- `schedule21.part9Rows[].provinceTaxableIncomeAllocationOverride`: Optional override of the province's allocated taxable income. When null, engine pulls from Schedule 5 Part 1 column F.
- `schedule21.part9Rows[].provincialTaxRate`: Provincial corporate tax rate to apply in cell 9H. Per Note 9: for all provinces except Ontario use the HIGHER tax rate (general corporate rate, not M&P or SBD). For Ontario use the basic rate from Schedule 500 Part 1. Mid-year rate change → days-weighted average. Accepts ratio (0.115) or percent (11.5).
- `schedule21.part9TaxableIncomeOutsideCanadaOverride`: Taxable income earned outside Canada, the amount excluded from the Part 9 amount 9F denominator per T2 SCH 21 note 8. Send it only when no Schedule 5 result is available; with a Schedule 5 present a differing value is reported as a conflict, and a negative value is rejected and reset to zero.
- `schedule21.part9TotalTaxableIncomeOverride`: Optional override for the total taxable income (Part 9 ratio denominator). When null, the engine pulls T2 line 360 from Schedule 5 or Division C; pre-Division-C Schedule 1 / Part 6 amounts are never substituted.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (60 of 145 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.adjustmentType | 0 to 20000 characters |
| accounts[].classification.assumption | 0 to 20000 characters |
| accounts[].classification.deductibility | 0 to 20000 characters |
| accounts[].classification.deductibilityPercentage | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| accounts[].classification.deductibilityRule | 0 to 20000 characters |
| accounts[].classification.ruleId | 0 to 20000 characters |
| accounts[].classification.templateId | 0 to 20000 characters |
| accounts[].classification.treatment | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule21.line6aNetIncomeForTaxPurposes | -1000000000000000 to 1000000000000000 |
| schedule21.line6bNetCapitalLossesClaimed | -1000000000000000 to 1000000000000000 |
| schedule21.line6cS112_113DividendsDeductible | -1000000000000000 to 1000000000000000 |
| schedule21.line6dS20_12Deductions | -1000000000000000 to 1000000000000000 |
| schedule21.line6gOtherAdjustments | -1000000000000000 to 1000000000000000 |
| schedule21.line6gS110_5AddBack | -1000000000000000 to 1000000000000000 |
| schedule21.line7aBaseT2Line550 | -1000000000000000 to 1000000000000000 |
| schedule21.line7bAbatementT2Line608 | -1000000000000000 to 1000000000000000 |
| schedule21.line7cInvCorpDeductionT2Line620 | -1000000000000000 to 1000000000000000 |
| schedule21.line7dGeneralTaxReductionT2Line639 | -1000000000000000 to 1000000000000000 |
| schedule21.line7fRecaptureITCT2Line602 | -1000000000000000 to 1000000000000000 |
| schedule21.line7gCCPCRefundableTaxInvIncomeT2Line604 | -1000000000000000 to 1000000000000000 |
| schedule21.part1Rows[].claimedAmountOverride | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule21.part1Rows[].col1b_netForeignNonBusinessIncome | -1000000000000000 to 1000000000000000 |
| schedule21.part1Rows[].col1c_foreignNonBusinessTaxPaid | -1000000000000000 to 1000000000000000 |
| schedule21.part1Rows[].col1d_s20_12Deduction | -1000000000000000 to 1000000000000000 |
| schedule21.part1Rows[].country | 0 to 20000 characters |
| schedule21.part1Rows[].foreignAffiliateShareIncome | 0 to 20000 characters |
| schedule21.part2Rows[].claimedAmountOverride | -1000000000000000 to 1000000000000000 |
| schedule21.part2Rows[].col2b_netForeignBusinessIncome | -1000000000000000 to 1000000000000000 |
| schedule21.part2Rows[].col2c_foreignBusinessTaxPaid | -1000000000000000 to 1000000000000000 |
| schedule21.part2Rows[].col2d_unusedFTCPreviousYears | -1000000000000000 to 1000000000000000 |
| schedule21.part2Rows[].country | 0 to 20000 characters |
| schedule21.part3Rows[].col3l_originYearBreakdown[].originYearEnd | 0 to 20000 characters |
| schedule21.part3Rows[].col3l_priorYearClosingBalance | -1000000000000000 to 1000000000000000 |
| schedule21.part3Rows[].col3m_amountExpiredInYear | -1000000000000000 to 1000000000000000 |
| schedule21.part3Rows[].col3o_amalgamationOrWindupTransfer | -1000000000000000 to 1000000000000000 |
| schedule21.part3Rows[].col3o_originYearBreakdown[].originYearEnd | 0 to 20000 characters |
| schedule21.part3Rows[].col3p_currentYearTaxPaidOverride | -1000000000000000 to 1000000000000000 |
| schedule21.part3Rows[].col3q_currentYearCreditDeductedOverride | -1000000000000000 to 1000000000000000 |
| schedule21.part3Rows[].country | 0 to 20000 characters |
| schedule21.part4Rows[].col4u_unusedFTCOverride | -1000000000000000 to 1000000000000000 |
| schedule21.part4Rows[].col4v_carrybackPrev1 | -1000000000000000 to 1000000000000000 |
| schedule21.part4Rows[].col4w_carrybackPrev2 | -1000000000000000 to 1000000000000000 |
| schedule21.part4Rows[].col4x_carrybackPrev3 | -1000000000000000 to 1000000000000000 |
| schedule21.part4Rows[].country | 0 to 20000 characters |
| schedule21.part4Rows[].targetYearEvidence[].taxationYearEnd | 0 to 20000 characters |
| schedule21.part9Rows[].country | 0 to 20000 characters |
| schedule21.part9Rows[].province | 0 to 20000 characters |
| schedule21.part9Rows[].provinceTaxableIncomeAllocationOverride | -1000000000000000 to 1000000000000000 |
| schedule21.part9Rows[].provincialTaxRate | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |
| workpapers[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |

## Output cells (149)

| Cell | Types |
| --- | --- |
| batch_refinement.partITaxApplied | boolean |
| batch_refinement.phase | string |
| batch_refinement.s1FeedStable | boolean |
| batch_refinement.schedule1Applied | boolean |
| batch_refinement.schedule3Applied | boolean |
| batch_refinement.schedule4Applied | boolean |
| batch_refinement.schedule5Applied | boolean |
| federal_fbi_credit_total | number |
| federal_fnbi_credit_total | number |
| federal_logging_tax_credit | number |
| fired_gates | object |
| isAuthorizedForeignBank | boolean |
| line_100 | string |
| line_110 | number |
| line_120 | number |
| line_130 | number |
| line_180 | number |
| line_200 | string |
| line_210 | number |
| line_220 | number |
| line_230 | number |
| line_280 | number |
| line_345 | string |
| line_348 | number |
| line_350 | number |
| line_360 | number |
| line_380 | number |
| line_500 | number |
| line_510 | number |
| line_520 | number |
| line_530 | number |
| line_580 | number |
| line_600 | number |
| line_610 | number |
| line_620 | number |
| line_900 | string |
| line_901 | number |
| line_902 | number |
| line_903 | number |
| part_1_rows[].claimed_amount | number |
| part_1_rows[].col_1b | number |
| part_1_rows[].col_1c | number |
| part_1_rows[].col_1d | number |
| part_1_rows[].col_1e | number |
| part_1_rows[].col_1f | number |
| part_1_rows[].col_1g | number |
| part_1_rows[].col_1h | number |
| part_1_rows[].col_1i | number |
| part_1_rows[].country | string |
| part_2_rows | array |
| part_3_rows | array |
| part_4_rows | array |
| part_5_rows | array |
| part_6.line_600 | number |
| part_6.val_6a | number |
| part_6.val_6b | number |
| part_6.val_6c | number |
| part_6.val_6d | number |
| part_6.val_6e | number |
| part_6.val_6f | number |
| part_6.val_6g | number |
| part_6.val_6h | number |
| part_6.val_6i | number |
| part_6.val_6j | number |
| part_6.val_6k | number |
| part_6.val_6l | number |
| part_6.val_6m | number |
| part_6.val_6n | number |
| part_7.line_610 | number |
| part_7.val_7a | number |
| part_7.val_7b | number |
| part_7.val_7c | number |
| part_7.val_7d | number |
| part_7.val_7e | number |
| part_7.val_7f | number |
| part_7.val_7g | number |
| part_7.val_7h | number |
| part_7.val_7i | number |
| part_7.val_7j | number |
| part_7.val_7k | number |
| part_8.line_620 | number |
| part_8.val_8a | number |
| part_8.val_8b | number |
| part_8.val_8c | number |
| part_8.val_8d | number |
| part_8.val_8e | number |
| part_8.val_8f | number |
| part_8.val_8g | number |
| part_8.val_8h | number |
| part_8.val_8i | number |
| part_8.val_8j | number |
| part_9_rows | array |
| provincial_ftc_application.appliedToProvincialTax | boolean |
| provincial_ftc_application.appliedToSchedule5 | boolean |
| provincial_ftc_application.calculatedTotal | number |
| provincial_ftc_application.reason | array \| boolean \| null \| number \| object \| string |
| provincial_ftc_application.status | string |
| provincial_ftc_totals_by_prov | object |
| provisional | boolean |
| ready | boolean |
| s1_feed_s20_12_deduction | number |
| s1_feed_s20_12_deduction_by_country | array |
| val_5g | number |
| val_5h | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].producer | string |
| warnings[].target | string |
| warnings[].manualValue | number |
| warnings[].canonicalValue | number |
| warnings[].amount | number |
| canadianBankingBusinessDetermination | array \| boolean \| null \| number \| object \| string |
| federal_fbi_credit_total_without_s123_4 | number |
| federal_fnbi_credit_total_without_s123_3_and_s123_4 | number |
| part_7_without_s123_3_and_s123_4.line_610 | number |
| part_7_without_s123_3_and_s123_4.val_7a | number |
| part_7_without_s123_3_and_s123_4.val_7b | number |
| part_7_without_s123_3_and_s123_4.val_7c | number |
| part_7_without_s123_3_and_s123_4.val_7d | number |
| part_7_without_s123_3_and_s123_4.val_7e | number |
| part_7_without_s123_3_and_s123_4.val_7f | number |
| part_7_without_s123_3_and_s123_4.val_7g | number |
| part_7_without_s123_3_and_s123_4.val_7h | number |
| part_7_without_s123_3_and_s123_4.val_7i | number |
| part_7_without_s123_3_and_s123_4.val_7j | number |
| part_7_without_s123_3_and_s123_4.val_7k | number |
| part_8_without_s123_4.line_620 | number |
| part_8_without_s123_4.val_8a | number |
| part_8_without_s123_4.val_8b | number |
| part_8_without_s123_4.val_8c | number |
| part_8_without_s123_4.val_8d | number |
| part_8_without_s123_4.val_8e | number |
| part_8_without_s123_4.val_8f | number |
| part_8_without_s123_4.val_8g | number |
| part_8_without_s123_4.val_8h | number |
| part_8_without_s123_4.val_8i | number |
| part_8_without_s123_4.val_8j | number |

# schedule23

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s23_2025_two_code1_cad_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): schedule28

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule23"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule23": {
      "calendarYear": 2025,
      "isAmendedAgreement": false,
      "rows": [
        {
          "name": "Cedar Ridge Manufacturing Inc.",
          "businessNumber": "123456782RC0001",
          "associationCode": 1,
          "businessLimitBeforeAllocation": 500000,
          "percentageOfBusinessLimit": 60,
          "businessLimitAllocated": 300000
        },
        {
          "name": "Birchline Tools Ltd.",
          "businessNumber": "222222226RC0001",
          "associationCode": 1,
          "businessLimitBeforeAllocation": 500000,
          "percentageOfBusinessLimit": 40,
          "businessLimitAllocated": 200000
        }
      ]
    }
  }
}
```

## Input cells (17)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule23.calendarYear | null \| number | strict |
| schedule23.isAmendedAgreement | boolean \| null | strict |
| schedule23.rows | array |  |
| schedule23.rows[].associationCode | integer \| null \| object | strict |
| schedule23.rows[].businessLimitAllocated | null \| number |  |
| schedule23.rows[].businessLimitBeforeAllocation | null \| number | strict |
| schedule23.rows[].businessNumber | null \| string | strict |
| schedule23.rows[].name | null \| string | strict |
| schedule23.rows[].percentageOfBusinessLimit | null \| number | strict |
| schedule23.rows[].thirdCorporationBusinessNumber | null \| string |  |
| schedule23.thirdCorporationSchedule28Elections | array |  |
| schedule23.thirdCorporationSchedule28Elections[].businessNumber | null \| string |  |
| schedule23.thirdCorporationSchedule28Elections[].coveredCorporationBusinessNumbers | array |  |
| schedule23.thirdCorporationSchedule28Elections[].electionTaxYearEnd | null \| string |  |
| schedule23.thirdCorporationSchedule28Elections[].electionTaxYearStart | null \| string |  |
| schedule23.thirdCorporationSchedule28Elections[].filedSchedule28Confirmed | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule23.calendarYear`: Box 050, the calendar year the agreement applies to. The engine's own sanity range; it must also equal the calendar year in which the return's tax year ends, which the engine reconciles rather than the boundary.
- `schedule23.isAmendedAgreement`: Box 075. Either answer is admitted. True asserts only the submitted JSON value; it is not evidence that an original agreement exists, was filed, or was accepted.
- `schedule23.rows`: Rows of associated corporations in the group. Practitioner adds one row per corporation (including the filing corp itself). Empty rows are elided by the backend.
- `schedule23.rows[].associationCode`: Column 3, box 300. Codes 1 (associated for the allocation), 3 (non-CCPC third corporation) and 4 (associated non-CCPC). Codes 2 and 5 are excluded: both are defined by a third corporation having FILED the Schedule 28 election under ITA subparagraph 256(2)(b)(ii), this payload has no field able to evidence that filing, and the engine therefore fails them closed unconditionally. Codes 3 and 4 require column 4 to be 0 and take no percentage.
- `schedule23.rows[].businessLimitAllocated`: Column 6, box 400. Optional: supply the explicit amount, or omit the key (or send null) to take the engine's computed column 4 x column 5 / 100 substitution, which raises the advisory box_400_blank_uses_computed_value warning on a code-1 row. A supplied value that disagrees with the computation is admitted and answered by box_400_equals_column_4_times_column_5.
- `schedule23.rows[].businessLimitBeforeAllocation`: Column 4, Filemark-synthetic box 320. Nonnegative amount capped at the ITA s.125(2) federal business-limit baseline. Code 1 must equal that pre-allocation baseline (box_320_code_1_equals_federal_baseline); amounts above it fire box_320_business_limit_at_most_federal_limit. Must be 0 for codes 2, 3, and 4 per the printed column instruction.
- `schedule23.rows[].businessNumber`: Column 2, box 200. Either the CRA 15-character program account (9 digits + 2 uppercase letters + 4 digits) or the 'NR' sentinel for an unregistered corporation. Syntactic only: no checksum, registration, identity, CCPC-status, or association claim. Repeating a registered number across rows is admitted and answered by the engine's duplicate_registered_business_number gate.
- `schedule23.rows[].name`: Column 1, box 100. Free corporation label; not a legal-name or identity assertion and not verified against any registry.
- `schedule23.rows[].percentageOfBusinessLimit`: Column 5, box 350, in percent units. Only code-1 rows may carry a non-zero percentage, and the column-5 total across rows must not exceed 100; both are engine gates rather than boundary rejections.
- `schedule23.rows[].thirdCorporationBusinessNumber`: Filemark evidence for a code-5 row using the automatic s.256(2)(b)(i) branch: the code-3 non-CCPC third corporation that is common to the filer and this row. Not a printed Schedule 23 column.
- `schedule23.thirdCorporationSchedule28Elections`: ITA 256(2)(b)(ii) evidence for association codes 2/5. OPTIONAL: blobs persisted before this capture surface existed do not carry the key, and an absent key is not an empty answer — the S23 code-2/5 gate keeps blocking until evidence is entered.
- `schedule23.thirdCorporationSchedule28Elections[].businessNumber`: The ELECTING third corporation's business number — nine-digit root or the full 15-character program account. "NR" is not accepted: it cannot identify which corporation elected.
- `schedule23.thirdCorporationSchedule28Elections[].coveredCorporationBusinessNumbers`: Business numbers of the corporations enumerated on that filed Schedule 28. At least two distinct registered BN roots are required; the electing third corporation itself is not one of them. An empty list is unanswered and contributes no evidence.
- `schedule23.thirdCorporationSchedule28Elections[].electionTaxYearEnd`: The taxation year end the third corporation's Schedule 28 election was filed for (ISO YYYY-MM-DD). ITA 256(2)(b)(ii) requires the election to be made "in its taxation year that includes the particular time", so this is bound to the filer's period by the backend.
- `schedule23.thirdCorporationSchedule28Elections[].electionTaxYearStart`: Start of the third corporation's election taxation year (ISO YYYY-MM-DD). Together with the end, this proves actual period overlap.
- `schedule23.thirdCorporationSchedule28Elections[].filedSchedule28Confirmed`: Explicit confirmation that the election was FILED. null = unanswered. Anything other than true contributes no evidence — never a silent affirmative.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (8 of 17 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule23.calendarYear | 2019 to 2099 |
| schedule23.rows[].associationCode | one of 1, 3, 4 |
| schedule23.rows[].businessLimitAllocated | 0 to 500000 |
| schedule23.rows[].businessLimitBeforeAllocation | 0 to 500000 |
| schedule23.rows[].businessNumber | matches ^(NR\|[0-9]{9}[A-Z]{2}[0-9]{4})$; 0 to 20000 characters |
| schedule23.rows[].name | 1 to 2000 characters |
| schedule23.rows[].percentageOfBusinessLimit | 0 to 100 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (32)

| Cell | Types |
| --- | --- |
| calendar_year | integer \| null |
| is_amended_agreement | boolean \| null |
| rows[].associationCode | integer \| null |
| rows[].businessLimitAllocated | number |
| rows[].businessLimitBeforeAllocation | number |
| rows[].businessNumber | null \| string |
| rows[].name | null \| string |
| rows[].percentageOfBusinessLimit | number |
| rows[].thirdCorporationBusinessNumber | array \| boolean \| null \| number \| object \| string |
| total_allocated | string |
| total_percentage | string |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| section125NotAssociatedBnRoots | array |

### Output cell notes

- `total_allocated`: Line A, returned as a decimal string.
- `total_percentage`: Returned as a decimal string.

# schedule24

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s24_versioned_profile_target_value_v1
- Payload schema version: 0.3.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule24"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule24": {
      "filingTriggers": [
        "incorporation"
      ],
      "operationCode": "01",
      "predecessors": [],
      "subsidiaries": []
    }
  }
}
```

## Input cells (15)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule24.filingTriggers | array |  |
| schedule24.filingTriggers[] | string | strict |
| schedule24.operationCode | null \| string | strict |
| schedule24.predecessors | array |  |
| schedule24.predecessors[].businessNumber | null \| string |  |
| schedule24.predecessors[].name | null \| string |  |
| schedule24.subsidiaries | array |  |
| schedule24.subsidiaries[].assetDistributionCompletedInThatYear | boolean \| null |  |
| schedule24.subsidiaries[].assetsDistributedTaxationYearEnd | null \| string |  |
| schedule24.subsidiaries[].businessNumber | null \| string |  |
| schedule24.subsidiaries[].commencementDate | null \| string |  |
| schedule24.subsidiaries[].name | null \| string |  |
| schedule24.subsidiaries[].qualifiesUnderSection88_1 | boolean \| null |  |
| schedule24.subsidiaries[].windUpDate | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule24.filingTriggers`: Which trigger(s) caused this S24 to be filed. May contain multiple values for the (rare) case where the corporation experienced more than one trigger in its first tax year. Empty array = practitioner has opened the form but not yet selected a trigger (incomplete).
- `schedule24.operationCode`: One box 100 operation-type code printed on T2 SCH 24 E (23). The schema validates only membership in the printed list, not the corporation's actual operation type.
- `schedule24.predecessors`: Part 2 predecessor rows. Empty array is valid when filingTriggers does NOT include "amalgamation"; otherwise at least one row with both name and BN is required.
- `schedule24.predecessors[].businessNumber`: Box 300 — Business number (9 digits + 2 uppercase letters + 4 digits, e.g. "123456789RC0001"), or "NR" if the predecessor was never CRA-registered (typically a foreign-amalgamation predecessor).
- `schedule24.predecessors[].name`: Box 200 — Name of predecessor corporation.
- `schedule24.subsidiaries`: Part 3 subsidiary rows. Empty array is valid when filingTriggers does NOT include "windup"; otherwise at least one fully-populated row is required.
- `schedule24.subsidiaries[].assetDistributionCompletedInThatYear`: Filemark-internal, non-printed tri-state. Reviewed affirmation that the winding-up distribution was completed in the taxation year ending on assetsDistributedTaxationYearEnd. Only true lets the matching filed subsidiary period authenticate a predecessor closing or RDTOH transfer.
- `schedule24.subsidiaries[].assetsDistributedTaxationYearEnd`: Filemark-internal, non-printed. End date of the subsidiary taxation year in which its assets were distributed to the parent on the winding-up (ISO YYYY-MM-DD). ITA s.88(1)(e.2)(v) substitutes that year, and box 700 is only the date of wind-up, so this fact is collected separately. Null stays unanswered.
- `schedule24.subsidiaries[].businessNumber`: Box 500 — Business number (same format as box 300, or "NR").
- `schedule24.subsidiaries[].commencementDate`: Box 600 — Commencement date of wind-up (ISO YYYY-MM-DD). Typically the board resolution / shareholder approval date.
- `schedule24.subsidiaries[].name`: Box 400 — Name of subsidiary corporation.
- `schedule24.subsidiaries[].qualifiesUnderSection88_1`: Filemark-internal, non-printed tri-state. Schedule 24 proves the event roster but not the taxable-Canadian-corporation, 90%-of-each-class, and arm's-length-minority conditions in the ITA s.88(1) chapeau. Pool continuity remains blocked until this reviewed conclusion is answered.
- `schedule24.subsidiaries[].windUpDate`: Box 700 — Date of wind-up (ISO YYYY-MM-DD). This is not the date the subsidiary's assets were distributed. Must be ≥ commencementDate per the validator's date-order gate.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 15 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule24.filingTriggers[] | 0 to 20000 characters |
| schedule24.operationCode | one of "01", "02", "03", "04", "05", "06", "07", "09", "10", "11", "12", "13", "14", "15", "16", "17", "99" |
| schedule24.predecessors[].businessNumber | 0 to 20000 characters |
| schedule24.predecessors[].name | 0 to 20000 characters |
| schedule24.subsidiaries[].assetsDistributedTaxationYearEnd | 0 to 20000 characters |
| schedule24.subsidiaries[].businessNumber | 0 to 20000 characters |
| schedule24.subsidiaries[].commencementDate | 0 to 20000 characters |
| schedule24.subsidiaries[].name | 0 to 20000 characters |
| schedule24.subsidiaries[].windUpDate | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (46)

| Cell | Types |
| --- | --- |
| filing_triggers[] | string |
| operation_code | null \| string |
| predecessors | array |
| subsidiaries | array |
| warnings | array |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].citation.display | string |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| predecessors[].name | null \| string |
| predecessors[].businessNumber | null \| string |
| subsidiaries[].name | null \| string |
| subsidiaries[].businessNumber | null \| string |
| subsidiaries[].commencementDate | null \| string |
| subsidiaries[].windUpDate | null \| string |
| subsidiaries[].qualifiesUnderSection88_1 | boolean \| null |
| subsidiaries[].assetsDistributedTaxationYearEnd | null \| string |
| subsidiaries[].assetDistributionCompletedInThatYear | boolean \| null |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].box_form | string |
| warnings[].sources[] | string |
| warnings[].taxYears[] | integer |

### Output cell notes

- `operation_code`: Box 100, the type of operation. Null when the request does not state it, which is itself one of the gated conditions.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier. At least one member is what selects this branch.
- `warnings[].box`: The form box the finding is about, or the em dash the engine prints when the gate is about the form rather than one box.
- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule25

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: s25_versioned_profile_target_value_v1
- Payload schema version: 0.10.0
- Dependencies (run automatically): foreign_affiliate_analysis

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule25"
  ],
  "inputs": {
    "taxYear": 2025,
    "t2Jacket": {
      "identification": {
        "isResidentOfCanada": true
      }
    },
    "schedule25": {
      "hasForeignAffiliates": true,
      "isNonResidentOwnedInvestmentCorp": false,
      "section212_3ForeignAffiliateInvestmentMade": false,
      "affiliateRows": [
        {
          "affiliateName": "Cedar Ridge USA Holdings Inc.",
          "equityPercentHeld": 10,
          "controlStatus": 2
        }
      ]
    }
  }
}
```

## Input cells (11)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule25.affiliateRows | array |  |
| schedule25.affiliateRows[].affiliateName | null \| string | strict |
| schedule25.affiliateRows[].controlStatus | null \| number | strict |
| schedule25.affiliateRows[].equityPercentHeld | null \| number | strict |
| schedule25.affiliateRows[].relatedPersonsAggregateEquityPercent | null \| number |  |
| schedule25.hasForeignAffiliates | boolean \| null | strict |
| schedule25.isNonResidentOwnedInvestmentCorp | boolean \| null | strict |
| schedule25.section212_3ForeignAffiliateInvestmentMade | boolean \| null |  |
| schedule25.section212_3NonResidentControlAtInvestment | boolean \| null |  |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule25.affiliateRows[].affiliateName`: A single-line name with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a legal-name check, or proof of foreign-affiliate status.
- `schedule25.affiliateRows[].controlStatus`: Exact submitted printed option 2 for this branch. It is not a legal determination that the entity is an 'other' rather than controlled foreign affiliate.
- `schedule25.affiliateRows[].equityPercentHeld`: The equity percentage, pinned to one exact value by this profile. The form prints 'Equity % held' without stating which statutory measurement applies, so the value you send does not establish that measurement or its accuracy.
- `schedule25.affiliateRows[].relatedPersonsAggregateEquityPercent`: Practitioner-stated total of the equity percentages in this affiliate held by the corporation plus each related person — limb (b) of the s.95(1) "foreign affiliate" definition, which requires that total to be not less than 10%. Not a printed CRA column. Only consulted when `equityPercentHeld` is at least 1% and below 10%, the band where classification turns entirely on related persons; at 10% or more the corporation's own holding satisfies limb (b) by itself. In that band an unanswered or below-10% total draws a review warning, never a block.
- `schedule25.hasForeignAffiliates`: Submitted true branch flag only; it does not establish that the named entity satisfies the Income Tax Act foreign-affiliate definition.
- `schedule25.isNonResidentOwnedInvestmentCorp`: This candidate excludes the non-resident-owned investment corporation branch and requires the submitted value false; it does not independently determine that status.
- `schedule25.section212_3ForeignAffiliateInvestmentMade`: Explicit false answer to the ITA 212.3 foreign-affiliate-investment question required when the affiliate roster is open. The engine keeps omission fail-closed.
- `schedule25.section212_3NonResidentControlAtInvestment`: ITA 212.3(1)(b): was the investing Canadian corporation, or the relevant other Canadian corporation, under non-resident control?
- `t2Jacket.identification.isResidentOfCanada`: T2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 11 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule25.affiliateRows[].affiliateName | matches ^\S(?:[^\r\n\u000b\u000c\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule25.affiliateRows[].controlStatus | -1000000000000000 to 1000000000000000 |
| schedule25.affiliateRows[].equityPercentHeld | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (145)

| Cell | Types |
| --- | --- |
| line_100 | null \| string |
| line_200 | null \| number |
| line_300 | integer \| null |
| affiliateRows[].affiliateId | null \| string |
| affiliateRows[].affiliateName | null \| string |
| affiliateRows[].equityPercentHeld | null \| number |
| affiliateRows[].controlStatus | integer \| null |
| affiliate_count | integer |
| controlledAffiliates | array |
| box_300_code_1_count | integer |
| controlled_affiliate_count | integer |
| other_affiliate_count | integer |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings | array |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| missing_required | array |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| warnings[].code | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[] | object |
| controlledAffiliates[].affiliateId | null \| string |
| controlledAffiliates[].affiliateName | null \| string |
| controlledAffiliates[].equityPercentHeld | null \| number |
| controlledAffiliates[].controlStatus | integer \| null |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].anchor_row | string |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.applies_to_boxes[] | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.cra_text_verbatim | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.form_id | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.form_revision | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.gate_id | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.rule | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.source | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.source_url | string |
| fired_gates.filing_trigger_owns_foreign_affiliate.verified_at | string |
| fired_gates.nroic_exemption_regime_repealed.applies_to_boxes[] | string |
| fired_gates.nroic_exemption_regime_repealed.cra_text_verbatim | string |
| fired_gates.nroic_exemption_regime_repealed.form_id | string |
| fired_gates.nroic_exemption_regime_repealed.form_revision | string |
| fired_gates.nroic_exemption_regime_repealed.gate_id | string |
| fired_gates.nroic_exemption_regime_repealed.rule | string |
| fired_gates.nroic_exemption_regime_repealed.source | string |
| fired_gates.nroic_exemption_regime_repealed.source_url | string |
| fired_gates.nroic_exemption_regime_repealed.verified_at | string |
| fired_gates.box_100_affiliate_name_required.applies_to_boxes[] | string |
| fired_gates.box_100_affiliate_name_required.cra_text_verbatim | string |
| fired_gates.box_100_affiliate_name_required.form_id | string |
| fired_gates.box_100_affiliate_name_required.form_revision | string |
| fired_gates.box_100_affiliate_name_required.gate_id | string |
| fired_gates.box_100_affiliate_name_required.rule | string |
| fired_gates.box_100_affiliate_name_required.source | string |
| fired_gates.box_100_affiliate_name_required.source_url | string |
| fired_gates.box_100_affiliate_name_required.verified_at | string |
| fired_gates.box_200_equity_percentage_definition.applies_to_boxes[] | string |
| fired_gates.box_200_equity_percentage_definition.cra_text_verbatim | string |
| fired_gates.box_200_equity_percentage_definition.form_id | string |
| fired_gates.box_200_equity_percentage_definition.form_revision | string |
| fired_gates.box_200_equity_percentage_definition.gate_id | string |
| fired_gates.box_200_equity_percentage_definition.rule | string |
| fired_gates.box_200_equity_percentage_definition.source | string |
| fired_gates.box_200_equity_percentage_definition.source_url | string |
| fired_gates.box_200_equity_percentage_definition.verified_at | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.applies_to_boxes[] | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.cra_text_verbatim | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.form_id | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.form_revision | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.gate_id | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.rule | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.source | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.source_url | string |
| fired_gates.box_300_controlled_means_s95_1_cfa.verified_at | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.applies_to_boxes[] | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.cra_text_verbatim | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.form_id | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.form_revision | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.gate_id | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.rule | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.source | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.source_url | string |
| fired_gates.cross_link_s91_1_fapi_inclusion.verified_at | string |
| fired_gates.cross_link_t1134_filing_required.applies_to_boxes[] | string |
| fired_gates.cross_link_t1134_filing_required.cra_text_verbatim | string |
| fired_gates.cross_link_t1134_filing_required.form_id | string |
| fired_gates.cross_link_t1134_filing_required.form_revision | string |
| fired_gates.cross_link_t1134_filing_required.gate_id | string |
| fired_gates.cross_link_t1134_filing_required.rule | string |
| fired_gates.cross_link_t1134_filing_required.source | string |
| fired_gates.cross_link_t1134_filing_required.source_url | string |
| fired_gates.cross_link_t1134_filing_required.verified_at | string |
| fired_gates.cross_link_s130_part2m_cfa_table.applies_to_boxes[] | string |
| fired_gates.cross_link_s130_part2m_cfa_table.cra_text_verbatim | string |
| fired_gates.cross_link_s130_part2m_cfa_table.form_id | string |
| fired_gates.cross_link_s130_part2m_cfa_table.form_revision | string |
| fired_gates.cross_link_s130_part2m_cfa_table.gate_id | string |
| fired_gates.cross_link_s130_part2m_cfa_table.rule | string |
| fired_gates.cross_link_s130_part2m_cfa_table.source | string |
| fired_gates.cross_link_s130_part2m_cfa_table.source_url | string |
| fired_gates.cross_link_s130_part2m_cfa_table.verified_at | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.applies_to_boxes[] | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.cra_text_verbatim | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.form_id | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.form_revision | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.gate_id | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.rule | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.source | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.source_url | string |
| fired_gates.form_capacity_21_rows_supplementary_attach.verified_at | string |
| fired_gates.consistency_has_affiliates_implies_rows.applies_to_boxes[] | string |
| fired_gates.consistency_has_affiliates_implies_rows.cra_text_verbatim | string |
| fired_gates.consistency_has_affiliates_implies_rows.form_id | string |
| fired_gates.consistency_has_affiliates_implies_rows.form_revision | string |
| fired_gates.consistency_has_affiliates_implies_rows.gate_id | string |
| fired_gates.consistency_has_affiliates_implies_rows.rule | string |
| fired_gates.consistency_has_affiliates_implies_rows.source | string |
| fired_gates.consistency_has_affiliates_implies_rows.source_url | string |
| fired_gates.consistency_has_affiliates_implies_rows.verified_at | string |
| missing_required[] | string |

### Output cell notes

- `line_100`: The single-line name you submitted, echoed back. It is not a legal-name check or proof of foreign-affiliate status.
- `line_200`: Exact current projection of the admitted submitted numeric value; it is not proof of the statutory measurement or accuracy of box 200.
- `line_300`: Exact current projection of submitted printed option 2; it is not a legal classification determination.
- `affiliateRows[].affiliateId`: Per-affiliate reconciliation key. Taken from the row's persisted key when the Schedule 25 blob carries one, and otherwise from the whitespace-collapsed upper-cased submitted name. It is a positional identity for the Schedule 1 ITA 91(1) reconciliation, not legal-name validation and not proof of foreign-affiliate status.
- `affiliateRows[].affiliateName`: The single-line name you submitted, echoed back. It is not a legal-name check or proof of foreign-affiliate status.
- `controlledAffiliates`: The CONTROLLED subset of the roster, published so Schedule 1 can reconcile its ITA 91(1) inclusion rows affiliate by affiliate instead of comparing two counts. Empty on this branch, whose single row is controlStatus 2 ("Other"). Emission does not classify any affiliate as controlled and is not proof of positive FAPI or a participating percentage.
- `box_300_code_1_count`: Mechanical count of submitted box-300 code 1 selections on the roster. It is a projection of the submitted printed option, not a Filemark determination of either s.95(1) control arm. Zero on this branch, whose single row is controlStatus 2 ("Other").
- `controlled_affiliate_count`: Legacy wire alias of box_300_code_1_count, retained additively for existing integrations.
- `warnings`: The findings for this branch: a non-blocking T1134 review note, an error-severity T2 box 169 reconciliation (a populated roster and a box 169 answer that is not Yes cannot both be right), and a non-blocking T2 box 271 reconciliation warning. No entry establishes T1134 completeness, relief, deadline or penalty treatment, and none answers a jacket box on the filer's behalf.
- `fired_gates`: Exact current metadata emitted by the five gates fired for this narrow branch. Emission records branch execution and source context; it does not prove the submitted legal facts or filing completeness.
- `provisional`: The branch carries an error-severity finding (the T2 box 169 reconciliation), which the current engine reports as provisional. Provisional records that a blocking finding is open, not that any submitted fact was disproved.
- `ready`: False on this branch. The request answers no T2 jacket applicability box, so box 169 is unanswered while the roster is populated, and the engine blocks on that contradiction. True would mean only that this branch produced no blocking result for the values sent.
- `warnings[].anchor_row`: The per-row navigation anchor the affiliate-roster findings carry, `s25-affiliate-<row index>`.

# schedule27

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s27_single_reg5201_profile_target_value_v2
- Payload schema version: 0.8.0
- Dependencies (run automatically): division_c, sbd, schedule21, schedule7, schedule8, t661

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule27"
  ],
  "inputs": {
    "taxYear": 2025,
    "corpType": "1",
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "accounts": [
      {
        "id": "revenue",
        "accountCode": "4000",
        "accountName": "Cedar Ridge active business revenue",
        "accountType": "revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "incomeType": "active",
          "foreignSource": false
        }
      }
    ],
    "incomeStatementFlags": {
      "revenue": true
    },
    "specifiedCorporateIncomeReviewed": true,
    "supplementalLinesReviewed": true,
    "specifiedPartnershipIncomeApplies": false,
    "specifiedInvestmentBusinessIncome": 0,
    "lifeInsurancePolicyIncome": 0,
    "priorYearGroupTCEC": 0,
    "priorYearGroupTCECMeta": {
      "basis": "standalone_preceding_tax_year",
      "asOf": "2024-12-31",
      "source": "prior filed T2",
      "confirmed": true
    },
    "schedule27": {
      "line100ActiveBusinessIncomeNetOfLoss": 100000,
      "line105AssociatedCorpsABI": 0,
      "mpGrossRevenueRatio": 1,
      "primarilyMPInCanada": true,
      "hasActiveBusinessOutsideCanada": false,
      "hasExcludedActivityS125_1_3_a_to_k": false,
      "hasForeignOreProcessingNotBeyondPrescribedStage": false,
      "hasResourceActivitiesReg5203": false
    },
    "daysInYear": 365,
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterAmalgamation": false,
        "firstYearAfterIncorporation": true,
        "subsidiaryWindupS88": false
      }
    },
    "associatedGroupAII": 0
  }
}
```

## Input cells (90)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].accountType | string | strict |
| accounts[].classification.foreignSource | boolean | strict |
| accounts[].classification.incomeType | string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| associatedGroupAII | integer \| null \| number |  |
| corpType | string | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.revenue | boolean | strict |
| lifeInsurancePolicyIncome | integer | strict |
| priorYearGroupTCEC | integer | strict |
| priorYearGroupTCECMeta.asOf | string | strict |
| priorYearGroupTCECMeta.basis | string | strict |
| priorYearGroupTCECMeta.confirmed | boolean | strict |
| priorYearGroupTCECMeta.source | string | strict |
| schedule27.amount11BPortionDirectlyInQualifiedActivitiesIncludingElecSteam | null \| number |  |
| schedule27.amount12ASalariesWagesInQualifiedActivitiesIncludingElecSteam | null \| number |  |
| schedule27.amount12BNonEmployeeInQualifiedActivitiesIncludingElecSteam | null \| number |  |
| schedule27.amount16AZETMSalariesWagesDirectlyInZETM | null \| number |  |
| schedule27.amount16BZETMNonEmployeeInZETM | null \| number |  |
| schedule27.amount305ZETMCostOfCapitalMCB | null \| number |  |
| schedule27.amount3BNetResourceAdjustmentReg5203_3_1 | null \| number |  |
| schedule27.amount3DRefundInterestReg5203_4 | null \| number |  |
| schedule27.amount4ADepreciableScheduleII | null \| number |  |
| schedule27.amount4BTimberLimitsAndCuttingRights | null \| number |  |
| schedule27.amount4CImmovableWoodAssetsClass15 | null \| number |  |
| schedule27.amount4DIndustrialMineralMines | null \| number |  |
| schedule27.amount4ESREDCapitalExpenditures | null \| number |  |
| schedule27.amount4FPartXVIIProperty | null \| number |  |
| schedule27.amount4HRentalCostForPropertyUse | null \| number |  |
| schedule27.amount4IPartnershipShareOfCC | null \| number |  |
| schedule27.amount5BPortionDirectlyInQualifiedActivities | null \| number |  |
| schedule27.amount6ASalariesWagesEmployees | null \| number |  |
| schedule27.amount6BIncludedInGrossCostOfProperty | null \| number |  |
| schedule27.amount6CRelatedToOutsideCanadaAB | null \| number |  |
| schedule27.amount6DRelatedToCdnResourceProfits | null \| number |  |
| schedule27.amount6EIncludedInCEDEFEDE | null \| number |  |
| schedule27.amount6HPartnershipShareEmployeeNet | null \| number |  |
| schedule27.amount6JManagementAdminNonEmployee | null \| number |  |
| schedule27.amount6KSREDNonEmployee | null \| number |  |
| schedule27.amount6LServiceFunctionNonEmployee | null \| number |  |
| schedule27.amount6NIncludedInGrossCostOfPropertyNE | null \| number |  |
| schedule27.amount6ORelatedToOutsideCanadaABNE | null \| number |  |
| schedule27.amount6PRelatedToCdnResourceProfitsNE | null \| number |  |
| schedule27.amount6QIncludedInCEDEFEDENE | null \| number |  |
| schedule27.amount6TPartnershipShareNonEmployeeNet | null \| number |  |
| schedule27.amount7ASalariesWagesInQualifiedActivities | null \| number |  |
| schedule27.amount7BNonEmployeeInQualifiedActivities | null \| number |  |
| schedule27.amount8AResourceProfitsReg1204 | null \| number |  |
| schedule27.amount8BSection59IncomeNotInResourceProfits | null \| number |  |
| schedule27.amount8DSection65DeductionsNotAgainstResourceProfits | null \| number |  |
| schedule27.amount8EIncomeFromForeignOreProcessing | null \| number |  |
| schedule27.claimingElectricalSteamPath | boolean \| null |  |
| schedule27.claimingPart9MainPath | boolean \| null |  |
| schedule27.claimingZETMDeduction | boolean \| null |  |
| schedule27.costOfCapitalReflectsReg5203And5204Exclusions | boolean \| null |  |
| schedule27.excludedActivityParagraphs | array |  |
| schedule27.hasActiveBusinessOutsideCanada | boolean \| null | strict |
| schedule27.hasExcludedActivityS125_1_3_a_to_k | boolean \| null | strict |
| schedule27.hasForeignOreProcessingNotBeyondPrescribedStage | boolean \| null | strict |
| schedule27.hasResourceActivitiesReg5203 | boolean \| null | strict |
| schedule27.includesEmployerCPP_EI | boolean \| null |  |
| schedule27.line100ActiveBusinessIncomeNetOfLoss | null \| number | strict |
| schedule27.line105AssociatedCorpsABI | null \| number | strict |
| schedule27.line120ActiveBusinessIncomeNetOfLoss | null \| number |  |
| schedule27.mpGrossRevenueRatio | null \| number | strict |
| schedule27.onlyGeneratedOrProducedElectricalEnergyOrSteamForSaleInSaskatchewan | boolean \| null |  |
| schedule27.primarilyMPInCanada | boolean \| null | strict |
| schedule27.primarilyMPRatio | null \| number |  |
| schedule27.schedule404 | null \| object |  |
| schedule27.schedule404.amount1EFromSchedule411 | null \| number |  |
| schedule27.uccDepreciableScheduleII | null \| number \| string |  |
| schedule27.zetmAllocationReflectsDirectUse | boolean \| null |  |
| schedule27.zetmQualifiedActivityClauses | array |  |
| schedule27.zetm_deduction_claimed | boolean \| null |  |
| specifiedCorporateIncomeReviewed | boolean | strict |
| specifiedInvestmentBusinessIncome | integer | strict |
| specifiedPartnershipIncomeApplies | boolean | strict |
| supplementalLinesReviewed | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `accounts[].classification.foreignSource`: The account's income is foreign source; schedules that split Canadian from foreign amounts route it accordingly, for example Schedule 7's foreign property and rental buckets and line 500 foreign business income.
- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `associatedGroupAII`: ITA s.125(5.1)(b): the adjusted aggregate investment income of the corporation and every associated corporation for taxation years that ended in the PRECEDING calendar year. It can never be derived from current-year amounts, so Schedule 7 holds the business-limit grind until it is stated; zero is a valid answer and is what this witness states.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `incomeStatementFlags.revenue`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `lifeInsurancePolicyIncome`: TXE-319: ITA s.125(7)(c)(ii), in the 'adjusted aggregate investment income' definition, includes amounts in respect of a life insurance policy that are included in income; the engine reads the amount as an explicit off-form statutory fact. Zero pins this witness's branch.
- `priorYearGroupTCECMeta.confirmed`: Confirms the associated group's prior-year taxable capital employed in Canada figure, the operand of the ITA s.125(5.1) business-limit reduction.
- `schedule27.amount11BPortionDirectlyInQualifiedActivitiesIncludingElecSteam`: Amount 11B — the part of C used directly in qualified activities INCLUDING generating electrical energy / producing steam. Must be the SUPERSET of amount 5B, not the elec/steam carve-out.
- `schedule27.amount12ASalariesWagesInQualifiedActivitiesIncludingElecSteam`: Amount 12A — employee salaries and wages in qualified activities INCLUDING elec/steam. Superset of amount 7A.
- `schedule27.amount12BNonEmployeeInQualifiedActivitiesIncludingElecSteam`: Amount 12B — non-employee payments in qualified activities INCLUDING elec/steam. Superset of amount 7B.
- `schedule27.amount16AZETMSalariesWagesDirectlyInZETM`: Amount 16A — employee salaries and wages for services directly engaged in qualified ZETM activities.
- `schedule27.amount16BZETMNonEmployeeInZETM`: Amount 16B — non-employee payments for functions directly related to qualified ZETM activities. 306 (MLB) = 16A + 16B.
- `schedule27.amount305ZETMCostOfCapitalMCB`: Box 305 — ZETM cost of capital (MCB): the part of C (line 140) used directly in qualified ZETM activities. Capped at C.
- `schedule27.amount3BNetResourceAdjustmentReg5203_3_1`: Amount 3B — net resource adjustment, Reg 5203(3.1).
- `schedule27.amount3DRefundInterestReg5203_4`: Amount 3D — refund interest, Reg 5203(4).
- `schedule27.amount4ADepreciableScheduleII`: Amount 4A — GROSS COST (not UCC) of owned depreciable property under Schedule II.
- `schedule27.amount4BTimberLimitsAndCuttingRights`: Amount 4B — timber limits and cutting rights.
- `schedule27.amount4CImmovableWoodAssetsClass15`: Amount 4C — immovable wood assets (Class 15).
- `schedule27.amount4DIndustrialMineralMines`: Amount 4D — industrial mineral mines.
- `schedule27.amount4ESREDCapitalExpenditures`: Amount 4E — SR&ED capital expenditures.
- `schedule27.amount4FPartXVIIProperty`: Amount 4F — Part XVII property.
- `schedule27.amount4HRentalCostForPropertyUse`: Amount 4H — rental cost incurred for the use of property whose gross cost would be included above if owned. Aggregated in FULL (no 10%).
- `schedule27.amount4IPartnershipShareOfCC`: Amount 4I — partnership share of cost of capital.
- `schedule27.amount5BPortionDirectlyInQualifiedActivities`: Amount 5B — the part of C reflecting the extent of direct use in Reg 5202 qualified activities. Engine applies 100/85, capped at C.
- `schedule27.amount6ASalariesWagesEmployees`: Amount 6A — salaries and wages paid or payable to employees.
- `schedule27.amount6BIncludedInGrossCostOfProperty`: Amount 6B — portion included in gross cost of property (Part 4).
- `schedule27.amount6CRelatedToOutsideCanadaAB`: Amount 6C — portion related to active business outside Canada.
- `schedule27.amount6DRelatedToCdnResourceProfits`: Amount 6D — portion related to Canadian resource profits.
- `schedule27.amount6EIncludedInCEDEFEDE`: Amount 6E — portion included in CEDE / FEDE / CEE / CDE.
- `schedule27.amount6HPartnershipShareEmployeeNet`: Amount 6H — partnership share, employee arm, net of exclusions.
- `schedule27.amount6JManagementAdminNonEmployee`: Amount 6J — non-employee management and administration amounts.
- `schedule27.amount6KSREDNonEmployee`: Amount 6K — non-employee SR&ED amounts.
- `schedule27.amount6LServiceFunctionNonEmployee`: Amount 6L — non-employee amounts for a service or function that would normally be performed by an employee.
- `schedule27.amount6NIncludedInGrossCostOfPropertyNE`: Amount 6N — non-employee portion included in gross cost of property.
- `schedule27.amount6ORelatedToOutsideCanadaABNE`: Amount 6O — non-employee portion related to outside-Canada business.
- `schedule27.amount6PRelatedToCdnResourceProfitsNE`: Amount 6P — non-employee portion related to Cdn resource profits.
- `schedule27.amount6QIncludedInCEDEFEDENE`: Amount 6Q — non-employee portion included in CEDE / FEDE.
- `schedule27.amount6TPartnershipShareNonEmployeeNet`: Amount 6T — partnership share, non-employee arm, net of exclusions.
- `schedule27.amount7ASalariesWagesInQualifiedActivities`: Amount 7A — part of salaries and wages (included in 6I) for employees directly engaged in qualified activities.
- `schedule27.amount7BNonEmployeeInQualifiedActivities`: Amount 7B — part of other payments (included in 6U) to non-employees for functions directly related to qualified activities.
- `schedule27.amount8AResourceProfitsReg1204`: Amount 8A — resource profits, Reg 1204.
- `schedule27.amount8BSection59IncomeNotInResourceProfits`: Amount 8B — s.59 income not included in resource profits.
- `schedule27.amount8DSection65DeductionsNotAgainstResourceProfits`: Amount 8D — s.65 deductions not applied against resource profits.
- `schedule27.amount8EIncomeFromForeignOreProcessing`: Amount 8E — income from processing foreign ore.
- `schedule27.claimingElectricalSteamPath`: Claiming the parallel deduction on profits from generating electrical energy for sale or producing steam for sale. Parts 10–13 compute as all-zero unless true.
- `schedule27.claimingPart9MainPath`: Whether the main Part 9 path is ALSO claimed. Governs amount 13J: form footnote 10 requires 13J = 0 when only the elec/steam deduction is claimed. null = engine assumes both are claimed (conservative).
- `schedule27.claimingZETMDeduction`: Signals a ZETM claim. Used only to raise an advisory when no MCB/MLB allocation is supplied; the ZETM arm computes off the amounts below.
- `schedule27.costOfCapitalReflectsReg5203And5204Exclusions`: Box 140 review: Part 4 gross and rental costs exclude the property-use portions required by Reg 5203(1) or, for a partnership member, Reg 5204.
- `schedule27.excludedActivityParagraphs`: s.125.1(3)(a)–(k) paragraph letters the corporation is engaged in. Non-empty blocks the deduction. Paragraph (h) (electrical energy / steam) is RE-INCLUDED by s.125.1(5) for the Parts 10–13 path.
- `schedule27.hasActiveBusinessOutsideCanada`: Reg 5201(d) disqualifier: the corporation carried on an active business outside Canada at any time in the year, which forces the Reg 5200 formula.
- `schedule27.hasExcludedActivityS125_1_3_a_to_k`: Reg 5201(c) disqualifier: the corporation engaged in an activity excluded by paragraphs (a) to (k) of the ITA s.125.1(3) manufacturing or processing definition.
- `schedule27.hasForeignOreProcessingNotBeyondPrescribedStage`: Reg 5201(c.1) to (c.3) disqualifier: processing of foreign ore not beyond the prime metal, iron-ore pellet, or crude-oil stage.
- `schedule27.hasResourceActivitiesReg5203`: Exact-profile fact required by Regulations 5201 and 5203(2): the corporation has no resource activities that require the Schedule 27 resource-profit reduction.
- `schedule27.includesEmployerCPP_EI`: Advisory flag: amount 6A includes employer-portion CPP/EI/EHT. Reg 5202 limits salaries and wages to salaries, wages and commissions; the engine warns for review but never auto-strips.
- `schedule27.line100ActiveBusinessIncomeNetOfLoss`: Box 100 — active business income minus active business losses for the year, including your share for each partnership of which you were a member. Reg 5201(b)(i). When the four conditions are met this IS the Canadian M&P profits figure entered at line 200.
- `schedule27.line105AssociatedCorpsABI`: Box 105 — active business income of each associated Canadian corporation. Reg 5201(b)(ii) has NO loss-netting on this arm.
- `schedule27.line120ActiveBusinessIncomeNetOfLoss`: Box 120 — active business income net of losses (Reg 5200 path).
- `schedule27.mpGrossRevenueRatio`: The ITA s.125.1(3)(l) qualifying Canadian manufacturing and processing gross-revenue ratio. This exact witness proves the 10% floor instead of treating an unanswered statutory fact as zero.
- `schedule27.onlyGeneratedOrProducedElectricalEnergyOrSteamForSaleInSaskatchewan`: Schedule 404 Note 1 — the corporation only generated or produced electrical energy or steam for sale in Saskatchewan. Yes routes S404 amount 1A to S27 line 210; No routes it to line 200; null is unanswered.
- `schedule27.primarilyMPInCanada`: Reg 5201 small-manufacturers condition: the corporation's activities during the year were primarily manufacturing or processing in Canada.
- `schedule27.primarilyMPRatio`: Optional 0..1 corroboration of the Reg 5201(a) "primarily" test.
- `schedule27.schedule404`: Supporting Schedule 404 worksheet. It rides on THIS document because Schedule 27 already owns the Schedule 404 Note 1 routing answer above and produces amount 1A (line 200 / line 210); the same nesting Schedule 511 uses inside Schedule 510. Opening Schedule 404 therefore opens Schedule 27 too, which is correct in substance — amount 1A comes from Schedule 27, so the Saskatchewan reduction cannot be computed without it.
- `schedule27.schedule404.amount1EFromSchedule411`: Amount 1E from Schedule 411, which the face prints TWICE — as amount 1B (subtracted from Canadian M&P profits to reach amount 1C) and as amount 1E (added into amount 1H and so subtracted from taxable income to reach amount 1I). Form Note 2 makes it live only for a corporation that was a CCPC throughout the year. Filemark computes no Schedule 411, so this is entered. Leaving it blank does NOT read as nil — a nil would enlarge the reduction in the taxpayer's favour — it makes the engine fall back to the Saskatchewan small-business-rate income it computed and disclose that substitution at…
- `schedule27.uccDepreciableScheduleII`: Not consumed. Regulation 5202 cost of capital paragraph (a) requires the gross historical capital cost of owned depreciable property, not undepreciated capital cost, so any value here is ignored and only produces a warning telling you to send amount4ADepreciableScheduleII instead.
- `schedule27.zetmAllocationReflectsDirectUse`: Confirmation that the MCB/MLB allocation reflects extent of direct use in those clauses. A positive allocation without `true` fails closed.
- `schedule27.zetmQualifiedActivityClauses`: Reg 5202 qualified-ZETM-activity clause identifiers the allocation relates to — a CLOSED list (clauses (a)(i)(A)–(I) and (L)–(O)). A positive MCB/MLB allocation with no clause fails closed; manufacturing generally is NOT a qualified ZETM activity.
- `schedule27.zetm_deduction_claimed`: Signals that a zero-emission technology manufacturing deduction is being claimed, so the engine emits an advisory when no ZETM cost is supplied. It does not itself produce the line 350 amount: with no ZETM cost present the line 616 figure stays the exact manufacturing and processing figure. claimingZETMDeduction is the equivalent alternative spelling.
- `specifiedCorporateIncomeReviewed`: Confirms the Schedule 7 Part 7 review of ITA s.125(7) specified corporate income; until true the engine caps specified corporate income at nil and line 615 stays out of SBD-eligible income.
- `specifiedInvestmentBusinessIncome`: Total income for the year from a specified investment business carried on in Canada, the ITA s.125(7) 'income of the corporation for the year from an active business' paragraph (a) carve-out the sweep made an explicit operand. Zero pins this witness's branch: no specified investment business income.
- `specifiedPartnershipIncomeApplies`: Whether ITA s.125(7) specified partnership income applies for the year; true requires the Schedule 7 Parts 4 and 5 partnership packets.
- `supplementalLinesReviewed`: Confirms Schedule 7 lines 042, 052, 072, 720, 725, 735, 741, 029, 059, 530 and 540 were reviewed and every applicable amount entered; AII, FII, AAII and SBD-eligible income are held at zero until confirmed.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (23 of 90 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].accountType | 0 to 20000 characters |
| accounts[].classification.incomeType | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| associatedGroupAII | -1000000000000000 to 1000000000000000 |
| corpType | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| lifeInsurancePolicyIncome | -1000000000000000 to 1000000000000000 |
| priorYearGroupTCEC | -1000000000000000 to 1000000000000000 |
| priorYearGroupTCECMeta.asOf | 0 to 20000 characters |
| priorYearGroupTCECMeta.basis | 0 to 20000 characters |
| priorYearGroupTCECMeta.source | matches \S; 1 to 20000 characters |
| schedule27.line100ActiveBusinessIncomeNetOfLoss | -1000000000000000 to 1000000000000000 |
| schedule27.line105AssociatedCorpsABI | -1000000000000000 to 1000000000000000 |
| schedule27.mpGrossRevenueRatio | -1000000000000000 to 1000000000000000 |
| specifiedInvestmentBusinessIncome | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (133)

| Cell | Types |
| --- | --- |
| amount_11A | number |
| amount_11B | number |
| amount_12A | number |
| amount_12B | number |
| amount_12C | number |
| amount_13A | number |
| amount_13B | number |
| amount_13C | number |
| amount_13D | number |
| amount_13E | number |
| amount_13F | number |
| amount_13G | number |
| amount_13H | number |
| amount_13I | number |
| amount_13J | number |
| amount_13K | number |
| amount_13L | number |
| amount_14A | number |
| amount_14B | number |
| amount_14C | number |
| amount_16A | number |
| amount_16B | number |
| amount_17A | number |
| amount_17B | number |
| amount_17C | number |
| amount_17D | number |
| amount_17E | number |
| amount_17F | number |
| amount_17G | number |
| amount_17H | number |
| amount_17I | number |
| amount_17J | number |
| amount_17K | number |
| amount_17L | number |
| amount_17M | number |
| amount_3A | number |
| amount_3B | number |
| amount_3C | number |
| amount_3D | number |
| amount_4A | number |
| amount_4B | number |
| amount_4C | number |
| amount_4D | number |
| amount_4E | number |
| amount_4F | number |
| amount_4G | number |
| amount_4H | number |
| amount_4I | number |
| amount_5A | number |
| amount_5B | number |
| amount_6A | number |
| amount_6B | number |
| amount_6C | number |
| amount_6D | number |
| amount_6E | number |
| amount_6F | number |
| amount_6G | number |
| amount_6H | number |
| amount_6I | number |
| amount_6J | number |
| amount_6K | number |
| amount_6L | number |
| amount_6M | number |
| amount_6N | number |
| amount_6O | number |
| amount_6P | number |
| amount_6Q | number |
| amount_6R | number |
| amount_6S | number |
| amount_6T | number |
| amount_6U | number |
| amount_7A | number |
| amount_7B | number |
| amount_7C | number |
| amount_8A | number |
| amount_8B | number |
| amount_8C | number |
| amount_8D | number |
| amount_8E | number |
| amount_8F | number |
| amount_8G | number |
| amount_9A | number |
| amount_9B | number |
| amount_9C | number |
| amount_9D | number |
| amount_9E | number |
| amount_9F | number |
| amount_9G | number |
| amount_9H | number |
| amount_9I | number |
| amount_9J | number |
| amount_9K | number |
| amount_9L | number |
| fired_gates | object |
| line_100 | number |
| line_105 | number |
| line_110 | number |
| line_120 | number |
| line_125 | number |
| line_130 | number |
| line_140 | number |
| line_150 | number |
| line_160 | number |
| line_170 | number |
| line_200 | number |
| line_205 | number |
| line_206 | number |
| line_210 | number |
| line_305 | number |
| line_306 | number |
| line_310 | number |
| line_350 | number |
| mp_profits_for_provincial_use | number |
| provisional | boolean |
| ready | boolean |
| reg_5201_qualifies | boolean |
| t2_line_616_mp_deduction | number |
| warnings[].box | null \| string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].producers[] | string |
| warnings[].severity | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| fbitc_relevant_factor | string |

### Output cell notes

- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.

# schedule28

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2016 and later
- Strict profile: s28_2025_two_other_corps_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule28"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule28": {
      "amendedElection": false,
      "thirdCorpName": "Cedar Ridge Holdings Inc.",
      "thirdCorpBn": "333333334RC0001",
      "thirdCorpTaxYearEnd": "2025-12-31",
      "otherCorps": [
        {
          "name": "Cedar Ridge Manufacturing Inc.",
          "businessNumber": "123456782RC0001"
        },
        {
          "name": "Birchline Tools Ltd.",
          "businessNumber": "222222226RC0001"
        }
      ]
    }
  }
}
```

## Input cells (16)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean | strict |
| schedule28.amendedElection | boolean \| null | strict |
| schedule28.dateFiled | null \| string |  |
| schedule28.otherCorps | array |  |
| schedule28.otherCorps[].businessNumber | null \| string | strict |
| schedule28.otherCorps[].name | null \| string | strict |
| schedule28.othersAssociatedWithThirdCorp | boolean \| null \| number \| string |  |
| schedule28.othersNotOtherwiseAssociated | boolean \| null \| number \| string |  |
| schedule28.supplementaryPagesAttached | boolean \| null |  |
| schedule28.thirdCorpBn | null \| string | strict |
| schedule28.thirdCorpIsCcpc | boolean \| null \| number \| string |  |
| schedule28.thirdCorpName | null \| string | strict |
| schedule28.thirdCorpTaxYearEnd | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `fiscalEnd`: The return's tax year-end, pinned exactly. Sending it selects the branch that runs the box 050 equality check. The other current-year branch omits it, and the engine blocks on the missing year-end.
- `fiscalStart`: The return's fiscal-period start. Together with fiscalEnd it establishes the filer-owned taxation period; a lone year-end is not period evidence.
- `isCCPC`: The corporation-type fact at the request root, required on this branch. Schedule 28 reads its own schedule28.thirdCorpIsCcpc fact instead, so setting this one does not clear the unanswered-CCPC gate, and it does not establish legal status.
- `schedule28.amendedElection`: Pinned to false. That does not establish this is an original election or that an election exists.
- `schedule28.dateFiled`: Pinned to null: box 010 is outside this profile. Null does not establish whether or when anything was filed.
- `schedule28.otherCorps`: Per-row "other" corporation entries. Must contain at least 2 populated rows for local structural completeness, based on the form's description of two other corporations and its per-corporation table. This does not establish that an election is legally effective.
- `schedule28.otherCorps[].businessNumber`: The first box 200 row's business number, pinned to a distinct fixed synthetic value. It is not a real business number, and it does not establish identity, registration, or association.
- `schedule28.otherCorps[].name`: A single-line name with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a legal-name check, or proof of corporate identity or status.
- `schedule28.othersAssociatedWithThirdCorp`: Whether the two other corporations were associated with the third corporation. Boolean is the canonical form. An absent answer leaves the ITA s.256(2)(b)(ii) election conclusion unanswered and the schedule fails closed.
- `schedule28.othersNotOtherwiseAssociated`: Whether the two other corporations would not otherwise be associated with each other. Boolean is the canonical form. An absent answer leaves the ITA s.256(2)(b)(ii) election conclusion unanswered.
- `schedule28.supplementaryPagesAttached`: TE-2026-08-27-062 — the printed grid holds 15 rows and the form says "If you need more space, attach additional schedules." The generated package prints only the 15, so a corporation in row 16 or beyond is covered by the election only if that attachment was really filed. s.256(2) deems non-association only for corporations the third corporation "elects in prescribed form" to cover, and Schedule 23 consumes that election into the business limit. Null is unanswered and holds; it is only asked when the grid overflows.
- `schedule28.thirdCorpBn`: The box 040 business number, pinned to one fixed synthetic value. It is not a real business number, and it does not establish that the number exists, belongs to the submitted name, or identifies a CCPC.
- `schedule28.thirdCorpIsCcpc`: Whether the third corporation is a Canadian-controlled private corporation. Schedule 28 reads this fact rather than the request-root corporation type, so setting the root fact alone does not clear the unanswered-CCPC gate.
- `schedule28.thirdCorpName`: A single-line name with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a legal-name check, or proof of corporate identity or status.
- `schedule28.thirdCorpTaxYearEnd`: Pinned to the same 2025 tax year the request states, so the schedule body's year cannot disagree with the return's year.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (12 of 16 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule28.dateFiled | 0 to 20000 characters |
| schedule28.otherCorps[].businessNumber | 0 to 20000 characters |
| schedule28.otherCorps[].name | matches ^\S(?:[^\r\n\u000b\u000c\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule28.othersAssociatedWithThirdCorp | one of true, false, 0, 1, "true", "false" |
| schedule28.othersNotOtherwiseAssociated | one of true, false, 0, 1, "true", "false" |
| schedule28.thirdCorpBn | 0 to 20000 characters |
| schedule28.thirdCorpIsCcpc | one of true, false, 0, 1, "true", "false" |
| schedule28.thirdCorpName | matches ^\S(?:[^\r\n\u000b\u000c\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule28.thirdCorpTaxYearEnd | date (YYYY-MM-DD); 10 to 10 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027; 0 to 20000 characters |

## Output cells (215)

| Cell | Types |
| --- | --- |
| date_filed | null |
| amended_election | boolean \| null |
| third_corp_name | null \| string |
| third_corp_bn | null \| string |
| third_corp_tax_year_end | null \| string |
| third_corp_business_limit_deemed_nil | null |
| other_corps[].name | null \| string |
| other_corps[].businessNumber | null \| string |
| warnings[].box | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.verified_at | string |
| fired_gates.box_040_matches_filing_corporation.gate_id | string |
| fired_gates.box_040_matches_filing_corporation.form_id | string |
| fired_gates.box_040_matches_filing_corporation.rule | string |
| fired_gates.box_040_matches_filing_corporation.cra_text_verbatim | string |
| fired_gates.box_040_matches_filing_corporation.source | string |
| fired_gates.box_040_matches_filing_corporation.source_url | string |
| fired_gates.box_040_matches_filing_corporation.form_revision | string |
| fired_gates.box_040_matches_filing_corporation.applies_to_boxes[] | string |
| fired_gates.box_040_matches_filing_corporation.verified_at | string |
| fired_gates.box_050_within_return_tax_year.gate_id | string |
| fired_gates.box_050_within_return_tax_year.form_id | string |
| fired_gates.box_050_within_return_tax_year.rule | string |
| fired_gates.box_050_within_return_tax_year.cra_text_verbatim | string |
| fired_gates.box_050_within_return_tax_year.source | string |
| fired_gates.box_050_within_return_tax_year.source_url | string |
| fired_gates.box_050_within_return_tax_year.form_revision | string |
| fired_gates.box_050_within_return_tax_year.applies_to_boxes[] | string |
| fired_gates.box_050_within_return_tax_year.verified_at | string |
| fired_gates.s256_2_a_conditions_answered.gate_id | string |
| fired_gates.s256_2_a_conditions_answered.form_id | string |
| fired_gates.s256_2_a_conditions_answered.rule | string |
| fired_gates.s256_2_a_conditions_answered.cra_text_verbatim | string |
| fired_gates.s256_2_a_conditions_answered.source | string |
| fired_gates.s256_2_a_conditions_answered.source_url | string |
| fired_gates.s256_2_a_conditions_answered.form_revision | string |
| fired_gates.s256_2_a_conditions_answered.applies_to_boxes[] | string |
| fired_gates.s256_2_a_conditions_answered.verified_at | string |
| fired_gates.third_corp_must_be_ccpc.gate_id | string |
| fired_gates.third_corp_must_be_ccpc.form_id | string |
| fired_gates.third_corp_must_be_ccpc.rule | string |
| fired_gates.third_corp_must_be_ccpc.cra_text_verbatim | string |
| fired_gates.third_corp_must_be_ccpc.source | string |
| fired_gates.third_corp_must_be_ccpc.source_url | string |
| fired_gates.third_corp_must_be_ccpc.form_revision | string |
| fired_gates.third_corp_must_be_ccpc.applies_to_boxes[] | string |
| fired_gates.third_corp_must_be_ccpc.verified_at | string |
| provisional | boolean |
| ready | boolean |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[].sources[] | string |
| warnings[].taxYears[] | integer |
| fired_gates.box_030_third_corp_name_required.gate_id | string |
| fired_gates.box_030_third_corp_name_required.form_id | string |
| fired_gates.box_030_third_corp_name_required.rule | string |
| fired_gates.box_030_third_corp_name_required.cra_text_verbatim | string |
| fired_gates.box_030_third_corp_name_required.source | string |
| fired_gates.box_030_third_corp_name_required.source_url | string |
| fired_gates.box_030_third_corp_name_required.form_revision | string |
| fired_gates.box_030_third_corp_name_required.applies_to_boxes[] | string |
| fired_gates.box_030_third_corp_name_required.verified_at | string |
| fired_gates.box_040_third_corp_bn_required.gate_id | string |
| fired_gates.box_040_third_corp_bn_required.form_id | string |
| fired_gates.box_040_third_corp_bn_required.rule | string |
| fired_gates.box_040_third_corp_bn_required.cra_text_verbatim | string |
| fired_gates.box_040_third_corp_bn_required.source | string |
| fired_gates.box_040_third_corp_bn_required.source_url | string |
| fired_gates.box_040_third_corp_bn_required.form_revision | string |
| fired_gates.box_040_third_corp_bn_required.applies_to_boxes[] | string |
| fired_gates.box_040_third_corp_bn_required.verified_at | string |
| fired_gates.box_040_third_corp_bn_format.gate_id | string |
| fired_gates.box_040_third_corp_bn_format.form_id | string |
| fired_gates.box_040_third_corp_bn_format.rule | string |
| fired_gates.box_040_third_corp_bn_format.cra_text_verbatim | string |
| fired_gates.box_040_third_corp_bn_format.source | string |
| fired_gates.box_040_third_corp_bn_format.source_url | string |
| fired_gates.box_040_third_corp_bn_format.form_revision | string |
| fired_gates.box_040_third_corp_bn_format.applies_to_boxes[] | string |
| fired_gates.box_040_third_corp_bn_format.verified_at | string |
| fired_gates.box_050_tax_year_end_required.gate_id | string |
| fired_gates.box_050_tax_year_end_required.form_id | string |
| fired_gates.box_050_tax_year_end_required.rule | string |
| fired_gates.box_050_tax_year_end_required.cra_text_verbatim | string |
| fired_gates.box_050_tax_year_end_required.source | string |
| fired_gates.box_050_tax_year_end_required.source_url | string |
| fired_gates.box_050_tax_year_end_required.form_revision | string |
| fired_gates.box_050_tax_year_end_required.applies_to_boxes[] | string |
| fired_gates.box_050_tax_year_end_required.verified_at | string |
| fired_gates.box_050_tax_year_end_iso_date_format.gate_id | string |
| fired_gates.box_050_tax_year_end_iso_date_format.form_id | string |
| fired_gates.box_050_tax_year_end_iso_date_format.rule | string |
| fired_gates.box_050_tax_year_end_iso_date_format.cra_text_verbatim | string |
| fired_gates.box_050_tax_year_end_iso_date_format.source | string |
| fired_gates.box_050_tax_year_end_iso_date_format.source_url | string |
| fired_gates.box_050_tax_year_end_iso_date_format.form_revision | string |
| fired_gates.box_050_tax_year_end_iso_date_format.applies_to_boxes[] | string |
| fired_gates.box_050_tax_year_end_iso_date_format.verified_at | string |
| fired_gates.box_010_date_filed_iso_date_format.gate_id | string |
| fired_gates.box_010_date_filed_iso_date_format.form_id | string |
| fired_gates.box_010_date_filed_iso_date_format.rule | string |
| fired_gates.box_010_date_filed_iso_date_format.cra_text_verbatim | string |
| fired_gates.box_010_date_filed_iso_date_format.source | string |
| fired_gates.box_010_date_filed_iso_date_format.source_url | string |
| fired_gates.box_010_date_filed_iso_date_format.form_revision | string |
| fired_gates.box_010_date_filed_iso_date_format.applies_to_boxes[] | string |
| fired_gates.box_010_date_filed_iso_date_format.verified_at | string |
| fired_gates.box_020_amended_election_required.gate_id | string |
| fired_gates.box_020_amended_election_required.form_id | string |
| fired_gates.box_020_amended_election_required.rule | string |
| fired_gates.box_020_amended_election_required.cra_text_verbatim | string |
| fired_gates.box_020_amended_election_required.source | string |
| fired_gates.box_020_amended_election_required.source_url | string |
| fired_gates.box_020_amended_election_required.form_revision | string |
| fired_gates.box_020_amended_election_required.applies_to_boxes[] | string |
| fired_gates.box_020_amended_election_required.verified_at | string |
| fired_gates.minimum_two_other_corporations_required.gate_id | string |
| fired_gates.minimum_two_other_corporations_required.form_id | string |
| fired_gates.minimum_two_other_corporations_required.rule | string |
| fired_gates.minimum_two_other_corporations_required.cra_text_verbatim | string |
| fired_gates.minimum_two_other_corporations_required.source | string |
| fired_gates.minimum_two_other_corporations_required.source_url | string |
| fired_gates.minimum_two_other_corporations_required.form_revision | string |
| fired_gates.minimum_two_other_corporations_required.applies_to_boxes[] | string |
| fired_gates.minimum_two_other_corporations_required.verified_at | string |
| fired_gates.box_100_other_corp_name_required.gate_id | string |
| fired_gates.box_100_other_corp_name_required.form_id | string |
| fired_gates.box_100_other_corp_name_required.rule | string |
| fired_gates.box_100_other_corp_name_required.cra_text_verbatim | string |
| fired_gates.box_100_other_corp_name_required.source | string |
| fired_gates.box_100_other_corp_name_required.source_url | string |
| fired_gates.box_100_other_corp_name_required.form_revision | string |
| fired_gates.box_100_other_corp_name_required.applies_to_boxes[] | string |
| fired_gates.box_100_other_corp_name_required.verified_at | string |
| fired_gates.box_200_other_corp_bn_required.gate_id | string |
| fired_gates.box_200_other_corp_bn_required.form_id | string |
| fired_gates.box_200_other_corp_bn_required.rule | string |
| fired_gates.box_200_other_corp_bn_required.cra_text_verbatim | string |
| fired_gates.box_200_other_corp_bn_required.source | string |
| fired_gates.box_200_other_corp_bn_required.source_url | string |
| fired_gates.box_200_other_corp_bn_required.form_revision | string |
| fired_gates.box_200_other_corp_bn_required.applies_to_boxes[] | string |
| fired_gates.box_200_other_corp_bn_required.verified_at | string |
| fired_gates.box_200_other_corp_bn_format.gate_id | string |
| fired_gates.box_200_other_corp_bn_format.form_id | string |
| fired_gates.box_200_other_corp_bn_format.rule | string |
| fired_gates.box_200_other_corp_bn_format.cra_text_verbatim | string |
| fired_gates.box_200_other_corp_bn_format.source | string |
| fired_gates.box_200_other_corp_bn_format.source_url | string |
| fired_gates.box_200_other_corp_bn_format.form_revision | string |
| fired_gates.box_200_other_corp_bn_format.applies_to_boxes[] | string |
| fired_gates.box_200_other_corp_bn_format.verified_at | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.gate_id | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.form_id | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.rule | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.cra_text_verbatim | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.source | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.source_url | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.form_revision | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.applies_to_boxes[] | string |
| fired_gates.other_corp_bn_distinct_from_third_corp.verified_at | string |
| fired_gates.other_corp_bn_unique_within_election.gate_id | string |
| fired_gates.other_corp_bn_unique_within_election.form_id | string |
| fired_gates.other_corp_bn_unique_within_election.rule | string |
| fired_gates.other_corp_bn_unique_within_election.cra_text_verbatim | string |
| fired_gates.other_corp_bn_unique_within_election.source | string |
| fired_gates.other_corp_bn_unique_within_election.source_url | string |
| fired_gates.other_corp_bn_unique_within_election.form_revision | string |
| fired_gates.other_corp_bn_unique_within_election.applies_to_boxes[] | string |
| fired_gates.other_corp_bn_unique_within_election.verified_at | string |
| fired_gates.other_corp_nr_name_unique_within_election.gate_id | string |
| fired_gates.other_corp_nr_name_unique_within_election.form_id | string |
| fired_gates.other_corp_nr_name_unique_within_election.rule | string |
| fired_gates.other_corp_nr_name_unique_within_election.cra_text_verbatim | string |
| fired_gates.other_corp_nr_name_unique_within_election.source | string |
| fired_gates.other_corp_nr_name_unique_within_election.source_url | string |
| fired_gates.other_corp_nr_name_unique_within_election.form_revision | string |
| fired_gates.other_corp_nr_name_unique_within_election.applies_to_boxes[] | string |
| fired_gates.other_corp_nr_name_unique_within_election.verified_at | string |
| fired_gates.other_corp_rows_overflow_supplementary.gate_id | string |
| fired_gates.other_corp_rows_overflow_supplementary.form_id | string |
| fired_gates.other_corp_rows_overflow_supplementary.rule | string |
| fired_gates.other_corp_rows_overflow_supplementary.cra_text_verbatim | string |
| fired_gates.other_corp_rows_overflow_supplementary.source | string |
| fired_gates.other_corp_rows_overflow_supplementary.source_url | string |
| fired_gates.other_corp_rows_overflow_supplementary.form_revision | string |
| fired_gates.other_corp_rows_overflow_supplementary.applies_to_boxes[] | string |
| fired_gates.other_corp_rows_overflow_supplementary.verified_at | string |
| fired_gates.third_corp_business_limit_deemed_nil.gate_id | string |
| fired_gates.third_corp_business_limit_deemed_nil.form_id | string |
| fired_gates.third_corp_business_limit_deemed_nil.rule | string |
| fired_gates.third_corp_business_limit_deemed_nil.cra_text_verbatim | string |
| fired_gates.third_corp_business_limit_deemed_nil.source | string |
| fired_gates.third_corp_business_limit_deemed_nil.source_url | string |
| fired_gates.third_corp_business_limit_deemed_nil.form_revision | string |
| fired_gates.third_corp_business_limit_deemed_nil.applies_to_boxes[] | string |
| fired_gates.third_corp_business_limit_deemed_nil.verified_at | string |

### Output cell notes

- `amended_election`: Box 020, 'Is this an amended election?', answered Yes. The engine echoes the answer; no other published member moves with it.
- `third_corp_business_limit_deemed_nil`: The engine emits no deemed-nil business limit for this branch because the election is not structurally complete.
- `warnings[].message`: Exact current engine message. This contract records the string; it does not adopt it as a determination of the underlying statutory or association facts.
- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule29

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1998 and later
- Strict profile: s29_versioned_profile_target_value_v1
- Payload schema version: 0.5.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule29"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule29": {
      "rows": [
        {
          "name": "Cedar Ridge Software LLC",
          "address": "123 Market Street, Boston, MA 02110, USA",
          "paymentCode": 1,
          "partXiiiDetermination": "withholding-required",
          "informationReturnConfirmed": true,
          "amount": 50000
        }
      ]
    }
  }
}
```

## Input cells (8)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule29.rows | array |  |
| schedule29.rows[].address | null \| string | strict |
| schedule29.rows[].amount | null \| number | strict |
| schedule29.rows[].informationReturnConfirmed | boolean |  |
| schedule29.rows[].name | null \| string | strict |
| schedule29.rows[].partXiiiDetermination | null \| string |  |
| schedule29.rows[].paymentCode | integer \| null \| object | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule29.rows`: Rows of non-resident payees. Empty rows are elided by the backend.
- `schedule29.rows[].address`: A string with at least one non-whitespace character. The engine trims surrounding whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA form limit.
- `schedule29.rows[].amount`: A positive JSON number for box 400. Numeric strings, blanks, booleans, zero, negative values, non-finite values, and magnitudes above 1e15 are rejected. No rule about cents precision is implied.
- `schedule29.rows[].informationReturnConfirmed`: Confirmation that the separate Regulation 202 information-return workflow was handled outside Filemark when the payment code requires it.
- `schedule29.rows[].name`: A string with at least one non-whitespace character. The engine trims surrounding whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA form limit.
- `schedule29.rows[].partXiiiDetermination`: Practitioner Part XIII conclusion. Required for every payment code whose Note 1 label names a category ITA s.212 charges on its face: 1 and 2 (s.212(1)(d) rent, royalty or similar payment), 3 (s.212(1)(a) management or administration fee or charge), 6 (s.212(1)(b) interest), 7 (s.212(2) dividends) and 8 (s.212(5) film payments). Codes 4, 5 and 9 reach Part XIII only through s.212(1)(d)(ii)/(iii), whose contingency test the form label does not establish, so no determination is demanded on them. A row the canonical Part XIII workpaper already concludes on may leave this null. Filemark does not compute a withholding rate, exclusion, waiver or treaty result from this field.
- `schedule29.rows[].paymentCode`: CRA box 300 payment code from Note 1 on T2 SCH 29 (99).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (6 of 8 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule29.rows[].address | matches \S; 1 to 10000 characters |
| schedule29.rows[].amount | -1000000000000000 to 1000000000000000 |
| schedule29.rows[].name | matches \S; 1 to 10000 characters |
| schedule29.rows[].partXiiiDetermination | one of "withholding-required", "reduced-or-exempt", null |
| schedule29.rows[].paymentCode | one of 1, 2, 3, 4, 5, 6, 7, 8, 9 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (40)

| Cell | Types |
| --- | --- |
| rows[].name | null \| string |
| rows[].address | null \| string |
| rows[].paymentCode | integer \| null |
| rows[].amount | null \| number |
| rows[].partXiiiDetermination | null \| string |
| rows[].informationReturnConfirmed | boolean |
| total_amount | string |
| warnings | array |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation | object |
| fired_gates.box_400_de_minimis_under_100 | object |
| fired_gates.filing_required_for_reg_202_or_105_payments | object |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[] | any |
| fired_gates.code_7_part_xiii_determination_required | object |
| fired_gates.reg_202_information_return_confirmation_required | object |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |

### Output cell notes

- `rows[].partXiiiDetermination`: Normalized practitioner Part XIII conclusion; null for rows where no conclusion was supplied. Payment codes 1, 2, 3, 6, 7 and 8 name categories ITA s.212 charges on their face, so a null there is a blocking finding rather than a settled nil.
- `rows[].informationReturnConfirmed`: Normalized boolean confirmation for the separate Regulation 202 information-return workflow.
- `total_amount`: A positive amount, returned as a string in ordinary or scientific notation.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].message`: One finding per payee, not per row. The message opens with the repr-quoted normalized payee name and the merged row numbers, and adds the explicit aggregation note whenever more than one row was merged into one payee.
- `warnings[]`: Any finding this held branch can publish.

# schedule3

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s3_2025_single_capital_dividend_paid_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): foreign_affiliate_analysis, part_iv_overlap, schedule25, schedule43

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule3"
  ],
  "inputs": {
    "taxYear": 2025,
    "workpapers": [
      {
        "id": "wp-dividends-target",
        "templateId": "dividends",
        "linkedAccountIds": [],
        "adjustmentStatus": "ok",
        "customName": "Cedar Ridge 2025 capital dividend",
        "rows": [
          {
            "payerName": "Cedar Ridge Manufacturing Inc.",
            "amountCY": 80000,
            "isConnected": "no",
            "dividendType": "Capital Dividend",
            "direction": "paid",
            "dividendSource": "canadian_taxable",
            "denial112": false,
            "foreignCurrency": "CAD"
          }
        ],
        "sectionRows": {},
        "assumption": "Caller-supplied facts only; no CDA balance, election, recipient/share, payment, or filing verification"
      }
    ]
  }
}
```

## Input cells (102)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule3.dividendsPaid | array |  |
| schedule3.dividendsPaid[].businessNumber | string |  |
| schedule3.dividendsPaid[].connectedCorpBN | null \| string |  |
| schedule3.dividendsPaid[].connectedPayerDividendRefund | number |  |
| schedule3.dividendsPaid[].connectedPayerTotalEligibleDividends | number |  |
| schedule3.dividendsPaid[].connectedPayerTotalTaxableDividends | number |  |
| schedule3.dividendsPaid[].denial112 | boolean |  |
| schedule3.dividendsPaid[].denial112Reason | null \| string |  |
| schedule3.dividendsPaid[].direction | string |  |
| schedule3.dividendsPaid[].dividendSource | string |  |
| schedule3.dividendsPaid[].eligibleDividendsInF | number |  |
| schedule3.dividendsPaid[].isCapitalDividend | boolean |  |
| schedule3.dividendsPaid[].isConnected | boolean \| string |  |
| schedule3.dividendsPaid[].nonTaxableDividendsS83 | number |  |
| schedule3.dividendsPaid[].payerName | string |  |
| schedule3.dividendsPaid[].payerYearEnd | null \| string |  |
| schedule3.dividendsPaid[].rowIndex | number |  |
| schedule3.dividendsPaid[].s113Paragraph | string |  |
| schedule3.dividendsPaid[].source | string |  |
| schedule3.dividendsPaid[].taxableDividendsDeductible | number |  |
| schedule3.dividendsPaid[].workpaperId | string |  |
| schedule3.dividendsReceived | array |  |
| schedule3.dividendsReceived[].businessNumber | string |  |
| schedule3.dividendsReceived[].connectedCorpBN | null \| string |  |
| schedule3.dividendsReceived[].connectedPayerDividendRefund | number |  |
| schedule3.dividendsReceived[].connectedPayerTotalEligibleDividends | number |  |
| schedule3.dividendsReceived[].connectedPayerTotalTaxableDividends | number |  |
| schedule3.dividendsReceived[].denial112 | boolean |  |
| schedule3.dividendsReceived[].denial112Reason | null \| string |  |
| schedule3.dividendsReceived[].direction | string |  |
| schedule3.dividendsReceived[].dividendSource | string |  |
| schedule3.dividendsReceived[].eligibleDividendsInF | number |  |
| schedule3.dividendsReceived[].isCapitalDividend | boolean |  |
| schedule3.dividendsReceived[].isConnected | boolean \| string |  |
| schedule3.dividendsReceived[].nonTaxableDividendsS83 | number |  |
| schedule3.dividendsReceived[].payerName | string |  |
| schedule3.dividendsReceived[].payerYearEnd | null \| string |  |
| schedule3.dividendsReceived[].rowIndex | number |  |
| schedule3.dividendsReceived[].s113Paragraph | string |  |
| schedule3.dividendsReceived[].source | string |  |
| schedule3.dividendsReceived[].taxableDividendsDeductible | number |  |
| schedule3.dividendsReceived[].workpaperId | string |  |
| schedule3.form | object |  |
| schedule3.form.formWarnings | array |  |
| schedule3.form.part1Table | array |  |
| schedule3.form.part1Table[].connectedCode | string |  |
| schedule3.form.part1Table[].deductible235 | number |  |
| schedule3.form.part1Table[].deductible240 | number |  |
| schedule3.form.part1Table[].eligible242 | number |  |
| schedule3.form.part1Table[].nonTaxableS83 | number |  |
| schedule3.form.part1Table[].partIV275 | number |  |
| schedule3.form.part1Table[].partIVConnected280 | number |  |
| schedule3.form.part1Table[].partIVEligible265 | number |  |
| schedule3.form.part1Table[].payerBn | string |  |
| schedule3.form.part1Table[].payerName | string |  |
| schedule3.form.part1Table[].payerRefund260 | number |  |
| schedule3.form.part1Table[].payerTotalTaxable250 | number |  |
| schedule3.form.part1Table[].payerYearEnd | string |  |
| schedule3.form.part3Table | array |  |
| schedule3.form.part3Table[].eligible440 | number |  |
| schedule3.form.part3Table[].recipientBn | string |  |
| schedule3.form.part3Table[].recipientName | string |  |
| schedule3.form.part3Table[].recipientYearEnd | string |  |
| schedule3.form.part3Table[].taxable430 | number |  |
| schedule3.grossPartIVTaxBeforeSchedule43Reduction | number |  |
| schedule3.missing_required | array |  |
| schedule3.partIVTaxConnected | number |  |
| schedule3.partIVTaxNonConnected | number |  |
| schedule3.provisional | boolean |  |
| schedule3.section137_5_2DeductionReduction | number |  |
| schedule3.section137_5_2IncomeInclusion | number |  |
| schedule3.totalCapitalDividendsPaid | number |  |
| schedule3.totalColumnF235 | number |  |
| schedule3.totalColumnG240 | number |  |
| schedule3.totalEligibleDividends | number |  |
| schedule3.totalEligibleDividendsPaid | number |  |
| schedule3.totalNonConnectedDividends | number |  |
| schedule3.totalNonDeductiblePortfolio | number |  |
| schedule3.totalNonTaxableS83Received | number |  |
| schedule3.totalPartIVTax | number |  |
| schedule3.totalS112Deduction | number |  |
| schedule3.totalS113Deduction | number |  |
| schedule3.totalTaxableDividendsDeductible | number |  |
| schedule3.totalTaxableDividendsPaid | number |  |
| schedule3.totalTaxableDividendsPaidForRefund | number |  |
| taxYear | integer \| string | always |
| workpapers[].adjustmentAmount | null \| number \| string |  |
| workpapers[].adjustmentStatus | string | strict |
| workpapers[].assumption | string | strict |
| workpapers[].customName | string | strict |
| workpapers[].id | string | strict |
| workpapers[].linkedAccountIds[] | boolean \| null \| number \| string | strict |
| workpapers[].rows[].amountCY | integer | strict |
| workpapers[].rows[].denial112 | boolean | strict |
| workpapers[].rows[].direction | string | strict |
| workpapers[].rows[].dividendSource | string | strict |
| workpapers[].rows[].dividendType | string | strict |
| workpapers[].rows[].foreignCurrency | string | strict |
| workpapers[].rows[].isConnected | string | strict |
| workpapers[].rows[].payerName | string | strict |
| workpapers[].sectionRows | object | strict |
| workpapers[].templateId | string | strict |

### Input cell notes

- `schedule3.dividendsPaid[].isCapitalDividend`: s.83(2) capital dividend — non-taxable: form column E (received) / Part 4 line 510 (paid); no s.112 deduction, no Part IV.
- `schedule3.dividendsPaid[].payerYearEnd`: Payer's (received) / recipient's (paid) tax year-end — form columns D (line 220) / P (line 420). Optional workpaper column.
- `schedule3.dividendsPaid[].s113Paragraph`: Foreign-affiliate rows: which s.113 paragraph the deduction claims. "surplus" (113(1)(a)/(a.1)/(b)/(d)/113(2) — column G, in the s.186(3) Part IV base), "113_1_c" (column F, no Part IV), or the fail-closed "legacy_ambiguous" sentinel for the retired contradictory UI label.
- `schedule3.dividendsPaid[].taxableDividendsDeductible`: Legacy misnomer — the ROW'S DIVIDEND AMOUNT (display + classification input), not the deductible subset. The engine's classification decides which form column / total it lands in.
- `schedule3.dividendsPaid[].workpaperId`: Write-back address — the engine's received/paid lists are FILTERED views of the workpaper rows, so UI edits target (workpaperId, rowIndex) in the ORIGINAL workpaper, never the display-list index. Optional because paid rows projected from the dividends-declared workpaper carry no address; only addressed rows accept UI edits.
- `schedule3.dividendsReceived[].isCapitalDividend`: s.83(2) capital dividend — non-taxable: form column E (received) / Part 4 line 510 (paid); no s.112 deduction, no Part IV.
- `schedule3.dividendsReceived[].payerYearEnd`: Payer's (received) / recipient's (paid) tax year-end — form columns D (line 220) / P (line 420). Optional workpaper column.
- `schedule3.dividendsReceived[].s113Paragraph`: Foreign-affiliate rows: which s.113 paragraph the deduction claims. "surplus" (113(1)(a)/(a.1)/(b)/(d)/113(2) — column G, in the s.186(3) Part IV base), "113_1_c" (column F, no Part IV), or the fail-closed "legacy_ambiguous" sentinel for the retired contradictory UI label.
- `schedule3.dividendsReceived[].taxableDividendsDeductible`: Legacy misnomer — the ROW'S DIVIDEND AMOUNT (display + classification input), not the deductible subset. The engine's classification decides which form column / total it lands in.
- `schedule3.dividendsReceived[].workpaperId`: Write-back address — the engine's received/paid lists are FILTERED views of the workpaper rows, so UI edits target (workpaperId, rowIndex) in the ORIGINAL workpaper, never the display-list index. Optional because paid rows projected from the dividends-declared workpaper carry no address; only addressed rows accept UI edits.
- `schedule3.form`: True Form View projection — every printed T2 SCH 3 box, always present.
- `schedule3.form.formWarnings`: Tie-out mismatches (defensive — impossible by construction today) and grid-overflow notices (Part 1 holds 5 printed rows, Part 3 holds 7; bound totals always include every row). The form view renders these — nothing is silently truncated.
- `schedule3.form.part1Table[].payerTotalTaxable250`: I / 250 — ITA 186(1)(b)(ii)'s taxable-dividends-paid-while-private-or- subject denominator. Deliberately narrower than the PDF /TU caption's unqualified payer-year total when the payer changed status mid-year.
- `schedule3.grossPartIVTaxBeforeSchedule43Reduction`: Gross s.186 Part IV tax before the Schedule 43 Part IV.1 overlap reduction.
- `schedule3.section137_5_2DeductionReduction`: Payer-credit-union amount removed from the otherwise available s.112 deduction by ITA 137(5.2)(a).
- `schedule3.section137_5_2IncomeInclusion`: Elected paragraph 137(5.1)(b)/(c) amounts included in income under paragraph 137(5.2)(b), consumed by Schedule 1 other additions.
- `schedule3.totalColumnF235`: Printed column totals: amount 1A = column F (s.113(1)(c) only) and amount 1B = column G (s.112 + the s.113 surplus paragraphs — the s.186(3) assessable base).
- `schedule3.totalNonConnectedDividends`: Legacy diagnostic — non-connected DEDUCTIBLE portion. NOT the AII feed. Kept for backward compat with older binder/UI consumers.
- `schedule3.totalNonDeductiblePortfolio`: Foreign portfolio + s.112(2.x) denied dividends + the payer-credit-union s.137(5.2)(a) deduction reduction. Flows into Schedule 7 line 4b as the AII feed per s.129(4).
- `schedule3.totalNonTaxableS83Received`: s.83(2) capital dividends received — form column E total → S1 line 402.
- `schedule3.totalPartIVTax`: Final Schedule 3 line 360 after the Schedule 43 reduction; feeds T2 line 712.
- `schedule3.totalS112Deduction`: s.112(1) deductible component (Canadian taxable, no denial).
- `schedule3.totalS113Deduction`: s.113 deductible component (foreign affiliate).
- `schedule3.totalTaxableDividendsDeductible`: s.112(1) + s.113 combined deduction → T2 jacket line 320 (Division C).
- `schedule3.totalTaxableDividendsPaidForRefund`: Paid-side form totals (lines 460 / 465 / 510). totalTaxableDividendsPaid is the S55 auto-fill alias for taxable-dividend line 460; coverage-gated Part 4 lines 520-540 do not change that taxable total.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.
- `workpapers[].rows[].denial112`: Whether the ITA s.112 deduction was denied for this dividend; s.187.2 tax reaches the dividend only to the extent it was deductible, so a blank cannot be read as no.
- `workpapers[].rows[].foreignCurrency`: Currency unit of the paid dividend amount. CAD proves this exact witness is already stated in the taxation year reporting currency under ITA 261(2)(a).

### Strict profile accepted values (28 of 102 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule3.dividendsPaid[].denial112Reason | one of "term_preferred_share", "guaranteed_share", "dividend_rental", "other_112_2_x" |
| schedule3.dividendsPaid[].direction | one of "received", "paid" |
| schedule3.dividendsPaid[].dividendSource | one of "canadian_taxable", "foreign_affiliate", "foreign_portfolio" |
| schedule3.dividendsPaid[].isConnected | one of "needs_confirmation" |
| schedule3.dividendsPaid[].s113Paragraph | one of "surplus", "113_1_c", "legacy_ambiguous" |
| schedule3.dividendsPaid[].source | one of "workpaper", "manual", "scraped" |
| schedule3.dividendsReceived[].denial112Reason | one of "term_preferred_share", "guaranteed_share", "dividend_rental", "other_112_2_x" |
| schedule3.dividendsReceived[].direction | one of "received", "paid" |
| schedule3.dividendsReceived[].dividendSource | one of "canadian_taxable", "foreign_affiliate", "foreign_portfolio" |
| schedule3.dividendsReceived[].isConnected | one of "needs_confirmation" |
| schedule3.dividendsReceived[].s113Paragraph | one of "surplus", "113_1_c", "legacy_ambiguous" |
| schedule3.dividendsReceived[].source | one of "workpaper", "manual", "scraped" |
| schedule3.form.part1Table[].connectedCode | one of "", "1" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |
| workpapers[].adjustmentAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| workpapers[].adjustmentStatus | 0 to 20000 characters |
| workpapers[].assumption | 0 to 20000 characters |
| workpapers[].customName | 0 to 20000 characters |
| workpapers[].id | 0 to 20000 characters |
| workpapers[].linkedAccountIds[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| workpapers[].rows[].amountCY | -1000000000000000 to 1000000000000000 |
| workpapers[].rows[].direction | 0 to 20000 characters |
| workpapers[].rows[].dividendSource | 0 to 20000 characters |
| workpapers[].rows[].dividendType | 0 to 20000 characters |
| workpapers[].rows[].foreignCurrency | 0 to 20000 characters |
| workpapers[].rows[].isConnected | 0 to 20000 characters |
| workpapers[].rows[].payerName | 0 to 20000 characters |
| workpapers[].templateId | 0 to 20000 characters |

## Output cells (159)

| Cell | Types |
| --- | --- |
| coverageReview.part4ExclusionConclusion | array \| boolean \| null \| number \| object \| string |
| coverageReview.partIVLossClaimConclusion | array \| boolean \| null \| number \| object \| string |
| coverageReview.requirements.part4ExclusionReview | boolean |
| coverageReview.requirements.partIVLossClaimReview | boolean |
| coverageReview.reviewed | boolean |
| coverageReview.schemaVersion | integer |
| coverageReview.status | string |
| dividendsPaid[].businessNumber | string |
| dividendsPaid[].connectedCorpBN | array \| boolean \| null \| number \| object \| string |
| dividendsPaid[].connectedPayerDividendRefund | number |
| dividendsPaid[].connectedPayerTotalEligibleDividends | number |
| dividendsPaid[].connectedPayerTotalTaxableDividends | number |
| dividendsPaid[].denial112 | boolean |
| dividendsPaid[].denial112Reason | array \| boolean \| null \| number \| object \| string |
| dividendsPaid[].direction | string |
| dividendsPaid[].dividendSource | string |
| dividendsPaid[].eligibleDividendsInF | integer |
| dividendsPaid[].isCapitalDividend | boolean |
| dividendsPaid[].isConnected | boolean |
| dividendsPaid[].nonTaxableDividendsS83 | number |
| dividendsPaid[].payerName | string |
| dividendsPaid[].payerYearEnd | array \| boolean \| null \| number \| object \| string |
| dividendsPaid[].rowIndex | integer |
| dividendsPaid[].s113Paragraph | string |
| dividendsPaid[].source | string |
| dividendsPaid[].statutoryOperands | object |
| dividendsPaid[].taxableDividendsDeductible | number |
| dividendsPaid[].workpaperId | string |
| dividendsPaid[].denial112DateUnresolved | boolean |
| dividendsPaid[].denial112Unresolved | boolean |
| dividendsReceived | array |
| form.amount_1A | number |
| form.amount_1B | number |
| form.amount_1C | number |
| form.amount_1D | number |
| form.amount_1E | number |
| form.amount_1F | number |
| form.amount_1G | number |
| form.amount_1H | number |
| form.amount_1I | number |
| form.amount_1J | number |
| form.amount_1K | number |
| form.amount_1L | number |
| form.amount_2A | number |
| form.amount_2B | number |
| form.amount_2C | number |
| form.amount_2D | number |
| form.amount_2E | number |
| form.amount_2F | number |
| form.amount_2G | number |
| form.amount_2H | number |
| form.amount_2I | number |
| form.amount_2J | number |
| form.amount_3A | number |
| form.amount_3B | number |
| form.amount_4A | number |
| form.amount_4B | number |
| form.continuationScheduleRequired.part1 | integer |
| form.continuationScheduleRequired.part3 | integer |
| form.formWarnings | array |
| form.line_320 | number |
| form.line_330 | number |
| form.line_335 | number |
| form.line_340 | number |
| form.line_345 | number |
| form.line_360 | number |
| form.line_450 | number |
| form.line_455 | number |
| form.line_460 | number |
| form.line_465 | number |
| form.line_470 | number |
| form.line_500 | number |
| form.line_510 | number |
| form.line_520 | number |
| form.line_530 | number |
| form.line_540 | number |
| form.part1Table | array |
| form.part3Table | array |
| form.line_100 | array \| boolean \| null \| number \| object \| string |
| grossPartIVTaxBeforeSchedule43Reduction | number |
| missing_required | array |
| nonDeductibleBreakdown | array |
| part4ExclusionEligiblePortion | number |
| partIVTaxConnected | number |
| partIVTaxNonConnected | number |
| provisional | boolean |
| ready | boolean |
| s112Breakdown | array |
| s113Breakdown | array |
| s113ParagraphTotals.a | number |
| s113ParagraphTotals.a1 | number |
| s113ParagraphTotals.a1NonBusinessIncomeTax | number |
| s113ParagraphTotals.b | number |
| s113ParagraphTotals.c | number |
| s113ParagraphTotals.cClauseIANonBusinessIncomeTax | number |
| s113ParagraphTotals.d | number |
| s113ParagraphTotals.lowRtf93_4_3_cClause113_1_c_i_AAmount | number |
| s113ParagraphTotals.lowRtf93_4_3_cDeduction | number |
| s113ParagraphTotals.lowRtf93_4_3_cOperandsEstablished | boolean |
| s113ParagraphTotals.paragraphHBaseOperandsEstablished | boolean |
| schedule43PartIVReduction.amount_2F | number |
| schedule43PartIVReduction.amount_2I | number |
| schedule43PartIVReduction.line_320 | number |
| totalCapitalDividendsPaid | number |
| totalColumnF235 | number |
| totalColumnG240 | number |
| totalConnectedTaxableDividends | number |
| totalEligibleDividends | number |
| totalEligibleDividendsPaid | number |
| totalForeignPortfolioDividends | number |
| totalForeignTaxableDividends | number |
| totalNonConnectedDividends | number |
| totalNonDeductiblePortfolio | number |
| totalNonEligibleS112DividendsReceived | number |
| totalNonEligibleTaxableDividendsPaid | number |
| totalNonTaxableS83Received | number |
| totalPartIVTax | number |
| totalS112Deduction | number |
| totalS113Deduction | number |
| totalS113_6Deduction | number |
| totalTaxableDividendsDeductible | number |
| totalTaxableDividendsPaid | number |
| totalTaxableDividendsPaidForRefund | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[] | object |
| warnings[].acceptedByClaim | object |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].kind | string |
| warnings[].reason | string |
| warnings[].requestedByClaim | object |
| warnings[].status | string |
| warnings[].templateId | string |
| warnings[].amount | number |
| warnings[].payerName | string |
| warnings[].rowIndex | integer \| null |
| warnings[].workpaperId | null \| string |
| warnings[].payerYearEnd | null \| string |
| warnings[].rowIndices[] | integer \| null |
| totalForeignAffiliateDividendAmounts | number |
| section55Receivers | array |
| creditUnionAllocationReview.deductionReduction | number |
| creditUnionAllocationReview.electionMade | array \| boolean \| null \| number \| object \| string |
| creditUnionAllocationReview.incomeInclusion | number |
| creditUnionAllocationReview.recipientIsCreditUnion | array \| boolean \| null \| number \| object \| string |
| creditUnionAllocationReview.required | boolean |
| creditUnionAllocationReview.rows | array |
| creditUnionAllocationReview.status | string |
| section137_5_2DeductionReduction | number |
| section137_5_2IncomeInclusion | number |
| totalNonConnectedAssessableDividends | number |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `warnings[]`: A Schedule 3 dividend-workpaper or coverage-review finding: the row, payer, claim or template the review is about, with the reason it is held.

# schedule31

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024 and later
- Strict profile: s31_single_apprenticeship_itc_profile_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): part_i_tax, schedule23, schedule4, schedule49, schedule74, schedule75, schedule76, schedule78, t661

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule31"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "corpType": "1",
    "filerBn": "123456782RC0001",
    "schedule31": {
      "hasRelatedEmployersForApprentices": false,
      "part19Rows": [
        {
          "contractNumber": "CTR-001",
          "eligibleTradeName": "Electrician",
          "eligibleSalaryWages": 10000
        }
      ]
    }
  }
}
```

## Input cells (168)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| corpType | string | strict |
| daysInYear | integer | strict |
| filerBn | string | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule31 | object |  |
| schedule31.amount25CRecapturedCleanHydrogen | null \| number |  |
| schedule31.amount25DRecapturedCleanTech | null \| number |  |
| schedule31.amount25ERecapturedCleanTechMfg | null \| number |  |
| schedule31.amount25GRecapturedCleanElectricity | null \| number \| string |  |
| schedule31.apprenticeshipItcOtherwiseBasisReduced | boolean \| null |  |
| schedule31.apprenticeshipItcRelatedToDeductedSalaryExpenditure | boolean \| null |  |
| schedule31.ecpcConsolidatedGroupAgreementConfirmed | boolean \| null |  |
| schedule31.ecpcConsolidatedGroupExpenditureLimit | null \| number |  |
| schedule31.ecpcConsolidatedGroupMember | boolean \| null |  |
| schedule31.ecpcConsolidatedGroupMemberAllocation | null \| number |  |
| schedule31.ecpcEligibilityConfirmed | boolean \| null |  |
| schedule31.ecpcRefundabilityApplicationConfirmed | boolean \| null |  |
| schedule31.farmingContributionNotAlreadyInT661 | boolean \| null |  |
| schedule31.farmingGrossContribution | null \| number |  |
| schedule31.hasRelatedEmployersForApprentices | boolean \| null | strict |
| schedule31.isAssociatedForExpLimit | boolean \| null |  |
| schedule31.isCcpc | boolean \| null |  |
| schedule31.isEcpc | boolean \| null |  |
| schedule31.isElectingRevenueBasedLimit | boolean \| null |  |
| schedule31.isExcludedCorp | boolean \| null |  |
| schedule31.isFarmingCheckOffDuesClaimant | boolean \| null |  |
| schedule31.isQualifyingCorp | boolean \| null |  |
| schedule31.itcBusinessContinuesPostAoc | boolean \| null |  |
| schedule31.itcLossRestrictionEventDate | null \| string |  |
| schedule31.line140CleanHydrogenItc | null \| number |  |
| schedule31.line155CleanTechItc | null \| number |  |
| schedule31.line170CleanTechMfgItc | null \| number |  |
| schedule31.line185CleanElectricityApprenticeHoursActual | null \| number |  |
| schedule31.line185CleanElectricityApprenticeHoursRequired | null \| number |  |
| schedule31.line185CleanElectricityAttestationDate | null \| string |  |
| schedule31.line185CleanElectricityClaimFormAuthorized | boolean \| null |  |
| schedule31.line185CleanElectricityDaysBelowPrevailingWage | null \| number |  |
| schedule31.line185CleanElectricityItc | null \| number |  |
| schedule31.line185CleanElectricityLabourElection | boolean \| null |  |
| schedule31.line185CleanElectricityMetLabourRequirements | null \| string |  |
| schedule31.line185CleanElectricityProperties | array |  |
| schedule31.line185CleanElectricityProperties[].acquisitionDate | null \| string |  |
| schedule31.line185CleanElectricityProperties[].assistanceAmount | null \| number |  |
| schedule31.line185CleanElectricityProperties[].availableForUseDate | null \| string |  |
| schedule31.line185CleanElectricityProperties[].capitalCost | null \| number |  |
| schedule31.line185CleanElectricityProperties[].designatedWorkSites | null \| string |  |
| schedule31.line185CleanElectricityProperties[].otherCleanEconomyCreditClaimedOnProperty | null \| string |  |
| schedule31.line185CleanElectricityProperties[].preparedOrInstalledDate | null \| string |  |
| schedule31.line185CleanElectricityProperties[].propertyIdentifier | null \| string |  |
| schedule31.line185CleanElectricityProperties[].qualifyingEntityType | null \| string |  |
| schedule31.line185CleanElectricityProperties[].writtenAgreementConfirmed | null \| string |  |
| schedule31.line185CleanElectricitySigningOfficerFirstName | null \| string |  |
| schedule31.line185CleanElectricitySigningOfficerLastName | null \| string |  |
| schedule31.line185CleanElectricitySigningOfficerPosition | null \| string |  |
| schedule31.line185CleanElectricityWorkersBelowPrevailingWageCount | null \| number |  |
| schedule31.line200CcusItc | null \| number |  |
| schedule31.line210CoopRemittanceQp | null \| number |  |
| schedule31.line215CreditExpiredQpExtra | null \| number |  |
| schedule31.line230AmalgamTransferInQp | null \| number |  |
| schedule31.line235ItcFromRepaymentQp | null \| number |  |
| schedule31.line250PartnershipAllocationQp | null \| number |  |
| schedule31.line260DeductedFromPartIQp | null \| number |  |
| schedule31.line280TransferredToPartViiQp | null \| number |  |
| schedule31.line310RefundClaimedQp | null \| number |  |
| schedule31.line360CapitalExpendituresT661 | null \| number |  |
| schedule31.line370RepaymentsT661 | null \| number |  |
| schedule31.line390PriorYearTaxableIncome | null \| number |  |
| schedule31.line398PyTaxableCapitalMinus10M | null \| number |  |
| schedule31.line399EcpcRevenueMinus15M | null \| number |  |
| schedule31.line400Schedule49Allocation | null \| number |  |
| schedule31.line460RepaymentAssistanceCcpc | null \| number |  |
| schedule31.line480RepaymentPre2015 | null \| number |  |
| schedule31.line490RepaymentPost2014 | null \| number |  |
| schedule31.line510CoopRemittanceSred | null \| number |  |
| schedule31.line515CreditExpiredSredExtra | null \| number |  |
| schedule31.line530AmalgamTransferInSred | null \| number |  |
| schedule31.line550PartnershipAllocationSred | null \| number |  |
| schedule31.line560DeductedFromPartISred | null \| number |  |
| schedule31.line580TransferredToPartViiSred | null \| number |  |
| schedule31.line610RefundClaimedSred | null \| number \| string |  |
| schedule31.line611RelatedEmployerSingleClaimerAgreement | boolean \| null |  |
| schedule31.line612CoopRemittanceAjctc | null \| number |  |
| schedule31.line615CreditExpiredAjctcExtra | null \| number |  |
| schedule31.line630AmalgamTransferInAjctc | null \| number |  |
| schedule31.line635ItcFromRepaymentAjctc | null \| number |  |
| schedule31.line655PartnershipAllocationAjctc | null \| number |  |
| schedule31.line660DeductedFromPartIAjctc | null \| number |  |
| schedule31.line760PartnershipExcessSred | null \| number |  |
| schedule31.line765CoopRemittanceChildCare | null \| number |  |
| schedule31.line770CreditExpiredChildCareExtra | null \| number |  |
| schedule31.line777AmalgamTransferInChildCare | null \| number |  |
| schedule31.line782PartnershipAllocationChildCare | null \| number |  |
| schedule31.line785DeductedFromPartIChildCare | null \| number |  |
| schedule31.line799PartnershipExcessChildCare | null \| number |  |
| schedule31.line841CoopRemittancePpm | null \| number |  |
| schedule31.line845CreditExpiredPpmExtra | null \| number |  |
| schedule31.line860AmalgamTransferInPpm | null \| number |  |
| schedule31.line885CarryforwardAppliedPpm | null \| number |  |
| schedule31.line901CarrybackY1Qp | null \| number |  |
| schedule31.line902CarrybackY2Qp | null \| number |  |
| schedule31.line903CarrybackY3Qp | null \| number |  |
| schedule31.line911CarrybackY1Sred | null \| number |  |
| schedule31.line912CarrybackY2Sred | null \| number |  |
| schedule31.line913CarrybackY3Sred | null \| number |  |
| schedule31.line931CarrybackY1Ajctc | null \| number |  |
| schedule31.line932CarrybackY2Ajctc | null \| number |  |
| schedule31.line933CarrybackY3Ajctc | null \| number |  |
| schedule31.openingCarryforwardApprenticeshipByVintage | null \| object |  |
| schedule31.openingCarryforwardChildCareByVintage | null \| object |  |
| schedule31.openingCarryforwardPpmByVintage | null \| object |  |
| schedule31.openingCarryforwardQpByVintage | null \| object |  |
| schedule31.openingCarryforwardSredByVintage | null \| object |  |
| schedule31.openingPreLossRestrictionCohorts | null \| object |  |
| schedule31.openingPreLossRestrictionVintages | null \| object |  |
| schedule31.part16Calc1Rows | array |  |
| schedule31.part16Calc1Rows[].acquisitionYear | null \| number |  |
| schedule31.part16Calc1Rows[].description | null \| string |  |
| schedule31.part16Calc1Rows[].isArmLengthDisposition | boolean \| null |  |
| schedule31.part16Calc1Rows[].nonArmLengthIntendsAllOrSubstantiallyAllSredUse | boolean \| null |  |
| schedule31.part16Calc1Rows[].originalItc | null \| number |  |
| schedule31.part16Calc1Rows[].recalcAtAcquisitionRate | null \| number |  |
| schedule31.part16Calc2Rows | array |  |
| schedule31.part16Calc2Rows[].alreadyRecapturedCalc1 | null \| number |  |
| schedule31.part16Calc2Rows[].description | null \| string |  |
| schedule31.part16Calc2Rows[].itcEarnedByTransferee | null \| number |  |
| schedule31.part16Calc2Rows[].podOrFmv | null \| number |  |
| schedule31.part16Calc2Rows[].transfereeRate | null \| number |  |
| schedule31.part19Rows | array |  |
| schedule31.part19Rows[].contractNumber | null \| string | strict |
| schedule31.part19Rows[].eligibleSalaryWages | null \| number | strict |
| schedule31.part19Rows[].eligibleSalaryWagesNetConfirmed | boolean \| null |  |
| schedule31.part19Rows[].eligibleTradeName | null \| string | strict |
| schedule31.part19Rows[].isEmployedInCanada | boolean \| null |  |
| schedule31.part19Rows[].isWithinFirst24MonthsOfRegisteredContract | boolean \| null |  |
| schedule31.part19Rows[].sourceEmploymentId | null \| string |  |
| schedule31.part19Rows[].tradeIsPrescribed | boolean \| null |  |
| schedule31.part23Rows | array |  |
| schedule31.part23Rows[].acquisitionYear | null \| number |  |
| schedule31.part23Rows[].description | null \| string |  |
| schedule31.part23Rows[].originalItcChildCareSpace | null \| number |  |
| schedule31.part23Rows[].originalItcEligibleExpenditure | null \| number |  |
| schedule31.part23Rows[].podOrFmv | null \| number |  |
| schedule31.part4Rows | array |  |
| schedule31.part4Rows[].assistanceAmount | null \| number |  |
| schedule31.part4Rows[].assistanceSourceCategory | null \| string |  |
| schedule31.part4Rows[].atlanticLocation | null \| string |  |
| schedule31.part4Rows[].ccaClass | null \| string |  |
| schedule31.part4Rows[].dateAvailableForUse | null \| string |  |
| schedule31.part4Rows[].description | null \| string |  |
| schedule31.part4Rows[].investmentAmount | null \| number |  |
| schedule31.priorFiscalPeriodsComplete | boolean \| null |  |
| schedule31.priorYearS13_7_1UccReduction | null \| object |  |
| schedule31.priorYearTaxYearDays | null \| number |  |
| schedule31.priorYearTaxYearS249_4_bElection | boolean \| null |  |
| schedule31.revenuePriorYear1 | null \| number |  |
| schedule31.revenuePriorYear2 | null \| number |  |
| schedule31.revenuePriorYear3 | null \| number |  |
| schedule31.schedule125FarmingIndustryLinked | boolean \| null |  |
| schedule31.schedule31FilingDueDate | null \| string |  |
| schedule31.schedule31PrescribedFormFiledDate | null \| string |  |
| schedule31.schedule31PrescribedInformationComplete | boolean \| null |  |
| schedule31.t661Line559SredPool | null \| number |  |
| schedule31.taxPayableAttributableToSameOrSimilarBusiness | null \| number |  |
| schedule31.ultimateParentFiscalYearDaysPriorYear1 | null \| number |  |
| schedule31.ultimateParentFiscalYearDaysPriorYear2 | null \| number |  |
| schedule31.ultimateParentFiscalYearDaysPriorYear3 | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year, tied to the inclusive fiscalStart-to-fiscalEnd span. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this request's dependency closure computes are day-weighted, so the engine requires the stated count instead of assuming a calendar year.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `schedule31`: Schedule 31 (Investment Tax Credit, s.127) practitioner blob. A result is emitted only when the blob is present, so an unopened form never blocks export.
- `schedule31.amount25CRecapturedCleanHydrogen`: Amount 25C — Clean Hydrogen recapture / recovery (s.127.48).
- `schedule31.amount25DRecapturedCleanTech`: Amount 25D — Clean Tech recapture (s.127.45). From Schedule 75.
- `schedule31.amount25ERecapturedCleanTechMfg`: Amount 25E — Clean Tech Mfg recapture (s.127.49).
- `schedule31.amount25GRecapturedCleanElectricity`: Clean electricity investment tax credit recapture for the year, printed as form amount 24E. A negative value is floored to zero. Where the canonical ITA s.127.491(17) recapture events are also supplied, the calculated amount controls and a disagreement is reported as an error.
- `schedule31.apprenticeshipItcOtherwiseBasisReduced`: Was the credit already absorbed by one of the carve-outs — most often ITA 13(7.1)(e), which subtracts "all amounts deducted under subsection 127(5) or (6) ..." from the deemed capital cost of the property? A `true` answer makes the 12(1)(t) inclusion NIL: government grinds the pool or includes the credit in income, never both. `null` blocks.
- `schedule31.apprenticeshipItcRelatedToDeductedSalaryExpenditure`: Did the credit relate to salary and wages that were themselves DEDUCTED in computing income? That is the ITA 12(1)(t) precondition. `null` blocks the following year's Schedule 1.
- `schedule31.ecpcConsolidatedGroupMember`: Was the ECPC a member of a consolidated group at any time in the year? ITA 127(10.61) makes a member's expenditure limit nil absent an allocation under 127(10.62)/(10.63).
- `schedule31.ecpcEligibilityConfirmed`: Underlying ITA 127(9) residence, public-corporation/control or eligible- subsidiary tests have been reviewed and documented. Box 382 alone is not treated as a second copy of that legal-status evidence.
- `schedule31.ecpcRefundabilityApplicationConfirmed`: The ECPC refund claim satisfies S.C. 2026, c. 3, s.48(5)'s property- acquisition / lease-cost application dates.
- `schedule31.farmingContributionNotAlreadyInT661`: The check-off contribution entered in Part 3 is not already included in the producer corporation's Form T661. Explicit false blocks duplication.
- `schedule31.farmingGrossContribution`: Gross contribution amount (engine applies 80% factor → line 103).
- `schedule31.hasRelatedEmployersForApprentices`: T2 SCH 31 Part 19 box 611: related employers employ the same eligible apprentice, so the s.127(9) apprenticeship expenditure cap must be shared under the related-employer agreement.
- `schedule31.isAssociatedForExpLimit`: Part 9 line 385 — Associated with another CCPC for SR&ED expenditure-limit purposes (per s.127(10.1)/(10.2)). When true, triggers Schedule 49 dependency.
- `schedule31.isCcpc`: Throughout-the-year CCPC status per s.125(7). Gates the 35% enhanced SR&ED rate (s.127(10.1)) and refundability under Part 14/15.
- `schedule31.isEcpc`: Line 382 — Are you an eligible Canadian public corporation (ECPC)?
- `schedule31.isElectingRevenueBasedLimit`: Line 383 — Are you a CCPC electing under s.127(10.31) (single) or s.127(10.32) (associated group) to determine the SR&ED expenditure limit on the REVENUE measure instead of taxable capital? When true (or for an ECPC) in a TYS-after-Dec-15-2024 year, Part 10B substitutes line 399 for line 398 in the $6M × [($60M − A) ÷ $60M] formula.
- `schedule31.isExcludedCorp`: Part 2B line 650 — Excluded corporation per s.127.1(2) (controlled by / related to tax-exempt or public-authority persons). Triggers footnote-7 40%-on-all refund tier.
- `schedule31.isFarmingCheckOffDuesClaimant`: Part 3 line 102 — Claiming an agricultural-organization SR&ED contribution (e.g. check-off dues). 80% factor applies.
- `schedule31.isQualifyingCorp`: Part 2A line 101 — Qualifying corporation per s.127.1(2) (CCPC + PY taxable income ≤ qualifying income limit).
- `schedule31.itcBusinessContinuesPostAoc`: Tri-state attestation: the same or a similar business (s.127(9.1)(d)(i)) is carried on for profit post-AoC and substantially all post-AoC tax payable is attributable to it, so the s.127(5) tax-payable cap already binds. null = unanswered — a Part-I deduction drawing on a pre-AoC opening pool FAILS CLOSED (error severity, removed from T2 line 652) until this is answered or the s.127(9.1)(d) cap below is supplied.
- `schedule31.itcLossRestrictionEventDate`: ISO YYYY-MM-DD date of the loss restriction event the corporation was last subject to. Send it with the pre-event vintages or cohorts when no linked prior filed return carries that provenance. An unparseable value raises and blocks the restriction calculation.
- `schedule31.line140CleanHydrogenItc`: Line 140 — Clean Hydrogen ITC (s.127.48). Sourced from Schedule 76 (RETRIEVAL-OPEN — CRA may publish later); entered directly today.
- `schedule31.line155CleanTechItc`: Line 155 — Clean Technology ITC (s.127.45). From Schedule 75.
- `schedule31.line170CleanTechMfgItc`: Line 170 — Clean Tech Manufacturing ITC (s.127.49). Entered directly on S31 (no separate companion form per Part 24).
- `schedule31.line185CleanElectricityClaimFormAuthorized`: s.127.491(2) prescribed form containing prescribed information was completed by the filing-due date.
- `schedule31.line185CleanElectricityItc`: Line 185 — Clean electricity ITC (s.127.491). E (26) fifth clean-economy stream; property acquired after Apr 15 2024.
- `schedule31.line185CleanElectricityLabourElection`: s.127.46(2) election to claim the regular rather than reduced rate.
- `schedule31.line185CleanElectricityMetLabourRequirements`: Installation-year s.127.46(3)/(5) compliance answer.
- `schedule31.line185CleanElectricityProperties`: Per-property authority for line 185.
- `schedule31.line185CleanElectricityProperties[].designatedWorkSites`: s.127.46(1) designated work site(s) covered by the labour election.
- `schedule31.line185CleanElectricityProperties[].otherCleanEconomyCreditClaimedOnProperty`: ITA 127.491(9)(a)(ii): another clean-economy credit claimed by any person.
- `schedule31.line185CleanElectricityProperties[].preparedOrInstalledDate`: s.127.46(1) installation taxation year: the date preparation or installation was completed. s.127.46 reaches this credit only for property prepared or installed on or after 2023-11-28, and the available-for-use date is not a substitute.
- `schedule31.line185CleanElectricityProperties[].propertyIdentifier`: Shared fixed-asset key for the five-credit anti-stacking register.
- `schedule31.line185CleanElectricitySigningOfficerFirstName`: Prescribed-form signing-officer evidence for a regular-rate election.
- `schedule31.line200CcusItc`: Line 200 — Carbon Capture, Utilization & Storage ITC (s.127.44). From Schedule 78.
- `schedule31.line210CoopRemittanceQp`: Line 210 — Credit deemed as a remittance of co-op corporations.
- `schedule31.line215CreditExpiredQpExtra`: Line 215 EXTRA — Manual addition to the engine-computed expiry amount (carryforward expiries are auto-detected from vintage ledger; this captures any non-vintage-tracked adjustments).
- `schedule31.line230AmalgamTransferInQp`: Line 230 — Credit transferred on amalgamation / wind-up (s.87/88).
- `schedule31.line235ItcFromRepaymentQp`: Legacy reported line 235. The engine neutralizes it until an authenticated repayment/property authority path is implemented.
- `schedule31.line250PartnershipAllocationQp`: Line 250 — Credit allocated from a partnership (s.127(8)).
- `schedule31.line260DeductedFromPartIQp`: Line 260 — Credit deducted from Part I tax.
- `schedule31.line280TransferredToPartViiQp`: Line 280 — Credit transferred to offset Part VII tax liability.
- `schedule31.line310RefundClaimedQp`: Line 310 — Refund amount designated on the prescribed form under ITA 127.1(1)(d), capped by the Part 7 maximum. Explicit 0 is a valid designation; null leaves the designation unanswered.
- `schedule31.line360CapitalExpendituresT661`: Line 360 — Capital SR&ED expenditures incurred after December 15, 2024 (T661 line 558). E (26): the 2024 reform restores capital SR&ED for depreciable property acquired after Dec 15 2024 used for SR&ED.
- `schedule31.line370RepaymentsT661`: Line 370 — Repayments made in the year (T661 line 560).
- `schedule31.line390PriorYearTaxableIncome`: Box 390 — PY taxable income (pre loss-carrybacks). Short-year prorated by the engine per form note.
- `schedule31.line398PyTaxableCapitalMinus10M`: Legacy/import line 398 value. Hub computation derives this stand-alone CCPC line from canonical Prior-Year Tax Attributes TCEC; associated CCPCs use Schedule 49. Retained for imported form data and API backward compatibility, never derived from the current-year draft S33 node.
- `schedule31.line399EcpcRevenueMinus15M`: Line 399 — variable A of s.127(10.6): three-year average annual revenue MINUS $15M (floored at 0, capped at $60M). The form-faithful DIRECT input — the practitioner enters the already-averaged/grossed-up figure. Supply this OR the raw revenuePriorYear1/2/3 inputs below (the raw path, when supplied, wins and lets the engine do the averaging).
- `schedule31.line400Schedule49Allocation`: Legacy/import line 400 value. Hub computation resolves the filing corporation's canonical Schedule 49 row; retained only as an API/import fallback for records without a matched Schedule 49 result.
- `schedule31.line460RepaymentAssistanceCcpc`: Line 460 — Repayment of assistance that reduced a qualifying expenditure for a CCPC. 35% rate applied.
- `schedule31.line480RepaymentPre2015`: Line 480 — Repayment of assistance made after Sep 16, 2016 that reduced a qualifying expenditure incurred BEFORE 2015. 20% rate.
- `schedule31.line490RepaymentPost2014`: Line 490 — Repayment of assistance made after Sep 16, 2016 that reduced a qualifying expenditure incurred AFTER 2014. 15% rate.
- `schedule31.line610RefundClaimedSred`: Box 610, the refund of the SR&ED investment tax credit claimed for the year. On an eligible Canadian private corporation in a reform year it is the separate ITA s.127.1 refund claim that S.C. 2026, c. 3, s.48(5) governs: ECPC status and the tax-year-start rule prove the enhanced rate, not this refund rule, so state the amount rather than leaving it to be inferred.
- `schedule31.line611RelatedEmployerSingleClaimerAgreement`: Part 19 line 611 — Related-employer single-claimer agreement is on file per s.127(11.4) when multiple s.251(2)-related employers jointly employ an apprentice.
- `schedule31.line635ItcFromRepaymentAjctc`: Legacy reported line 635. The engine neutralizes it until an authenticated repayment/apprentice authority path is implemented.
- `schedule31.line760PartnershipExcessSred`: Line 760 — Corporate partner's share of partnership-level excess SR&ED ITC recapture (s.127(28)).
- `schedule31.line799PartnershipExcessChildCare`: Line 799 — Corporate partner's share of partnership-level excess child-care-spaces ITC recapture.
- `schedule31.line885CarryforwardAppliedPpm`: Line 885 — Carryforward applied to reduce Part I tax.
- `schedule31.line901CarrybackY1Qp`: Line 901 — Credit applied to 1st previous tax year.
- `schedule31.line902CarrybackY2Qp`: Line 902 — Credit applied to 2nd previous tax year.
- `schedule31.line903CarrybackY3Qp`: Line 903 — Credit applied to 3rd previous tax year.
- `schedule31.openingCarryforwardQpByVintage`: Opening carryforward by vintage year (per s.127(9)(c) 20-year clock). Key is the year-of-original-generation (as string per JSON convention). Vintages older than tax_year − 20 are expired by the engine and rolled into the per-stream line 215/515/615/770.
- `schedule31.openingPreLossRestrictionCohorts`: Per credit stream, the opening carryforward earned before the loss restriction event keyed by vintage year, as stream to year to amount and taxationPeriodId. The streams are qualifiedProperty, sred, apprenticeship, preProductionMining and childCareSpaces; a bare amount may stand in for the object. Each amount must be non-negative.
- `schedule31.openingPreLossRestrictionVintages`: Per credit stream, the list of vintage years whose opening carryforward was earned before the loss restriction event. Each year may be an integer or a four-digit string. This is the coarser sibling of openingPreLossRestrictionCohorts, kept for filed renders that carry no cohort detail.
- `schedule31.part16Calc1Rows[].acquisitionYear`: Tax year in which the property was acquired. 20-year lookback.
- `schedule31.part16Calc1Rows[].isArmLengthDisposition`: Whether the disposition was at arm's length. Drives the former s.127(27.1) carve-out (repealed 2017, c. 20, s. 23).
- `schedule31.part16Calc1Rows[].nonArmLengthIntendsAllOrSubstantiallyAllSredUse`: Per form Part 16 note + former s.127(27.1) (repealed 2017, c. 20, s. 23): when true AND isArmLengthDisposition is false, recapture is deferred to the purchaser.
- `schedule31.part16Calc1Rows[].originalItc`: Column 700 — original ITC amount calculated on the property when acquired (or original user's ITC for non-arm's-length acquirees).
- `schedule31.part16Calc1Rows[].recalcAtAcquisitionRate`: Column 710 — ITC rate at acquisition × proceeds-of-disposition (arm's-length) or fair-market-value (non-arm's-length).
- `schedule31.part16Calc2Rows[].alreadyRecapturedCalc1`: Column 740 — Amount already recaptured under Calc 1 on the same property (avoids double-counting on partial transfers).
- `schedule31.part16Calc2Rows[].itcEarnedByTransferee`: Column 750 — ITC earned by the transferee for the transferred expenditures (caps the formula result).
- `schedule31.part16Calc2Rows[].podOrFmv`: Column 730 — Proceeds of disposition (arm's-length) or FMV (other cases) at conversion / disposition.
- `schedule31.part16Calc2Rows[].transfereeRate`: Column 720 — Rate the transferee used in determining its ITC for qualified expenditures under the s.127(13) agreement.
- `schedule31.part19Rows[].contractNumber`: Column 601 — Apprenticeship contract number (or SIN or name when contract # unavailable).
- `schedule31.part19Rows[].eligibleSalaryWages`: Column 603 — Eligible salary and wages payable to the apprentice for the tax year (net of any other government / non-government assistance).
- `schedule31.part19Rows[].eligibleSalaryWagesNetConfirmed`: Explicit s.127(11.1)(c.4) confirmation; the wage amount alone cannot prove that assistance was removed.
- `schedule31.part19Rows[].eligibleTradeName`: Column 602 — Name of the eligible Red-Seal trade.
- `schedule31.part19Rows[].isEmployedInCanada`: ITA 127(9) "eligible apprentice" — employed in Canada.
- `schedule31.part19Rows[].isWithinFirst24MonthsOfRegisteredContract`: ITA 127(9) "eligible apprentice" — within the registered contract's first 24 months.
- `schedule31.part19Rows[].sourceEmploymentId`: Stable apprentice/payroll identity. Reuse it if the same individual has more than one contract row so the per-apprentice cap cannot be duplicated.
- `schedule31.part19Rows[].tradeIsPrescribed`: ITA 127(9) "eligible apprentice" — trade prescribed for Canada/province.
- `schedule31.part23Rows[].acquisitionYear`: Tax year in which the property was acquired. 60-month lookback (5 years) per former s.127(27.12) (repealed 2017, c. 20, s. 23).
- `schedule31.part23Rows[].originalItcChildCareSpace`: Line 792 — Original ITC amount on a disposed child care space (former s.127(27.12)(a), repealed 2017, c. 20, s. 23).
- `schedule31.part23Rows[].originalItcEligibleExpenditure`: Line 795 — Original ITC on a disposed eligible expenditure property (former s.127(27.12)(b) input, repealed 2017, c. 20, s. 23).
- `schedule31.part23Rows[].podOrFmv`: Proceeds of disposition (arm's-length) or FMV (other cases). Drives line 797 = 25% × this amount.
- `schedule31.part4Rows[].assistanceAmount`: Assistance reasonably attributable to acquiring the property under s.127(11.1)(b); the engine subtracts it when publishing box 125.
- `schedule31.part4Rows[].assistanceSourceCategory`: Whether that assistance is government, non-government, or affirmatively none.
- `schedule31.part4Rows[].atlanticLocation`: Column 120 — Atlantic Canada province code or "Gaspé Peninsula" / "offshore" identifier per Reg 4610 + Reg 4609.
- `schedule31.part4Rows[].ccaClass`: Column 105 — CCA class number (e.g. "8", "10", "53").
- `schedule31.part4Rows[].dateAvailableForUse`: Column 115 — date available for use (ISO YYYY-MM-DD). Drives the s.127(11.2) AFU timing gate.
- `schedule31.part4Rows[].description`: Column 110 — free-form description of the investment.
- `schedule31.part4Rows[].investmentAmount`: Capital cost before the s.127(11.1)(b) assistance reduction and before s.13(7.1)/(7.4) grinds. The engine publishes the net at box 125.
- `schedule31.priorFiscalPeriodsComplete`: Attestation that every taxation period preceding this one is present in the binder, so the preceding-period count can be used as the statutory count for the carryback and vintage arithmetic. Must be true, false or null; anything else is rejected.
- `schedule31.priorYearS13_7_1UccReduction`: Schedule 31's prior-year qualified-property investment tax credit grind on undepreciated capital cost under ITA s.13(7.1), as an object with appliesToTaxYear, itcDeductedQp, itcRefundedQp, total, byClass and unattributed. Sent on this blob it is lifted into Schedule 8; the identically named root key is the other accepted spelling.
- `schedule31.priorYearTaxYearDays`: Days in the prior tax year. Drives short-year proration of line 390.
- `schedule31.priorYearTaxYearS249_4_bElection`: Whether the corporation elected under ITA paragraph 249(4)(b) for the preceding taxation year. Paragraph 249.1(1)(a) caps a corporate fiscal period at 53 weeks, and 249(4)(b) extends that by up to seven days where the prior year would otherwise have ended in the seven-day period before an acquisition of control, but only where the taxpayer so elects in its return for that year. Only an explicit true buys the extra days, so an unelected day count above the 53-week ceiling stays unlawful and the prior-year day count is refused.
- `schedule31.revenuePriorYear1`: RAW-revenue path (s.127(10.6)/(10.64), form line-399 footnote 5): the annual revenue reflected in the financial statements for the 1st/2nd/3rd fiscal year immediately preceding and ending before this tax year. The engine requires the set matching the canonical prior periods. For a consolidated-group ECPC, the accompanying ultimate-parent fiscal-year day counts are required by s.127(10.64)(d).
- `schedule31.schedule125FarmingIndustryLinked`: Schedule 125 identifies the corporation's farming industry, as required by the Schedule 31 Part 3 instruction once box 102 is Yes.
- `schedule31.schedule31FilingDueDate`: The taxpayer's filing-due date, as an exact ISO YYYY-MM-DD date after the tax-year end. Read with schedule31PrescribedFormFiledDate to test the ITA s.127(9) rule that the prescribed Schedule 31 information be filed no later than 12 months after it. Required once a T661 claim exposes a current-year ITC base; either date missing or on or before the year end blocks at error severity.
- `schedule31.schedule31PrescribedFormFiledDate`: The date the prescribed Schedule 31 information was or will be filed, as an exact ISO YYYY-MM-DD date after the tax-year end. The other half of the ITA s.127(9) 12-month deadline test; see schedule31FilingDueDate.
- `schedule31.schedule31PrescribedInformationComplete`: Confirmation that Schedule 31 itself contains the prescribed ITC information. The ITA s.127(9) form deadline is a separate statutory gate from the T661 s.37 prescribed-information deadline, so a complete and timely T661 is not a substitute. Only true releases the current-year T661 credit base; blank and false both hold it at error severity.
- `schedule31.t661Line559SredPool`: T661 line 559 — SR&ED qualified expenditure pool. Engine adds the Part 3 line 103 (farming check-off × 80%) automatically.
- `schedule31.taxPayableAttributableToSameOrSimilarBusiness`: s.127(9.1)(d) cap — Part I tax otherwise payable × same-or-similar business income ÷ taxable income (practitioner-computed; the income streaming is not derivable from S31's own inputs). The pre-AoC claim is ground to this cap. Explicit 0 is valid; null = not supplied.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (14 of 168 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| corpType | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| filerBn | 0 to 20000 characters |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule31.line185CleanElectricityMetLabourRequirements | one of "Y", "N" |
| schedule31.line185CleanElectricityProperties[].otherCleanEconomyCreditClaimedOnProperty | one of "Y", "N" |
| schedule31.line185CleanElectricityProperties[].qualifyingEntityType | one of "taxable_corporation", "qualifying_trust" |
| schedule31.line185CleanElectricityProperties[].writtenAgreementConfirmed | one of "Yes", "No" |
| schedule31.part19Rows[].contractNumber | 0 to 20000 characters |
| schedule31.part19Rows[].eligibleSalaryWages | -1000000000000000 to 1000000000000000 |
| schedule31.part19Rows[].eligibleTradeName | 0 to 20000 characters |
| schedule31.part4Rows[].assistanceSourceCategory | one of "none", "government", "non_government" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (322)

| Cell | Types |
| --- | --- |
| amount_10A | number |
| amount_10B | number |
| amount_10C | number |
| amount_10D | number |
| amount_10D_selected_base | number |
| amount_10D_tax_year_days | integer |
| amount_11A | number |
| amount_11B | number |
| amount_11C | number |
| amount_11D | number |
| amount_11E | number |
| amount_11F | number |
| amount_11G | number |
| amount_11H | number |
| amount_11I | number |
| amount_11J | number |
| amount_12A | number |
| amount_12B | number |
| amount_12C | number |
| amount_12D | number |
| amount_12E | number |
| amount_12F | number |
| amount_12G | number |
| amount_13A | number |
| amount_14A | number |
| amount_14B | number |
| amount_14C | number |
| amount_14D | number |
| amount_14E | number |
| amount_14F | number |
| amount_14G | number |
| amount_15A | number |
| amount_15B | number |
| amount_15C | number |
| amount_15D | number |
| amount_15E | number |
| amount_15F | number |
| amount_15G | number |
| amount_16A | number |
| amount_16B | number |
| amount_17A | number |
| amount_17B | number |
| amount_17C | number |
| amount_17D | number |
| amount_18A | number |
| amount_18B | number |
| amount_18C | number |
| amount_19A | number |
| amount_20A | number |
| amount_20B | number |
| amount_20C | number |
| amount_20D | number |
| amount_20E | number |
| amount_20F | number |
| amount_21A | number |
| amount_22A | number |
| amount_22B | number |
| amount_22C | number |
| amount_22D | number |
| amount_23A_total | number |
| amount_23B | number |
| amount_24A | number |
| amount_25A | number |
| amount_25B | number |
| amount_25C | number |
| amount_25D | number |
| amount_25E | number |
| amount_25F | number |
| amount_25G_clean_electricity | number |
| amount_26A | number |
| amount_26B | number |
| amount_26C | number |
| amount_26D | number |
| amount_26E | number |
| amount_26F | number |
| amount_4A | number |
| amount_5A | number |
| amount_5B | number |
| amount_5C | number |
| amount_5D | number |
| amount_5E | number |
| amount_5F | number |
| amount_5G | number |
| amount_6A | number |
| amount_7A | number |
| amount_7B | number |
| amount_7C | number |
| closingCarryforwardByVintage.apprenticeship | object |
| closingCarryforwardByVintage.childCareSpaces | object |
| closingCarryforwardByVintage.preProductionMining | object |
| closingCarryforwardByVintage.qualifiedProperty | object |
| closingCarryforwardByVintage.sred | object |
| expired_apprentice_detail | array |
| expired_childcare_detail | array |
| expired_ppm_detail | array |
| expired_qp_detail | array |
| expired_sred_detail | array |
| farmingGrossContribution | number |
| fired_gates | object |
| hasRelatedEmployersForApprentices | boolean \| null |
| isAssociatedForExpLimit | boolean |
| isCcpc | boolean |
| isExcludedCorp | array \| boolean \| null \| number \| object \| string |
| isQualifyingCorp | boolean |
| itcBusinessContinuesPostAoc | array \| boolean \| null \| number \| object \| string |
| line_101 | boolean |
| line_102 | boolean |
| line_103 | number |
| line_105 | array \| boolean \| null \| number \| object \| string |
| line_110 | array \| boolean \| null \| number \| object \| string |
| line_115 | array \| boolean \| null \| number \| object \| string |
| line_120 | array \| boolean \| null \| number \| object \| string |
| line_125 | number |
| line_140 | number |
| line_155 | number |
| line_170 | number |
| line_185 | number |
| line_200 | number |
| line_210 | number |
| line_215 | number |
| line_220 | number |
| line_230 | number |
| line_235 | number |
| line_240 | number |
| line_250 | number |
| line_260 | number |
| line_280 | number |
| line_310 | number |
| line_320 | number |
| line_350 | number |
| line_360 | number |
| line_370 | number |
| line_380 | number |
| line_382 | boolean |
| line_383 | boolean |
| line_385 | array \| boolean \| null \| number \| object \| string |
| line_385_input_source | string |
| line_390 | number |
| line_398 | number |
| line_398_authoritative_input_provided | boolean |
| line_398_input_metadata.asOf | array \| boolean \| null \| number \| object \| string |
| line_398_input_metadata.basis | array \| boolean \| null \| number \| object \| string |
| line_398_input_metadata.confirmed | boolean |
| line_398_input_metadata.expectedAsOf | string |
| line_398_input_metadata.expectedBasis | string |
| line_398_input_metadata.source | array \| boolean \| null \| number \| object \| string |
| line_398_input_source | string |
| line_399 | number |
| line_399_source | array \| boolean \| null \| number \| object \| string |
| line_400 | number |
| line_400_authoritative_input_provided | boolean |
| line_400_input_source | string |
| line_400_matched_business_number | array \| boolean \| null \| number \| object \| string |
| line_400_matched_corporation_type_code | array \| boolean \| null \| number \| object \| string |
| line_410 | number |
| line_420 | number |
| line_430 | number |
| line_440 | number |
| line_450 | number |
| line_460 | number |
| line_480 | number |
| line_490 | number |
| line_510 | number |
| line_515 | number |
| line_520 | number |
| line_530 | number |
| line_540 | number |
| line_550 | number |
| line_560 | number |
| line_580 | number |
| line_601 | null \| string |
| line_602 | null \| string |
| line_603 | null \| number |
| line_604 | number |
| line_605 | number |
| line_610 | number |
| line_611 | array \| boolean \| null \| number \| object \| string |
| line_612 | number |
| line_615 | number |
| line_620 | number |
| line_625 | number |
| line_630 | number |
| line_635 | number |
| line_640 | number |
| line_650 | array \| boolean \| null \| number \| object \| string |
| line_655 | number |
| line_660 | number |
| line_690 | number |
| line_700 | number |
| line_710 | number |
| line_720 | number |
| line_730 | number |
| line_740 | number |
| line_750 | number |
| line_760 | number |
| line_765 | number |
| line_770 | number |
| line_775 | number |
| line_777 | number |
| line_782 | number |
| line_785 | number |
| line_790 | number |
| line_792 | number |
| line_795 | number |
| line_797 | number |
| line_799 | number |
| line_841 | number |
| line_845 | number |
| line_850 | number |
| line_860 | number |
| line_885 | number |
| line_890 | number |
| line_901 | number |
| line_901_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_902 | number |
| line_902_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_903 | number |
| line_903_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_911 | number |
| line_911_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_912 | number |
| line_912_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_913 | number |
| line_913_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_931 | number |
| line_931_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_932 | number |
| line_932_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| line_933 | number |
| line_933_target_tax_year_end | array \| boolean \| null \| number \| object \| string |
| missing_required | array |
| part16Calc1Rows | array |
| part16Calc2Rows | array |
| part19Rows[].line_601 | null \| string |
| part19Rows[].line_602 | null \| string |
| part19Rows[].line_603 | null \| number |
| part19Rows[].line_604 | number |
| part19Rows[].line_605 | number |
| part19Rows[].sourceEmploymentId | array \| boolean \| null \| number \| object \| string |
| part23Rows | array |
| part4Rows | array |
| provisional | boolean |
| ready | boolean |
| reported_legacy_line_398 | array \| boolean \| null \| number \| object \| string |
| reported_legacy_line_400 | array \| boolean \| null \| number \| object \| string |
| revenue_election_active | boolean |
| s127_9_1_pre_aoc_deducted | number |
| s127_9_1_pre_aoc_opening_total | number |
| s127_9_1_restricted_excess | number |
| s127_9_1_same_business_tax_cap | array \| boolean \| null \| number \| object \| string |
| s13_7_1NextYearUccReduction.appliesToTaxYear | array \| boolean \| null \| number \| object \| string |
| s13_7_1NextYearUccReduction.byClass | array |
| s13_7_1NextYearUccReduction.itcDeductedQp | number |
| s13_7_1NextYearUccReduction.itcRefundedQp | number |
| s13_7_1NextYearUccReduction.sourceTaxYearEnd | array \| boolean \| null \| number \| object \| string |
| s13_7_1NextYearUccReduction.sourceTaxYearId | array \| boolean \| null \| number \| object \| string |
| s13_7_1NextYearUccReduction.total | number |
| s13_7_1NextYearUccReduction.unattributed | number |
| short_year_proration_applied | boolean |
| t2_line_602_recapture | number |
| t2_line_652_deducted | number |
| t2_line_780_refunded | number |
| t661Line559SredPool | number |
| warnings[].box | null \| string |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].anchor_field | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].field | string |
| warnings[].gate_id | string |
| warnings[].section | string |
| warnings[].taxYear | integer \| null |
| warnings[] | object |
| warnings[].kind | string |
| warnings[].law_citation.display | string |
| warnings[].law_citation.kind | string |
| warnings[].law_citation.section | string |
| warnings[].citation.form | string |
| warnings[].citation.path | string |
| warnings[].citation.revision | string |
| warnings[].grid | string |
| warnings[].actual | number |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].reason | string |
| formRevision | string |
| closingCarryforwardTaxationPeriodIds.apprenticeship | object |
| closingCarryforwardTaxationPeriodIds.childCareSpaces | object |
| closingCarryforwardTaxationPeriodIds.preProductionMining | object |
| closingCarryforwardTaxationPeriodIds.qualifiedProperty | object |
| closingCarryforwardTaxationPeriodIds.sred | object |
| expired_transfer_detail | array |
| transferInByVintage.apprenticeship | object |
| transferInByVintage.childCareSpaces | object |
| transferInByVintage.preProductionMining | object |
| transferInByVintage.qualifiedProperty | object |
| transferInByVintage.sred | object |
| closingPreLossRestrictionVintages.apprenticeship | array |
| closingPreLossRestrictionVintages.childCareSpaces | array |
| closingPreLossRestrictionVintages.preProductionMining | array |
| closingPreLossRestrictionVintages.qualifiedProperty | array |
| closingPreLossRestrictionVintages.sred | array |
| s127_9_1_loss_restriction_event_date_cy | array \| boolean \| null \| number \| object \| string |
| closingPreLossRestrictionCohorts.apprenticeship | object |
| closingPreLossRestrictionCohorts.childCareSpaces | object |
| closingPreLossRestrictionCohorts.preProductionMining | object |
| closingPreLossRestrictionCohorts.qualifiedProperty | object |
| closingPreLossRestrictionCohorts.sred | object |
| t2_line_580_feed_labour_addition | number |
| cleanElectricityPropertyRows | array |

### Output cell notes

- `hasRelatedEmployersForApprentices`: The caller's answer to the related-employers question. Null when the request does not state it, which the schedule reports rather than reading as No.
- `line_601`: Box 601, the apprenticeship contract number. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `line_602`: Box 602, the eligible trade name. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `line_603`: Box 603, eligible salary and wages payable to the apprentice. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `part19Rows[].line_601`: Box 601, the apprenticeship contract number. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `part19Rows[].line_602`: Box 602, the eligible trade name. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `part19Rows[].line_603`: Box 603, eligible salary and wages payable to the apprentice. Null when the Part 19 row does not state it; the schedule reports the unanswered cell rather than filing a substitute value.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].citation.display`: The citation as it is shown to a preparer.
- `warnings[].citation.kind`: The authority family the section belongs to.
- `warnings[].citation.section`: The cited provision.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].anchor_field`: The Filemark input anchor a preparer has to answer to clear the finding, when the box alone does not identify it.
- `warnings[].field`: The Filemark input field a finding names when it is not a printed box.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[]`: A Schedule 31 refusal that cites the governing statute or the printed form directly rather than a registered form gate, or a gate-cited refusal that names the paragraph its neutralization rests on.
- `warnings[].kind`: Always the validation family.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].reason`: What broke and what to do about it.

# schedule33

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2014 and later
- Strict profile: s33_single_resident_tcec_profile_target_value_v1
- Payload schema version: 0.11.0
- Dependencies (run automatically): division_c, schedule23, schedule5

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule33"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isResidentOfCanada": true,
    "isFinancialInstitution": false,
    "isInsuranceCorp": false,
    "associatedCCPC": false,
    "wasAssociatedInPrecedingYear": false,
    "accounts": [
      {
        "id": "revenue",
        "accountCode": "4000",
        "accountName": "Cedar Ridge active business revenue",
        "accountType": "revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "incomeType": "active",
          "foreignSource": false
        }
      }
    ],
    "incomeStatementFlags": {
      "revenue": true
    },
    "schedule33": {
      "allResidentComponentsReviewed": true,
      "partnershipDetails": null,
      "lines": {
        "104": {
          "amount": 15000000,
          "source": "entered"
        },
        "610": {
          "amount": 100000,
          "source": "entered"
        }
      }
    },
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (45)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts | array |  |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].accountType | string | strict |
| accounts[].classification.foreignSource | boolean \| null | strict |
| accounts[].classification.incomeType | null \| string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].currentYearBalance | integer \| null \| number | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| associatedCCPC | boolean | strict |
| currentYearTCEC | null \| number \| string |  |
| currentYearTCECMeta | null \| object |  |
| daysInYear | integer | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| gifiAssignments | null \| object |  |
| incomeStatementFlags.revenue | boolean | strict |
| isCCPC | boolean |  |
| isFinancialInstitution | boolean |  |
| isInsuranceCorp | boolean |  |
| isResidentOfCanada | boolean | strict |
| schedule33 | null \| object |  |
| schedule33.allResidentComponentsReviewed | boolean \| null | strict |
| schedule33.isFinancialInstitution | boolean \| null |  |
| schedule33.isInsuranceCorp | boolean \| null |  |
| schedule33.line713ForeignTaxConditionMet | boolean \| null |  |
| schedule33.lines | object |  |
| schedule33.lines.104.amount | integer | strict |
| schedule33.lines.104.source | string | strict |
| schedule33.lines.112.amount | number | strict |
| schedule33.lines.112.source | string | strict |
| schedule33.lines.407.amount | number | strict |
| schedule33.lines.407.source | string | strict |
| schedule33.lines.610.amount | integer | strict |
| schedule33.lines.610.source | string | strict |
| schedule33.partnershipDetails | null \| object |  |
| schedule33.partnershipDetails.112[].amount | number | strict |
| schedule33.partnershipDetails.112[].partnershipName | string |  |
| schedule33.partnershipDetails.407[].amount | number | strict |
| schedule33.partnershipDetails.407[].partnershipName | string |  |
| taxYear | number \| string | always |
| wasAssociatedInPrecedingYear | boolean |  |

### Input cell notes

- `accounts[].classification.foreignSource`: The account's income is foreign source; schedules that split Canadian from foreign amounts route it accordingly, for example Schedule 7's foreign property and rental buckets and line 500 foreign business income.
- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `associatedCCPC`: T2 jacket box 160: the corporation was associated with one or more CCPCs in the taxation year; with the preceding-year fact this controls Schedule 33 Part 5.
- `currentYearTCEC`: Taxable capital employed in Canada for the current taxation year. It must be finite and non-negative.
- `currentYearTCECMeta`: Provenance for currentYearTCEC. When sent, all four members must be present and correct: basis is current_tax_year, asOf is the current taxation-year end, source names where the figure came from, and confirmed is true. Anything less leaves the amount an unattested assertion.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `gifiAssignments`: Map of account id to the accepted GIFI code, folded onto accounts before consumers read them. An assignment overrides an account's embedded gifiCode and an empty string clears it. The merged view drives statutory paths including Schedule 1's lines 239/347 OCI treatment and Schedule 4's farming-presence signal, as well as Schedule 33's reference panel and prefill.
- `incomeStatementFlags.revenue`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `isFinancialInstitution`: Whether the corporation is a "financial institution" within the meaning of ITA 181(1). Every operative subsection of ITA 181.2 is scoped to a corporation "other than a financial institution", and a filer inside that class is measured under ITA 181.3 on Schedule 34/35 instead. Optional, and never defaulted: omit it and the scope is unresolved, so the engine refuses to certify any taxable capital, small-business-deduction grind or s.127(10.2) flag rather than assuming the ordinary-corporation regime. Pinned false for this profile, whose witness states that ITA 181.2 governs.
- `isInsuranceCorp`: Whether the corporation is an insurance corporation. T2 SCH33 E (15) scopes its own face to "the corporation (other than a financial institution or an insurance corporation)", and an insurance corporation is measured under ITA 181.3 on Schedule 35. Pinned false for this profile, optional, and never defaulted — see `isFinancialInstitution`.
- `isResidentOfCanada`: The corporation was resident in Canada in the taxation year (T2 box 080); Schedule 33 requires the residence fact answered before its taxable-capital result is filing-ready.
- `schedule33`: Schedule 33 (Taxable Capital Employed in Canada) statutory input blob. null or absent means the form was not opened: the node returns the not-ready all-None shape, never a silent-zero 690/790.
- `schedule33.allResidentComponentsReviewed`: True confirms every resident Schedule 33 capital, deduction, and investment-allowance line omitted from `lines` was reviewed and is nil. Without this confirmation, every line must be entered explicitly, including zero.
- `schedule33.isFinancialInstitution`: `true` = a financial institution within the meaning of s.181(1) (→ s.181.3, Schedule 34); null/absent leaves the scope unresolved.
- `schedule33.isInsuranceCorp`: `true` = an insurance corporation at any time in the year (→ s.181.3, Schedule 35); null/absent leaves the scope unresolved.
- `schedule33.line713ForeignTaxConditionMet`: Supplied paragraph 181.4(d) fact for a positive line 713. `true` confirms that the corporation's country of residence imposed neither tax described by that paragraph; `false` means line 713 is not deductible; null/absent is unresolved.
- `schedule33.lines`: Form line number ("101"…"713") → entry. Enterable codes: 101, 103-112, 121-124, 401-407, 610, 701/711/712/713.
- `schedule33.lines.104.source`: Where the line's amount came from. A closed set: the engine refuses any other source with a box-scoped error and excludes the entry, so a free-text source would silently drop the amount out of capital. This contract rejects it at the boundary instead, before execution.
- `schedule33.lines.112.source`: Where the line's amount came from. A closed set: the engine refuses any other source with a box-scoped error and excludes the entry, so a free-text source would silently drop the amount out of capital. This contract rejects it at the boundary instead, before execution.
- `schedule33.lines.407.source`: Where the line's amount came from. A closed set: the engine refuses any other source with a box-scoped error and excludes the entry, so a free-text source would silently drop the amount out of capital. This contract rejects it at the boundary instead, before execution.
- `schedule33.lines.610.source`: Where the line's amount came from. A closed set: the engine refuses any other source with a box-scoped error and excludes the entry, so a free-text source would silently drop the amount out of capital. This contract rejects it at the boundary instead, before execution.
- `schedule33.partnershipDetails`: Optional per-partnership detail rows backing lines 112 and 407, as a map from the line code (112 or 407) to a list of partnershipName and amount rows. Detail rows do not substitute for the line amount: the line must also be entered and the rows must total it within tolerance. ITA s.181.2(3)(g) for line 112 and s.181.2(4)(e) for line 407.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.
- `wasAssociatedInPrecedingYear`: The corporation was associated with at least one other corporation in the preceding taxation year; prior-year continuity fact for association-driven limits.

### Strict profile accepted values (24 of 45 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].accountType | 0 to 20000 characters |
| accounts[].classification.incomeType | one of "active_business", "property", "rental", "capital", "active", null |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule33.lines.104.amount | -1000000000000000 to 1000000000000000 |
| schedule33.lines.104.source | one of "entered", "prefill_accepted" |
| schedule33.lines.112.amount | 0 to 600000000000 |
| schedule33.lines.112.source | one of "entered", "prefill_accepted" |
| schedule33.lines.407.amount | 0 to 600000000000 |
| schedule33.lines.407.source | one of "entered", "prefill_accepted" |
| schedule33.lines.610.amount | -1000000000000000 to 1000000000000000 |
| schedule33.lines.610.source | one of "entered", "prefill_accepted" |
| schedule33.partnershipDetails.112[].amount | 0 to 600000000000 |
| schedule33.partnershipDetails.112[].partnershipName | 1 to 20000 characters |
| schedule33.partnershipDetails.407[].amount | 0 to 600000000000 |
| schedule33.partnershipDetails.407[].partnershipName | 1 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (107)

| Cell | Types |
| --- | --- |
| amount_A | null \| number |
| amount_B | null \| number |
| amount_E | array \| boolean \| null \| number \| object \| string |
| amount_F | array \| boolean \| null \| number \| object \| string |
| amount_G | array \| boolean \| null \| number \| object \| string |
| amount_H | array \| boolean \| null \| number \| object \| string |
| amount_I | array \| boolean \| null \| number \| object \| string |
| associatedGroupStatus | boolean |
| associatedGroupTCECMissing | boolean |
| associatedGroupTCECProvided | boolean |
| authoritativeForPriorYearGrinds | boolean |
| businessLimitReduction | null \| number |
| businessLimitReductionIsScenario | boolean |
| coverageStatus | string |
| currentYearAssociated | boolean |
| eligibleForPriorYearGrindInput | boolean |
| filingProjectionSupported | boolean |
| fired_gates | object |
| fiscalEnd | string |
| fiscalStart | string |
| gifiReference.canadianRevenuePercentEstimate | array \| boolean \| null \| number \| object \| string |
| gifiReference.deferredTaxLiabilities | number |
| gifiReference.gifiBreakdown[].description | string |
| gifiReference.gifiBreakdown[].gifiRange | string |
| gifiReference.gifiBreakdown[].total | number |
| gifiReference.investmentDeductions | number |
| gifiReference.prefillSuggestions | object |
| gifiReference.shareholderLoans | number |
| gifiReference.taxableCapitalBase | number |
| gifiReference.taxableCapitalEstimate | number |
| gifiReference.totalAssets | number |
| gifiReference.totalReserves | number |
| grindTCEC | null \| number |
| line713EligibilityResolved | boolean |
| line713ForeignTaxConditionMet | array \| boolean \| null \| number \| object \| string |
| line_101 | array \| boolean \| null \| number \| object \| string |
| line_103 | array \| boolean \| null \| number \| object \| string |
| line_104 | null \| number |
| line_105 | array \| boolean \| null \| number \| object \| string |
| line_106 | array \| boolean \| null \| number \| object \| string |
| line_107 | array \| boolean \| null \| number \| object \| string |
| line_108 | array \| boolean \| null \| number \| object \| string |
| line_109 | array \| boolean \| null \| number \| object \| string |
| line_110 | array \| boolean \| null \| number \| object \| string |
| line_111 | array \| boolean \| null \| number \| object \| string |
| line_112 | null \| number |
| line_121 | array \| boolean \| null \| number \| object \| string |
| line_122 | array \| boolean \| null \| number \| object \| string |
| line_123 | array \| boolean \| null \| number \| object \| string |
| line_124 | array \| boolean \| null \| number \| object \| string |
| line_190_capital | null \| number |
| line_401 | array \| boolean \| null \| number \| object \| string |
| line_402 | array \| boolean \| null \| number \| object \| string |
| line_403 | array \| boolean \| null \| number \| object \| string |
| line_404 | array \| boolean \| null \| number \| object \| string |
| line_405 | array \| boolean \| null \| number \| object \| string |
| line_406 | array \| boolean \| null \| number \| object \| string |
| line_407 | null \| number |
| line_415_sbd_factor | array \| boolean \| null \| number \| object \| string |
| line_490_investment_allowance | null \| number |
| line_500_taxable_capital | null \| number |
| line_610 | null \| number |
| line_690_tcec_resident | null \| number |
| line_701 | array \| boolean \| null \| number \| object \| string |
| line_711 | array \| boolean \| null \| number \| object \| string |
| line_712 | array \| boolean \| null \| number \| object \| string |
| line_713 | array \| boolean \| null \| number \| object \| string |
| line_790_tcec_non_resident | array \| boolean \| null \| number \| object \| string |
| missing_required[] | string |
| part5Applicability | string |
| part5ApplicabilityReason | string |
| part5CurrentYearTCECReconciled | array \| boolean \| null \| number \| object \| string |
| provincialProportion | null \| number |
| provisional | boolean |
| ready | boolean |
| residenceFactSupplied | boolean |
| residencyBranch | string |
| reviewedCurrentYearTCEC | array \| boolean \| null \| number \| object \| string |
| taxYear | integer |
| taxable_income_denominator | null \| number |
| tcec | null \| number |
| tcecCalculationComplete | boolean |
| tcecExceeds10M | boolean \| null |
| tcecExceeds15M | boolean \| null |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings[].accountIds[] | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].box_form | string |
| wasAssociatedInPrecedingYear | boolean \| null |

### Output cell notes

- `wasAssociatedInPrecedingYear`: Whether the corporation was associated with another corporation in the preceding taxation year. The input is optional and the answer selects whether ITA 125(5.1)(a)(ii) and Part 5 apply, so an unanswered fact is published as null and listed in missing_required rather than assumed to be false.

# schedule34

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2014 and later
- Strict profile: s34_2026_exact_prescribed_form_v1
- Payload schema version: 2.0.0
- Dependencies (run automatically): schedule23

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule34"
  ],
  "inputs": {
    "taxYear": 2026,
    "fiscalStart": "2026-01-01",
    "fiscalEnd": "2026-12-31",
    "t2Jacket": {
      "applicability": {
        "associatedCCPC": false
      }
    },
    "wasAssociatedInPrecedingYear": false,
    "schedule34": {
      "isFinancialInstitution": "Yes",
      "isInsuranceCorporation": "No",
      "isAuthorizedForeignBank": "No",
      "residentAtAnyTime": "Yes",
      "lines": {
        "201": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "202": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "203": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "204": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "205": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "206": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "221": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "222": {
          "amount": 0,
          "source": "reviewed trial balance"
        },
        "223": {
          "amount": 0,
          "source": "reviewed trial balance"
        }
      },
      "investmentReviewComplete": "Yes",
      "investmentRows": [],
      "tangibleAssetReviewComplete": "Yes",
      "tangibleAssetRows": [],
      "partnershipReviewComplete": "Yes",
      "partnershipRows": [],
      "canadianAssetsBeforeInvestmentAllowance": 1,
      "totalAssetsBeforeInvestmentAllowance": 1
    }
  }
}
```

## Input cells (37)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| schedule34 | null \| object |  |
| schedule34.canadianAssetsBeforeInvestmentAllowance | integer | strict |
| schedule34.investmentReviewComplete | string | strict |
| schedule34.investmentRows[] | boolean \| null \| number \| string | strict |
| schedule34.isAuthorizedForeignBank | string | strict |
| schedule34.isFinancialInstitution | string | strict |
| schedule34.isInsuranceCorporation | string | strict |
| schedule34.lines.201.amount | integer | strict |
| schedule34.lines.201.source | string | strict |
| schedule34.lines.202.amount | integer | strict |
| schedule34.lines.202.source | string | strict |
| schedule34.lines.203.amount | integer | strict |
| schedule34.lines.203.source | string | strict |
| schedule34.lines.204.amount | integer | strict |
| schedule34.lines.204.source | string | strict |
| schedule34.lines.205.amount | integer | strict |
| schedule34.lines.205.source | string | strict |
| schedule34.lines.206.amount | integer | strict |
| schedule34.lines.206.source | string | strict |
| schedule34.lines.221.amount | integer | strict |
| schedule34.lines.221.source | string | strict |
| schedule34.lines.222.amount | integer | strict |
| schedule34.lines.222.source | string | strict |
| schedule34.lines.223.amount | integer | strict |
| schedule34.lines.223.source | string | strict |
| schedule34.partnershipReviewComplete | string | strict |
| schedule34.partnershipRows[] | boolean \| null \| number \| string | strict |
| schedule34.residentAtAnyTime | string | strict |
| schedule34.tangibleAssetReviewComplete | string | strict |
| schedule34.tangibleAssetRows[] | boolean \| null \| number \| string | strict |
| schedule34.totalAssetsBeforeInvestmentAllowance | integer | strict |
| t2Jacket.applicability.associatedCCPC | boolean | strict |
| taxYear | number \| string | always |
| wasAssociatedInPrecedingYear | boolean | strict |

### Input cell notes

- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `fiscalStart`: The first day of the taxation year (ISO YYYY-MM-DD). With fiscalEnd and daysInYear it is the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure — the request is refused before any computation when one is missing. The bounds also drive Schedule 8's Reg 1100(3) short-year CCA proration and the Reg 1104(3.5)(b) immediate-expensing limit proration.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (33 of 37 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule34.canadianAssetsBeforeInvestmentAllowance | -1000000000000000 to 1000000000000000 |
| schedule34.investmentReviewComplete | 0 to 20000 characters |
| schedule34.investmentRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule34.isAuthorizedForeignBank | 0 to 20000 characters |
| schedule34.isFinancialInstitution | 0 to 20000 characters |
| schedule34.isInsuranceCorporation | 0 to 20000 characters |
| schedule34.lines.201.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.201.source | 0 to 20000 characters |
| schedule34.lines.202.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.202.source | 0 to 20000 characters |
| schedule34.lines.203.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.203.source | 0 to 20000 characters |
| schedule34.lines.204.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.204.source | 0 to 20000 characters |
| schedule34.lines.205.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.205.source | 0 to 20000 characters |
| schedule34.lines.206.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.206.source | 0 to 20000 characters |
| schedule34.lines.221.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.221.source | 0 to 20000 characters |
| schedule34.lines.222.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.222.source | 0 to 20000 characters |
| schedule34.lines.223.amount | -1000000000000000 to 1000000000000000 |
| schedule34.lines.223.source | 0 to 20000 characters |
| schedule34.partnershipReviewComplete | 0 to 20000 characters |
| schedule34.partnershipRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule34.residentAtAnyTime | 0 to 20000 characters |
| schedule34.tangibleAssetReviewComplete | 0 to 20000 characters |
| schedule34.tangibleAssetRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule34.totalAssetsBeforeInvestmentAllowance | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (95)

| Cell | Types |
| --- | --- |
| activeTCECLine | string |
| audit.authority | string |
| audit.capitalBranch | string |
| audit.investmentRows | array |
| audit.residenceFactSupplied | boolean |
| authoritativeForPriorYearGrinds | boolean |
| coverageStatus | string |
| eligibleForPriorYearGrindInput | boolean |
| filingProjectionSupported | boolean |
| fiscalEnd | null \| string |
| fiscalStart | null \| string |
| form.amountA | number |
| form.amountB | number |
| form.amountC | number |
| form.amountD | number |
| form.amountE | number |
| form.amountF | number \| string |
| form.amountG | number \| string |
| form.amountH | number \| string |
| form.lines.201 | number |
| form.lines.202 | number |
| form.lines.203 | number |
| form.lines.204 | number |
| form.lines.205 | number |
| form.lines.206 | number |
| form.lines.221 | number |
| form.lines.222 | number |
| form.lines.223 | number |
| form.lines.290 | number |
| form.lines.301 | string |
| form.lines.302 | string |
| form.lines.390 | string |
| form.lines.401 | number |
| form.lines.404 | number |
| form.lines.415 | number \| string |
| form.lines.490 | number |
| form.lines.500 | number |
| form.lines.511 | number |
| form.lines.512 | number |
| form.lines.611 | number |
| form.lines.612 | number |
| form.lines.650 | number |
| form.lines.690 | number |
| grindTCEC | number |
| line_415_sbd_factor | array \| boolean \| null \| number \| object \| string |
| lines.201 | number |
| lines.202 | number |
| lines.203 | number |
| lines.204 | number |
| lines.205 | number |
| lines.206 | number |
| lines.221 | number |
| lines.222 | number |
| lines.223 | number |
| lines.290 | number |
| lines.401 | number |
| lines.404 | number |
| lines.415 | array \| boolean \| null \| number \| object \| string |
| lines.490 | number |
| lines.500 | number |
| lines.511 | number |
| lines.512 | number |
| lines.611 | number |
| lines.612 | number |
| lines.650 | number |
| lines.690 | number |
| lines.A | number |
| lines.B | number |
| missing_required | array |
| part5Applicability | string |
| part5CurrentYearTCECReconciled | array \| boolean \| null \| number \| object \| string |
| part5Excess | array \| boolean \| null \| number \| object \| string |
| part5Floor | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| ready | boolean |
| residenceFactSupplied | boolean |
| reviewedCurrentYearTCEC | array \| boolean \| null \| number \| object \| string |
| schedule | string |
| sourceSchedule | string |
| taxYear | integer |
| tcec | number |
| tcecBranchFactSupplied | boolean |
| tcecCalculationComplete | boolean |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings[].code | string |
| warnings[].field | string |
| warnings[].message | string |
| warnings[].severity | string |
| currentYearAssociated | boolean |
| wasAssociatedInPrecedingYear | boolean |

# schedule35

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s35_2026_exact_prescribed_form_v1
- Payload schema version: 2.0.0
- Dependencies (run automatically): schedule23

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule35"
  ],
  "inputs": {
    "taxYear": 2026,
    "fiscalStart": "2026-01-01",
    "fiscalEnd": "2026-12-31",
    "t2Jacket": {
      "applicability": {
        "associatedCCPC": false
      }
    },
    "wasAssociatedInPrecedingYear": false,
    "schedule35": {
      "isInsuranceCorporation": "Yes",
      "residentAtAnyTime": "Yes",
      "carriedLifeInsuranceBusinessAtAnyTime": "Yes",
      "carriedInsuranceBusinessInCanadaAtAnyTime": "Yes",
      "lines": {
        "102": {
          "amount": 1000000,
          "source": "reviewed"
        },
        "103": {
          "amount": 2000000,
          "source": "reviewed"
        },
        "104": {
          "amount": 3000000,
          "source": "reviewed"
        },
        "105": {
          "amount": 500000,
          "source": "reviewed"
        },
        "106": {
          "amount": 500000,
          "source": "reviewed"
        },
        "107": {
          "amount": 200000,
          "source": "reviewed"
        },
        "108": {
          "amount": 4000000,
          "source": "reviewed"
        },
        "122": {
          "amount": 100000,
          "source": "reviewed"
        },
        "522": {
          "amount": 6000000,
          "source": "reviewed"
        },
        "523": {
          "amount": 8000000,
          "source": "reviewed"
        }
      },
      "eligibleNonSegregatedInsuranceContractCsm": 2000000,
      "eligibleNonSegregatedReinsuranceContractCsm": 1000000,
      "investmentReviewComplete": "Yes",
      "investmentRows": [],
      "tangibleAssetReviewComplete": "Yes",
      "tangibleAssetRows": [],
      "partnershipReviewComplete": "Yes",
      "partnershipRows": [],
      "foreignInsuranceSubsidiaryReviewComplete": "Yes",
      "foreignInsuranceSubsidiaryRows": [
        {
          "subsidiaryId": "foreign-life-1",
          "subsidiaryName": "Harbourlight International Life Ltd.",
          "reg8605CapitalA": 5000000,
          "capitalStockInvestedH": 2000000,
          "longTermDebtInvestedH": 1000000,
          "additionalSurplusContributedI": 1000000,
          "reg8605ReserveLiabilities": 2000000,
          "reg8605FormDetail": {
            "longTermDebt": 1000000,
            "capitalStockOrMemberContributions": 2000000,
            "retainedEarnings": 1000000,
            "netCsm90": 0,
            "policyholderLiabilities": 1000000,
            "aociContributedSurplusOther": 0,
            "deficitDeductedInShareholdersEquity": 0
          }
        }
      ]
    }
  }
}
```

## Input cells (55)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| schedule35 | null \| object |  |
| schedule35.carriedInsuranceBusinessInCanadaAtAnyTime | string | strict |
| schedule35.carriedLifeInsuranceBusinessAtAnyTime | string | strict |
| schedule35.eligibleNonSegregatedInsuranceContractCsm | integer | strict |
| schedule35.eligibleNonSegregatedReinsuranceContractCsm | integer | strict |
| schedule35.foreignInsuranceSubsidiaryReviewComplete | boolean \| null \| string | strict |
| schedule35.foreignInsuranceSubsidiaryRows | array \| null |  |
| schedule35.foreignInsuranceSubsidiaryRows[].additionalSurplusContributedI | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].capitalStockInvestedH | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].longTermDebtInvestedH | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605CapitalA | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.aociContributedSurplusOther | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.capitalStockOrMemberContributions | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.deficitDeductedInShareholdersEquity | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.longTermDebt | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.netCsm90 | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.policyholderLiabilities | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.retainedEarnings | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605ReserveLiabilities | integer | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].subsidiaryId | string | strict |
| schedule35.foreignInsuranceSubsidiaryRows[].subsidiaryName | string | strict |
| schedule35.investmentReviewComplete | string | strict |
| schedule35.investmentRows[] | boolean \| null \| number \| string | strict |
| schedule35.isInsuranceCorporation | string | strict |
| schedule35.lines.102.amount | integer | strict |
| schedule35.lines.102.source | string | strict |
| schedule35.lines.103.amount | integer | strict |
| schedule35.lines.103.source | string | strict |
| schedule35.lines.104.amount | integer | strict |
| schedule35.lines.104.source | string | strict |
| schedule35.lines.105.amount | integer | strict |
| schedule35.lines.105.source | string | strict |
| schedule35.lines.106.amount | integer | strict |
| schedule35.lines.106.source | string | strict |
| schedule35.lines.107.amount | integer | strict |
| schedule35.lines.107.source | string | strict |
| schedule35.lines.108.amount | integer | strict |
| schedule35.lines.108.source | string | strict |
| schedule35.lines.122.amount | integer | strict |
| schedule35.lines.122.source | string | strict |
| schedule35.lines.522.amount | integer | strict |
| schedule35.lines.522.source | string | strict |
| schedule35.lines.523.amount | integer | strict |
| schedule35.lines.523.source | string | strict |
| schedule35.partnershipReviewComplete | string | strict |
| schedule35.partnershipRows[] | boolean \| null \| number \| string | strict |
| schedule35.residentAtAnyTime | string | strict |
| schedule35.tangibleAssetReviewComplete | string | strict |
| schedule35.tangibleAssetRows[] | boolean \| null \| number \| string | strict |
| t2Jacket.applicability.associatedCCPC | boolean | strict |
| taxYear | number \| string | always |
| wasAssociatedInPrecedingYear | boolean | strict |

### Input cell notes

- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `fiscalStart`: The first day of the taxation year (ISO YYYY-MM-DD). With fiscalEnd and daysInYear it is the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure — the request is refused before any computation when one is missing. The bounds also drive Schedule 8's Reg 1100(3) short-year CCA proration and the Reg 1104(3.5)(b) immediate-expensing limit proration.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `schedule35.foreignInsuranceSubsidiaryReviewComplete`: Confirms completion of the Regulation 8605 foreign-insurance-subsidiary census. Send true or Yes only after the complete population has been reviewed; blank is not proof that none exist.
- `schedule35.foreignInsuranceSubsidiaryRows`: Reviewed Regulation 8605 subsidiary rows used for Schedule 35 lines 521, 524, and 525. Send an empty array when the completed census found no subsidiaries.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (50 of 55 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule35.carriedInsuranceBusinessInCanadaAtAnyTime | 0 to 20000 characters |
| schedule35.carriedLifeInsuranceBusinessAtAnyTime | 0 to 20000 characters |
| schedule35.eligibleNonSegregatedInsuranceContractCsm | -1000000000000000 to 1000000000000000 |
| schedule35.eligibleNonSegregatedReinsuranceContractCsm | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryReviewComplete | 0 to 20000 characters |
| schedule35.foreignInsuranceSubsidiaryRows[].additionalSurplusContributedI | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].capitalStockInvestedH | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].longTermDebtInvestedH | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605CapitalA | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.aociContributedSurplusOther | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.capitalStockOrMemberContributions | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.deficitDeductedInShareholdersEquity | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.longTermDebt | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.netCsm90 | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.policyholderLiabilities | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605FormDetail.retainedEarnings | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].reg8605ReserveLiabilities | -1000000000000000 to 1000000000000000 |
| schedule35.foreignInsuranceSubsidiaryRows[].subsidiaryId | 0 to 20000 characters |
| schedule35.foreignInsuranceSubsidiaryRows[].subsidiaryName | 0 to 20000 characters |
| schedule35.investmentReviewComplete | 0 to 20000 characters |
| schedule35.investmentRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule35.isInsuranceCorporation | 0 to 20000 characters |
| schedule35.lines.102.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.102.source | 0 to 20000 characters |
| schedule35.lines.103.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.103.source | 0 to 20000 characters |
| schedule35.lines.104.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.104.source | 0 to 20000 characters |
| schedule35.lines.105.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.105.source | 0 to 20000 characters |
| schedule35.lines.106.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.106.source | 0 to 20000 characters |
| schedule35.lines.107.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.107.source | 0 to 20000 characters |
| schedule35.lines.108.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.108.source | 0 to 20000 characters |
| schedule35.lines.122.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.122.source | 0 to 20000 characters |
| schedule35.lines.522.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.522.source | 0 to 20000 characters |
| schedule35.lines.523.amount | -1000000000000000 to 1000000000000000 |
| schedule35.lines.523.source | 0 to 20000 characters |
| schedule35.partnershipReviewComplete | 0 to 20000 characters |
| schedule35.partnershipRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule35.residentAtAnyTime | 0 to 20000 characters |
| schedule35.tangibleAssetReviewComplete | 0 to 20000 characters |
| schedule35.tangibleAssetRows[] | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (196)

| Cell | Types |
| --- | --- |
| activeTCECLine | null \| string |
| audit.authority | string |
| audit.capitalBranch | string |
| audit.foreignInsuranceSubsidiaryRows[].additionalSurplusContributedI | number |
| audit.foreignInsuranceSubsidiaryRows[].aociContributedSurplusOther | number |
| audit.foreignInsuranceSubsidiaryRows[].capitalA | number |
| audit.foreignInsuranceSubsidiaryRows[].capitalStockInvestedH | number |
| audit.foreignInsuranceSubsidiaryRows[].capitalStockOrMemberContributions | number |
| audit.foreignInsuranceSubsidiaryRows[].deficitDeductedInShareholdersEquity | number |
| audit.foreignInsuranceSubsidiaryRows[].formDetailComplete | boolean |
| audit.foreignInsuranceSubsidiaryRows[].hPlusI | number |
| audit.foreignInsuranceSubsidiaryRows[].line521Component | number |
| audit.foreignInsuranceSubsidiaryRows[].line524Component | number |
| audit.foreignInsuranceSubsidiaryRows[].line525Component | number |
| audit.foreignInsuranceSubsidiaryRows[].longTermDebt | number |
| audit.foreignInsuranceSubsidiaryRows[].longTermDebtInvestedH | number |
| audit.foreignInsuranceSubsidiaryRows[].netCsm90 | number |
| audit.foreignInsuranceSubsidiaryRows[].policyholderLiabilities | number |
| audit.foreignInsuranceSubsidiaryRows[].reg8605CapitalA | number |
| audit.foreignInsuranceSubsidiaryRows[].reg8605ReserveLiabilities | number |
| audit.foreignInsuranceSubsidiaryRows[].retainedEarnings | number |
| audit.foreignInsuranceSubsidiaryRows[].rowIndex | integer |
| audit.foreignInsuranceSubsidiaryRows[].subsidiaryId | string |
| audit.foreignInsuranceSubsidiaryRows[].subsidiaryName | string |
| audit.foreignInsuranceSubsidiaryRows[].table2Capital | number |
| audit.foreignInsuranceSubsidiaryRows[].table2Subtotal | number |
| audit.investmentRows | array |
| audit.residenceFactSupplied | boolean |
| authoritativeForPriorYearGrinds | boolean |
| coverageStatus | string |
| eligibleForPriorYearGrindInput | boolean |
| filingProjectionSupported | boolean |
| fiscalEnd | null \| string |
| fiscalStart | null \| string |
| form.amount1A | number \| string |
| form.amount1B | string |
| form.amount1C | string |
| form.amount1D | string |
| form.amount1E | string |
| form.amount1F | string |
| form.amount3A | number \| string |
| form.amount3B | number |
| form.amount4A | number |
| form.amount4B | number \| string |
| form.amount4C | number \| string |
| form.amount5A | number \| string |
| form.amount5B | number \| string |
| form.amount5C | number \| string |
| form.amount5D | number \| string |
| form.foreignInsuranceSubsidiaryRows[].additionalSurplusContributedI | number |
| form.foreignInsuranceSubsidiaryRows[].aociContributedSurplusOther | number |
| form.foreignInsuranceSubsidiaryRows[].capitalA | number |
| form.foreignInsuranceSubsidiaryRows[].capitalStockInvestedH | number |
| form.foreignInsuranceSubsidiaryRows[].capitalStockOrMemberContributions | number |
| form.foreignInsuranceSubsidiaryRows[].deficitDeductedInShareholdersEquity | number |
| form.foreignInsuranceSubsidiaryRows[].formDetailComplete | boolean |
| form.foreignInsuranceSubsidiaryRows[].hPlusI | number |
| form.foreignInsuranceSubsidiaryRows[].line521Component | number |
| form.foreignInsuranceSubsidiaryRows[].line524Component | number |
| form.foreignInsuranceSubsidiaryRows[].line525Component | number |
| form.foreignInsuranceSubsidiaryRows[].longTermDebt | number |
| form.foreignInsuranceSubsidiaryRows[].longTermDebtInvestedH | number |
| form.foreignInsuranceSubsidiaryRows[].netCsm90 | number |
| form.foreignInsuranceSubsidiaryRows[].policyholderLiabilities | number |
| form.foreignInsuranceSubsidiaryRows[].reg8605CapitalA | number |
| form.foreignInsuranceSubsidiaryRows[].reg8605ReserveLiabilities | number |
| form.foreignInsuranceSubsidiaryRows[].retainedEarnings | number |
| form.foreignInsuranceSubsidiaryRows[].rowIndex | integer |
| form.foreignInsuranceSubsidiaryRows[].subsidiaryId | string |
| form.foreignInsuranceSubsidiaryRows[].subsidiaryName | string |
| form.foreignInsuranceSubsidiaryRows[].table2Capital | number |
| form.foreignInsuranceSubsidiaryRows[].table2Subtotal | number |
| form.lines.102 | number \| string |
| form.lines.103 | number \| string |
| form.lines.104 | number \| string |
| form.lines.105 | number \| string |
| form.lines.106 | number \| string |
| form.lines.107 | number \| string |
| form.lines.108 | number \| string |
| form.lines.109 | number \| string |
| form.lines.122 | number \| string |
| form.lines.190 | number \| string |
| form.lines.202 | string |
| form.lines.203 | string |
| form.lines.204 | string |
| form.lines.205 | string |
| form.lines.206 | string |
| form.lines.207 | string |
| form.lines.208 | string |
| form.lines.209 | string |
| form.lines.210 | string |
| form.lines.222 | string |
| form.lines.290 | string |
| form.lines.301 | string |
| form.lines.302 | string |
| form.lines.303 | string |
| form.lines.304 | string |
| form.lines.331 | string |
| form.lines.341 | string |
| form.lines.342 | string |
| form.lines.390 | string |
| form.lines.401 | number |
| form.lines.404 | number |
| form.lines.415 | number \| string |
| form.lines.490 | number |
| form.lines.500 | number \| string |
| form.lines.511 | number |
| form.lines.512 | number |
| form.lines.521 | number |
| form.lines.522 | number |
| form.lines.523 | number |
| form.lines.524 | number |
| form.lines.525 | number |
| form.lines.530 | number \| string |
| form.lines.590 | number \| string |
| form.lines.611 | string |
| form.lines.612 | string |
| form.lines.650 | string |
| form.lines.690 | string |
| form.lines.790 | string |
| grindTCEC | null \| number |
| line_415_sbd_factor | array \| boolean \| null \| number \| object \| string |
| lines.102 | number |
| lines.103 | number |
| lines.104 | number |
| lines.105 | number |
| lines.106 | number |
| lines.107 | number |
| lines.108 | number |
| lines.109 | number |
| lines.122 | number |
| lines.190 | number |
| lines.1A | number |
| lines.401 | number |
| lines.404 | number |
| lines.415 | array \| boolean \| null \| number \| object \| string |
| lines.490 | number |
| lines.4A | number |
| lines.4C | null \| number |
| lines.500 | null \| number |
| lines.511 | number |
| lines.512 | number |
| lines.521 | number |
| lines.522 | number |
| lines.523 | number |
| lines.524 | number |
| lines.525 | number |
| lines.530 | null \| number |
| lines.590 | null \| number |
| missing_required[] | string |
| part5Applicability | string |
| part5CurrentYearTCECReconciled | array \| boolean \| null \| number \| object \| string |
| part5Excess | array \| boolean \| null \| number \| object \| string |
| part5Floor | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| ready | boolean |
| residenceFactSupplied | boolean |
| reviewedCurrentYearTCEC | array \| boolean \| null \| number \| object \| string |
| schedule | string |
| sourceSchedule | string |
| taxYear | integer |
| tcec | null \| number |
| tcecBranchFactSupplied | boolean |
| tcecCalculationComplete | boolean |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings[].box | null |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].field | string |
| currentYearAssociated | boolean |
| wasAssociatedInPrecedingYear | boolean |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.gate_id | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.form_id | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.rule | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.cra_text_verbatim | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.source | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.source_url | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.form_revision | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.applies_to_boxes[] | string |
| fired_gates.s181_3_b_c_d_ifrs17_formula_only_for_ty_starting_after_2022.verified_at | string |

# schedule38

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2008 and later
- Strict profile: s38_exact_single_request_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): part_i_tax, schedule31, schedule39, schedule67

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule38"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "schedule38": {
      "corporationName": "Northstar Bank of Canada",
      "businessNumber": "222333445",
      "currentTaxYearEnd": "2025-12-31",
      "currentTaxYearStart": "2025-01-01",
      "daysInTaxYear": 365,
      "isBank": true,
      "isRelatedToOtherFinancialInstitutionAtEndOfYear": false,
      "capitalPerS190_13": 2000000000,
      "canadianAllocationFraction": 1,
      "partITaxPayableForYear": 0,
      "investmentReviewComplete": true,
      "investmentRows": []
    },
    "isCCPC": true
  }
}
```

## Input cells (95)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule38.businessNumber | null \| string | strict |
| schedule38.canadianAllocationFraction | null \| number | strict |
| schedule38.capitalDeductionClaimed | null \| number |  |
| schedule38.capitalPerS190_13 | null \| number \| string | strict |
| schedule38.corporationName | null \| string | strict |
| schedule38.currentTaxYearEnd | null \| string | strict |
| schedule38.currentTaxYearStart | null \| string | strict |
| schedule38.daysInTaxYear | null \| number | strict |
| schedule38.groupAllocationAgreementS39 | array |  |
| schedule38.groupAllocationAgreementS39[].allocationAmount | null \| number |  |
| schedule38.groupAllocationAgreementS39[].memberBN | null \| string |  |
| schedule38.groupAllocationAgreementS39[].memberName | null \| string |  |
| schedule38.hasAcquisitionOfControlThisYear | boolean \| null |  |
| schedule38.hasFunctionalCurrencyElectionS261 | boolean \| null |  |
| schedule38.investmentInRelatedFinancialInstitutions | null \| number |  |
| schedule38.investmentReviewComplete | boolean \| null | strict |
| schedule38.investmentRows | array |  |
| schedule38.investmentRows[].carryingValue | null \| number |  |
| schedule38.investmentRows[].investmentType | null \| string |  |
| schedule38.investmentRows[].nonSegregatedProperty | boolean \| null |  |
| schedule38.investmentRows[].proceedsOrSurplusUsedInCanadianPeBusiness | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts | null \| object |  |
| schedule38.investmentRows[].reg8201Facts.controlledSubsidiaryOnly | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.employeeOrAgentEstablishedAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.fixedPlaceJurisdiction | null \| string |  |
| schedule38.investmentRows[].reg8201Facts.generalContractingAuthorityAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.hasFixedPlaceOfBusiness | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.independentAgentOnly | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.insurerRegisteredOrLicensedJurisdictions | array |  |
| schedule38.investmentRows[].reg8201Facts.isInsurer | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.personOwnedStockAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.principalPlaceOfBusinessAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.purchaseOnlyOfficeOnly | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.regularlyFillsOrdersFromStockAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.substantialMachineryOrEquipmentUsedAtTarget | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.treatyExists | boolean \| null |  |
| schedule38.investmentRows[].reg8201Facts.treatyPermanentEstablishmentArticle | null \| string |  |
| schedule38.investmentRows[].reg8201Facts.treatyPermanentEstablishmentConclusion | boolean \| null |  |
| schedule38.investmentRows[].relatedFinancialInstitution | boolean \| null |  |
| schedule38.investmentRows[].targetNotExemptFromPartVI | boolean \| null |  |
| schedule38.investmentRows[].targetRelatedSolelyViaCrownControl | boolean \| null |  |
| schedule38.investmentRows[].targetRelatedSolelyViaS251_5_b_Right | boolean \| null |  |
| schedule38.investmentRows[].targetResidentInCanada | boolean \| null |  |
| schedule38.isAuthorizedForeignBank | boolean \| null |  |
| schedule38.isBank | boolean \| null | strict |
| schedule38.isDepositTakingMortgageLender | boolean \| null |  |
| schedule38.isHoldcoUnderS190_1_e | boolean \| null |  |
| schedule38.isLifeInsuranceCorpInCanada | boolean \| null |  |
| schedule38.isNonResident | boolean \| null |  |
| schedule38.isRelatedToOtherFinancialInstitutionAtEndOfYear | boolean \| null | strict |
| schedule38.isTrustCorporation | boolean \| null |  |
| schedule38.line101ReservesNotDeductedInIncome | null \| number |  |
| schedule38.line102LongTermDebt | null \| number |  |
| schedule38.line103CapitalStock | null \| number |  |
| schedule38.line104RetainedEarnings | null \| number |  |
| schedule38.line105ContributedSurplus | null \| number |  |
| schedule38.line106OtherSurpluses | null \| number |  |
| schedule38.line121DeferredTaxDebitBalance | null \| number |  |
| schedule38.line122DeficitDeducted | null \| number |  |
| schedule38.line151LongTermDebt | null \| number |  |
| schedule38.line152CapitalStock | null \| number |  |
| schedule38.line153RetainedEarnings | null \| number |  |
| schedule38.line154AccumulatedOtherComprehensiveIncome | null \| number |  |
| schedule38.line155PolicyholdersLiabilities | null \| number |  |
| schedule38.line156ContributedSurplus | null \| number |  |
| schedule38.line157OtherSurpluses | null \| number |  |
| schedule38.line158Net90PercentCsm | null \| number |  |
| schedule38.line165DeficitDeducted | null \| number |  |
| schedule38.line201TenPercentRiskWeightedAssets | null \| number |  |
| schedule38.line202CapitalAdequacyDeductions | null \| number |  |
| schedule38.line301SurplusFundsFromOperationsExcess | null \| number |  |
| schedule38.line302AttributedSurplus | null \| number |  |
| schedule38.line303OtherCanadaInsuranceSurpluses | null \| number |  |
| schedule38.line304CanadaInsuranceLongTermDebt | null \| number |  |
| schedule38.line401SharesOfRelatedFIs | null \| number |  |
| schedule38.line404LongTermDebtOfRelatedFIs | null \| number |  |
| schedule38.line411SurplusContributedToRelatedFIs | null \| number |  |
| schedule38.line551PrescribedClauseBAmounts | null \| number |  |
| schedule38.line552CanadianReserveLiabilities | null \| number |  |
| schedule38.line553TotalReserveLiabilities | null \| number |  |
| schedule38.line554PrescribedClauseEAmounts | null \| number |  |
| schedule38.line555PrescribedClauseCAmounts | null \| number |  |
| schedule38.line650CanadianAssets | null \| number |  |
| schedule38.line655TotalAssets | null \| number |  |
| schedule38.partITaxPayableForYear | null \| number | strict |
| schedule38.partVI2TaxPayableForYearS67 | null \| number \| string |  |
| schedule38.relatedSolelyViaCrownControl | boolean \| null |  |
| schedule38.relatedSolelyViaS251_5_b_Right | boolean \| null |  |
| schedule38.rightAcquiredForAvoidancePurpose | boolean \| null |  |
| schedule38.unusedPartIcreditsClaimedFromS42 | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year, tied to the inclusive fiscalStart-to-fiscalEnd span. 2024 is a leap year, so the exact witness period is 366 days.
- `fiscalEnd`: Last day of the taxation year, stated for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this request's dependency closure computes are day-weighted, so the engine requires the stated period instead of assuming a calendar year. It matches the Schedule 38 Part 1 period.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule38.businessNumber`: Full 15-character CRA program account (for example 123456789RC0001).
- `schedule38.canadianAllocationFraction`: s.190.11(a) Canadian-assets / total-assets fraction (0..1) for non-life-insurer FIs; life insurers use the (b)/(c) branches. Aggregate fallback behind the Part 4 component lines (650/655 on the s.190.11(a) branch, 551-555 on the s.190.11(b)(i) branch), on the same terms as `capitalPerS190_13`; the mismatch warning names the component-derived TCEC and the TCEC this fraction implies.
- `schedule38.capitalDeductionClaimed`: Capital deduction claimed (per the S39 allocation when related; $1B standalone).
- `schedule38.capitalPerS190_13`: Capital per the applicable s.190.13 branch, practitioner-computed. Aggregate fallback: supply the Part 1 component lines above and those components govern, leaving this figure as a cross-check that warns when the two diverge by more than $1. Aggregate-only returns keep working unchanged.
- `schedule38.corporationName`: Corporation legal name (header field).
- `schedule38.currentTaxYearEnd`: TY-end YYYY-MM-DD.
- `schedule38.currentTaxYearStart`: TY-start YYYY-MM-DD — drives the IFRS-17 s.190.13(b) formula gate (post-Bill-C-32 formula applies to tax years BEGINNING after Dec 31, 2022).
- `schedule38.daysInTaxYear`: Days in the tax year — drives the s.190.1(2) short-year proration (< 51 weeks = 357 days → gross tax × days/365).
- `schedule38.groupAllocationAgreementS39`: s.190.15(2) related-group $1B allocation agreement rows (Schedule 39 hook; Phase-1 embedded copy retained for backward compatibility).
- `schedule38.groupAllocationAgreementS39[].allocationAmount`: Col 3 — this row's allocation of the $1B capital deduction. Per s.190.15(2) the total across all rows cannot exceed $1B; per s.190.15(4) the LEAST amount allocated is each member's capital deduction, and with no allocation every member's CD is NIL.
- `schedule38.groupAllocationAgreementS39[].memberBN`: Col 2 — BN of the row's corp. 'NR' allowed for unregistered.
- `schedule38.groupAllocationAgreementS39[].memberName`: Col 1 — name of related-group member (s.190.15(2) agreement row).
- `schedule38.hasAcquisitionOfControlThisYear`: s.190.1(6) AoC restriction on unused-credit carryover (s.111(5) same-or-similar-business test, NOT s.111(5.1)).
- `schedule38.hasFunctionalCurrencyElectionS261`: Functional-currency election under s.261 — translate the $1B fixed amount under s.261(5)(b) at the first-day relevant spot rate.
- `schedule38.investmentInRelatedFinancialInstitutions`: s.190.14 investment in RELATED financial institutions (shares + long-term debt + contributed surplus; resident or Canadian-PE only). Aggregate fallback behind the Part 2 component lines 401/404/411, on the same terms as `capitalPerS190_13`.
- `schedule38.investmentReviewComplete`: Confirms the ITA 190.14(2) eligible-investment census is complete for this exact witness.
- `schedule38.investmentRows[].targetRelatedSolelyViaCrownControl`: s.190.15(6)(a): this target is related only through Crown control, so it is deemed unrelated for the s.190.14 investment allowance.
- `schedule38.investmentRows[].targetRelatedSolelyViaS251_5_b_Right`: s.190.15(6)(b): this target is related only through a s.251(5)(b) right. The anti-avoidance tail applies only to s.190.15, so the target remains deemed unrelated for s.190.14 even when that tail fires.
- `schedule38.isAuthorizedForeignBank`: Authorized foreign bank — s.190.13(d) 10%-of-RWA capital path.
- `schedule38.isBank`: ITA s.190(1) financial-institution category fact: the corporation is a bank, one of the five categories in scope for Part VI tax.
- `schedule38.isDepositTakingMortgageLender`: s.190(1)(c) — deposit-taking mortgage lender?
- `schedule38.isHoldcoUnderS190_1_e`: s.190(1)(e) — holdco with all/substantially-all assets in shares or debt of related (a)-(e) corps (CRA admin practice ≥90% of FMV).
- `schedule38.isLifeInsuranceCorpInCanada`: s.190(1)(d) — life insurance corp carrying on business in Canada?
- `schedule38.isNonResident`: Non-resident corp — routes life insurers to the s.190.13(c) branch.
- `schedule38.isRelatedToOtherFinancialInstitutionAtEndOfYear`: The corporation was related to another financial institution at the end of the year; selects between the s.190.15(1) standalone $1B capital deduction and the related-group allocation that Schedule 39 files.
- `schedule38.isTrustCorporation`: s.190(1)(b) — authorized to offer trustee services to the public?
- `schedule38.line101ReservesNotDeductedInIncome`: Box 101 — reserves, except to the extent deducted in computing Part I income (s.190.13(a)(iii)).
- `schedule38.line102LongTermDebt`: Box 102 — long-term debt (s.190.13(a)(i)).
- `schedule38.line103CapitalStock`: Box 103 — capital stock (or members' contributions if the corporation has no share capital) (s.190.13(a)(ii)).
- `schedule38.line104RetainedEarnings`: Box 104 — retained earnings (s.190.13(a)(ii)).
- `schedule38.line105ContributedSurplus`: Box 105 — contributed surplus (s.190.13(a)(ii)).
- `schedule38.line106OtherSurpluses`: Box 106 — any other surpluses (s.190.13(a)(ii)).
- `schedule38.line121DeferredTaxDebitBalance`: Box 121 — deferred tax debit balance (s.190.13(a)(iv) deduction).
- `schedule38.line122DeficitDeducted`: Box 122 — deficit deducted in computing shareholders' equity, including any provision for redeeming preferred shares (s.190.13(a)(v) deduction).
- `schedule38.line151LongTermDebt`: Box 151 — long-term debt (formula variable A).
- `schedule38.line152CapitalStock`: Box 152 — capital stock (or members' contributions) — variable B(i).
- `schedule38.line153RetainedEarnings`: Box 153 — retained earnings — variable B(ii).
- `schedule38.line154AccumulatedOtherComprehensiveIncome`: Box 154 — accumulated other comprehensive income (AOCI) — variable B(iii). The ONLY component box the engine accepts as negative: a debit AOCI balance is legitimate and s.190.13(b) B(iii) totals it as reported. Every other component box warns when negative, because an equity deficit belongs on the deduction lines (121/122 for s.190.13(a); 165 for s.190.13(b)).
- `schedule38.line155PolicyholdersLiabilities`: Box 155 — policyholders' liabilities — variable B(iv).
- `schedule38.line156ContributedSurplus`: Box 156 — contributed surplus — variable B(v).
- `schedule38.line157OtherSurpluses`: Box 157 — any other surpluses — variable B(vi).
- `schedule38.line158Net90PercentCsm`: Box 158 — 90% of the net contractual service margin (CSM), excluding segregated fund policies (formula variables C and D: 0.9 × C − 0.9 × D).
- `schedule38.line165DeficitDeducted`: Box 165 — deficit deducted in computing shareholders' equity, including any provision for redeeming preferred shares (formula variable E deduction).
- `schedule38.line201TenPercentRiskWeightedAssets`: Box 201 — 10% of risk-weighted on-balance-sheet assets and off-balance-sheet exposures per the OSFI risk-weighting guidelines (s.190.13(d)).
- `schedule38.line202CapitalAdequacyDeductions`: Box 202 — amounts deductible from capital under the OSFI risk-based capital adequacy guidelines, on the Schedule II Bank Act basis (s.190.13(d)).
- `schedule38.line301SurplusFundsFromOperationsExcess`: Box 301 — excess of surplus funds derived from operations (s.138(12)) over amounts already taxed under Part XIV in a prior year (s.190.13(c)).
- `schedule38.line302AttributedSurplus`: Box 302 — attributed surplus for the year (s.190.13(c)).
- `schedule38.line303OtherCanadaInsuranceSurpluses`: Box 303 — any other surpluses relating to insurance businesses carried on in Canada (s.190.13(c)).
- `schedule38.line304CanadaInsuranceLongTermDebt`: Box 304 — long-term debt reasonably regarded as relating to insurance businesses carried on in Canada (s.190.13(c)).
- `schedule38.line401SharesOfRelatedFIs`: Box 401 — carrying value at year-end of shares of related financial institutions (s.190.14(2) eligible investment).
- `schedule38.line404LongTermDebtOfRelatedFIs`: Box 404 — carrying value at year-end of long-term debt of related financial institutions (s.190.14(2) eligible investment).
- `schedule38.line411SurplusContributedToRelatedFIs`: Box 411 — surplus of related financial institutions contributed by the corporation and not reflected on lines 401/404 (s.190.14(2)).
- `schedule38.line551PrescribedClauseBAmounts`: Box 551 — amounts described in clause 190.11(b)(i)(B) (total of column 5, Table 1); added to the proportion base.
- `schedule38.line552CanadianReserveLiabilities`: Box 552 — Canadian reserve liabilities at the end of the year (s.190.11(b)(i) proportion numerator).
- `schedule38.line553TotalReserveLiabilities`: Box 553 — total reserve liabilities at the end of the year (s.190.11(b)(i) proportion denominator, together with line 554).
- `schedule38.line554PrescribedClauseEAmounts`: Box 554 — amounts described in clause 190.11(b)(i)(E) (total of column 7, Table 1); part of the proportion DENOMINATOR.
- `schedule38.line555PrescribedClauseCAmounts`: Box 555 — amounts described in clause 190.11(b)(i)(C) (total of column 6, Table 1); subtracted from the proportion base.
- `schedule38.line650CanadianAssets`: Box 650 — Canadian assets at the end of the year (s.190.11(a) numerator).
- `schedule38.line655TotalAssets`: Box 655 — total assets at the end of the year (s.190.11(a) denominator).
- `schedule38.partITaxPayableForYear`: s.190.1(3)(a) — Part I tax payable for the year (offset).
- `schedule38.partVI2TaxPayableForYearS67`: Optional practitioner cross-check of the Schedule 67 T2 line 725 Part VI.2 instalment deductible under ITA s.190.1(3)(a). It is never authority: batch computation supplies the server-produced Schedule 67 t2_line_725_feed, and a missing or conflicting feed blocks the deduction.
- `schedule38.relatedSolelyViaCrownControl`: s.190.15(6)(a) — related SOLELY because of Crown control (deemed NOT related for s.190.14/190.15).
- `schedule38.relatedSolelyViaS251_5_b_Right`: s.190.15(6)(b) — related SOLELY via a s.251(5)(b) right.
- `schedule38.rightAcquiredForAvoidancePurpose`: s.190.15(6) closing exception: was ONE OF THE MAIN PURPOSES for acquiring the s.251(5)(b) right to avoid a limitation on the amount of a corporation's capital deduction? Avoidance need only be among the main purposes, not the predominant one. Yes treats the right as exercised, so the corporations stay related for the s.190.15 capital deduction. It does not restore relatedness for s.190.14. Required whenever relatedSolelyViaS251_5_b_Right is true: a blank withholds the deeming rather than granting the $1B standalone capital deduction.
- `schedule38.unusedPartIcreditsClaimedFromS42`: s.190.1(3)(b) — unused Part I tax credits claimed this year (S38 line 884 ≡ S42 line 420; the pool register lives on S42).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (14 of 95 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule38.businessNumber | 0 to 20000 characters |
| schedule38.canadianAllocationFraction | -1000000000000000 to 1000000000000000 |
| schedule38.capitalPerS190_13 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule38.corporationName | 0 to 20000 characters |
| schedule38.currentTaxYearEnd | 0 to 20000 characters |
| schedule38.currentTaxYearStart | 0 to 20000 characters |
| schedule38.daysInTaxYear | -1000000000000000 to 1000000000000000 |
| schedule38.investmentRows[].carryingValue | -1000000000000000 to 1000000000000000 |
| schedule38.investmentRows[].investmentType | one of "share", "long_term_debt", "contributed_surplus", null |
| schedule38.partITaxPayableForYear | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (115)

| Cell | Types |
| --- | --- |
| amount_1a_subtotal_capital_additions | array \| boolean \| null \| number \| object \| string |
| amount_1b_capital_deductions | array \| boolean \| null \| number \| object \| string |
| amount_1c_subtotal_capital_additions | array \| boolean \| null \| number \| object \| string |
| amount_1d_greater_of_sfdo_excess_or_attributed_surplus | array \| boolean \| null \| number \| object \| string |
| amount_2a_subtotal_shares_plus_long_term_debt | null \| number |
| amount_4b_subtotal_taxable_capital_plus_clause_b | array \| boolean \| null \| number \| object \| string |
| amount_4c_total_after_clause_c | array \| boolean \| null \| number \| object \| string |
| amount_5b_short_year_prorated_gross_tax | array \| boolean \| null \| number \| object \| string |
| amount_6a_gross_part_vi_tax | number |
| amount_6b_excess_part_vi_tax | number |
| amount_6c_unused_part_i_credit_balance_from_s42 | array \| boolean \| null \| number \| object \| string |
| amount_6d_unused_part_i_credit_applicable_this_year | array \| boolean \| null \| number \| object \| string |
| amount_8a_part_i_tax_payable | number |
| amount_8b_gross_part_vi_tax | number |
| businessNumber | null \| string |
| canadian_allocation_fraction | number |
| capital_branch | string |
| capital_deduction_s190_15 | number |
| capital_per_s190_13 | number |
| corporationName | null \| string |
| currentTaxYearEnd | string |
| currentTaxYearStart | string |
| daysInTaxYear | integer |
| fired_gates | object |
| gross_part_vi_tax_after_short_year | number |
| gross_part_vi_tax_before_short_year | number |
| groupAllocationAgreementS39 | array |
| group_allocation_residual | number |
| ifrs17_post_2022_ty_start | array \| boolean \| null \| number \| object \| string |
| investment_in_related_fi_s190_14 | number |
| isAuthorizedForeignBank | array \| boolean \| null \| number \| object \| string |
| isBank | boolean \| null |
| isDepositTakingMortgageLender | array \| boolean \| null \| number \| object \| string |
| isHoldcoUnderS190_1_e | array \| boolean \| null \| number \| object \| string |
| isLifeInsuranceCorpInCanada | array \| boolean \| null \| number \| object \| string |
| isNonResident | array \| boolean \| null \| number \| object \| string |
| isRelatedToOtherFinancialInstitutionAtEndOfYear | boolean \| null |
| isTrustCorporation | array \| boolean \| null \| number \| object \| string |
| is_short_year | boolean |
| line_101_reserves_not_deducted_in_income | array \| boolean \| null \| number \| object \| string |
| line_102_long_term_debt | array \| boolean \| null \| number \| object \| string |
| line_103_capital_stock | array \| boolean \| null \| number \| object \| string |
| line_104_retained_earnings | array \| boolean \| null \| number \| object \| string |
| line_105_contributed_surplus | array \| boolean \| null \| number \| object \| string |
| line_106_other_surpluses | array \| boolean \| null \| number \| object \| string |
| line_121_deferred_tax_debit_balance | array \| boolean \| null \| number \| object \| string |
| line_122_deficit_deducted | array \| boolean \| null \| number \| object \| string |
| line_151_long_term_debt | array \| boolean \| null \| number \| object \| string |
| line_152_capital_stock | array \| boolean \| null \| number \| object \| string |
| line_153_retained_earnings | array \| boolean \| null \| number \| object \| string |
| line_154_accumulated_other_comprehensive_income | array \| boolean \| null \| number \| object \| string |
| line_155_policyholders_liabilities | array \| boolean \| null \| number \| object \| string |
| line_156_contributed_surplus | array \| boolean \| null \| number \| object \| string |
| line_157_other_surpluses | array \| boolean \| null \| number \| object \| string |
| line_158_net_ninety_percent_csm | array \| boolean \| null \| number \| object \| string |
| line_165_deficit_deducted | array \| boolean \| null \| number \| object \| string |
| line_171_capital_for_year_resident_life | array \| boolean \| null \| number \| object \| string |
| line_190_capital_for_year_non_life | null \| number |
| line_201_ten_percent_risk_weighted_assets | array \| boolean \| null \| number \| object \| string |
| line_202_capital_adequacy_deductions | array \| boolean \| null \| number \| object \| string |
| line_290_capital_for_year_authorized_foreign_bank | array \| boolean \| null \| number \| object \| string |
| line_301_surplus_funds_from_operations_excess | array \| boolean \| null \| number \| object \| string |
| line_302_attributed_surplus | array \| boolean \| null \| number \| object \| string |
| line_303_other_canada_insurance_surpluses | array \| boolean \| null \| number \| object \| string |
| line_304_canada_insurance_long_term_debt | array \| boolean \| null \| number \| object \| string |
| line_306_capital_for_year_non_resident_life | array \| boolean \| null \| number \| object \| string |
| line_401_shares_of_related_fis | null \| number |
| line_404_long_term_debt_of_related_fis | null \| number |
| line_411_surplus_contributed_to_related_fis | null \| number |
| line_551_prescribed_clause_b_amounts | array \| boolean \| null \| number \| object \| string |
| line_552_canadian_reserve_liabilities | array \| boolean \| null \| number \| object \| string |
| line_553_total_reserve_liabilities | array \| boolean \| null \| number \| object \| string |
| line_554_prescribed_clause_e_amounts | array \| boolean \| null \| number \| object \| string |
| line_555_prescribed_clause_c_amounts | array \| boolean \| null \| number \| object \| string |
| line_591_tcec_resident_life | array \| boolean \| null \| number \| object \| string |
| line_650_canadian_assets | array \| boolean \| null \| number \| object \| string |
| line_655_total_assets | array \| boolean \| null \| number \| object \| string |
| line_691_tcec_non_life | null \| number |
| line_791_tcec_non_resident_life | array \| boolean \| null \| number \| object \| string |
| line_883_part_i_credit_applied_current_year | number |
| line_890_net_part_vi_tax_payable | number |
| missing_required[] | string |
| part_i_tax_offset_s190_1_3_a | number |
| part_vi_2_tax_offset_s190_1_3_a | number |
| provisional | boolean |
| ready | boolean |
| requested_unused_part_i_credit_claim_s190_1_3_b | number |
| short_year_proration_factor | number |
| subtotal_group_allocation_total | number |
| t2_line_720_feed | number |
| tax_base_excess_taxable_capital_over_cd | number |
| taxable_capital_s190_12 | number |
| tcec_s190_11 | number |
| total_offsets | number |
| unused_part_i_credit_claimed_s190_1_3_b | number |
| unused_part_i_credit_generated_this_year_s190_1_5 | number |
| warnings[].box | null \| string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].producers[] | string |
| warnings[].severity | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].anchor_field | string |
| requested_unused_surtax_credit_claim_s190_1_3_b | number |
| unused_surtax_credit_claimed_s190_1_3_b | number |
| amount_7b_printed_offsets_subtotal | number |

### Output cell notes

- `amount_2a_subtotal_shares_plus_long_term_debt`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `businessNumber`: The filer's business number. Echoed back from the request. Null when the caller supplied none; the unsupplied cell is named in `missing_required` instead of being invented.
- `corporationName`: The corporation's name. Echoed back from the request. Null when the caller supplied none; the unsupplied cell is named in `missing_required` instead of being invented.
- `isBank`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isRelatedToOtherFinancialInstitutionAtEndOfYear`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `line_190_capital_for_year_non_life`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `line_401_shares_of_related_fis`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `line_404_long_term_debt_of_related_fis`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `line_411_surplus_contributed_to_related_fis`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `line_691_tcec_non_life`: Printed Schedule 38 form-face cell. Null when the branch is inactive or the return was entered in aggregate, which leaves the printed cell blank instead of filing a zero.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.

# schedule39

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s39_exact_single_request_target_value_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule39"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule39": {
      "calendarYear": 2025,
      "isAmendedAgreement": false,
      "rows": [
        {
          "memberName": "Northstar Financial Holdings Inc.",
          "memberBN": "111222337RC0001",
          "allocationAmount": 600000000
        },
        {
          "memberName": "Harbourlight Life Insurance Company",
          "memberBN": "444555668RC0001",
          "allocationAmount": 400000000
        }
      ]
    }
  }
}
```

## Input cells (13)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule39.calendarYear | null \| number | strict |
| schedule39.dateFiled | null \| string |  |
| schedule39.isAmendedAgreement | boolean \| null | strict |
| schedule39.otherAgreementsFiledForCalendarYear | boolean \| null |  |
| schedule39.otherFiledAgreements | array |  |
| schedule39.otherFiledAgreements[].agreementDateFiled | null \| string |  |
| schedule39.otherFiledAgreements[].allocationAuthority | string |  |
| schedule39.otherFiledAgreements[].allocationToFilingCorporation | null \| number |  |
| schedule39.rows | array |  |
| schedule39.rows[].allocationAmount | null \| number \| string | strict |
| schedule39.rows[].memberBN | null \| string | strict |
| schedule39.rows[].memberName | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule39.calendarYear`: Box 030 — Four-digit calendar year the agreement applies to. Sanity-clamped to [2019, 2099]; per s.190.15(5) the deduction is calendar-year scoped — a member with multiple TY ending in the same calendar year files ONE S39 per calendar year.
- `schedule39.dateFiled`: Box 010 — Date the agreement was filed. Carried as internal metadata with no validation gate: T2 SCH 39 E (19) prints no "do not use this area" annotation on this field (unlike S23/S28/S49), so it is a preparer field, but ITA s.190.15 attaches no consequence to the date beyond the s.190.15(3) Minister's 30-day demand. null = not stated, and nothing is invented.
- `schedule39.isAmendedAgreement`: T2 SCH 39 box 020: this is an amended related-group agreement allocating the s.190.15(2) $1B Part VI capital deduction.
- `schedule39.otherAgreementsFiledForCalendarYear`: ITA 190.15(4) takes "the least amount allocated for a taxation year to each member of a related group UNDER AN AGREEMENT described in subsection 190.15(2)". Two members of one related group can each file a conflicting agreement, and nothing in this return can see the other copy, so the corporation states whether another agreement exists for the calendar year. null = unanswered, which withholds the capital deduction rather than assuming this copy stands alone.
- `schedule39.otherFiledAgreements`: One row per OTHER filed s.190.15(2) agreement, stating the amount it allocates to THIS corporation. Required when otherAgreementsFiledForCalendarYear is true; an explicit 0 is a binding nil.
- `schedule39.otherFiledAgreements[].agreementDateFiled`: Date that agreement was filed, for the practitioner's own trail.
- `schedule39.otherFiledAgreements[].allocationAuthority`: Allocation source.
- `schedule39.otherFiledAgreements[].allocationToFilingCorporation`: Capital deduction that agreement allocates to the filing corporation.
- `schedule39.rows`: Rows of related FI members in the group. Practitioner adds one row per related FI (including the filing FI itself). Empty rows are elided by the backend. Single-row agreements are structurally invalid — for standalone FIs claim the $1B deduction directly on S38 line 250 under s.190.15(1).
- `schedule39.rows[].allocationAmount`: Box 450 — Column 3: amount of capital deduction allocated to this member $. Non-negative, must be ≤ $1B per row, sum across all rows must be ≤ $1B per s.190.15(2).
- `schedule39.rows[].memberBN`: Box 300 — Column 2: business number (CRA 15-character format '123456789RC0001' or 'NR' for unregistered corps).
- `schedule39.rows[].memberName`: Box 200 — Column 1: legal name of the related FI member.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (6 of 13 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule39.calendarYear | -1000000000000000 to 1000000000000000 |
| schedule39.otherFiledAgreements[].allocationAuthority | one of "agreement", "minister" |
| schedule39.rows[].allocationAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule39.rows[].memberBN | 0 to 20000 characters |
| schedule39.rows[].memberName | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (40)

| Cell | Types |
| --- | --- |
| date_filed | array \| boolean \| null \| number \| object \| string |
| calendar_year | integer \| null |
| capital_deduction_cap_applied | string |
| fired_gates | object |
| is_amended_agreement | boolean \| null |
| provisional | boolean |
| ready | boolean |
| residual_to_1b_cap | string |
| rows[].allocationAmount | null \| number |
| rows[].memberBN | null \| string |
| rows[].memberName | null \| string |
| total_allocated | string |
| warnings[].box | null \| string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | null \| string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.verified_at | string |
| warnings[].code | null \| string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].citation.display | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].actual | number |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| capital_deduction_cap_conversion_receipt.reportingCurrency | string |

### Output cell notes

- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].citation.kind`: The authority family the section belongs to.
- `warnings[].citation.section`: The cited provision.
- `warnings[].citation.display`: The citation as it is shown to a preparer.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule4

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024 and later
- Strict profile: s4_2025_single_non_capital_loss_application_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): schedule1, schedule130, schedule2, schedule24, schedule3, schedule43, schedule6

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule4"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "accounts": [
      {
        "id": "acct-revenue-target",
        "accountCode": "8000",
        "accountName": "Cedar Ridge sales revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "treatment": "no_adjustment",
          "deductibility": "100%",
          "assumption": "Caller-supplied book-income fact"
        }
      },
      {
        "id": "acct-tax-penalty-target",
        "accountCode": "9000",
        "accountName": "Interest and penalties on taxes",
        "currentYearBalance": 1000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": true,
          "adjustmentType": "addition",
          "treatment": "full_addition",
          "deductibility": "0%",
          "assumption": "Caller-supplied line-103 classification; legal deductibility not verified",
          "s1Line": "103"
        }
      }
    ],
    "incomeStatementFlags": {
      "acct-revenue-target": true,
      "acct-tax-penalty-target": true
    },
    "workpapers": [],
    "pyLossPools": [
      {
        "type": "non_capital",
        "yearOfOrigin": 2022,
        "originalAmount": 50000,
        "remainingBalance": 50000,
        "applied": {}
      }
    ],
    "lossElections": [],
    "claimMaximumLosses": true,
    "isCCPC": true,
    "daysInYear": 365
  }
}
```

## Input cells (92)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.adjustmentType | null \| string |  |
| accounts[].classification.assumption | string | strict |
| accounts[].classification.deductibility | string | strict |
| accounts[].classification.deductibilityPercentage | null \| number \| string |  |
| accounts[].classification.deductibilityRule | string |  |
| accounts[].classification.ruleId | null \| string |  |
| accounts[].classification.s1Line | string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].classification.templateId | null \| string |  |
| accounts[].classification.treatment | string | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| businessCarriedOnThroughoutByBusiness | object |  |
| claimMaximumLosses | boolean | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.acct-revenue-target | boolean | strict |
| incomeStatementFlags.acct-tax-penalty-target | boolean | strict |
| isCCPC | boolean |  |
| limitedPartnershipClaimDeniedUnder18_2_2 | number |  |
| lossElections[].requestedAmount | integer | strict |
| lossElections[].type | string | strict |
| lossElections[].yearOfOrigin | integer | strict |
| pyLossPools[].applied | object | strict |
| pyLossPools[].originalAmount | integer | strict |
| pyLossPools[].remainingBalance | integer | strict |
| pyLossPools[].type | string | strict |
| pyLossPools[].yearOfOrigin | integer | strict |
| sameOrSimilarBusinessIncomeByBusiness | object |  |
| schedule4.currentYearNonCapitalLoss | number |  |
| schedule4.expiredPools | array |  |
| schedule4.form | object |  |
| schedule4.form.formWarnings | array |  |
| schedule4.form.part6Table | array |  |
| schedule4.form.part6Table[].farm | number |  |
| schedule4.form.part6Table[].lpp | number |  |
| schedule4.form.part6Table[].nonCapital | number |  |
| schedule4.form.part6Table[].restrictedFarm | number |  |
| schedule4.form.part6Table[].year | string |  |
| schedule4.form.part7Table1 | array |  |
| schedule4.form.part7Table1[].accountFirst9 | string |  |
| schedule4.form.part7Table1[].accountLast4 | string |  |
| schedule4.form.part7Table1[].atRiskAmount | number |  |
| schedule4.form.part7Table1[].atRiskReducers | number |  |
| schedule4.form.part7Table1[].atRiskRoom | number |  |
| schedule4.form.part7Table1[].currentYearLPLoss | number |  |
| schedule4.form.part7Table1[].fiscalYearEnd | string |  |
| schedule4.form.part7Table1[].shareOfLoss | number |  |
| schedule4.form.part7Table2 | array |  |
| schedule4.form.part7Table2[].accountFirst9 | string |  |
| schedule4.form.part7Table2[].accountLast4 | string |  |
| schedule4.form.part7Table2[].applicableMax | number |  |
| schedule4.form.part7Table2[].atRiskAmount | number |  |
| schedule4.form.part7Table2[].atRiskReducers | number |  |
| schedule4.form.part7Table2[].atRiskRoom | number |  |
| schedule4.form.part7Table2[].availablePriorLoss | number |  |
| schedule4.form.part7Table2[].fiscalYearEnd | string |  |
| schedule4.form.part7Table3 | array |  |
| schedule4.form.part7Table3[].accountFirst9 | string |  |
| schedule4.form.part7Table3[].accountLast4 | string |  |
| schedule4.form.part7Table3[].applied | number |  |
| schedule4.form.part7Table3[].closing | number |  |
| schedule4.form.part7Table3[].currentYearLPLoss | number |  |
| schedule4.form.part7Table3[].opening | number |  |
| schedule4.form.part7Table3[].transferred | number |  |
| schedule4.incomeLimits | object |  |
| schedule4.lossesApplied | number |  |
| schedule4.newPools | array |  |
| schedule4.poolContinuity | array |  |
| schedule4.poolContinuity[].applied | object |  |
| schedule4.poolContinuity[].expired | boolean |  |
| schedule4.poolContinuity[].expiryClock | string |  |
| schedule4.poolContinuity[].expiryYear | null \| number |  |
| schedule4.poolContinuity[].lossYearEnd | string |  |
| schedule4.poolContinuity[].lossYearStart | string |  |
| schedule4.poolContinuity[].originalAmount | number |  |
| schedule4.poolContinuity[].originalInclusionRate | number |  |
| schedule4.poolContinuity[].partIVApplied | object |  |
| schedule4.poolContinuity[].preAoC | boolean |  |
| schedule4.poolContinuity[].remainingBalance | number |  |
| schedule4.poolContinuity[].taxationYearsElapsed | number |  |
| schedule4.poolContinuity[].type | string |  |
| schedule4.poolContinuity[].yearOfOrigin | number |  |
| schedule4.provisional | boolean |  |
| schedule4.warnings | array |  |
| taxYear | integer \| string | always |
| workpapers | array | strict |

### Input cell notes

- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `businessCarriedOnThroughoutByBusiness`: ITA 111(5)(a)(i) conclusion for each named pre-event business. False is a completed No answer; omit an unanswered business.
- `claimMaximumLosses`: ITA s.111(1) deducts "such portion as the taxpayer may claim", so the claim is an answer and not a default. True asks for every deductible pool in full, up to the income limits, and is the alternative to stating lossElections rows. The two answers are mutually exclusive: this witness states the maximum instruction and carries no election rows.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `incomeStatementFlags.acct-revenue-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `incomeStatementFlags.acct-tax-penalty-target`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `limitedPartnershipClaimDeniedUnder18_2_2`: Portion of the current-year limited-partnership loss claim denied under ITA 18.2(2). Omit while unanswered; 0 confirms that no claimed amount was denied. The full claim still reduces the loss balance under s.111(3)(a).
- `lossElections[].requestedAmount`: The portion claimed against that pool, in dollars. This witness claims $20,000 of the $50,000 pool and preserves the $30,000 balance; 0 is a lawful nil claim that preserves the whole pool. The engine applies the stated amount subject to the s.111(1) income limits and never more.
- `lossElections[].type`: Loss pool class the claim is made against. It must match a pyLossPools row: the election names the pool s.111(1) deducts from.
- `lossElections[].yearOfOrigin`: Taxation year the loss arose in, identifying the pool the claim consumes for the s.111(3) continuity.
- `sameOrSimilarBusinessIncomeByBusiness`: ITA 111(5)(a)(ii) income ceiling for each named pre-event business. Keys match `businessId` on Schedule 4 loss pools; omit an unanswered business, while 0 confirms a nil ceiling.
- `schedule4.currentYearNonCapitalLoss`: Current-year non-capital loss created per s.111(8) (also present as a current-year pool in newPools / poolContinuity).
- `schedule4.form`: Present when the engine attached the form projection (the batch path).
- `schedule4.form.part6Table[].year`: Year of origin (column 1) — a string identifier, never thousands-separated.
- `schedule4.poolContinuity[].lossYearStart`: The loss YEAR's own bounds (ISO). s.111(1.1)(a)(ii) variable C is the s.38 fraction "for the loss year", which S.C. 2001, c. 17, s. 22(5) selects from these dates — `yearOfOrigin` is a calendar label and cannot recover it for a year that straddles a transition.
- `schedule4.poolContinuity[].originalInclusionRate`: Scale: 0–1 fraction. Same scale as Schedule6Data.inclusionRate.
- `schedule4.poolContinuity[].partIVApplied`: Separate s.186(1)(c)/(d) debit ledger; never merged into the Part I `applied` amounts that print on Schedule 4 lines 130/330.
- `schedule4.poolContinuity[].taxationYearsElapsed`: How many TAXATION years have elapsed since the loss year, and which clock produced that count. s.111(1)(a) gives a non-capital loss "the 20 taxation years immediately preceding and the 3 taxation years immediately following the year"; `expiryYear` above is a calendar LABEL (the printed form has no other column), so without these a reader cannot tell a taxation-year expiry from a calendar one. Absent when the corporation's period sequence could not be proven.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (29 of 92 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.adjustmentType | 0 to 20000 characters |
| accounts[].classification.assumption | 0 to 20000 characters |
| accounts[].classification.deductibility | 0 to 20000 characters |
| accounts[].classification.deductibilityPercentage | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| accounts[].classification.deductibilityRule | 0 to 20000 characters |
| accounts[].classification.ruleId | 0 to 20000 characters |
| accounts[].classification.s1Line | 0 to 20000 characters |
| accounts[].classification.templateId | 0 to 20000 characters |
| accounts[].classification.treatment | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| lossElections[].requestedAmount | -1000000000000000 to 1000000000000000 |
| lossElections[].type | 0 to 20000 characters |
| lossElections[].yearOfOrigin | -1000000000000000 to 1000000000000000 |
| pyLossPools[].originalAmount | -1000000000000000 to 1000000000000000 |
| pyLossPools[].remainingBalance | -1000000000000000 to 1000000000000000 |
| pyLossPools[].type | 0 to 20000 characters |
| pyLossPools[].yearOfOrigin | -1000000000000000 to 1000000000000000 |
| schedule4.poolContinuity[].expiryClock | one of "taxation_years", "calendar_years" |
| schedule4.poolContinuity[].type | one of "non_capital", "net_capital", "restricted_farm", "farm", "limited_partnership" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027; 0 to 20000 characters |
| workpapers | exactly [] (pinned) |

## Output cells (247)

| Cell | Types |
| --- | --- |
| applicationDetails[].adjustmentFactor | number |
| applicationDetails[].amountApplied | number |
| applicationDetails[].poolId | string |
| applicationDetails[].type | string |
| applicationDetails[].yearOfOrigin | integer |
| applicationDetails[].applicationPeriodKey | string |
| carrybackRequests | array |
| currentYearFarmLoss | number |
| currentYearNonCapitalLoss | number |
| expiredPools | array |
| form.amount_1N | number |
| form.amount_1O | number |
| form.amount_1P | number |
| form.amount_1Q | number |
| form.amount_1R | number |
| form.amount_1S | number |
| form.amount_2A | number |
| form.amount_2B | number |
| form.amount_2C | number |
| form.amount_2D | number |
| form.amount_2E | number |
| form.amount_2F | number |
| form.amount_2G | number |
| form.amount_2H | number |
| form.amount_3A | number |
| form.amount_3B | number |
| form.amount_3C | number |
| form.amount_3D | number |
| form.amount_3E | number |
| form.amount_3F | number |
| form.amount_4F | number |
| form.amount_4G | number |
| form.amount_4H | number |
| form.amount_4I | number |
| form.amount_4J | number |
| form.amount_4K | number |
| form.amount_5A | number |
| form.amount_5B | number |
| form.amount_5C | number |
| form.amount_5D | number |
| form.amount_5E | number |
| form.amount_8A | number |
| form.formWarnings | array |
| form.line_100 | number |
| form.line_102 | number |
| form.line_105 | number |
| form.line_110 | number |
| form.line_130 | number |
| form.line_140 | number |
| form.line_150 | number |
| form.line_180 | number |
| form.line_190 | integer |
| form.line_200 | number |
| form.line_205 | number |
| form.line_210 | number |
| form.line_215 | number |
| form.line_220 | number |
| form.line_225 | number |
| form.line_240 | number |
| form.line_250 | number |
| form.line_280 | number |
| form.line_300 | number |
| form.line_302 | number |
| form.line_305 | number |
| form.line_310 | number |
| form.line_330 | number |
| form.line_340 | number |
| form.line_350 | number |
| form.line_380 | number |
| form.line_400 | number |
| form.line_402 | number |
| form.line_405 | number |
| form.line_410 | number |
| form.line_430 | number |
| form.line_440 | number |
| form.line_450 | number |
| form.line_480 | number |
| form.line_500 | number |
| form.line_502 | number |
| form.line_510 | number |
| form.line_530 | number |
| form.line_550 | number |
| form.line_580 | number |
| form.line_675 | number |
| form.line_700 | number |
| form.line_705 | number |
| form.line_710 | number |
| form.line_730 | number |
| form.line_750 | number |
| form.line_780 | number |
| form.line_901 | number |
| form.line_902 | number |
| form.line_903 | number |
| form.line_911 | number |
| form.line_912 | number |
| form.line_913 | number |
| form.line_921 | number |
| form.line_922 | number |
| form.line_923 | number |
| form.line_931 | number |
| form.line_932 | number |
| form.line_933 | number |
| form.line_941 | number |
| form.line_942 | number |
| form.line_943 | number |
| form.line_951 | number |
| form.line_952 | number |
| form.line_953 | number |
| form.line_961 | number |
| form.line_962 | number |
| form.line_963 | number |
| form.part6Table[].farm | number |
| form.part6Table[].lpp | number |
| form.part6Table[].nonCapital | number |
| form.part6Table[].restrictedFarm | number |
| form.part6Table[].year | string |
| form.part7Table1 | array |
| form.part7Table2 | array |
| form.part7Table3 | array |
| form.amount_4A | number |
| form.amount_4B | number |
| form.amount_4C | number |
| form.amount_4D | number |
| form.amount_4E | number |
| form.line_485 | number |
| form.line_135 | number |
| form.line_335 | number |
| incomeLimits.farm | number |
| incomeLimits.limited_partnership | number |
| incomeLimits.net_capital | number |
| incomeLimits.non_capital | number |
| incomeLimits.restricted_farm | number |
| limitedPartnership.accounts | array |
| limitedPartnership.totalApplied | number |
| limitedPartnership.totalClosing | number |
| limitedPartnership.totalCurrentLoss | number |
| limitedPartnership.warnings | array |
| limitedPartnershipClaimedBeforeEifel | number |
| limitedPartnershipDeniedUnder_18_2_2 | number |
| lossesApplied | number |
| netCapitalCaptures.abilExpiredAsNcl | number |
| netCapitalCaptures.unusedNclEleventhYear | number |
| newPools | array |
| part1BuildupWorksheet.printedAmount1A | number |
| part1BuildupWorksheet.printedAmount1B | number |
| part1BuildupWorksheet.printedAmount1C | number |
| part1BuildupWorksheet.printedAmount1D | number |
| part1BuildupWorksheet.printedAmount1E | number |
| part1BuildupWorksheet.printedAmount1F | number |
| part1BuildupWorksheet.printedAmount1G | number |
| part1BuildupWorksheet.printedAmount1H | number |
| part1BuildupWorksheet.printedAmount1I | number |
| part1BuildupWorksheet.printedAmount1J | number |
| part1BuildupWorksheet.printedAmount1K | number |
| part1BuildupWorksheet.printedAmount1L | number |
| part1BuildupWorksheet.printedAmount1M | number |
| poolContinuity[].applied.tax-year-end:2025-12-31 | number |
| poolContinuity[].expired | boolean |
| poolContinuity[].expiryYear | integer |
| poolContinuity[].originalAmount | number |
| poolContinuity[].remainingBalance | number |
| poolContinuity[].type | string |
| poolContinuity[].yearOfOrigin | integer |
| poolContinuity[].expiryClock | string |
| poolContinuity[].taxationYearsElapsed | integer |
| poolContinuity[].poolId | string |
| provisional | boolean |
| s88_1_1_f_election | boolean |
| s88_1_1_f_yearShifts | array |
| warnings[].actual | number |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].code | string |
| warnings[].expected | array \| boolean \| null \| number \| object \| string |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[].field | string |
| warnings[].amount | null \| number |
| warnings[].type | string |
| warnings[].yearOfOrigin | integer \| null \| string |
| warnings[] | object |
| warnings[].acceptedByClaim | object |
| warnings[].requestedByClaim | object |
| warnings[].unappliedByClaim | object |
| warnings[].businessId | string |
| warnings[].originPools[].amount | number |
| warnings[].originPools[].type | string |
| warnings[].originPools[].yearOfOrigin | integer |
| warnings[].claims[].amountAccepted | null \| number |
| warnings[].claims[].amountRequested | null \| number |
| warnings[].claims[].lossType | null \| string |
| warnings[].claims[].reason | null \| string |
| warnings[].claims[].targetYear | integer \| null |
| warnings[].claims[].yearOfOrigin | integer \| null |
| warnings[].fields[] | string |
| warnings[].higherPriorityTypes[] | string |
| warnings[].poolId | null \| string |
| warnings[].poolIds[] | string |
| warnings[].rowIndex | integer |
| warnings[].subsidiaryLossYearEnd | null \| string |
| warnings[].subsidiaryYearOfOrigin | integer |
| warnings[].taxationYearsElapsed | integer |
| warnings[].accountNumber | string |
| warnings[].pool.remainingBalance | number |
| warnings[].pool.type | string |
| warnings[].pool.yearOfOrigin | integer |
| warnings[].olderYears[] | integer \| null \| string |
| warnings[].targetYear | integer \| null |
| warnings[].yearOfOriginBeforeElection | integer \| null |
| limitedPartnershipApplied_line_335 | number |
| restrictedInterestApplied_line_336 | number |
| currentYearRestrictedFarmLoss | number |
| part4RestrictedFarmWorksheet.amount_4A | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.amount_4B | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.amount_4C | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.amount_4D | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.amount_4E | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.applies | array \| boolean \| null \| number \| object \| string |
| part4RestrictedFarmWorksheet.blocked | boolean |
| part4RestrictedFarmWorksheet.chiefSourceStatus | string |
| part4RestrictedFarmWorksheet.line_485 | array \| boolean \| null \| number \| object \| string |
| currentTaxationYearEnd | string |
| partIVLossClaimContinuity.acceptedByClaim.currentYearFarm | number |
| partIVLossClaimContinuity.acceptedByClaim.currentYearNonCapital | number |
| partIVLossClaimContinuity.acceptedByClaim.priorYearFarm | number |
| partIVLossClaimContinuity.acceptedByClaim.priorYearNonCapital | number |
| partIVLossClaimContinuity.applications | array |
| partIVLossClaimContinuity.fullyReconciled | boolean |
| partIVLossClaimContinuity.requestedByClaim.currentYearFarm | number |
| partIVLossClaimContinuity.requestedByClaim.currentYearNonCapital | number |
| partIVLossClaimContinuity.requestedByClaim.priorYearFarm | number |
| partIVLossClaimContinuity.requestedByClaim.priorYearNonCapital | number |
| partIVLossClaimContinuity.unappliedByClaim.currentYearFarm | number |
| partIVLossClaimContinuity.unappliedByClaim.currentYearNonCapital | number |
| partIVLossClaimContinuity.unappliedByClaim.priorYearFarm | number |
| partIVLossClaimContinuity.unappliedByClaim.priorYearNonCapital | number |
| s88_1_1_g_election | boolean |
| s88_1_1_g_yearShifts | array |
| s88_1_2_d_election | boolean |
| s88_1_2_d_yearShifts | array |
| formRevision | string |

### Output cell notes

- `warnings[]`: A Schedule 4 loss-continuity finding that cites the governing statute directly rather than a registered form gate, with the pool, claim or row operands the refusal is about.
- `limitedPartnershipApplied_line_335`: Part 7 limited-partnership deduction included in lossesApplied (T2 line 335).
- `restrictedInterestApplied_line_336`: Part 8 RIFE deduction included in lossesApplied (T2 line 336).

# schedule42

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s42_single_source_credit_pool_profile_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): part_i_tax, schedule31, schedule38

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule42"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "schedule42": {
      "corporationName": "Northstar Bank of Canada",
      "businessNumber": "222333445",
      "currentTaxYearEnd": "2025-12-31",
      "openingUnusedCreditPoolByYear": {
        "2017": 100000
      },
      "carryforwardClaimAppliedToCurrentS38": 50000,
      "currentYearGeneratedFromS38": 25000
    },
    "isCCPC": true
  }
}
```

## Input cells (25)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule42.amalgamationOrWindupTransferAmount | null \| number |  |
| schedule42.amalgamationTransferPredecessorBreakdownByYear | object |  |
| schedule42.aocContinuingBusinessIncomeNumerator | null \| number |  |
| schedule42.aocTaxableIncomeForRatioDenominator | null \| number |  |
| schedule42.businessNumber | null \| string | strict |
| schedule42.carrybackTo1stPreviousYearAmount | null \| number |  |
| schedule42.carrybackTo2ndPreviousYearAmount | null \| number |  |
| schedule42.carrybackTo3rdPreviousYearAmount | null \| number |  |
| schedule42.carryforwardClaimAppliedToCurrentS38 | null \| number | strict |
| schedule42.corporationName | null \| string | strict |
| schedule42.currentTaxYearEnd | null \| string | strict |
| schedule42.currentYearGeneratedFromS38 | null \| number | strict |
| schedule42.hasAcquisitionOfControlThisYear | boolean \| null |  |
| schedule42.openingUnusedCreditPoolByYear | object |  |
| schedule42.openingUnusedCreditPoolByYear.2017 | integer | strict |
| schedule42.surtaxCreditAmount | null \| number |  |
| schedule42.surtaxCreditPoolBySourceTaxationYear | array |  |
| schedule42.surtaxCreditPoolBySourceTaxationYear[].partI3CreditClaimedForYear | null \| number |  |
| schedule42.surtaxCreditPoolBySourceTaxationYear[].sourceTaxYearStart | null \| string |  |
| schedule42.surtaxCreditPoolBySourceTaxationYear[].sourceTaxationYearId | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year, tied to the inclusive fiscalStart-to-fiscalEnd span. 2024 is a leap year, so the exact witness period is 366 days.
- `fiscalEnd`: Last day of the taxation year. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this request's dependency closure computes are day-weighted, so the engine requires the stated period instead of assuming a calendar year. It matches the Schedule 42 current tax-year end.
- `fiscalStart`: First day of the taxation year, stated for the same reason as fiscalEnd.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule42.amalgamationOrWindupTransferAmount`: Line 220 — credit transferred on amalgamation (s.87(2.1)) or subsidiary wind-up (s.88(1)). Expiry clock does NOT reset.
- `schedule42.amalgamationTransferPredecessorBreakdownByYear`: Line 220 per-source-year predecessor breakdown ("YYYY" → amount) — transferred entries retain the predecessor's generating year.
- `schedule42.aocContinuingBusinessIncomeNumerator`: AoC proportional-ratio NUMERATOR — income from the continuing (same-or-similar) business for the particular year.
- `schedule42.aocTaxableIncomeForRatioDenominator`: AoC proportional-ratio DENOMINATOR input — taxable income for the particular year (engine uses greater of numerator and this).
- `schedule42.businessNumber`: 9-digit BN or 15-char RC account.
- `schedule42.carrybackTo1stPreviousYearAmount`: Line 901 — carryback to 1st previous tax year (s.190.1(3)(b)).
- `schedule42.carrybackTo2ndPreviousYearAmount`: Line 902 — carryback to 2nd previous tax year.
- `schedule42.carrybackTo3rdPreviousYearAmount`: Line 903 — carryback to 3rd previous tax year.
- `schedule42.carryforwardClaimAppliedToCurrentS38`: Line 420 — carryforward claim applied to reduce current-year Part VI tax (≡ S38 line 884 / unusedPartIcreditsClaimedFromS42).
- `schedule42.corporationName`: Corporation legal name (header field).
- `schedule42.currentTaxYearEnd`: TY-end YYYY-MM-DD.
- `schedule42.currentYearGeneratedFromS38`: Line 600 — current-year unused Part I tax credit generated (≡ S38 line 870, max(0, Part I tax − gross Part VI) per s.190.1(5)).
- `schedule42.hasAcquisitionOfControlThisYear`: s.190.1(6) AoC restriction — pre-AoC credits restricted post-AoC (s.111(5) same-or-similar-business test, NOT s.111(5.1)).
- `schedule42.openingUnusedCreditPoolByYear`: Line A opening pool — source-year ("YYYY") → unused Part I tax credit generated in that year and still unclaimed. The form face is aggregate-only; the per-source-year register is required for FIFO ordering (s.190.1(4)(a)) and 7-year expiry (line 115).
- `schedule42.surtaxCreditAmount`: Unused surtax credit claimed this year (s.190.1(3)(b)). There is no fixed target-calendar cutoff: a claim is supported only by a source period that began before 2008 and remains within the next seven taxation years in the verified entity sequence. It is applied against the separate unused-surtax-credit register carried by the pinned prior filed return and needs a `surtaxCreditPoolBySourceTaxationYear` row per source year.
- `schedule42.surtaxCreditPoolBySourceTaxationYear`: Two per-source-year facts the current return must state about the unused surtax credit register: `sourceTaxYearStart` and `partI3CreditClaimedForYear`. The balances themselves are never entered here — they come from the pinned prior filed closing register. An unstated Part I.3 claim is not a nil one and blocks. The UI uses a derived absolute outer date only to hide an impossible empty register; the engine decides actual reach from the verified taxation-year sequence.
- `schedule42.surtaxCreditPoolBySourceTaxationYear[].partI3CreditClaimedForYear`: s.190.1(4)(b)(ii)(B) — the total claimed in respect of THIS source year's unused surtax credit under Part I.3, for the current year or any earlier one. Required; absent is not zero and blocks the claim.
- `schedule42.surtaxCreditPoolBySourceTaxationYear[].sourceTaxYearStart`: YYYY-MM-DD start of the source period. Admissibility is on the START: S.C. 2006, c. 4, s. 72(3) repeals s.123.2 for "taxation years that begin after 2007", and a year beginning 2007-07-01 still generated a credit.
- `schedule42.surtaxCreditPoolBySourceTaxationYear[].sourceTaxationYearId`: Stable server taxation-year identity of the SOURCE year, matching the register row on the pinned prior filed Schedule 42 closing.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 25 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule42.businessNumber | 0 to 20000 characters |
| schedule42.carryforwardClaimAppliedToCurrentS38 | -1000000000000000 to 1000000000000000 |
| schedule42.corporationName | 0 to 20000 characters |
| schedule42.currentTaxYearEnd | 0 to 20000 characters |
| schedule42.currentYearGeneratedFromS38 | -1000000000000000 to 1000000000000000 |
| schedule42.openingUnusedCreditPoolByYear.2017 | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (79)

| Cell | Types |
| --- | --- |
| aoc_grind_applied | boolean |
| aoc_statutory_caps_by_source_taxation_year | object |
| authority_grind_applied | boolean |
| businessNumber | null \| string |
| carryback_target_taxation_years | object |
| claimed_this_year_carryback_actually_consumed | number |
| claimed_this_year_carryforward_actually_consumed | number |
| claimed_this_year_total_fifo_sum | number |
| corporationName | null \| string |
| currentTaxYear | integer |
| currentTaxYearEnd | null \| string |
| currentTaxYearId | array \| boolean \| null \| number \| object \| string |
| fifo_consumption_carryback | object |
| fifo_consumption_carryback_by_source_taxation_year | object |
| fifo_consumption_carryforward | object |
| fifo_consumption_carryforward_by_source_taxation_year | object |
| fired_gates | object |
| hasAcquisitionOfControlThisYear | array \| boolean \| null \| number \| object \| string |
| line_115_expired_after_seven_years | number |
| line_120_beginning_of_tax_year | number |
| line_220_amalgamation_or_windup_transfer | number |
| line_220_excluded_expired_amount | number |
| line_420_carryforward_claim_to_s38_line_884 | number |
| line_420_pre_aoc_grind | number |
| line_420_pre_authority_grind | number |
| line_600_current_year_generated_from_s38_line_870 | number |
| line_600_entered_from_raw_data | number |
| line_820_closing_balance | number |
| line_901_carryback_to_1st_previous_year | number |
| line_901_pre_aoc_grind | number |
| line_901_pre_sequence_grind | number |
| line_902_carryback_to_2nd_previous_year | number |
| line_902_pre_aoc_grind | number |
| line_902_pre_sequence_grind | number |
| line_903_carryback_to_3rd_previous_year | number |
| line_903_pre_aoc_grind | number |
| line_903_pre_sequence_grind | number |
| line_a_opening_unused_credit_prior_year | number |
| line_b_subtotal | number |
| line_c_balance_after_carryforward_claim | number |
| line_d_subtotal_after_current_year_generation | number |
| line_e_carryback_claim_total | number |
| line_f_carryback_total | number |
| line_f_pre_aoc_grind | number |
| missing_required[] | string |
| pool_by_source_taxation_year_closing | array |
| pool_by_source_taxation_year_opening | array |
| pool_by_source_year_closing | object |
| pool_by_source_year_opening | object |
| predecessor_transfer_history_closing | array |
| provisional | boolean |
| ready | boolean |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.display | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.kind | string |
| warnings[].citation.rule | string |
| warnings[].citation.section | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].kind | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[] | object |
| surtax_credit_claim_applied_to_part_vi | number |
| surtax_credit_claim_requested | number |
| surtax_credit_expired_after_seven_years | number |
| surtax_fifo_consumption_by_source_taxation_year | object |
| surtax_pool_by_source_taxation_year_closing | array |
| surtax_pool_by_source_taxation_year_opening | array |
| surtax_predecessor_transfer_history_closing | array |
| surtax_credit_available_before_part_vi_capacity | array \| boolean \| null \| number \| object \| string |

### Output cell notes

- `warnings[]`: A Schedule 42 finding that states no registered gate identity: a statute-cited refusal, a coded input refusal, or a plain box-scoped message.

# schedule43

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s43_single_prior_dividend_profile_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): part_iv_overlap, schedule23

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule43"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule43": {
      "line1BPriorYearNonExcludedDividendsPaid": 1200000,
      "line220StpsDividendsPaid": 0,
      "line230ElectedTpsDividendsPaid": 0,
      "line240NonElectedTpsDividendsPaid": 0,
      "line250TransferredInFromRelatedCorp": 0,
      "line260TransferredOutToRelatedCorp": 0,
      "line310TpsDividendsReceived": 0,
      "line320RfiSharesDividendsReceived": 0,
      "part4ExemptionApplies": true
    },
    "corpType": "1",
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365
  }
}
```

## Input cells (37)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| corpType | string | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule43.electionUnderS191_2_1Made | boolean \| null |  |
| schedule43.isAssociatedAndAllocating | boolean \| null |  |
| schedule43.isRestrictedFinancialInstitution | boolean \| null |  |
| schedule43.line116DateFiled | null \| string |  |
| schedule43.line117IsAmendedAgreement | boolean \| null |  |
| schedule43.line118CalendarYearOfAgreement | null \| number |  |
| schedule43.line1BPriorYearNonExcludedDividendsPaid | null \| number \| string | strict |
| schedule43.line210OwnAllocation | null \| number |  |
| schedule43.line220StpsDividendsPaid | null \| number | strict |
| schedule43.line230ElectedTpsDividendsPaid | null \| number | strict |
| schedule43.line240NonElectedTpsDividendsPaid | null \| number | strict |
| schedule43.line250TransferredInFromRelatedCorp | null \| number | strict |
| schedule43.line260TransferredOutToRelatedCorp | null \| number | strict |
| schedule43.line310TpsDividendsReceived | null \| number | strict |
| schedule43.line320RfiSharesDividendsReceived | null \| number | strict |
| schedule43.line350PortionAlsoSubjectToPartIv | null \| number |  |
| schedule43.line370PortionFromConnectedCorps | null \| number |  |
| schedule43.line380PartIvTaxOnLine370Dividends | null \| number |  |
| schedule43.line390PortionFromNonConnectedCorps | null \| number |  |
| schedule43.line400EligibleTaxableDividendsFromLine390 | null \| number |  |
| schedule43.part2Agreement | null \| object |  |
| schedule43.part2Agreement.attestedFiledByEveryAssociatedTpsPayer | boolean \| null |  |
| schedule43.part2Agreement.calendarYear | null \| number |  |
| schedule43.part2Agreement.evidenceReference | null \| string |  |
| schedule43.part2Agreement.filedDate | null \| string |  |
| schedule43.part2Agreement.firstTaxYearAllowanceContinuity191_1_6b | boolean \| null |  |
| schedule43.part2Agreement.isAmended | boolean \| null |  |
| schedule43.part2Rows | array |  |
| schedule43.part2Rows[].businessNumber | null \| string |  |
| schedule43.part2Rows[].dividendAllowanceAllocated | null \| number |  |
| schedule43.part2Rows[].name | null \| string |  |
| schedule43.part4ExemptionApplies | boolean \| null | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `corpType`: T2 box 040 corporation type. Code 1 (CCPC) is the receipt-time private-corporation evidence that resolves the Part IV.1 recipient status the sweep made mandatory whenever Part 4 input is present; the editable Schedule 43 answer alone cannot authorize the s.187.1 exemption.
- `daysInYear`: Inclusive day count of the taxation year. ITA 191.1(6)(a) prorates the line 210 dividend allowance for a year shorter than 51 weeks, so the sweep withholds line 210 until the day count is supplied; 365 pins the full-year branch.
- `schedule43.electionUnderS191_2_1Made`: Flag: a s.191.2(1) election is in force for ≥1 class/series of TPS. Required when line 230 > 0. The election is IRREVOCABLE per s.191.2(1) closing words.
- `schedule43.isAssociatedAndAllocating`: Flag: corporation is associated and allocating the $500K dividend allowance among the associated group. When true, Part 2 rows are required and line 210 sources from this corp's own line-140 row rather than the full line 115.
- `schedule43.isRestrictedFinancialInstitution`: Flag: the corporation is a restricted financial institution per s.248(1). Required when line 320 > 0.
- `schedule43.line116DateFiled`: Box 116 — Date the agreement was filed (do not use this area per the form; Filemark records for our internal audit trail).
- `schedule43.line117IsAmendedAgreement`: Box 117 — Is this an amended agreement?
- `schedule43.line118CalendarYearOfAgreement`: Box 118 — Calendar year to which the agreement applies.
- `schedule43.line1BPriorYearNonExcludedDividendsPaid`: Amount 1B — Prior CALENDAR YEAR non-excluded taxable dividends paid by the corp (or the ASSOCIATED GROUP — see Part 2 point 1) on TPS or shares that would be TPS if issued after June 18, 1987. NOT a printed CRA box code but captured for the line 110 calculation.
- `schedule43.line210OwnAllocation`: Optional override for line 210 — the practitioner's own allocation when associated. Defaults to the first Part 2 row's column 140 if not provided. Short-year proration applied at the engine level per the form's Note 1 (< 51 weeks → days/365).
- `schedule43.line220StpsDividendsPaid`: Line 220 — taxable dividends (other than excluded dividends) paid in the year on SHORT-TERM preferred shares. ITA 191.1(1)(a)(i) taxes the excess of this total over the dividend allowance at (C) 40% for a taxation year ending after 2011. Required, and admitted only at nil: this profile states the Part VI.1 charging operand rather than defaulting it silently, so a corporation that paid short-term-preferred-share dividends is rejected here rather than served a nil line 270 / T2 line 724.
- `schedule43.line230ElectedTpsDividendsPaid`: Line 230 — taxable dividends (other than excluded dividends) paid in the year on taxable preferred shares (other than short-term preferred shares) of classes for which a subsection 191.2(1) election has been made. ITA 191.1(1)(a)(ii) taxes the excess over the unabsorbed dividend allowance at 40%. Admitted only at nil for the same reason as line 220.
- `schedule43.line240NonElectedTpsDividendsPaid`: Line 240 — taxable dividends (other than excluded dividends) paid in the year on taxable preferred shares (other than short-term preferred shares) of classes for which no subsection 191.2(1) election has been made. ITA 191.1(1)(a)(iii) taxes the excess over the unabsorbed dividend allowance at 25%. Admitted only at nil for the same reason as line 220.
- `schedule43.line250TransferredInFromRelatedCorp`: Line 250 — Part VI.1 tax transferred IN from a related corporation under a subsection 191.3(1) agreement (the ITA 191.1(1)(a)(iv) addition, Schedule 45 companion). Admitted only at nil so the transferred-in limb of the charge is stated rather than assumed.
- `schedule43.line260TransferredOutToRelatedCorp`: Line 260 — Part VI.1 tax transferred OUT to a related corporation under a subsection 191.3(1) agreement (the ITA 191.1(1)(b) deduction, Schedule 45 companion). Admitted only at nil so the transferred-out limb of the charge is stated rather than assumed.
- `schedule43.line310TpsDividendsReceived`: Line 310 — dividends RECEIVED in the year on taxable preferred shares (other than shares of a class for which a subsection 191.2(1) election has been made), to the extent deductible under section 112 or 113 or subsection 138(6) (or 115(1)). The ITA 187.2 Part IV.1 charge is 10% of them. Admitted only at nil, for the same reason as the Part VI.1 payer operands: the receipt is stated rather than defaulted silently, so a corporation that received such dividends is rejected here rather than served a nil line 360 / T2 line 716.
- `schedule43.line320RfiSharesDividendsReceived`: Line 320 — dividends RECEIVED in the year on taxable RFI shares, to the extent deductible under section 112 or 113 or subsection 138(6) (or 115(1)). The ITA 187.3(1) charge on a restricted financial institution is 10% of them. Admitted only at nil, for the same reason as line 310.
- `schedule43.line350PortionAlsoSubjectToPartIv`: Line 350 — Portion of line 330 also subject to Part IV tax.
- `schedule43.line370PortionFromConnectedCorps`: Line 370 — Portion of line 350 received from connected corps.
- `schedule43.line380PartIvTaxOnLine370Dividends`: Line 380 — Part IV tax on the dividends reported on line 370.
- `schedule43.line390PortionFromNonConnectedCorps`: Line 390 — Portion of line 350 received from non-connected corps.
- `schedule43.line400EligibleTaxableDividendsFromLine390`: Line 400 — Eligible-dividend SUBSET of line 390.
- `schedule43.part2Agreement`: CAP-R2 — the persisted ITA 191.1(3) agreement attestation. Boxes 116 / 117 / 118 record only WHEN the agreement was filed and WHICH calendar year it names; subsection 191.1(3) grants an allocated allowance only where ALL of the associated corporations filed the prescribed agreement, and paragraph 191.1(6)(b) makes later associated taxation years ending in the same calendar year reuse the first such year's unprorated allowance. Both attestations are tri-state: null is UNANSWERED and keeps line 210 withheld.
- `schedule43.part2Agreement.attestedFiledByEveryAssociatedTpsPayer`: ITA 191.1(3): the agreement is effective only where ALL of the associated corporations filed it. Null is unanswered.
- `schedule43.part2Agreement.calendarYear`: Calendar year the agreement allocates for. Must equal the calendar year in which this return's taxation year ends.
- `schedule43.part2Agreement.evidenceReference`: Practitioner reference to the filed agreement in the engagement file.
- `schedule43.part2Agreement.filedDate`: Date the prescribed agreement was filed with the Minister.
- `schedule43.part2Agreement.firstTaxYearAllowanceContinuity191_1_6b`: ITA 191.1(6)(b): where more than one associated taxation year ends in the same calendar year, the later years reuse the FIRST such year's unprorated allowance before paragraph (6)(a) prorates. Null is unanswered.
- `schedule43.part2Agreement.isAmended`: Whether the filed agreement is an amended one.
- `schedule43.part2Rows`: Allocation rows.
- `schedule43.part2Rows[].businessNumber`: Column 130 — Business number (or literal "NR" if not registered).
- `schedule43.part2Rows[].dividendAllowanceAllocated`: Column 140 — Dividend allowance allocated to this corp. Total of column 140 across all rows cannot exceed line 115.
- `schedule43.part2Rows[].name`: Column 120 — Name of the associated corporation.
- `schedule43.part4ExemptionApplies`: Whether every dividend reported on lines 310-400 is an excepted dividend under paragraph (c) of the ITA 187.1 definition, so Part IV.1 does not apply. Required, and admitted only in the exempt state: an explicit false leaves the engine without a reviewed received-TPS fact for a nil line 310/320 and blocks at error severity. Declaring the fact does not establish that it is true.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (13 of 37 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| corpType | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule43.line1BPriorYearNonExcludedDividendsPaid | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule43.line220StpsDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule43.line230ElectedTpsDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule43.line240NonElectedTpsDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule43.line250TransferredInFromRelatedCorp | -1000000000000000 to 1000000000000000 |
| schedule43.line260TransferredOutToRelatedCorp | -1000000000000000 to 1000000000000000 |
| schedule43.line310TpsDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule43.line320RfiSharesDividendsReceived | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (84)

| Cell | Types |
| --- | --- |
| amount_1A | number |
| amount_1C | number |
| amount_3A | number |
| amount_3B | number |
| amount_3C | number |
| amount_3D | number |
| amount_3E | number |
| amount_3F | number |
| amount_3G | number |
| amount_3H | number |
| amount_3I | number |
| amount_3J | number |
| amount_3K | number |
| amount_3L | number |
| amount_3M | number |
| amount_3N | number |
| amount_3O | number |
| amount_3P | number |
| amount_3Q | number |
| amount_3R | number |
| amount_4A | number |
| amount_4B | number |
| amount_4C | number |
| amount_4D | number |
| electionUnderS191_2_1Made | boolean |
| fired_gates | object |
| gross_part_vi1_tax_before_transfer_out | number |
| isAssociatedAndAllocating | boolean |
| isRestrictedFinancialInstitution | boolean |
| line_110 | number |
| line_115 | number |
| line_116 | array \| boolean \| null \| number \| object \| string |
| line_117 | array \| boolean \| null \| number \| object \| string |
| line_118 | array \| boolean \| null \| number \| object \| string |
| line_120 | array \| boolean \| null \| number \| object \| string |
| line_130 | array \| boolean \| null \| number \| object \| string |
| line_140 | number |
| line_1B | number |
| line_210 | number |
| line_220 | number |
| line_230 | number |
| line_240 | number |
| line_250 | number |
| line_260 | number |
| line_270 | number |
| line_310 | number |
| line_320 | number |
| line_330 | number |
| line_340 | number |
| line_350 | number |
| line_360 | number |
| line_370 | number |
| line_380 | number |
| line_390 | number |
| line_400 | number |
| missing_required | array |
| part2Rows | array |
| part2_allocation_total | number |
| part4_exempt | boolean |
| part4_scope_held | boolean |
| provisional | boolean |
| ready | boolean |
| s3_amount_2F_part_iv_reduction_connected_30 | number |
| s3_amount_2I_eligible_reduction_10 | number |
| s3_line_320_total_part_iv_reduction | number |
| short_year_proration_applied | boolean |
| t2_amount_T_part_iv_reduction_non_elig_non_conn | number |
| t2_line_716_part_iv1_tax | number |
| t2_line_724_part_vi1_tax | number |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| s191_2_1ElectionByClass | object |
| line_210_pre_proration | number |

# schedule44

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2006 and later
- Strict profile: s44_single_s85_1_transferor_profile_target_value_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule44"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "filerBn": "999999998RC0001",
    "schedule44": {
      "hasNonArmsLengthTransfers": true,
      "transferorRows": [
        {
          "transferorName": "Cedar Ridge Holdings Inc.",
          "transferorBusinessNumber": "333333334",
          "dateOfTransfer": "2025/03/15",
          "triggerStatute": "s85_1"
        }
      ]
    }
  }
}
```

## Input cells (31)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| filerBn | string | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule44.hasNonArmsLengthTransfers | boolean \| null | strict |
| schedule44.transferorRows | array |  |
| schedule44.transferorRows[].dateOfTransfer | null \| string | strict |
| schedule44.transferorRows[].entrantBankBusinessCarriedOnThroughCanadianPe | boolean \| null |  |
| schedule44.transferorRows[].entrantBankBusinessConductedThroughRepresentativeOffice | boolean \| null |  |
| schedule44.transferorRows[].entrantBankIsAuthorizedForeignBank | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts | null \| object |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.controlledSubsidiaryOnly | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.employeeOrAgentEstablishedAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.fixedPlaceJurisdiction | null \| string |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.generalContractingAuthorityAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.hasFixedPlaceOfBusiness | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.independentAgentOnly | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.insurerRegisteredOrLicensedJurisdictions | array |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.isInsurer | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.personOwnedStockAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.principalPlaceOfBusinessAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.purchaseOnlyOfficeOnly | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.regularlyFillsOrdersFromStockAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.substantialMachineryOrEquipmentUsedAtTarget | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.treatyExists | boolean \| null |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.treatyPermanentEstablishmentArticle | null \| string |  |
| schedule44.transferorRows[].entrantBankReg8201Facts.treatyPermanentEstablishmentConclusion | boolean \| null |  |
| schedule44.transferorRows[].transferorBusinessNumber | null \| number \| string | strict |
| schedule44.transferorRows[].transferorName | null \| string | strict |
| schedule44.transferorRows[].transferredPropertyUsedOrHeldInCanadianBankingBusinessImmediatelyAfter | boolean \| null |  |
| schedule44.transferorRows[].triggerStatute | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule44.hasNonArmsLengthTransfers`: The corporation received all or substantially all (90 percent or more) of a non-arm's-length transferor's assets under ITA s.85(1), s.85(2) or s.142.7(3) in the year; true requires the Schedule 44 disclosure rows.
- `schedule44.transferorRows[].dateOfTransfer`: Box 300 — date of transfer YYYY/MM/DD or YYYY-MM-DD.
- `schedule44.transferorRows[].transferorBusinessNumber`: Box 200 — transferor's CRA Business Number (9-digit or 15-char).
- `schedule44.transferorRows[].transferorName`: Box 100 — legal name of transferor corp.
- `schedule44.transferorRows[].triggerStatute`: Trigger statute discriminator (drives companion-form reminder).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (8 of 31 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| filerBn | 0 to 20000 characters |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule44.transferorRows[].dateOfTransfer | 0 to 20000 characters |
| schedule44.transferorRows[].transferorBusinessNumber | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule44.transferorRows[].transferorName | 0 to 20000 characters |
| schedule44.transferorRows[].triggerStatute | one of "s85_1", "s85_2", "s142_7_3", null |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (26)

| Cell | Types |
| --- | --- |
| fired_gates | object |
| line_100 | null \| string |
| line_200 | null \| string |
| line_300 | null \| string |
| missing_required[] | string |
| provisional | boolean |
| ready | boolean |
| transferorRows[].dateOfTransfer | null \| string |
| transferorRows[].transferorBusinessNumber | null \| string |
| transferorRows[].transferorName | null \| string |
| transferorRows[].triggerStatute | null \| string |
| transferorRows[].canadianBankingBusinessDetermination | array \| boolean \| null \| number \| object \| string |
| transferor_count | integer |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |

# schedule45

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2005 and later
- Strict profile: s45_single_transfer_agreement_profile_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): schedule43

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule45"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule43": {
      "line1BPriorYearNonExcludedDividendsPaid": 0,
      "line220StpsDividendsPaid": 700000
    },
    "schedule45": {
      "isFilingAsTransferor": true,
      "relatedCorporationConfirmed": true,
      "relatedOnlyByS251_5_b_OptionRight": false,
      "relatedOnlyByGovernmentControl": false,
      "transfereeIsTaxableCanadianCorp": true,
      "directorsResolutionsAttached": true,
      "relatedMainPurposeWasTransfer": false,
      "isAmendingAgreement": false,
      "line105TotalPartVi1TaxTransferred": 50000,
      "line110TransferorName": "Cedar Ridge Holdings Inc.",
      "line115TransferorBusinessNumber": "333333334RC0001",
      "line120TransferorTaxYearEnd": "2025-12-31",
      "transferees": [
        {
          "name": "Cedar Ridge Manufacturing Inc.",
          "businessNumber": "333333334RC0001",
          "transferredAmount": 50000,
          "transfereeTaxYearEnd": "2025-12-31"
        }
      ]
    }
  }
}
```

## Input cells (22)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule43.line1BPriorYearNonExcludedDividendsPaid | integer | strict |
| schedule43.line220StpsDividendsPaid | integer | strict |
| schedule45.directorsResolutionsAttached | boolean \| null | strict |
| schedule45.isAmendingAgreement | boolean \| null | strict |
| schedule45.isFilingAsTransferor | boolean \| null | strict |
| schedule45.line101DateFiled | null \| string |  |
| schedule45.line105TotalPartVi1TaxTransferred | null \| number |  |
| schedule45.line110TransferorName | null \| string | strict |
| schedule45.line115TransferorBusinessNumber | null \| string | strict |
| schedule45.line120TransferorTaxYearEnd | null \| string | strict |
| schedule45.relatedCorporationConfirmed | boolean \| null | strict |
| schedule45.relatedMainPurposeWasTransfer | boolean \| null | strict |
| schedule45.relatedOnlyByGovernmentControl | boolean \| null | strict |
| schedule45.relatedOnlyByS251_5_b_OptionRight | boolean \| null | strict |
| schedule45.transfereeIsTaxableCanadianCorp | boolean \| null | strict |
| schedule45.transferees | array |  |
| schedule45.transferees[].businessNumber | null \| string | strict |
| schedule45.transferees[].name | null \| string | strict |
| schedule45.transferees[].transfereeTaxYearEnd | null \| string | strict |
| schedule45.transferees[].transferredAmount | null \| number \| string | strict |
| schedule45.transferorGrossPartVi1TaxOtherwisePayable | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule45.directorsResolutionsAttached`: s.191.3(2) filing condition: certified copies of the directors' resolutions authorizing the Part VI.1 tax transfer agreement are attached.
- `schedule45.isAmendingAgreement`: This Schedule 45 is an amending agreement; s.191.3(2)(d) makes the latest otherwise-compliant agreement operative.
- `schedule45.isFilingAsTransferor`: Whether this return files the s.191.3 agreement as the transferor; true ties the agreement to Schedule 43 line 260, false to the filer's transferee row and line 250.
- `schedule45.line101DateFiled`: Box 101 — Date filed ("do not use this area" per CRA prompt; reserved for CRA's date-stamp on receipt). Filemark accepts a practitioner value for internal audit but does NOT transmit.
- `schedule45.line105TotalPartVi1TaxTransferred`: Box 105: the Part VI.1 tax the filed agreement itself specifies as transferred. A distinct required operand since the box gained its own input path; the column-233 sum is capped by it, never substituted for it.
- `schedule45.line110TransferorName`: Box 110 — Name of the transferor corporation.
- `schedule45.line115TransferorBusinessNumber`: Box 115 — Full 15-character CRA program account.
- `schedule45.line120TransferorTaxYearEnd`: Box 120 — Tax year-end of the transferor corporation (YYYY-MM-DD).
- `schedule45.relatedCorporationConfirmed`: Confirms s.191.3(1)(a) and (b): the transferee was related to the transferor throughout the transferor's taxation year and throughout the transferee's last taxation year ending in it.
- `schedule45.relatedMainPurposeWasTransfer`: s.191.3(4) anti-avoidance: the main purpose of the corporations becoming related was to permit the transfer, so the specified amount is deemed nil.
- `schedule45.relatedOnlyByGovernmentControl`: The corporations are related only through government control; that relation does not count for the s.191.3 agreement, which is then invalid.
- `schedule45.relatedOnlyByS251_5_b_OptionRight`: The corporations are related only through a s.251(5)(b) option right; that relation does not count for the s.191.3 agreement, which is then invalid.
- `schedule45.transfereeIsTaxableCanadianCorp`: Form preamble condition: the transferee must be a related taxable Canadian corporation; false or unset blocks the s.191.3 agreement.
- `schedule45.transferees`: Transferee rows (box 225 / 230 / 233 / 235 per row).
- `schedule45.transferees[].businessNumber`: Box 230 — Full 15-character CRA program account (9 digits, 2 letters, and 4 digits). The form does not authorize an "NR" alternative.
- `schedule45.transferees[].name`: Box 225 — Name of the transferee corporation.
- `schedule45.transferees[].transfereeTaxYearEnd`: Box 235 — Tax year end (YYYY-MM-DD) to which this agreement applies for the transferee. Per s.191.3(1)(b) this is the transferee's last taxation year ending at or before the end of the transferor's taxation year.
- `schedule45.transferees[].transferredAmount`: Box 233 — Part VI.1 tax transferred to this transferee, in CAD. Must be positive. Sum of column 233 across rows feeds box 105 and must not exceed the transferor's gross Part VI.1 tax per s.191.3(1)(c).
- `schedule45.transferorGrossPartVi1TaxOtherwisePayable`: The TRANSFEROR's Part VI.1 tax otherwise payable for the agreement year — its Schedule 43 amounts 3C + 3I + 3Q, excluding tax it owes under another s.191.3 agreement. Required on a transferee copy, where it is a fact about a different corporation that this return cannot derive; null blocks rather than accepting the agreement's own figure. On a transferor copy the canonical Schedule 43 figure governs and a stated value that disagrees with it is a contradiction.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (11 of 22 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule43.line1BPriorYearNonExcludedDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule43.line220StpsDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule45.line105TotalPartVi1TaxTransferred | -1000000000000000 to 1000000000000000 |
| schedule45.line110TransferorName | 0 to 20000 characters |
| schedule45.line115TransferorBusinessNumber | 0 to 20000 characters |
| schedule45.line120TransferorTaxYearEnd | 0 to 20000 characters |
| schedule45.transferees[].businessNumber | 0 to 20000 characters |
| schedule45.transferees[].name | 0 to 20000 characters |
| schedule45.transferees[].transfereeTaxYearEnd | 0 to 20000 characters |
| schedule45.transferees[].transferredAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (44)

| Cell | Types |
| --- | --- |
| directorsResolutionsAttached | boolean \| null |
| fired_gates | object |
| isFilingAsTransferor | boolean \| null |
| line_101 | array \| boolean \| null \| number \| object \| string |
| line_105 | number |
| line_110 | null \| string |
| line_115 | null \| string |
| line_120 | null \| string |
| line_225 | null \| string |
| line_230 | null \| string |
| line_233 | number |
| line_235 | null \| string |
| missing_required[] | string |
| provisional | boolean |
| ready | boolean |
| relatedCorporationConfirmed | boolean \| null |
| total_transferred | number |
| transfereeIsTaxableCanadianCorp | boolean \| null |
| transferees[].line_225 | string |
| transferees[].line_230 | string |
| transferees[].line_233 | number |
| transferees[].line_235 | string |
| warnings[].box | null \| string |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule49

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024 and later
- Strict profile: s49_two_ccpc_allocation_profile_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): schedule23

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule49"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "priorTaxYearEnd": "2024-12-31",
    "isCCPC": true,
    "priorYearGroupTCEC": 30000000,
    "priorYearGroupTCECMeta": {
      "basis": "associated_group_preceding_calendar_year",
      "asOf": "2024-12-31",
      "source": "associated group filed returns",
      "confirmed": true
    },
    "schedule49": {
      "calendarYear": 2025,
      "isAmendedAgreement": false,
      "rows": [
        {
          "name": "Cedar Ridge Manufacturing Inc.",
          "businessNumber": "123456782RC0001",
          "typeOfCorporationCode": 1,
          "expenditureLimitAllocated": 900000
        },
        {
          "name": "Birchline Tools Ltd.",
          "businessNumber": "222222226RC0001",
          "typeOfCorporationCode": 1,
          "expenditureLimitAllocated": 100000
        }
      ],
      "rosterComplete": true,
      "expenditureLimit": null,
      "amountB": null,
      "sameCalendarYearAssociationTestComplete": true,
      "sameCalendarYearAllocationRuleApplies": null,
      "firstSameCalendarYearFilerAllocation": null
    }
  }
}
```

## Input cells (26)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| filingCorpBn | string | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean | strict |
| priorTaxYearEnd | string | strict |
| priorYearGroupTCEC | integer | strict |
| priorYearGroupTCECMeta.asOf | string | strict |
| priorYearGroupTCECMeta.basis | string | strict |
| priorYearGroupTCECMeta.confirmed | boolean | strict |
| priorYearGroupTCECMeta.source | string | strict |
| schedule49.amountB | null \| number |  |
| schedule49.calendarYear | null \| number | strict |
| schedule49.expenditureLimit | null \| number |  |
| schedule49.firstSameCalendarYearFilerAllocation | null \| number |  |
| schedule49.isAmendedAgreement | boolean \| null | strict |
| schedule49.rosterComplete | boolean \| null | strict |
| schedule49.rows | array |  |
| schedule49.rows[].businessNumber | null \| string | strict |
| schedule49.rows[].expenditureLimitAllocated | null \| number | strict |
| schedule49.rows[].name | null \| string | strict |
| schedule49.rows[].typeOfCorporationCode | null \| number \| object | strict |
| schedule49.s127_10_22Exclusions | array \| null |  |
| schedule49.sameCalendarYearAllocationRuleApplies | boolean \| null |  |
| schedule49.sameCalendarYearAssociationTestComplete | boolean \| null | strict |
| taxYear | integer \| string | always |
| wasAssociatedInPrecedingYear | boolean | strict |

### Input cell notes

- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `priorYearGroupTCECMeta.confirmed`: Confirms the associated group's prior-year taxable capital employed in Canada figure, the operand of the ITA s.125(5.1) business-limit reduction.
- `schedule49.amountB`: Optional legacy/imported box 495 value used only for reconciliation. The box remains the form's TCEC Amount A. It is not repurposed as the s.127(10.6) revenue variable when Schedule 31 line 383 elects the revenue-based limit. The engine key stays `amountB` for compatibility.
- `schedule49.calendarYear`: Box 050 — Four-digit calendar year. E (26) coverage starts in 2024.
- `schedule49.expenditureLimit`: Optional legacy/imported box 410 value used only to reconcile against the backend's canonical, period-aware result. It is not a calculation input and may be cleared; under-allocation of column 4 is permitted.
- `schedule49.firstSameCalendarYearFilerAllocation`: Reviewed evidence for the filing corporation's Schedule 49 allocation in its first taxation year in which it was associated with the other CCPC in the current calendar year. Required only when `sameCalendarYearAllocationRuleApplies` is true; the backend matches it to the filing BN and enforces the s.127(10.5)(a) carry-through rule. This is evidence, not a derived box.
- `schedule49.isAmendedAgreement`: T2 SCH 49 box 075: this is an amended s.127(10.3) expenditure-limit allocation agreement.
- `schedule49.rosterComplete`: Preparer attestation that every associated CCPC required by s.127(10.3) is a party to the agreement; row count alone cannot prove group completeness.
- `schedule49.rows`: Rows of associated corporations in the group (CCPCs + non-CCPCs).
- `schedule49.rows[].businessNumber`: Box 200 — Column 2: business number (CRA 15-character format or "NR").
- `schedule49.rows[].expenditureLimitAllocated`: Box 400 — Column 4: expenditure limit allocated $. Must be 0 when typeOfCorporationCode is 2 — only associated CCPCs share the expenditure limit allocated under s.127(10.3). The group ceiling is ordinarily the s.127(10.2) TCEC amount, or the s.127(10.32)/(10.6) revenue amount when the associated CCPCs make the reform-year election.
- `schedule49.rows[].name`: Box 100 — Column 1: legal name of the associated corporation.
- `schedule49.rows[].typeOfCorporationCode`: Box 300 — Column 3: corporation-type code (1 = CCPC, 2 = non-CCPC).
- `schedule49.s127_10_22Exclusions`: Business numbers of corporations deemed not associated by ITA subsection 127(10.22) for the purpose of determining the expenditure limit, so they are lawfully omitted from the s.127(10.3) agreement while staying on the s.125(3) business-limit roster. Each entry is a registered nine-digit business-number root. The engine cannot derive the test, so the list is published exactly as the return states it; an absent key declares none, and an entry it cannot read holds Schedule 49 instead of shortening the roster into a false reconciliation.
- `schedule49.sameCalendarYearAllocationRuleApplies`: Confirms the full s.127(10.5)(a) relational condition: the filer had an earlier taxation year ending in the same calendar year in which it was associated with the same other CCPC.
- `schedule49.sameCalendarYearAssociationTestComplete`: Attestation that the s.127(10.5)(a) same-calendar-year association test was completed, including that any prior amount is from the first such associated taxation year.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.
- `wasAssociatedInPrecedingYear`: The corporation was associated with at least one other corporation in the preceding taxation year; prior-year continuity fact for association-driven limits.

### Strict profile accepted values (17 of 26 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| filingCorpBn | 0 to 20000 characters |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| priorTaxYearEnd | 0 to 20000 characters |
| priorYearGroupTCEC | -1000000000000000 to 1000000000000000 |
| priorYearGroupTCECMeta.asOf | 0 to 20000 characters |
| priorYearGroupTCECMeta.basis | 0 to 20000 characters |
| priorYearGroupTCECMeta.source | 0 to 20000 characters |
| schedule49.amountB | -1000000000000000 to 1000000000000000 |
| schedule49.calendarYear | -1000000000000000 to 1000000000000000 |
| schedule49.expenditureLimit | -1000000000000000 to 1000000000000000 |
| schedule49.firstSameCalendarYearFilerAllocation | -1000000000000000 to 1000000000000000 |
| schedule49.rows[].businessNumber | 0 to 20000 characters |
| schedule49.rows[].expenditureLimitAllocated | -1000000000000000 to 1000000000000000 |
| schedule49.rows[].name | 0 to 20000 characters |
| schedule49.rows[].typeOfCorporationCode | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (38)

| Cell | Types |
| --- | --- |
| amount_b | array \| boolean \| null \| number \| object \| string |
| calendar_year | integer |
| expenditure_limit | string |
| fired_gates | object |
| first_same_calendar_year_filer_allocation | null \| string |
| formRevision | string |
| is_amended_agreement | boolean |
| provisional | boolean |
| ready | boolean |
| reported_amount_b | array \| boolean \| null \| number \| object \| string |
| reported_expenditure_limit | array \| boolean \| null \| number \| object \| string |
| rows[].businessNumber | string |
| rows[].expenditureLimitAllocated | number |
| rows[].expenditureLimitAllocatedValid | boolean |
| rows[].name | string |
| rows[].typeOfCorporationCode | integer |
| same_calendar_year_allocation_rule_applies | boolean \| null |
| same_calendar_year_later_return | boolean |
| tcec_authoritative_input_provided | boolean |
| tcec_input_metadata | array \| boolean \| null \| number \| object \| string |
| tcec_input_source | string |
| total_allocated | string |
| warnings[].box | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].kind | string |
| warnings[].code | string |
| filer_allocation | array \| boolean \| null \| number \| object \| string |

### Output cell notes

- `warnings[].kind`: The finding's classifier, on the notices that carry one alongside the box-scoped gate. Absent on the gate findings the reviewed witness raises.

# schedule5

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2025 and later
- Strict profile: s5_2025_reg402_two_jurisdiction_worked_example_target_value_v1
- Payload schema version: 0.13.0
- Dependencies (run automatically): division_c, schedule1, schedule2, schedule21, schedule3, schedule4

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule5"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "applicableRegulation": "402",
    "reg402_1CentralPaymasterArrangement": false,
    "partnershipOperations": false,
    "outsourcedServiceFeesPaid": false,
    "accounts": [
      {
        "id": "revenue",
        "accountCode": "4000",
        "accountName": "Cedar Ridge active business revenue",
        "currentYearBalance": -100000,
        "classification": {
          "schedule1Relevant": false,
          "incomeType": "active_business",
          "foreignSource": false
        }
      }
    ],
    "incomeStatementFlags": {
      "revenue": true
    },
    "pyUCCPools": [],
    "assetData": [],
    "dispositions": [],
    "allocations": [
      {
        "jurisdiction": "ON",
        "hasPermanentEstablishment": true,
        "totalSalariesWages": 60000,
        "grossRevenue": 40000,
        "revenueReclass": 0
      },
      {
        "jurisdiction": "BC",
        "hasPermanentEstablishment": true,
        "totalSalariesWages": 40000,
        "grossRevenue": 60000,
        "revenueReclass": 0
      },
      {
        "jurisdiction": "AB",
        "hasPermanentEstablishment": false,
        "totalSalariesWages": 0,
        "grossRevenue": 0,
        "revenueReclass": 0,
        "albertaSmallBusinessFactorBasis": null
      }
    ],
    "isCCPC": true
  }
}
```

## Input cells (51)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.foreignSource | boolean | strict |
| accounts[].classification.incomeType | string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| allocations | array |  |
| allocations[].albertaSmallBusinessFactorBasis | null \| string |  |
| allocations[].grossRevenue | integer \| null \| number | strict |
| allocations[].hasPermanentEstablishment | boolean \| null | strict |
| allocations[].jurisdiction | null \| string | strict |
| allocations[].revenueReclass | integer \| null \| number | strict |
| allocations[].totalSalariesWages | integer \| null \| number | strict |
| applicableRegulation | string | strict |
| assetData | array | strict |
| daysInYear | integer | strict |
| dispositions | array | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| incomeStatementFlags.revenue | boolean | strict |
| isCCPC | boolean |  |
| outsourcedServiceFeesPaid | boolean | strict |
| partnershipOperations | boolean | strict |
| pyUCCPools | array | strict |
| reg402_1CentralPaymasterArrangement | boolean | strict |
| schedule5.allocations | array |  |
| schedule5.allocations[].allocatedTaxableIncome | number |  |
| schedule5.allocations[].allocationFactor | number |  |
| schedule5.allocations[].grossRevenue | number |  |
| schedule5.allocations[].hasPermanentEstablishment | boolean \| null |  |
| schedule5.allocations[].jurisdiction | string |  |
| schedule5.allocations[].outsourcedServiceFees | null \| number |  |
| schedule5.allocations[].partnershipGrossRevenue | null \| number |  |
| schedule5.allocations[].partnershipSalariesWages | null \| number |  |
| schedule5.allocations[].reg402_1DeemedSalary | null \| number |  |
| schedule5.allocations[].reg402_1SalaryDeduction | null \| number |  |
| schedule5.allocations[].reg402_4_1ThrowbackRevenue | null \| number |  |
| schedule5.allocations[].revenueAllocationPercent | number |  |
| schedule5.allocations[].revenueReclass | number |  |
| schedule5.allocations[].salaryAllocationPercent | number |  |
| schedule5.allocations[].totalSalariesWages | number |  |
| schedule5.allocations[].unmodelledProvincialCreditsClaimed | boolean \| null |  |
| schedule5.taxableIncome | number |  |
| schedule5.tieOutPayroll | object |  |
| schedule5.tieOutRevenue | object |  |
| schedule5.totalAllocated | number |  |
| schedule5.totalGrossRevenue | number |  |
| schedule5.totalSalariesWages | number |  |
| schedule5.zeroFactorsWarning | boolean |  |
| taxYear | number \| string | always |

### Input cell notes

- `accounts[].classification.foreignSource`: The account's income is foreign source; schedules that split Canadian from foreign amounts route it accordingly, for example Schedule 7's foreign property and rental buckets and line 500 foreign business income.
- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `allocations[].albertaSmallBusinessFactorBasis`: Alberta-row tri-state authority choice when ACTA s.19(1)/s.22(2.2) and AT1 Schedule 1 line 021 produce different small-business allocation factors. Omit or send null while unanswered; statute and prescribed_form select the named reading.
- `allocations[].hasPermanentEstablishment`: The corporation had a permanent establishment (Reg 400(2)) in this jurisdiction in the year; only PE jurisdictions enter the Reg 402 salaries-and-revenue allocation.
- `applicableRegulation`: The practitioner determination for Schedule 5 box 100. This exact profile is an ordinary corporation governed by Regulation 402.
- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `incomeStatementFlags.revenue`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `outsourcedServiceFeesPaid`: False confirms that Regulation 402(7) does not add deemed salary to this exact witness.
- `partnershipOperations`: False confirms that Regulation 402(6) does not add partnership revenue or salaries to this exact witness.
- `reg402_1CentralPaymasterArrangement`: False confirms that Regulation 402.1 does not add a particular salary to the benefiting corporation or deduct one from a central-paymaster employer in this exact witness.
- `schedule5.allocations[].allocationFactor`: Scale: 0–1 fraction. The Reg 402(3) proportion itself — column F over the amount being allocated — so it is independent of the base. T2 SCH 18 Notes 4/5 and 9/10 define the Ontario/Manitoba allocation factors as column F over T2 line 360 and direct that when taxable income is nil, column F be computed "as if the taxable income were $1,000"; that division cancels the base and leaves exactly this.
- `schedule5.allocations[].hasPermanentEstablishment`: Reg 400 permanent establishment — TRI-STATE. `null` means the question is UNANSWERED, which is neither a yes nor a no: the row takes no allocation (Reg 402(2) denies one to a province without a permanent establishment), and when it carries gross revenue or salaries the engine raises the error-severity `schedule5_permanent_establishment_unanswered` hold instead of reading the blank as "no".
- `schedule5.allocations[].outsourcedServiceFees`: Reg 402(7): qualifying service fees reasonably attributable to services rendered at this PE. Reg 402(8) commissions are excluded.
- `schedule5.allocations[].partnershipGrossRevenue`: Reg 402(6)(c): partnership gross revenue attributable to this PE before applying the corporation's paragraph (e)/(f) income-share proportion.
- `schedule5.allocations[].partnershipSalariesWages`: Reg 402(6)(d): partnership salaries and wages attributable to this PE before applying the corporation's paragraph (e)/(f) proportion.
- `schedule5.allocations[].reg402_1DeemedSalary`: Reg 402.1(1)-(2): particular salary deemed paid by the benefiting corporation and attributed to this permanent establishment.
- `schedule5.allocations[].reg402_1SalaryDeduction`: Reg 402.1(3): particular salary paid by the central-paymaster employer and deducted from this jurisdiction's Part IV salary operand. Enter the deduction as a positive amount.
- `schedule5.allocations[].reg402_4_1ThrowbackRevenue`: Reg 402(4.1)(d), read with Reg 402(4)(c)/(f): qualifying foreign-sale gross revenue attributable to this Canadian producing PE. The engine requires the populated producing-PE amounts to foot to the separately confirmed qualifying sale revenue before applying any throwback.
- `schedule5.allocations[].revenueAllocationPercent`: Scale: 0–100 percentage. Sibling of salaryAllocationPercent.
- `schedule5.allocations[].salaryAllocationPercent`: Scale: 0–100 percentage. e.g. 25 = 25% of total salaries.
- `schedule5.allocations[].unmodelledProvincialCreditsClaimed`: Whether the corporation claims a province-specific credit, rebate or additional tax for this jurisdiction that Filemark does not model. Filemark's per-jurisdiction figure is already net of every provincial credit it computes, so false means the canonical figure is the province's printed net-tax line and the face prints it. true means the printed line is not derivable here, so it stays blank and the schedule is held. null is unanswered and is held the same way — blank must never file as "none".
- `schedule5.zeroFactorsWarning`: True when both salary and revenue totals are zero across all PEs — allocation formula cannot operate
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (19 of 51 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.incomeType | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| allocations[].albertaSmallBusinessFactorBasis | one of "statute", "prescribed_form", null |
| allocations[].grossRevenue | -1000000000000000 to 1000000000000000 |
| allocations[].jurisdiction | 0 to 20000 characters |
| allocations[].revenueReclass | -1000000000000000 to 1000000000000000 |
| allocations[].totalSalariesWages | -1000000000000000 to 1000000000000000 |
| applicableRegulation | 0 to 20000 characters |
| assetData | exactly [] (pinned) |
| daysInYear | 1 to 1000000000000000 |
| dispositions | exactly [] (pinned) |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| pyUCCPools | exactly [] (pinned) |
| schedule5.allocations[].jurisdiction | one of "NL", "XO", "PE", "NS", "NO", "NB", "QC", "ON", "MB", "SK", "AB", "BC", "YT", "NT", "NU", "Outside Canada" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (123)

| Cell | Types |
| --- | --- |
| allocations[].allocatedTaxableIncome | number |
| allocations[].grossRevenue | integer |
| allocations[].hasPermanentEstablishment | boolean |
| allocations[].jurisdiction | string |
| allocations[].revenueAllocationPercent | number |
| allocations[].revenueReclass | integer |
| allocations[].salaryAllocationPercent | number |
| allocations[].totalSalariesWages | integer |
| allocations[].allocationFactor | number |
| form.line_100_regulation | string |
| form.part1Table[].allocated | number |
| form.part1Table[].pe | boolean |
| form.part1Table[].revenue | number |
| form.part1Table[].revenueIncomeShare | number |
| form.part1Table[].salaries | number |
| form.part1Table[].salaryIncomeShare | number |
| form.part2.line_209 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_214 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_224 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_229 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_234 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_239 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_244 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_249 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_254 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_255 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_264 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_290 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.amount5DMissingLines[] | string |
| form.part2.ontario.amount5EBlockedReason | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.amount_5C | null \| number |
| form.part2.ontario.amount_5D | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.amount_5E | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_278 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_406 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_408 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_410 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_415 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_418 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_270 | null \| number |
| form.part2.ontario.line_402 | null \| number |
| form.part2.ontario.line_281 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_421 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_474 | array \| boolean \| null \| number \| object \| string |
| form.part2.ontario.line_476 | array \| boolean \| null \| number \| object \| string |
| form.part2.provenance.ontario.line_270.provisional | boolean |
| form.part2.provenance.ontario.line_270.reason | string |
| form.part2.provenance.ontario.line_270.source | string |
| form.part2.provenance.ontario.line_402.provisional | boolean |
| form.part2.provenance.ontario.line_402.reason | string |
| form.part2.provenance.ontario.line_402.source | string |
| form.part2.status | string |
| form.part2.warnings[].code | string |
| form.part2.warnings[].message | string |
| form.part2.warnings[].severity | string |
| form.part2.netTaxCompleteness.BC.answer | array \| boolean \| null \| number \| object \| string |
| form.part2.netTaxCompleteness.BC.line | string |
| form.part2.netTaxCompleteness.BC.published | boolean |
| form.part2.netTaxCompleteness.ON.answer | array \| boolean \| null \| number \| object \| string |
| form.part2.netTaxCompleteness.ON.line | string |
| form.part2.netTaxCompleteness.ON.published | boolean |
| form.part2.saskatchewan.line_626 | array \| boolean \| null \| number \| object \| string |
| form.part2.schedule5FilingRequired | boolean |
| form.part2.yukon.line_677 | array \| boolean \| null \| number \| object \| string |
| form.part2.divergenceReason | string |
| form.part2.line_222 | array \| boolean \| null \| number \| object \| string |
| form.part2.line_518 | array \| boolean \| null \| number \| object \| string |
| form.part2.ftc_by_line | object |
| form.part2.provincial_tax_by_jurisdiction | object |
| form.part2.total_provincial_tax | number |
| form.part2.unwiredReason | string |
| formRevision | string |
| industryRegulation | string |
| provisional | boolean |
| ready | boolean |
| residency.allocationBase | number |
| residency.basis | string |
| residency.isResidentOfCanada | array \| boolean \| null \| number \| object \| string |
| residency.line360TaxableIncome | number |
| residency.reg413Applied | boolean |
| taxableIncome | number |
| tieOutPayroll.allocTotal | number |
| tieOutPayroll.difference | number |
| tieOutPayroll.tbTotal | number |
| tieOutPayroll | null |
| tieOutRevenue.allocTotal | number |
| tieOutRevenue.difference | number |
| tieOutRevenue.tbTotal | number |
| tieOutRevenue | null |
| totalAllocated | number |
| totalGrossRevenue | number |
| totalSalariesWages | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| taxableIncomeEarnedInAllProvinces | number |
| reg402_6_7_audit.reg_402_6_applied | boolean |
| reg402_6_7_audit.reg_402_6_proportion | array \| boolean \| null \| number \| object \| string |
| reg402_6_7_audit.reg_402_6_revenue_included | array \| boolean \| null \| number \| object \| string |
| reg402_6_7_audit.reg_402_6_salaries_included | array \| boolean \| null \| number \| object \| string |
| reg402_6_7_audit.reg_402_7_applied | boolean |
| reg402_6_7_audit.reg_402_7_deemed_salary | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.applied | boolean |
| reg402_4_1_audit.conditionAForeignMerchandiseSale | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.conditionBMatchingForeignPermanentEstablishment | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.conditionCUntaxedBecauseOfForeignLawOrTreaty | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.foreignPeSalariesDeemedNil | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.qualifyingForeignSaleRevenue | array \| boolean \| null \| number \| object \| string |
| reg402_4_1_audit.status | string |
| reg402_4_1_audit.throwbackRevenueByJurisdiction | object |
| reg402_4_1_audit.triggered | boolean |
| unmodelledProvincialCreditsByJurisdiction.BC | array \| boolean \| null \| number \| object \| string |
| unmodelledProvincialCreditsByJurisdiction.ON | array \| boolean \| null \| number \| object \| string |
| provincialTax.BC | number |
| provincialTax.ON | number |
| totalProvincialTax | number |
| reg402_1_audit.applied | boolean |
| reg402_1_audit.centralPaymasterArrangement | boolean |
| reg402_1_audit.deemedSalary | array \| boolean \| null \| number \| object \| string |
| reg402_1_audit.netSalaryAdjustment | array \| boolean \| null \| number \| object \| string |
| reg402_1_audit.netSalaryAdjustmentByJurisdiction | object |
| reg402_1_audit.operandsSupplied | boolean |
| reg402_1_audit.salaryDeduction | array \| boolean \| null \| number \| object \| string |

# schedule50

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2006 and later
- Strict profile: s50_versioned_profile_target_value_v1
- Payload schema version: 0.3.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule50"
  ],
  "inputs": {
    "taxYear": 2025,
    "t2Jacket": {
      "identification": {
        "typeOfCorporation": "2"
      },
      "applicability": {
        "privateShareholders10pct": true
      }
    },
    "schedule50": {
      "rows": [
        {
          "name": "Cedar Ridge USA Holdings Inc.",
          "shareholderType": "corporation",
          "businessNumber": "NR",
          "percentCommonShares": 10,
          "percentPreferredShares": 0
        }
      ]
    }
  }
}
```

## Input cells (12)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule50.rows | array |  |
| schedule50.rows[].businessNumber | null \| string | strict |
| schedule50.rows[].name | null \| string | strict |
| schedule50.rows[].percentCommonShares | null \| number | strict |
| schedule50.rows[].percentPreferredShares | null \| number | strict |
| schedule50.rows[].shareholderType | null \| string | strict |
| schedule50.rows[].socialInsuranceNumber | null \| string |  |
| schedule50.rows[].trustNumber | null \| string |  |
| t2Jacket.applicability.privateShareholders10pct | boolean | strict |
| t2Jacket.identification.typeChangeEffectiveDate | null \| string |  |
| t2Jacket.identification.typeOfCorporation | string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule50.rows`: Current T4012 says to provide a maximum of the 10 top shareholders. Empty rows (all fields null) are allowed and remain no-ops. Rows beyond 10 trigger roster review; Filemark does not infer a supplementary- attachment procedure from the printed-grid capacity.
- `schedule50.rows[].businessNumber`: The printed form permits NR when not registered. This branch restriction does not prove that NR is factually appropriate for the supplied row.
- `schedule50.rows[].name`: A single-line name with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field maximum.
- `schedule50.rows[].percentCommonShares`: Legacy field name mapped to CRA line 400. Current T4012 describes line 400 as percentage of votes. This narrow candidate accepts only integer values from 10 through 100.
- `schedule50.rows[].percentPreferredShares`: Legacy field name mapped to CRA line 500. This reviewed branch fixes the preferred-share vote percentage at zero.
- `schedule50.rows[].shareholderType`: Bracketed type indicator from box 100 — stored as an enum on the row so the validator can cross-check identifier-type consistency (corp/partnership → BN; individual → SIN; trust → trust number).
- `schedule50.rows[].socialInsuranceNumber`: Box 300 — SIN (9 digits). Populated only when shareholderType is individual; null otherwise.
- `schedule50.rows[].trustNumber`: Box 350 — Trust number (T followed by 8 digits). Populated only when shareholderType is trust; null otherwise.
- `t2Jacket.applicability.privateShareholders10pct`: Submitted T2 line-173 branch restriction. This assertion is not independently verified by the Schedule 50 leaf builder.
- `t2Jacket.identification.typeChangeEffectiveDate`: This narrow branch excludes a submitted corporation-type change date.
- `t2Jacket.identification.typeOfCorporation`: Submitted T2 line-040 branch restriction: code 2, Other private corporation.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 12 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule50.rows[].businessNumber | 0 to 20000 characters |
| schedule50.rows[].name | matches ^(?=\S)(?:[^\r\n]*\S)?$; 1 to 10000 characters |
| schedule50.rows[].percentCommonShares | 10 to 100 |
| schedule50.rows[].percentPreferredShares | -1000000000000000 to 1000000000000000 |
| schedule50.rows[].shareholderType | one of "corporation", "partnership", "individual", "trust", null |
| schedule50.rows[].socialInsuranceNumber | 0 to 20000 characters |
| schedule50.rows[].trustNumber | 0 to 20000 characters |
| t2Jacket.identification.typeChangeEffectiveDate | 0 to 20000 characters |
| t2Jacket.identification.typeOfCorporation | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (178)

| Cell | Types |
| --- | --- |
| rows_count | integer |
| rows[].row_label | integer |
| rows[].name | null \| string |
| rows[].shareholderType | null \| string |
| rows[].nameWithType | null \| string |
| rows[].businessNumber | null \| string |
| rows[].socialInsuranceNumber | null \| string |
| rows[].trustNumber | null \| string |
| rows[].percentCommonShares | null \| number |
| rows[].percentPreferredShares | null \| number |
| column_totals.400 | number |
| column_totals.500 | number |
| shareholder_breakdown.corporation | integer |
| shareholder_breakdown.partnership | integer |
| shareholder_breakdown.individual | integer |
| shareholder_breakdown.trust | integer |
| warnings | array |
| fired_gates.filing_required_when_private_corporation | object |
| provisional | boolean |
| ready | boolean |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| fired_gates.box_100_name_required.applies_to_boxes[] | string |
| fired_gates.box_100_name_required.cra_text_verbatim | string |
| fired_gates.box_100_name_required.form_id | string |
| fired_gates.box_100_name_required.form_revision | string |
| fired_gates.box_100_name_required.gate_id | string |
| fired_gates.box_100_name_required.rule | string |
| fired_gates.box_100_name_required.source | string |
| fired_gates.box_100_name_required.source_url | string |
| fired_gates.box_100_name_required.verified_at | string |
| fired_gates.box_100_shareholder_type_indicator.applies_to_boxes[] | string |
| fired_gates.box_100_shareholder_type_indicator.cra_text_verbatim | string |
| fired_gates.box_100_shareholder_type_indicator.form_id | string |
| fired_gates.box_100_shareholder_type_indicator.form_revision | string |
| fired_gates.box_100_shareholder_type_indicator.gate_id | string |
| fired_gates.box_100_shareholder_type_indicator.rule | string |
| fired_gates.box_100_shareholder_type_indicator.source | string |
| fired_gates.box_100_shareholder_type_indicator.source_url | string |
| fired_gates.box_100_shareholder_type_indicator.verified_at | string |
| fired_gates.box_200_format_bn_or_nr.applies_to_boxes[] | string |
| fired_gates.box_200_format_bn_or_nr.cra_text_verbatim | string |
| fired_gates.box_200_format_bn_or_nr.form_id | string |
| fired_gates.box_200_format_bn_or_nr.form_revision | string |
| fired_gates.box_200_format_bn_or_nr.gate_id | string |
| fired_gates.box_200_format_bn_or_nr.rule | string |
| fired_gates.box_200_format_bn_or_nr.source | string |
| fired_gates.box_200_format_bn_or_nr.source_url | string |
| fired_gates.box_200_format_bn_or_nr.verified_at | string |
| fired_gates.box_300_format_sin_nine_digits.applies_to_boxes[] | string |
| fired_gates.box_300_format_sin_nine_digits.cra_text_verbatim | string |
| fired_gates.box_300_format_sin_nine_digits.form_id | string |
| fired_gates.box_300_format_sin_nine_digits.form_revision | string |
| fired_gates.box_300_format_sin_nine_digits.gate_id | string |
| fired_gates.box_300_format_sin_nine_digits.rule | string |
| fired_gates.box_300_format_sin_nine_digits.source | string |
| fired_gates.box_300_format_sin_nine_digits.source_url | string |
| fired_gates.box_300_format_sin_nine_digits.verified_at | string |
| fired_gates.box_300_modulus_10.applies_to_boxes[] | string |
| fired_gates.box_300_modulus_10.cra_text_verbatim | string |
| fired_gates.box_300_modulus_10.form_id | string |
| fired_gates.box_300_modulus_10.form_revision | string |
| fired_gates.box_300_modulus_10.gate_id | string |
| fired_gates.box_300_modulus_10.rule | string |
| fired_gates.box_300_modulus_10.source | string |
| fired_gates.box_300_modulus_10.source_url | string |
| fired_gates.box_300_modulus_10.verified_at | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.applies_to_boxes[] | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.cra_text_verbatim | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.form_id | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.form_revision | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.gate_id | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.rule | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.source | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.source_url | string |
| fired_gates.box_350_format_trust_t_plus_eight_digits.verified_at | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.applies_to_boxes[] | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.cra_text_verbatim | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.form_id | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.form_revision | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.gate_id | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.rule | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.source | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.source_url | string |
| fired_gates.boxes_200_300_350_exactly_one_per_row.verified_at | string |
| fired_gates.boxes_400_500_at_least_one_positive.applies_to_boxes[] | string |
| fired_gates.boxes_400_500_at_least_one_positive.cra_text_verbatim | string |
| fired_gates.boxes_400_500_at_least_one_positive.form_id | string |
| fired_gates.boxes_400_500_at_least_one_positive.form_revision | string |
| fired_gates.boxes_400_500_at_least_one_positive.gate_id | string |
| fired_gates.boxes_400_500_at_least_one_positive.rule | string |
| fired_gates.boxes_400_500_at_least_one_positive.source | string |
| fired_gates.boxes_400_500_at_least_one_positive.source_url | string |
| fired_gates.boxes_400_500_at_least_one_positive.verified_at | string |
| fired_gates.boxes_400_500_range_0_to_100.applies_to_boxes[] | string |
| fired_gates.boxes_400_500_range_0_to_100.cra_text_verbatim | string |
| fired_gates.boxes_400_500_range_0_to_100.form_id | string |
| fired_gates.boxes_400_500_range_0_to_100.form_revision | string |
| fired_gates.boxes_400_500_range_0_to_100.gate_id | string |
| fired_gates.boxes_400_500_range_0_to_100.rule | string |
| fired_gates.boxes_400_500_range_0_to_100.source | string |
| fired_gates.boxes_400_500_range_0_to_100.source_url | string |
| fired_gates.boxes_400_500_range_0_to_100.verified_at | string |
| fired_gates.column_sums_at_most_100.applies_to_boxes[] | string |
| fired_gates.column_sums_at_most_100.cra_text_verbatim | string |
| fired_gates.column_sums_at_most_100.form_id | string |
| fired_gates.column_sums_at_most_100.form_revision | string |
| fired_gates.column_sums_at_most_100.gate_id | string |
| fired_gates.column_sums_at_most_100.rule | string |
| fired_gates.column_sums_at_most_100.source | string |
| fired_gates.column_sums_at_most_100.source_url | string |
| fired_gates.column_sums_at_most_100.verified_at | string |
| fired_gates.disclosure_threshold_10_percent.applies_to_boxes[] | string |
| fired_gates.disclosure_threshold_10_percent.cra_text_verbatim | string |
| fired_gates.disclosure_threshold_10_percent.form_id | string |
| fired_gates.disclosure_threshold_10_percent.form_revision | string |
| fired_gates.disclosure_threshold_10_percent.gate_id | string |
| fired_gates.disclosure_threshold_10_percent.rule | string |
| fired_gates.disclosure_threshold_10_percent.source | string |
| fired_gates.disclosure_threshold_10_percent.source_url | string |
| fired_gates.disclosure_threshold_10_percent.verified_at | string |
| fired_gates.filing_required_when_private_corporation.applies_to_boxes[] | string |
| fired_gates.filing_required_when_private_corporation.cra_text_verbatim | string |
| fired_gates.filing_required_when_private_corporation.form_id | string |
| fired_gates.filing_required_when_private_corporation.form_revision | string |
| fired_gates.filing_required_when_private_corporation.gate_id | string |
| fired_gates.filing_required_when_private_corporation.rule | string |
| fired_gates.filing_required_when_private_corporation.source | string |
| fired_gates.filing_required_when_private_corporation.source_url | string |
| fired_gates.filing_required_when_private_corporation.verified_at | string |
| fired_gates.identifier_matches_shareholder_type.applies_to_boxes[] | string |
| fired_gates.identifier_matches_shareholder_type.cra_text_verbatim | string |
| fired_gates.identifier_matches_shareholder_type.form_id | string |
| fired_gates.identifier_matches_shareholder_type.form_revision | string |
| fired_gates.identifier_matches_shareholder_type.gate_id | string |
| fired_gates.identifier_matches_shareholder_type.rule | string |
| fired_gates.identifier_matches_shareholder_type.source | string |
| fired_gates.identifier_matches_shareholder_type.source_url | string |
| fired_gates.identifier_matches_shareholder_type.verified_at | string |
| fired_gates.no_duplicate_identifiers.applies_to_boxes[] | string |
| fired_gates.no_duplicate_identifiers.cra_text_verbatim | string |
| fired_gates.no_duplicate_identifiers.form_id | string |
| fired_gates.no_duplicate_identifiers.form_revision | string |
| fired_gates.no_duplicate_identifiers.gate_id | string |
| fired_gates.no_duplicate_identifiers.rule | string |
| fired_gates.no_duplicate_identifiers.source | string |
| fired_gates.no_duplicate_identifiers.source_url | string |
| fired_gates.no_duplicate_identifiers.verified_at | string |
| fired_gates.rows_over_10_need_supplementary.applies_to_boxes[] | string |
| fired_gates.rows_over_10_need_supplementary.cra_text_verbatim | string |
| fired_gates.rows_over_10_need_supplementary.form_id | string |
| fired_gates.rows_over_10_need_supplementary.form_revision | string |
| fired_gates.rows_over_10_need_supplementary.gate_id | string |
| fired_gates.rows_over_10_need_supplementary.rule | string |
| fired_gates.rows_over_10_need_supplementary.source | string |
| fired_gates.rows_over_10_need_supplementary.source_url | string |
| fired_gates.rows_over_10_need_supplementary.verified_at | string |

# schedule513

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2009 and later
- Strict profile: s513_2025_related_group_capital_allowance_agreement_v1
- Payload schema version: 0.1.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule513"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule513": {
      "multipleTaxYearsEndingInCalendarYear": false,
      "members": [
        {
          "name": "Harbourlight Life Insurance Company",
          "businessNumber": "123456782RC0001",
          "lifeInsuranceCorporationCarryingOnBusinessInCanada": true,
          "taxableCapitalEmployedInCanada": 240000000,
          "allocations": [
            30000000
          ]
        },
        {
          "name": "Harbourlight Life Assurance Company",
          "businessNumber": "222222226RC0001",
          "lifeInsuranceCorporationCarryingOnBusinessInCanada": true,
          "taxableCapitalEmployedInCanada": 60000000,
          "allocations": [
            12500000
          ]
        }
      ]
    }
  }
}
```

## Input cells (12)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | null \| string | strict |
| fiscalStart | string | strict |
| schedule513.currentYearIsFirstTaxYearEndingInCalendarYear | boolean \| null |  |
| schedule513.members | array |  |
| schedule513.members[].allocations | array |  |
| schedule513.members[].allocations[] | integer \| null \| number |  |
| schedule513.members[].businessNumber | null \| string |  |
| schedule513.members[].lifeInsuranceCorporationCarryingOnBusinessInCanada | boolean \| null |  |
| schedule513.members[].name | null \| string |  |
| schedule513.members[].taxableCapitalEmployedInCanada | null \| number |  |
| schedule513.multipleTaxYearsEndingInCalendarYear | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `fiscalEnd`: The filer-owned taxation-period end. Schedule 513 resolves the subsection 63(10) group tier thresholds on this date.
- `fiscalStart`: The filer-owned taxation-period start. The batch reader refuses one fiscal bound without the other, so it is required alongside fiscalEnd.
- `schedule513.currentYearIsFirstTaxYearEndingInCalendarYear`: Whether this is the first tax year ending in that calendar year. Only relevant when the Note applies: for the first such year the deemed allowance is this year's own column 400 allocation, and a later year is held because the earlier year's allowance is not carried.
- `schedule513.members[].allocations`: Column 400 — every amount allocated to this member for the year under the s.63(10) agreement and/or an s.63(11) ministerial allocation.
- `schedule513.members[].businessNumber`: Box 300. This member's Business Number, or "NR" when the corporation is not registered.
- `schedule513.members[].lifeInsuranceCorporationCarryingOnBusinessInCanada`: Whether this row is a life insurance corporation carrying on business in Canada. Only such a corporation is a member of the related group, and only its taxable capital sizes the line 410 ceiling. An unanswered row is held rather than assumed.
- `schedule513.members[].name`: Box 200. Name of this member of the related group.
- `schedule513.members[].taxableCapitalEmployedInCanada`: Footnote **. This member's taxable capital employed in Canada, being the amount from line 190 or line 290 on its own Schedule 512, whichever applies.
- `schedule513.multipleTaxYearsEndingInCalendarYear`: The Schedule 513 Note. Whether a member has more than one tax year ending in this calendar year and is, in two or more of them, related to another life insurance corporation with a tax year ending in that calendar year. Unanswered is held, never read as No.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (7 of 12 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule513.members[].allocations[] | -1000000000000000 to 1000000000000000 |
| schedule513.members[].businessNumber | 0 to 20000 characters |
| schedule513.members[].name | 0 to 20000 characters |
| schedule513.members[].taxableCapitalEmployedInCanada | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (48)

| Cell | Types |
| --- | --- |
| schedule | string |
| cra_form_ref | string |
| status | string |
| ready | boolean |
| provisional | boolean |
| warnings[].box | null \| string |
| warnings[].row | integer \| null |
| warnings[].field | null \| string |
| warnings[].slot | integer \| null |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].subsection | string |
| warnings[].authority | string |
| warnings[].gate_id | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| line_410_total_allocated | null \| number |
| group_capital_allowance_cap | null \| number |
| group_taxable_capital_employed_in_canada | number |
| unallocated_group_capacity | number |
| members[].row | integer |
| members[].name_200 | null \| string |
| members[].business_number_300 | null \| string |
| members[].taxable_capital_employed_in_canada | null \| number |
| members[].allocations_400[] | number |
| members[].capital_allowance_s63_12 | null \| number |
| members[].s512_line_330 | null \| number |
| s512_receiver_box | string |
| computed.line_410 | number |
| audit.line_410 | string |
| audit.group_capital_allowance_cap | string |
| audit.group_taxable_capital_employed_in_canada | string |
| audit.tiers | string |
| fired_gates | object |
| computed | object |
| audit | object |

### Output cell notes

- `schedule`: The Filemark schedule identifier for this result.
- `cra_form_ref`: The CRA form this result belongs to.
- `status`: The computed branch discriminator.
- `ready`: Whether the agreement carries no error-severity finding and can be released.
- `provisional`: Whether an error-severity finding holds this result short of release.
- `warnings[].box`: The printed box this finding is about, or null where it is about the schedule as a whole.
- `warnings[].row`: The printed grid row this finding is about, or null where it is not about a row.
- `warnings[].field`: The member cell this finding is about, or null where it is not about one. A closed vocabulary: the engine states it as a constant beside the identity rather than composing the two into `code`.
- `warnings[].slot`: The zero-based position within a repeated member cell (column 400 carries one amount per allocation), or null where the cell is not repeated.
- `warnings[].code`: The finding's own identifier.
- `warnings[].findingCode`: The registered filing-disposition identity this finding is dispositioned under; equal to `code` unless the emit site states a shared one.
- `warnings[].severity`: error holds the agreement, warning discloses it, info records an enacted result that is not a defect.
- `warnings[].subsection`: The Ontario Taxation Act, 2007 subsection this finding rests on.
- `warnings[].authority`: The same subsection, fully cited.
- `warnings[].gate_id`: The T4012 gate whose printed CRA face text authorises this finding.
- `line_410_total_allocated`: Box 410. The total of the column 400 capital allowance each member is allocated for the tax year.
- `group_capital_allowance_cap`: The footnote * ceiling on line 410: $10 million plus the four tiered slices of subsection 63(10) paragraphs 2 to 5, measured on the group's aggregate taxable capital employed in Canada.
- `group_taxable_capital_employed_in_canada`: Footnote **. The sum of every member's taxable capital employed in Canada, being each one's Schedule 512 line 190 or line 290, whichever applies.
- `unallocated_group_capacity`: The part of the subsection 63(10) ceiling the agreement has not allocated.
- `members[].row`: The printed grid row number, from 1.
- `members[].name_200`: Box 200. Name of this member of the related group; null when the row did not state one.
- `members[].business_number_300`: Box 300. This member's Business Number, or "NR" when it is not registered; null when the row did not state one.
- `members[].taxable_capital_employed_in_canada`: Footnote **. This member's Schedule 512 line 190 or line 290 amount, as stated on the row.
- `members[].capital_allowance_s63_12`: This member's capital allowance under subsection 63(12): the LEAST amount allocated to it, never the sum and never the latest. This is the amount the printed column 400 cell carries.
- `members[].s512_line_330`: The same subsection 63(12) amount, addressed by the box it is entered at on this member's OWN Schedule 512 (Part 4 line 330, "the amount from line 400 on Schedule 513"). It is a cross-schedule feed, not a second Schedule 513 value: the Schedule 513 face prints this amount once, in column 400.
- `s512_receiver_box`: The Schedule 512 box each member's capital allowance is entered at on that member's own return. Schedule 512 Part 4 line 330 reads "the amount from line 400 on Schedule 513".
- `computed.line_410`: Box 410, as the form graph consumes it.
- `audit.tiers`: Each subsection 63(8) tier citation and the amount it contributed to the group ceiling.
- `fired_gates`: Every T4012 gate this build evaluated, keyed by gate identifier, each carrying the verbatim CRA face text it was authored from.
- `computed`: Empty on this branch: no printed box value is published from a held agreement.
- `audit`: Empty on this branch: there is no decimal trail behind a box that was not computed.

# schedule53

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s53_single_grip_profile_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): dividend_pool_status, division_c, sbd, schedule24, schedule3, schedule4, schedule7

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule53"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "corpType": "1",
    "t2Jacket": {
      "identification": {
        "isResidentOfCanada": true
      },
      "additionalInfo": {
        "isDepositInsuranceCorporation": false,
        "isCreditUnion": false,
        "substantiveCCPCAnytime": false,
        "section89_11ElectionInForceForTaxYear": false
      },
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false
      }
    },
    "accounts": [
      {
        "id": "revenue",
        "accountCode": "4000",
        "accountName": "Cedar Ridge active business revenue",
        "accountType": "revenue",
        "currentYearBalance": -100000,
        "userStatus": "default",
        "reviewStatus": "default",
        "classification": {
          "schedule1Relevant": false,
          "incomeType": "active",
          "foreignSource": false
        }
      }
    ],
    "incomeStatementFlags": {
      "revenue": true
    },
    "specifiedCorporateIncomeReviewed": true,
    "supplementalLinesReviewed": true,
    "specifiedPartnershipIncomeApplies": false,
    "specifiedInvestmentBusinessIncome": 0,
    "lifeInsurancePolicyIncome": 0,
    "schedule53": {
      "line100GripOpening": 0,
      "line130LesserSbdNumerator": 40000,
      "line210Section113Dividends": 0,
      "line300EligibleDivsPaidPriorYear": 0,
      "line310ExcessiveEEDPriorYear": 0,
      "line140LesserAiiTaxableIncome": 0
    },
    "daysInYear": 365
  }
}
```

## Input cells (75)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].accountType | string | strict |
| accounts[].classification.foreignSource | boolean | strict |
| accounts[].classification.incomeType | string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].currentYearBalance | integer | strict |
| accounts[].id | string | strict |
| accounts[].reviewStatus | string | strict |
| accounts[].userStatus | string | strict |
| corpType | string | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.revenue | boolean | strict |
| lifeInsurancePolicyIncome | integer | strict |
| schedule53.isBecomingCcpc | boolean \| null |  |
| schedule53.line100GripOpening | null \| number | strict |
| schedule53.line110TaxableIncome | null \| number |  |
| schedule53.line130LesserSbdNumerator | null \| number | strict |
| schedule53.line140LesserAiiTaxableIncome | null \| number |  |
| schedule53.line200EligibleDividendsReceived | null \| number |  |
| schedule53.line210Section113Dividends | null \| number | strict |
| schedule53.line300EligibleDivsPaidPriorYear | null \| number | strict |
| schedule53.line310ExcessiveEEDPriorYear | null \| number | strict |
| schedule53.part2Rows | array |  |
| schedule53.part2Rows[].a_taxableIncomeBefore | null \| number |  |
| schedule53.part2Rows[].b_sbdBefore | null \| number |  |
| schedule53.part2Rows[].c_aiiBefore | null \| number |  |
| schedule53.part2Rows[].f_taxableIncomeAfter | null \| number |  |
| schedule53.part2Rows[].g_sbdAfter | null \| number |  |
| schedule53.part2Rows[].h_aiiAfter | null \| number |  |
| schedule53.part2Rows[].priorYearIndex | integer |  |
| schedule53.part3Rows | array |  |
| schedule53.part3Rows[].a4_predecessorGrip | null \| number |  |
| schedule53.part3Rows[].assetsReceivedTaxationYearEnd | null \| string |  |
| schedule53.part3Rows[].b4_eligibleDivsPaid | null \| number |  |
| schedule53.part3Rows[].businessNumber | string |  |
| schedule53.part3Rows[].c4_excessiveEED | null \| number |  |
| schedule53.part3Rows[].corpName | string |  |
| schedule53.part3Rows[].operation | string |  |
| schedule53.part4Rows | array |  |
| schedule53.part4Rows[].a5_costOfProperty | null \| number |  |
| schedule53.part4Rows[].assetsReceivedTaxationYearEnd | null \| string |  |
| schedule53.part4Rows[].b5_moneyOnHand | null \| number |  |
| schedule53.part4Rows[].businessNumber | string |  |
| schedule53.part4Rows[].c5_nonCapitalLosses | null \| number |  |
| schedule53.part4Rows[].corpName | string |  |
| schedule53.part4Rows[].d5_netCapitalLosses | null \| number |  |
| schedule53.part4Rows[].e5_farmLosses | null \| number |  |
| schedule53.part4Rows[].f5_restrictedFarmLosses | null \| number |  |
| schedule53.part4Rows[].g5_limitedPartnershipLosses | null \| number |  |
| schedule53.part4Rows[].i5_actualNonCapitalLosses | null \| number |  |
| schedule53.part4Rows[].j5_actualNetCapitalLosses | null \| number |  |
| schedule53.part4Rows[].k5_actualFarmLosses | null \| number |  |
| schedule53.part4Rows[].l5_actualRestrictedFarmLosses | null \| number |  |
| schedule53.part4Rows[].m5_actualLimitedPartnershipLosses | null \| number |  |
| schedule53.part4Rows[].q5_debts | null \| number |  |
| schedule53.part4Rows[].r5_paidUpCapital | null \| number |  |
| schedule53.part4Rows[].s5_reserves | null \| number |  |
| schedule53.part4Rows[].situation | string |  |
| schedule53.part4Rows[].t5_cdaBalance | null \| number |  |
| schedule53.part4Rows[].u5_lripBalance | null \| number |  |
| specifiedCorporateIncomeReviewed | boolean | strict |
| specifiedInvestmentBusinessIncome | integer | strict |
| specifiedPartnershipIncomeApplies | boolean | strict |
| supplementalLinesReviewed | boolean | strict |
| t2Jacket.additionalInfo.isCreditUnion | boolean | strict |
| t2Jacket.additionalInfo.isDepositInsuranceCorporation | boolean | strict |
| t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear | boolean | strict |
| t2Jacket.additionalInfo.substantiveCCPCAnytime | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `accounts[].classification.foreignSource`: The account's income is foreign source; schedules that split Canadian from foreign amounts route it accordingly, for example Schedule 7's foreign property and rental buckets and line 500 foreign business income.
- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `incomeStatementFlags.revenue`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `lifeInsurancePolicyIncome`: TXE-319: ITA s.125(7)(c)(ii), in the 'adjusted aggregate investment income' definition, includes amounts in respect of a life insurance policy that are included in income; the engine reads the amount as an explicit off-form statutory fact. Zero pins this witness's branch.
- `schedule53.isBecomingCcpc`: True iff corp is BECOMING a CCPC this year (s.89(4)); forces 300/310 = 0.
- `schedule53.line100GripOpening`: Line 100 — Opening GRIP carryforward from prior-year line 590.
- `schedule53.line110TaxableIncome`: Line 110 — Taxable income for the year (DICs enter 0).
- `schedule53.line130LesserSbdNumerator`: Line 130 — Lesser of T2 lines 400/405/410/428.
- `schedule53.line140LesserAiiTaxableIncome`: Schedule 53 line 140: for a CCPC, the lesser of aggregate investment income (T2 line 440) and taxable income. A ready Schedule 7 is the canonical producer and GOVERNS this figure; the explicit amount is the only other proof, and without either the engine holds line 140 rather than reading the blank as nil. This witness earns only active business income, so its answer is 0.
- `schedule53.line200EligibleDividendsReceived`: Line 200 — Eligible dividends received in tax year (Cdn-source).
- `schedule53.line210Section113Dividends`: Line 210 — Exact ITA s.89(1) variable-E foreign-affiliate amount.
- `schedule53.line300EligibleDivsPaidPriorYear`: Line 300 — Final prior-year eligible dividends paid after any valid s.185.1(2) election. Source from the finalized prior Schedule 55 line 150/election record; Schedule 3 line 465 is partial-scope only.
- `schedule53.line310ExcessiveEEDPriorYear`: Line 310 — Final prior-year excessive eligible dividend designations remaining after any valid s.185.1(2) election. Paragraph-(c) EEDD is not electable.
- `schedule53.part2Rows[].a_taxableIncomeBefore`: A — Taxable income BEFORE SFTC.
- `schedule53.part2Rows[].b_sbdBefore`: B — Lesser of T2 400/405/410/428 BEFORE SFTC.
- `schedule53.part2Rows[].c_aiiBefore`: C — AII (T2 line 440) BEFORE SFTC.
- `schedule53.part2Rows[].f_taxableIncomeAfter`: F — Taxable income AFTER SFTC.
- `schedule53.part2Rows[].g_sbdAfter`: G — Lesser of T2 400/405/410/428 AFTER SFTC.
- `schedule53.part2Rows[].h_aiiAfter`: H — AII (T2 line 440) AFTER SFTC.
- `schedule53.part2Rows[].priorYearIndex`: Which prior tax year this row covers.
- `schedule53.part3Rows[].a4_predecessorGrip`: A4 — Predecessor GRIP at end of its last tax year.
- `schedule53.part3Rows[].assetsReceivedTaxationYearEnd`: ISO YYYY-MM-DD end of the PARENT's taxation year during which it received the subsidiary's assets on the wind-up. ITA 89(6) includes the addition in the parent's GRIP "at the end of its taxation year that immediately follows the taxation year during which it receives the assets of the subsidiary", so the receipt year is what places the inclusion; the return's own year end cannot stand in for it. Required on a `wind_up` row and ignored on an `amalgamation` row. Left blank the engine derives it from the provenance-bearing Schedule 24 wind-up evidence and blocks when that evidence is absent — it…
- `schedule53.part3Rows[].b4_eligibleDivsPaid`: B4 — Eligible dividends paid by predecessor in its last tax year.
- `schedule53.part3Rows[].c4_excessiveEED`: C4 — Excessive eligible dividend designations made by predecessor.
- `schedule53.part3Rows[].operation`: "amalgamation" feeds line 230; "wind_up" feeds line 240.
- `schedule53.part4Rows[].a5_costOfProperty`: A5 — Cost amount of all property immediately before end of last TY.
- `schedule53.part4Rows[].assetsReceivedTaxationYearEnd`: ISO YYYY-MM-DD end of the PARENT's taxation year during which it received the subsidiary's assets on the wind-up — the same ITA 89(6) timing fact Part 3 carries, on the non-CCPC subsidiary branch. Required on a `post_wind_up` row and ignored on the other two situations. Left blank the engine derives it from the Schedule 24 wind-up evidence and blocks when that evidence is absent. Optional in the shape for the same reason as the Part 3 twin.
- `schedule53.part4Rows[].b5_moneyOnHand`: B5 — Corporation's money on hand immediately before end of last TY.
- `schedule53.part4Rows[].situation`: "becoming_ccpc" feeds line 220 (s.89(4)); "post_amalgamation" feeds line 230 (s.87(1) / s.89(5)); "post_wind_up" feeds line 240 (s.88(1) / s.89(6)).
- `specifiedCorporateIncomeReviewed`: Confirms the Schedule 7 Part 7 review of ITA s.125(7) specified corporate income; until true the engine caps specified corporate income at nil and line 615 stays out of SBD-eligible income.
- `specifiedInvestmentBusinessIncome`: Total income for the year from a specified investment business carried on in Canada, the ITA s.125(7) 'income of the corporation for the year from an active business' paragraph (a) carve-out the sweep made an explicit operand. Zero pins this witness's branch: no specified investment business income.
- `specifiedPartnershipIncomeApplies`: Whether ITA s.125(7) specified partnership income applies for the year; true requires the Schedule 7 Parts 4 and 5 partnership packets.
- `supplementalLinesReviewed`: Confirms Schedule 7 lines 042, 052, 072, 720, 725, 735, 741, 029, 059, 530 and 540 were reviewed and every applicable amount entered; AII, FII, AAII and SBD-eligible income are held at zero until confirmed.
- `t2Jacket.additionalInfo.isCreditUnion`: The corporation is a credit union; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.isDepositInsuranceCorporation`: The corporation is a deposit insurance corporation; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear`: An ITA s.89(11) election not to be treated as a CCPC is in force for the taxation year; the continuing election state, distinct from the box 266 and 267 filing events.
- `t2Jacket.additionalInfo.substantiveCCPCAnytime`: T2 box 290: the corporation was a substantive CCPC (ITA s.248(1)) at any time in the taxation year; routes the general rate reduction worksheet and the dividend-pool regime.
- `t2Jacket.identification.isResidentOfCanada`: T2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (23 of 75 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].accountType | 0 to 20000 characters |
| accounts[].classification.incomeType | 0 to 20000 characters |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| accounts[].reviewStatus | 0 to 20000 characters |
| accounts[].userStatus | 0 to 20000 characters |
| corpType | 0 to 20000 characters |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| lifeInsurancePolicyIncome | -1000000000000000 to 1000000000000000 |
| schedule53.line100GripOpening | -1000000000000000 to 1000000000000000 |
| schedule53.line130LesserSbdNumerator | -1000000000000000 to 1000000000000000 |
| schedule53.line140LesserAiiTaxableIncome | -1000000000000000 to 1000000000000000 |
| schedule53.line210Section113Dividends | -1000000000000000 to 1000000000000000 |
| schedule53.line300EligibleDivsPaidPriorYear | -1000000000000000 to 1000000000000000 |
| schedule53.line310ExcessiveEEDPriorYear | -1000000000000000 to 1000000000000000 |
| schedule53.part3Rows[].operation | one of "amalgamation", "wind_up" |
| schedule53.part4Rows[].situation | one of "becoming_ccpc", "post_amalgamation", "post_wind_up" |
| specifiedInvestmentBusinessIncome | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (89)

| Cell | Types |
| --- | --- |
| fired_gates | object |
| form.formWarnings | array |
| form.line_100 | number |
| form.line_110 | number |
| form.line_130 | number |
| form.line_140 | number |
| form.line_150 | number |
| form.line_190 | number |
| form.line_200 | number |
| form.line_210 | number |
| form.line_220 | number |
| form.line_230 | number |
| form.line_240 | number |
| form.line_290 | number |
| form.line_300 | number |
| form.line_310 | number |
| form.line_490 | number |
| form.line_500 | number |
| form.line_520 | number |
| form.line_540 | number |
| form.line_560 | number |
| form.line_590 | array \| boolean \| null \| number \| object \| string |
| form.part2Table[].a | number |
| form.part2Table[].b | number |
| form.part2Table[].c | number |
| form.part2Table[].d | number |
| form.part2Table[].d2 | number |
| form.part2Table[].e | number |
| form.part2Table[].e2 | number |
| form.part2Table[].f | number |
| form.part2Table[].g | number |
| form.part2Table[].h | number |
| form.part2Table[].i | number |
| form.part2Table[].i2 | number |
| form.part2Table[].j | number |
| form.part2Table[].j2 | number |
| form.part2Table[].k | number |
| form.part2Table[].year | integer |
| form.part3Table | array |
| form.part4Table | array |
| form.subtotal_A | number |
| form.subtotal_B | number |
| form.subtotal_C | number |
| form.subtotal_D | number |
| line_100 | number |
| line_110 | number |
| line_130 | number |
| line_140 | number |
| line_150 | number |
| line_190 | number |
| line_200 | number |
| line_210 | number |
| line_220 | number |
| line_230 | number |
| line_240 | number |
| line_290 | number |
| line_300 | number |
| line_310 | number |
| line_490 | number |
| line_500 | number |
| line_520 | number |
| line_540 | number |
| line_560 | number |
| line_590 | array \| boolean \| null \| number \| object \| string |
| missing_required[] | string |
| part2Rows | array |
| part3Rows | array |
| part4Rows | array |
| poolBalanceChanged | boolean |
| provisional | boolean |
| ready | boolean |
| subtotalA | number |
| subtotalB | number |
| subtotalC | number |
| subtotalD | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| line_590_withheld | boolean |

### Output cell notes

- `line_590_withheld`: Present only when the closing balance was withheld, and then always true.

# schedule54

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s54_2024_non_ccpc_single_lrip_event_target_value_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): dividend_pool_status, schedule24, schedule3

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule54"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "t2Jacket": {
      "identification": {
        "isResidentOfCanada": true,
        "typeOfCorporation": "3"
      },
      "filingStatus": {
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      },
      "additionalInfo": {
        "isDepositInsuranceCorporation": false,
        "isCreditUnion": false,
        "substantiveCCPCAnytime": false,
        "section89_11ElectionInForceForTaxYear": false
      },
      "applicability": {
        "lripChangeOrEligDiv": true
      }
    },
    "schedule54": {
      "line100OpeningLrip": 100000,
      "s89_11ElectionInPriorYear": false,
      "wasSubstantiveCCPCInPriorYear": false,
      "wasCCPCInPriorYear": false,
      "priorYearS125Deduction": 0,
      "line160PriorYearIcDeduction": 0,
      "s89_10DissolutionOrWindupOccurredInYear": false,
      "part2Rows": [
        {
          "date": "2025-06-30",
          "eligDivsPaidOnDate": 50000,
          "designatedInWritingAtPaymentTime": true
        }
      ]
    }
  }
}
```

## Input cells (51)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule54 | object |  |
| schedule54.amalgamationOccurredInYear | boolean \| null |  |
| schedule54.election89_11 | null \| object |  |
| schedule54.election89_11.electionFiledDate | null \| string |  |
| schedule54.election89_11.ministerialConditionsComplied | boolean \| null |  |
| schedule54.election89_11.revocationFiledDate | null \| string |  |
| schedule54.isCreditUnion | boolean \| null |  |
| schedule54.line100OpeningLrip | null \| number | strict |
| schedule54.line140PriorYearAii | null \| number |  |
| schedule54.line160PriorYearIcDeduction | null \| number | strict |
| schedule54.line510NonEligDivsReceived | null \| number |  |
| schedule54.line520Adjustments | null \| number |  |
| schedule54.line540NonEligDivsPaid | null \| number |  |
| schedule54.line540PriorYearTailback | null \| number |  |
| schedule54.mic130_1_1DeductibleDividendsPaid | null \| number |  |
| schedule54.part2Rows | array |  |
| schedule54.part2Rows[].adjustmentEventType | null \| string |  |
| schedule54.part2Rows[].adjustmentOnDate | null \| number |  |
| schedule54.part2Rows[].date | null \| string | strict |
| schedule54.part2Rows[].designatedInWritingAtPaymentTime | boolean \| null | strict |
| schedule54.part2Rows[].designationDate | null \| string |  |
| schedule54.part2Rows[].eligDivsPaidOnDate | null \| number | strict |
| schedule54.part2Rows[].lateDesignationErdtohTransitional | boolean \| null |  |
| schedule54.part2Rows[].nonEligDivsPaidOnDate | null \| number |  |
| schedule54.part2Rows[].paragraphCAntiAvoidanceApplies | boolean \| null |  |
| schedule54.part2Rows[].paymentTimeGroupId | null \| string |  |
| schedule54.part2Rows[].s112DivsBecameReceivableOnDate | null \| number |  |
| schedule54.part2Rows[].s89_14_1ReliefGranted | boolean \| null |  |
| schedule54.part2Rows[].subsidiaryLastTaxYearEnd | null \| string |  |
| schedule54.priorYearS125Deduction | null \| number | strict |
| schedule54.s89_10DissolutionOrWindupOccurredInYear | boolean \| null | strict |
| schedule54.s89_10TransitionAdjustment | null \| number |  |
| schedule54.s89_11ElectionInPriorYear | boolean \| null | strict |
| schedule54.s89_8TransitionAdjustment | null \| number |  |
| schedule54.s89_9TransitionAdjustment | null \| number |  |
| schedule54.subsidiaryWindupOccurredInYear | boolean \| null |  |
| schedule54.wasCCPCInPriorYear | boolean \| null | strict |
| schedule54.wasSubstantiveCCPCInPriorYear | boolean \| null | strict |
| t2Jacket.additionalInfo.isCreditUnion | boolean | strict |
| t2Jacket.additionalInfo.isDepositInsuranceCorporation | boolean | strict |
| t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear | boolean | strict |
| t2Jacket.additionalInfo.substantiveCCPCAnytime | boolean | strict |
| t2Jacket.applicability.lripChangeOrEligDiv | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| t2Jacket.identification.typeOfCorporation | string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `schedule54`: Schedule 54 (LRIP) / Schedule 55 (Part III.1 tax) practitioner blobs — feed the schedule54 / schedule55 batch nodes (S54 → S55 amount-C cross-feed). S54 emits only when opened. S55 also emits an error-severity unopened result when computed S3 line 460 or T2 jacket box 265 (t2Jacket.applicability.taxableDividendsPaid) proves its s.185.2(1) filing trigger.
- `schedule54.amalgamationOccurredInYear`: Legacy reconciliation-only answer that an amalgamation occurred in the year. The T2 jacket box 071 answer or Schedule 24 establishes the event and this flag alone cannot, so a value that disagrees with them blocks the return.
- `schedule54.election89_11`: Null until any field is answered; the tab collapses an all-null object back to null so an untouched return sends no election blob.
- `schedule54.election89_11.electionFiledDate`: Date (yyyy-mm-dd) the s.89(11) election (T2002) was filed. Both s.89(11) and s.89(12) admit only a filing made "on or before its filing-due date for a particular taxation year" — the deadline is a condition of the election's VALIDITY, so an asserted election without a provable on-time filing fails closed.
- `schedule54.election89_11.ministerialConditionsComplied`: s.89(13)(b) — the corporation complies with any conditions imposed by the Minister. TRI-STATE: null means unanswered and never resolves to compliant. Conjunctive with the (a) written consent ("invalid unless (a) ... and (b) ...") and NEVER defaulted from it — a continuing obligation that must be re-asserted each year the election or revocation is relied on.
- `schedule54.election89_11.revocationFiledDate`: Date (yyyy-mm-dd) the s.89(12) revocation notice was filed; the identical filing-due-date validity test applies.
- `schedule54.isCreditUnion`: Whether the corporation was a credit union, for statutory variable E under ITA s.89(1) and s.137(7). The canonical T2 jacket status wins and a disagreement blocks, so send this only on a standalone Schedule 54 call.
- `schedule54.line100OpeningLrip`: Line 100 — LRIP at end of immediately previous tax year. Sourced from PY line 590 with the form's 'if negative, enter 0' floor applied. Carryforward chain. Filing-grade computation requires an explicit amount or zero; null remains unanswered.
- `schedule54.line140PriorYearAii`: Line 140 — PY aggregate investment income (T2 line 440 of PY). POPULATED ONLY when the corp meets one of the two narrow arms: - s89_11ElectionInPriorYear = true, OR - wasSubstantiveCCPCInPriorYear = true. Per form footnote 1. If neither condition applies, both prior-year status answers must be explicitly false; null is unresolved. The engine then applies a statutory zero to line 140.
- `schedule54.line160PriorYearIcDeduction`: Line 160 — PY s.130(1) investment-corporation deduction (T2 line 620 of PY). The form multiplies this by 4 in the line 190 subtotal per s.89(1) variable F. Filing-grade computation requires an explicit deduction or zero; null remains unanswered.
- `schedule54.line510NonEligDivsReceived`: Line 510 — Year-total of s.112-deductible non-eligible dividends received. A present Schedule 3 result's exact `totalNonEligibleS112DividendsReceived` owns the annual total. Part 2 rows are dated timing/reconciliation detail; this direct field is a standalone fallback only when Schedule 3 is absent.
- `schedule54.line520Adjustments`: Line 520 — Year-total of s.89(8)/(9)/(10) adjustments. Per form footnote 4, MUST equal sum of Part 2 col 3 across rows. Override diverging from sum is an error.
- `schedule54.line540NonEligDivsPaid`: Line 540 — Year-total of non-eligible taxable dividends paid. A present Schedule 3 result's exact `totalNonEligibleTaxableDividendsPaid` owns the current-year component; Schedule 54 separately owns and adds the PY tailback. Part 2 rows are dated timing/reconciliation detail, and this direct field is a standalone fallback only when Schedule 3 is absent.
- `schedule54.line540PriorYearTailback`: Line 540 PY tail-back component (Bill C-59 / form footnote 8). Populated only for the applicable substantive-CCPC or s.89(11)-elector variable-D arm for taxation years starting after 2022-04-06. The amount is the LESSER of (a) prior-year amount paid that did not reduce LRIP, OR (b) the amount included under variable D in the particular CURRENT taxation year (current Schedule 54 line 150). The engine adds this to the CY paid total when computing line 540.
- `schedule54.mic130_1_1DeductibleDividendsPaid`: Line 540 — taxable dividends the corporation paid that are deductible by a mortgage investment corporation under ITA s.130.1(1)(a)(i). Variable G of the s.89(1) "low rate income pool" definition excludes them, so line 540 must be net of the amount. Applies only to a MIC (s.130.1(6)), and no MIC-status fact exists for the engine to demand it from, so send it: left absent, line 540 keeps the gross reduction, depletes more LRIP and under-taxes. It applies only against a Schedule 3 gross feed. Never carried forward.
- `schedule54.part2Rows`: Ordered list of per-event rows. Engine sorts by date ascending before computing cumulative col 2/5/6 values.
- `schedule54.part2Rows[].adjustmentEventType`: Which s.89 inclusion the adjustment amount is — required whenever adjustmentOnDate is non-zero, because the three rules carry different statutory timing: s.89(8) cease-CCPC and s.89(9) amalgamation are in the pool at any time in the year, while the s.89(10) wind-up enters only at or after the subsidiary's last taxation year end. Never inferred from the amount.
- `schedule54.part2Rows[].adjustmentOnDate`: Per-event s.89(8)/(9)/(10) adjustment ON this date — sum of any Parts 4/5/6 worksheets that share this date (per form footnote 4). Feeds this row's col 3 (line 220) AND the year-total line 520.
- `schedule54.part2Rows[].date`: Column 1 / line 200 — date (yyyy-mm-dd; the CRA-printed yyyy/mm/dd form is also accepted). Required when the row has a non-zero eligible-dividend payment; optional for pure adjustment rows but recommended for audit-trail clarity.
- `schedule54.part2Rows[].designatedInWritingAtPaymentTime`: s.89(14): the eligible-dividend designation for this row was made in writing at the time the dividend was paid; false or a later designation date engages the s.89(14.1) late-designation window arithmetic.
- `schedule54.part2Rows[].designationDate`: Date the s.89(14) written designation was made (yyyy-mm-dd), when it was not made at the payment time.
- `schedule54.part2Rows[].eligDivsPaidOnDate`: Per-event eligible dividends PAID on this date — populates col 8 (line 270) and is tested against col 7 (line 260, LRIP at date) via the lesser-of in col 9 (line 280).
- `schedule54.part2Rows[].lateDesignationErdtohTransitional`: s.89(14.2) — the late designation is made as a consequence of subparagraph (a)(iii) of the ERDTOH definition in s.129(4), extending the just-and-equitable window from three to six years.
- `schedule54.part2Rows[].nonEligDivsPaidOnDate`: Per-event non-eligible taxable dividends that BECAME PAYABLE on this date (s.89(1) variable G(a) — "became payable by the non-CCPC"; the form's column 5 asks for dividends "payable in the year before the date on line 200"). Feeds cumulative col 5 (line 240) and provides dated reconciliation detail. When Schedule 3 is present, its exact annual total owns line 540's current-year component; Schedule 54 separately owns the PY tailback.
- `schedule54.part2Rows[].paragraphCAntiAvoidanceApplies`: Para (c) anti-avoidance row-level determination. When true, line 280 for this row = line 270 in full (bypassing the lesser-of test). CPA-only / GAAR-adjacent; surfaces an amber 'Pending Filemark CPA sign-off' flag. On rows paying an eligible dividend this must be ANSWERED: explicit false is a complete answer, null blocks filing — the 30%-vs-0% swing never rides on silence.
- `schedule54.part2Rows[].paymentTimeGroupId`: Stable practitioner-authored identifier shared by every dividend paid at the same statutory time. Rows on the same date and with the same identifier share the paragraph-(b) denominator; a blank identifier uses the calendar date as the group for backwards-compatible single-time days.
- `schedule54.part2Rows[].s112DivsBecameReceivableOnDate`: Per-event s.112-deductible non-eligible dividends that BECAME RECEIVABLE on this date. The statutory trigger (ITA s.89(1) variable B) is a taxable dividend that "became payable ... to the non-CCPC", and the form's column 2 asks for dividends "receivable in the year before the date on line 200" — the date is when the dividend became payable, NOT when cash moved. Feeds cumulative col 2 (line 210) and provides dated reconciliation detail. When Schedule 3 is present, its exact annual total owns Part 3 line 510.
- `schedule54.part2Rows[].s89_14_1ReliefGranted`: s.89(14.1)/(14.2) — the Minister has GRANTED late-designation relief for this dividend. Filemark never judges the Minister's just-and-equitable discretion; it only records the outcome. A late designation without this confirmed true is reclassified as an ordinary taxable dividend (variable G) and blocks filing.
- `schedule54.part2Rows[].subsidiaryLastTaxYearEnd`: s.89(10) wind-ups only: the wound-up subsidiary's last taxation year end (yyyy-mm-dd). The inclusion cannot occur before this date.
- `schedule54.priorYearS125Deduction`: Federal s.125(1) deduction claimed for the immediately preceding taxation year. When variable E applies, explicit zero is a complete answer; null means the practitioner has not answered. The backend applies the period-indexed SBD rate and is the sole calculator.
- `schedule54.s89_10DissolutionOrWindupOccurredInYear`: Reviewed answer to the broader paragraph 89(10) dissolution-or-winding-up question; box 072 and Schedule 24 cover only the section 88 subset.
- `schedule54.s89_10TransitionAdjustment`: Same machinery for the s.89(10) subsidiary wind-up inclusion — ITA s.89(10) "there shall be included" — keyed on the subsidiary wind-up trigger fact. Zero is a complete answer; null is unanswered.
- `schedule54.s89_11ElectionInPriorYear`: Prior-year status fact for the s.89(1) low rate income pool continuity: an s.89(11) election was in force in the preceding taxation year.
- `schedule54.s89_8TransitionAdjustment`: Explicit answer for the s.89(8) cease-to-be-CCPC LRIP inclusion. ITA s.89(8): "there shall be included in computing the corporation's low rate income pool" the formula amount — mandatory, not elective. Required (when the return establishes the transition and no typed cease_ccpc Part 2 row carries the amount) as either the Parts 4/5/6 computed amount or an explicit zero when the formula genuinely nets to nil; null remains unanswered and blocks filing. A non-nil answer must equal the typed Part 2 column-3 total for the event type.
- `schedule54.s89_9TransitionAdjustment`: Same machinery for the s.89(9) amalgamation inclusion — ITA s.89(9) "there shall be included" — keyed on the amalgamation trigger fact. Zero is a complete answer; null is unanswered.
- `schedule54.subsidiaryWindupOccurredInYear`: Legacy reconciliation-only answer that a subsidiary wind-up occurred in the year. T2 jacket box 072, Schedule 24 or the broader ITA s.89(10) dissolution answer establishes the event, and a disagreeing value blocks the return.
- `schedule54.wasCCPCInPriorYear`: Direct temporal fact for LRIP variable E: whether the corporation was a CCPC in the preceding taxation year; when false an explicit prior-year s.125 deduction amount is required (zero is valid).
- `schedule54.wasSubstantiveCCPCInPriorYear`: Prior-year status fact for the s.89(1) LRIP continuity: the corporation was a substantive CCPC (s.248(1)) in the preceding taxation year.
- `t2Jacket.additionalInfo.isCreditUnion`: The corporation is a credit union; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.isDepositInsuranceCorporation`: The corporation is a deposit insurance corporation; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear`: An ITA s.89(11) election not to be treated as a CCPC is in force for the taxation year; the continuing election state, distinct from the box 266 and 267 filing events.
- `t2Jacket.additionalInfo.substantiveCCPCAnytime`: T2 box 290: the corporation was a substantive CCPC (ITA s.248(1)) at any time in the taxation year; routes the general rate reduction worksheet and the dividend-pool regime.
- `t2Jacket.applicability.lripChangeOrEligDiv`: T2 jacket applicability answer: the low rate income pool (ITA s.89(1)) changed in the year or an eligible dividend was paid or received, so Schedule 54 applies.
- `t2Jacket.identification.isResidentOfCanada`: T2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (11 of 51 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule54.line100OpeningLrip | -1000000000000000 to 1000000000000000 |
| schedule54.line160PriorYearIcDeduction | -1000000000000000 to 1000000000000000 |
| schedule54.part2Rows[].adjustmentEventType | one of "cease_ccpc", "amalgamation", "windup" |
| schedule54.part2Rows[].date | 0 to 20000 characters |
| schedule54.part2Rows[].eligDivsPaidOnDate | -1000000000000000 to 1000000000000000 |
| schedule54.priorYearS125Deduction | -1000000000000000 to 1000000000000000 |
| t2Jacket.identification.typeOfCorporation | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (123)

| Cell | Types |
| --- | --- |
| amountA | number |
| amountAParaBOnly | number |
| amountB | number |
| amountC | number |
| amountD | number |
| amountE | number |
| amountF | number |
| amount_a | number |
| amount_a_para_b_only | number |
| election89_11Status | array \| boolean \| null \| number \| object \| string |
| eligibleDividendsPaidPart2 | number |
| eligibleDividendsPaidSchedule3 | null \| number |
| fired_gates | object |
| form.amountA | number |
| form.amountB | number |
| form.amountC | number |
| form.amountD | number |
| form.amountE | number |
| form.amountF | number |
| form.formWarnings | array |
| form.line_100 | number |
| form.line_140 | number |
| form.line_150 | number |
| form.line_160_raw | number |
| form.line_160_x4 | number |
| form.line_190 | number |
| form.line_510 | number |
| form.line_520 | number |
| form.line_540 | number |
| form.line_590 | array \| boolean \| null \| number \| object \| string |
| form.part2Table[].c1 | string |
| form.part2Table[].c2 | number |
| form.part2Table[].c3 | number |
| form.part2Table[].c4 | number |
| form.part2Table[].c5 | number |
| form.part2Table[].c6 | number |
| form.part2Table[].c7 | number |
| form.part2Table[].c8 | number |
| form.part2Table[].c9 | number |
| isCreditUnion | boolean |
| line_100 | number |
| line_140 | number |
| line_150 | number |
| line_160 | number |
| line_190 | number |
| line_200 | string |
| line_210 | number |
| line_220 | number |
| line_230 | number |
| line_240 | number |
| line_250 | number |
| line_260 | number |
| line_270 | number |
| line_280 | number |
| line_510 | number |
| line_520 | number |
| line_540 | number |
| line_540_current_year_component | number |
| line_540_late_designation_reclassified | number |
| line_540_prior_year_tailback | number |
| line_590 | array \| boolean \| null \| number \| object \| string |
| missing_required[] | string |
| paragraphCAmount | number |
| paragraph_c_amount | number |
| part2Rows[].adjustmentEventType | array \| boolean \| null \| number \| object \| string |
| part2Rows[].designatedInWritingAtPaymentTime | boolean |
| part2Rows[].designationDate | array \| boolean \| null \| number \| object \| string |
| part2Rows[].lateDesignationErdtohTransitional | boolean |
| part2Rows[].lateDesignationReclassifiedOrdinary | boolean |
| part2Rows[].line_200 | string |
| part2Rows[].line_210 | number |
| part2Rows[].line_220 | number |
| part2Rows[].line_230 | number |
| part2Rows[].line_240 | number |
| part2Rows[].line_250 | number |
| part2Rows[].line_260 | number |
| part2Rows[].line_270 | number |
| part2Rows[].line_280 | number |
| part2Rows[].paragraphCAntiAvoidanceApplies | boolean |
| part2Rows[].s89_14_1ReliefGranted | array \| boolean \| null \| number \| object \| string |
| part2Rows[].subsidiaryLastTaxYearEnd | array \| boolean \| null \| number \| object \| string |
| part2Rows[].paymentTimeGroupId | array \| boolean \| null \| number \| object \| string |
| part2Rows[].paymentTimeCalculationGroupId | string |
| part2Rows[].paymentTimeGroupState | string |
| poolBalanceChanged | boolean |
| priorYearS125Deduction | number |
| provisional | boolean |
| ready | boolean |
| s89_10TransitionAdjustment | array \| boolean \| null \| number \| object \| string |
| s89_11ElectionInPriorYear | boolean |
| s89_8TransitionAdjustment | array \| boolean \| null \| number \| object \| string |
| s89_9TransitionAdjustment | array \| boolean \| null \| number \| object \| string |
| variableEAdjustment | number |
| variableEApplies | boolean |
| variableERateDate | array \| boolean \| null \| number \| object \| string |
| variableESbdRate | array \| boolean \| null \| number \| object \| string |
| variable_e_adjustment | number |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].anchor_field | string |
| warnings[].actual | number |
| warnings[].citation.form | string |
| warnings[].citation.reference | string |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| wasCCPCInPriorYear | boolean |
| wasSubstantiveCCPCInPriorYear | boolean |
| line_590_withheld | boolean |

### Output cell notes

- `part2Rows[].paymentTimeGroupState`: The per-payment-time answer state carried by the row. This contract states shape only; the closed label domain belongs to the engine, not to the published output schema.
- `warnings[].code`: Which continuity obligation this row is about.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].citation.form`: The pinned CRA form revision identifier.
- `warnings[].citation.reference`: The lines on that face the opening and closing balances are read from.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule55

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2006 and later
- Strict profile: s55_2024_ccpc_excess_eligible_dividend_target_value_v1
- Payload schema version: 0.5.0
- Dependencies (run automatically): dividend_pool_status, schedule3, schedule53, schedule54

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule55"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "t2Jacket": {
      "identification": {
        "isResidentOfCanada": true,
        "typeOfCorporation": "1"
      },
      "additionalInfo": {
        "isDepositInsuranceCorporation": false,
        "isCreditUnion": false,
        "substantiveCCPCAnytime": false,
        "section89_11ElectionInForceForTaxYear": false
      },
      "applicability": {
        "gripChangeOrEligDiv": true,
        "taxableDividendsPaid": true
      }
    },
    "workpapers": [
      {
        "id": "wp-dividends",
        "templateId": "dividends",
        "adjustmentStatus": "ok",
        "schedule3CoverageReview": {
          "schemaVersion": 1,
          "reviewed": true,
          "partIVLossClaimConclusion": "none_claimed",
          "part4ExclusionConclusion": "none_applicable",
          "reviewedAt": "2026-08-10T00:00:00Z"
        },
        "rows": [
          {
            "payerName": "Cedar Ridge Manufacturing Inc.",
            "direction": "Paid",
            "dividendType": "Eligible",
            "dividendSource": "Canadian taxable",
            "isConnected": "No",
            "isTaxablePreferredShare": false,
            "date": "2025-08-10",
            "amountCY": 100000,
            "designatedInWritingAtPaymentTime": true,
            "designationDate": "2025-08-10"
          }
        ]
      }
    ],
    "schedule53": {
      "line100GripOpening": 0,
      "line110TaxableIncome": 111111.11,
      "line130LesserSbdNumerator": 0,
      "line140LesserAiiTaxableIncome": 0,
      "line200EligibleDividendsReceived": 0,
      "line210Section113Dividends": 0,
      "line300EligibleDivsPaidPriorYear": 0,
      "line310ExcessiveEEDPriorYear": 0
    },
    "schedule55": {
      "partRouting": "part1_ccpc_dic",
      "line100TotalTaxableDividendsPaid": 100000,
      "line150TotalEligibleDividendsPaid": 100000,
      "line160GripEndOfYear": 80000
    }
  }
}
```

## Input cells (54)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule53.line100GripOpening | integer | strict |
| schedule53.line110TaxableIncome | number | strict |
| schedule53.line130LesserSbdNumerator | integer | strict |
| schedule53.line140LesserAiiTaxableIncome | integer | strict |
| schedule53.line200EligibleDividendsReceived | integer | strict |
| schedule53.line210Section113Dividends | integer | strict |
| schedule53.line300EligibleDivsPaidPriorYear | integer | strict |
| schedule53.line310ExcessiveEEDPriorYear | integer | strict |
| schedule55 | object |  |
| schedule55.allShareholdersTaxExempt | boolean \| null |  |
| schedule55.amountCTotalEEDD | null \| number |  |
| schedule55.electionAllocationToOriginalDividendsConfirmed | boolean \| null |  |
| schedule55.electionFiledWithin90DaysOfAssessment | boolean \| null |  |
| schedule55.electionShareholderConcurrenceObtained | boolean \| null |  |
| schedule55.electionWithin30MonthsOfOriginalDividend | boolean \| null |  |
| schedule55.line100TotalTaxableDividendsPaid | null \| number \| string | strict |
| schedule55.line150TotalEligibleDividendsPaid | null \| number | strict |
| schedule55.line160GripEndOfYear | null \| number | strict |
| schedule55.line180Part1ElectionUnder185_1_2 | null \| number |  |
| schedule55.line200TotalTaxableDividendsPaid | null \| number |  |
| schedule55.line280Part2ElectionUnder185_1_2 | null \| number |  |
| schedule55.paragraphCAntiAvoidanceApplies | boolean \| null |  |
| schedule55.paragraphCEEDDAmount | null \| number |  |
| schedule55.partRouting | null \| string | strict |
| t2Jacket.additionalInfo.isCreditUnion | boolean | strict |
| t2Jacket.additionalInfo.isDepositInsuranceCorporation | boolean | strict |
| t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear | boolean | strict |
| t2Jacket.additionalInfo.substantiveCCPCAnytime | boolean | strict |
| t2Jacket.applicability.gripChangeOrEligDiv | boolean | strict |
| t2Jacket.applicability.taxableDividendsPaid | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| t2Jacket.identification.typeOfCorporation | string | strict |
| taxYear | integer \| string | always |
| workpapers[].adjustmentStatus | string | strict |
| workpapers[].id | string | strict |
| workpapers[].rows[].amountCY | integer | strict |
| workpapers[].rows[].date | string | strict |
| workpapers[].rows[].designatedInWritingAtPaymentTime | boolean | strict |
| workpapers[].rows[].designationDate | string | strict |
| workpapers[].rows[].direction | string | strict |
| workpapers[].rows[].dividendSource | string | strict |
| workpapers[].rows[].dividendType | string | strict |
| workpapers[].rows[].isConnected | string | strict |
| workpapers[].rows[].isTaxablePreferredShare | boolean | strict |
| workpapers[].rows[].payerName | string | strict |
| workpapers[].schedule3CoverageReview.part4ExclusionConclusion | string | strict |
| workpapers[].schedule3CoverageReview.partIVLossClaimConclusion | string | strict |
| workpapers[].schedule3CoverageReview.reviewed | boolean | strict |
| workpapers[].schedule3CoverageReview.reviewedAt | string | strict |
| workpapers[].schedule3CoverageReview.schemaVersion | integer | strict |
| workpapers[].templateId | string | strict |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `schedule55.allShareholdersTaxExempt`: True iff every dividend-recipient shareholder is a Part-I-tax-exempt person. This can waive shareholder concurrence under s.185.1(4) only when the election is within 30 months of every original dividend.
- `schedule55.amountCTotalEEDD`: Amount C — Total excessive eligible dividend designations from S54 amount A. The engine auto-fills this from the S54 batch result (`amount_a_para_b_only`, the para-(b) portion of S54 amount A); a present S54 result is authoritative. This direct field is retained only for standalone/direct-call compatibility when S54 is absent; it cannot replace a triggered required S54 or satisfy filing readiness.
- `schedule55.electionAllocationToOriginalDividendsConfirmed`: Practitioner confirmation that the aggregate election amount has been allocated to the original eligible dividend(s) and the allocation is supported in the election workpapers.
- `schedule55.electionFiledWithin90DaysOfAssessment`: Practitioner confirmation that the s.185.1(2) election was filed within 90 days after the Part III.1 tax assessment was sent. Required for any non-zero election amount on line 180 or line 280.
- `schedule55.electionShareholderConcurrenceObtained`: True iff the corporation and the shareholder population required by s.185.1(3) have concurred. The required population depends on whether the election is within 30 months; after 30 months every recipient shareholder must concur. Required for any non-zero election unless the narrow s.185.1(4) waiver is available.
- `schedule55.electionWithin30MonthsOfOriginalDividend`: Practitioner confirmation whether the election was made within 30 months after every original eligible dividend to which it is allocated. This timing determines the applicable s.185.1(3) concurrence population and whether the s.185.1(4) tax-exempt waiver can be used.
- `schedule55.line100TotalTaxableDividendsPaid`: Line 100 — Total taxable dividends paid in the tax year (informational, not used in EEDD math). S55 owns this all-dividend filing total. The currently modelled S3 line 460 is only a bounded prefill/reconciliation source because taxable-dividend S3 Part 4 lines 530/540 are not yet captured from inputs (the current S3 projection emits zero placeholders).
- `schedule55.line150TotalEligibleDividendsPaid`: Line 150 — Total eligible dividends paid in the tax year, including any paragraph-(c) dividend. S55 owns the filing total; modelled S3 line 465 is only a bounded prefill/reconciliation source.
- `schedule55.line160GripEndOfYear`: Line 160 — GRIP at end of tax year (S53 line 590). Per the form's parenthetical, if S53 line 590 is negative, enter "0" here; the engine applies the floor automatically. This direct field is retained only for standalone/direct-call compatibility when S53 is absent; it cannot replace a triggered required S53 or satisfy filing readiness.
- `schedule55.line180Part1ElectionUnder185_1_2`: Line 180 — EEDD elected under s.185.1(2) to be treated as ordinary (non-eligible) dividend. Capped at amount A; the engine clamps any over-election to A and warns.
- `schedule55.line200TotalTaxableDividendsPaid`: Line 200 — Total taxable dividends paid in tax year (informational). Same provenance as line 100 but for non-CCPC/non-DIC corps.
- `schedule55.line280Part2ElectionUnder185_1_2`: Line 280 — EEDD elected under s.185.1(2) (Part 2 election). Capped at amount C; the engine clamps any over-election to C and warns.
- `schedule55.paragraphCAntiAvoidanceApplies`: Para (c) anti-avoidance applies — the eligible dividend was paid in a transaction (or series) one of whose main purposes was to artificially maintain or increase GRIP, or artificially maintain or decrease LRIP. When true, the form's Parts 1/2 calculations do NOT apply; Part III.1 tax = 30% × the full eligible dividend amount (s.185.1(1)(a) 20% + s.185.1(1)(b) additional 10%). A present S54 result supplies the canonical para-(c) row-ledger amount; this flag is standalone/direct-call compatibility only when S54 is absent and cannot satisfy a triggered required companion.
- `schedule55.paragraphCEEDDAmount`: Para (c) full EEDD amount. A present S54 result's `paragraph_c_amount` is authoritative. This direct field is retained only for standalone/direct-call compatibility when S54 is absent; it cannot replace a triggered required S54 or satisfy filing readiness.
- `schedule55.partRouting`: Legacy compatibility routing. The normal Hub does not let this field select a part: the server resolves the current-year GRIP/LRIP regime from the canonical T2 jacket status and returns `partRouting` on the Schedule 55 computation result.
- `t2Jacket.additionalInfo.isCreditUnion`: The corporation is a credit union; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.isDepositInsuranceCorporation`: The corporation is a deposit insurance corporation; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code.
- `t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYear`: An ITA s.89(11) election not to be treated as a CCPC is in force for the taxation year; the continuing election state, distinct from the box 266 and 267 filing events.
- `t2Jacket.additionalInfo.substantiveCCPCAnytime`: T2 box 290: the corporation was a substantive CCPC (ITA s.248(1)) at any time in the taxation year; routes the general rate reduction worksheet and the dividend-pool regime.
- `t2Jacket.applicability.gripChangeOrEligDiv`: T2 jacket applicability answer: the general rate income pool (ITA s.89(1)) changed in the year or an eligible dividend was paid or received, so Schedule 53 applies.
- `t2Jacket.applicability.taxableDividendsPaid`: T2 jacket applicability answer: the corporation paid taxable dividends in the taxation year.
- `t2Jacket.identification.isResidentOfCanada`: T2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (32 of 54 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule53.line100GripOpening | -1000000000000000 to 1000000000000000 |
| schedule53.line110TaxableIncome | -1000000000000000 to 1000000000000000 |
| schedule53.line130LesserSbdNumerator | -1000000000000000 to 1000000000000000 |
| schedule53.line140LesserAiiTaxableIncome | -1000000000000000 to 1000000000000000 |
| schedule53.line200EligibleDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule53.line210Section113Dividends | -1000000000000000 to 1000000000000000 |
| schedule53.line300EligibleDivsPaidPriorYear | -1000000000000000 to 1000000000000000 |
| schedule53.line310ExcessiveEEDPriorYear | -1000000000000000 to 1000000000000000 |
| schedule55.line100TotalTaxableDividendsPaid | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule55.line150TotalEligibleDividendsPaid | -1000000000000000 to 1000000000000000 |
| schedule55.line160GripEndOfYear | -1000000000000000 to 1000000000000000 |
| schedule55.partRouting | one of "part1_ccpc_dic", "part2_other", null |
| t2Jacket.identification.typeOfCorporation | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |
| workpapers[].adjustmentStatus | 0 to 20000 characters |
| workpapers[].id | 0 to 20000 characters |
| workpapers[].rows[].amountCY | -1000000000000000 to 1000000000000000 |
| workpapers[].rows[].date | date (YYYY-MM-DD); 10 to 10 characters |
| workpapers[].rows[].designationDate | date (YYYY-MM-DD); 10 to 10 characters |
| workpapers[].rows[].direction | 0 to 20000 characters |
| workpapers[].rows[].dividendSource | 0 to 20000 characters |
| workpapers[].rows[].dividendType | 0 to 20000 characters |
| workpapers[].rows[].isConnected | 0 to 20000 characters |
| workpapers[].rows[].payerName | 0 to 20000 characters |
| workpapers[].schedule3CoverageReview.part4ExclusionConclusion | 0 to 20000 characters |
| workpapers[].schedule3CoverageReview.partIVLossClaimConclusion | 0 to 20000 characters |
| workpapers[].schedule3CoverageReview.reviewedAt | date-time; 0 to 20000 characters |
| workpapers[].schedule3CoverageReview.schemaVersion | -1000000000000000 to 1000000000000000 |
| workpapers[].templateId | 0 to 20000 characters |

## Output cells (53)

| Cell | Types |
| --- | --- |
| additionalParagraphCTax | number |
| amountC | number |
| filingOperands.electionAmount | null \| number |
| filingOperands.partRouting | null \| string |
| filingOperands.postElectionEedd | null \| number |
| filingOperands.state | string |
| fired_gates | object |
| form.amount_C | number |
| form.formWarnings | array |
| form.line_100 | number |
| form.line_150 | number |
| form.line_160 | number |
| form.line_180 | number |
| form.line_190 | number |
| form.line_200 | number |
| form.line_280 | number |
| form.line_290 | number |
| form.subtotal_A | number |
| form.subtotal_B | number |
| form.subtotal_D | number |
| line_100 | number |
| line_150 | number |
| line_160 | number |
| line_180 | number |
| line_190 | number |
| line_200 | number |
| line_280 | number |
| line_290 | number |
| missing_required[] | string |
| ordinaryPart1Eedd | number |
| paragraphCApplies | boolean |
| paragraphCEEDDAmount | number |
| partRouting | string |
| provisional | boolean |
| ready | boolean |
| subtotalA | number |
| subtotalB | number |
| subtotalD | number |
| totalPartIii1Tax | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |

### Output cell notes

- `filingOperands.partRouting`: Which Part the filing operands route to, or null when routing is not established. Shape only; the label domain belongs to the engine.
- `filingOperands.state`: Whether the filing operands are usable. Shape only; the label domain belongs to the engine.

# schedule56

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024 and later
- Strict profile: s56_single_gross_repurchase_profile_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule56"
  ],
  "inputs": {
    "taxYear": 2025,
    "daysInYear": 365,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "t2Jacket": {
      "applicability": {
        "equityBuybackPartII2": true
      },
      "identification": {
        "isResidentOfCanada": true
      }
    },
    "schedule56": {
      "line200TotalFmvEquityRedeemed": 10000000,
      "amountATotalFmvReorgRepurchased": 0,
      "amountBTotalFmvReorgEquityConsideration": 0,
      "amountDQualifyingIssuanceFmv": 0,
      "amountESpecifiedAffiliateDispositionFmv": 0
    }
  }
}
```

## Input cells (16)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string |  |
| fiscalStart | string |  |
| schedule56.amountATotalFmvReorgRepurchased | null \| number | strict |
| schedule56.amountBTotalFmvReorgEquityConsideration | null \| number | strict |
| schedule56.amountDQualifyingIssuanceFmv | null \| number | strict |
| schedule56.amountESpecifiedAffiliateDispositionFmv | null \| number | strict |
| schedule56.line200TotalFmvEquityRedeemed | null \| number \| string | strict |
| schedule56.partIi2AmountBPredicateAttested | boolean \| null |  |
| schedule56.partIi2AmountDNoPrimaryPurposeExclusionAttested | boolean \| null |  |
| schedule56.partIi2AmountDQualifyingIssuanceAttested | boolean \| null |  |
| schedule56.partIi2AmountEDispositionAttested | boolean \| null |  |
| schedule56.preRegimeTransactionsExcludedAttested | boolean \| null |  |
| t2Jacket.applicability.equityBuybackPartII2 | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule56.amountATotalFmvReorgRepurchased`: T2 SCH 56 amount A: total FMV of equity (other than substantive debt) repurchased in a reorganization or acquisition of the corporation. Operand of statutory variable B in ITA s.183.3(2). Absent is not nil — the engine blocks an unstated amount rather than netting zero.
- `schedule56.amountBTotalFmvReorgEquityConsideration`: T2 SCH 56 amount B: total FMV of equity issued as consideration in that reorganization or acquisition. It is the subtrahend of the amount A subtotal (line 205 = the excess of A over B) within statutory variable B in ITA s.183.3(2), so it cannot be inferred from amount A.
- `schedule56.amountDQualifyingIssuanceFmv`: T2 SCH 56 amount D: total FMV of equity issued in a qualifying issuance in the taxation year. Paragraph (a) of statutory variable C in ITA s.183.3(2), which subtracts through line 210.
- `schedule56.amountESpecifiedAffiliateDispositionFmv`: T2 SCH 56 amount E: total FMV of equity disposed of in the taxation year by a specified affiliate of the covered entity. Paragraph (b) of statutory variable C in ITA s.183.3(2), which subtracts through line 210.
- `schedule56.line200TotalFmvEquityRedeemed`: Line 200 — Total FMV of equity (other than substantive debt) that the corporation redeemed, acquired, or cancelled in the tax year. Per form Note 1, exclude equity that was redeemed/acquired/ cancelled in a reorganization OR acquired from a specified affiliate if that equity was previously deemed by s.183.3(5) to have been acquired by the corp and was previously on line 200 (no double-counting).
- `schedule56.partIi2AmountBPredicateAttested`: Amount B contains only paragraph (a)/(b) reorganization equity consideration described by ITA 183.3(2) variable B element E.
- `schedule56.partIi2AmountDNoPrimaryPurposeExclusionAttested`: No amount D issuance must be excluded from variable C under the separate ITA 183.3(3) primary-purpose rule.
- `schedule56.partIi2AmountDQualifyingIssuanceAttested`: Every amount D issuance meets one of the qualifying-issuance limbs in ITA 183.3(1).
- `schedule56.partIi2AmountEDispositionAttested`: Every amount E disposition meets ITA 183.3(2) variable C paragraph (b), including the prior subsection (5) deeming and variable-A history.
- `schedule56.preRegimeTransactionsExcludedAttested`: Straddle years only — Part II.2 applies to transactions occurring AFTER 2023-12-31. When the tax year began before that date, confirm that every pre-2024-01-01 transaction has been EXCLUDED from line 200 and amount A. Required when the year straddles the effective date and amount C is positive; null and false both fail closed.
- `t2Jacket.applicability.equityBuybackPartII2`: T2 jacket applicability answer: the corporation had equity repurchases within Part II.2 (ITA s.183.3), so Schedule 56 applies.
- `t2Jacket.identification.isResidentOfCanada`: T2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (9 of 16 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule56.amountATotalFmvReorgRepurchased | -1000000000000000 to 1000000000000000 |
| schedule56.amountBTotalFmvReorgEquityConsideration | -1000000000000000 to 1000000000000000 |
| schedule56.amountDQualifyingIssuanceFmv | -1000000000000000 to 1000000000000000 |
| schedule56.amountESpecifiedAffiliateDispositionFmv | -1000000000000000 to 1000000000000000 |
| schedule56.line200TotalFmvEquityRedeemed | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (32)

| Cell | Types |
| --- | --- |
| amount_A | number |
| amount_B | number |
| amount_C | number |
| amount_D | number |
| amount_E | number |
| amount_F | number |
| amount_G | number |
| de_minimis_exempt | boolean |
| de_minimis_threshold_applied | number |
| de_minimis_threshold_proration_applied | boolean |
| fired_gates | object |
| line_200 | number |
| line_205 | number |
| line_210 | number |
| missing_required[] | string |
| out_of_scope | boolean |
| provisional | boolean |
| ready | boolean |
| t2_line_705_part_ii2_tax | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |

# schedule58

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s58_single_employee_2024_profile_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule58"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule58": {
      "isQjo": "Y",
      "qjoPeriodFrom": "2025-01-01",
      "qjoPeriodTo": "2025-12-31",
      "qcjoDesignationNumber": "1234567",
      "part3Rows": [
        {
          "employeeName": "Jane Smith",
          "salaryOrWagesPayable": 50000
        }
      ],
      "line135AidToPublishers": 0
    },
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31"
  }
}
```

## Input cells (31)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule58.businessNumber | null \| string |  |
| schedule58.corporationId | null \| string |  |
| schedule58.holdsBroadcastingLicence | null \| string |  |
| schedule58.isQjo | null \| string | strict |
| schedule58.line130PartnershipAllocatedCredit | null \| number |  |
| schedule58.line135AidToPublishers | null \| number | strict |
| schedule58.part3Rows | array |  |
| schedule58.part3Rows[].amountOfAssistance | null \| number |  |
| schedule58.part3Rows[].atLeast75PctOriginalNewsContentTime | boolean \| null |  |
| schedule58.part3Rows[].averageWeeklyHours | null \| number |  |
| schedule58.part3Rows[].col10CurrentQLE | null \| number |  |
| schedule58.part3Rows[].col11CreditAmount | null \| number |  |
| schedule58.part3Rows[].col5LowThresholdNetTimesA | null \| number |  |
| schedule58.part3Rows[].col6LowThresholdCap | null \| number |  |
| schedule58.part3Rows[].col7LowThresholdQLE | null \| number |  |
| schedule58.part3Rows[].col8CurrentNetTimesB | null \| number |  |
| schedule58.part3Rows[].col9CurrentCap | null \| number |  |
| schedule58.part3Rows[].employeeName | null \| string | strict |
| schedule58.part3Rows[].fortyConsecutiveWeeksTestMet | boolean \| null |  |
| schedule58.part3Rows[].salaryOrWagesPayable | null \| number \| string | strict |
| schedule58.part3Rows[].socialInsuranceNumber | null \| string |  |
| schedule58.partnershipFiscalPeriodEnd | null \| string |  |
| schedule58.partnershipMemberNotSpecifiedMemberAttested | boolean \| null |  |
| schedule58.partnershipPrescribedReturnFiledAttested | boolean \| null |  |
| schedule58.partnershipWasQjoInFiscalPeriodAttested | boolean \| null |  |
| schedule58.qcjoDesignationNumber | null \| string | strict |
| schedule58.qjoPeriodFrom | null \| string | strict |
| schedule58.qjoPeriodTo | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `fiscalEnd`: The filer-owned taxation-period end used to reconcile the Schedule 58 QJO period and taxYear.
- `fiscalStart`: The filer-owned taxation-period start used to reconcile the Schedule 58 QJO period.
- `schedule58.businessNumber`: The corporation's CRA business number used to identify the Schedule 58 instalment calculation. The value must agree with the return identity supplied elsewhere in the request.
- `schedule58.corporationId`: The stable corporation identifier carried by the Schedule 58 instalment calculation. It identifies the filer and is not a substitute for the CRA business number.
- `schedule58.holdsBroadcastingLicence`: Practitioner-asserted: corp holds a Broadcasting Act s.2(1) licence? When 'Y' AND isQjo='Y', engine errors per s.125.6(1).
- `schedule58.isQjo`: Box 070 — Did you meet QJO conditions at any time in tax year?
- `schedule58.line130PartnershipAllocatedCredit`: Box 130 — CJLT credit allocated from partnerships (T5013/letter).
- `schedule58.line135AidToPublishers`: ITA 125.6(2)(b) subtracts "the amount received by the taxpayer from the Aid to Publishers component of the Canada Periodical Fund in the year" from the credit. Box 135 is an ANSWER, not an optional field: an explicit 0 is the affirmative "no receipt" answer this profile pins, while a blank box blocks the schedule and withholds the T2 line 798 feed. The submitted 0 is not proof that no Aid to Publishers amount was in fact received.
- `schedule58.part3Rows[].amountOfAssistance`: Box 115 (col 4) — Assistance received/receivable (excludes Aid to Publishers + the s.125.6(2) credit itself + amounts repaid pre-year-end).
- `schedule58.part3Rows[].atLeast75PctOriginalNewsContentTime`: Paragraph (d) — does the employee spend at least 75% of their time producing ORIGINAL WRITTEN NEWS CONTENT (including researching, collecting information, verifying facts, photographing, writing, editing, designing and otherwise preparing content)?
- `schedule58.part3Rows[].averageWeeklyHours`: Paragraph (b) — average number of hours per week the employee works for the QJO. Must be at least 26 to qualify; the engine raises a separate error below that threshold. Blank is not zero.
- `schedule58.part3Rows[].col10CurrentQLE`: Box 122 (col 10) — QLE = min(col 8, col 9).
- `schedule58.part3Rows[].col11CreditAmount`: Box 125 (col 11) — col 7 × 0.25 + col 10 × 0.35.
- `schedule58.part3Rows[].col5LowThresholdNetTimesA`: Derived col 5 — (col 3 − col 4) × Amount A.
- `schedule58.part3Rows[].col6LowThresholdCap`: Derived col 6 — $55,000 × (days_pre_2023_qjo / 365).
- `schedule58.part3Rows[].col7LowThresholdQLE`: Box 120 (col 7) — Low-threshold QLE = min(col 5, col 6).
- `schedule58.part3Rows[].col8CurrentNetTimesB`: Derived col 8 — (col 3 − col 4) × Amount B.
- `schedule58.part3Rows[].col9CurrentCap`: Derived col 9 — $85,000 × (days_post_2022_qjo / 365).
- `schedule58.part3Rows[].employeeName`: Box 100 (col 1) — Name of eligible newsroom employee.
- `schedule58.part3Rows[].fortyConsecutiveWeeksTestMet`: Paragraph (c) — is the employee employed for a minimum of 40 CONSECUTIVE weeks in the tax year?
- `schedule58.part3Rows[].salaryOrWagesPayable`: Box 110 (col 3) — Salary or wages payable in respect of QJO portion of the tax year.
- `schedule58.part3Rows[].socialInsuranceNumber`: Box 105 (col 2) — Social insurance number.
- `schedule58.partnershipFiscalPeriodEnd`: End of the partnership's fiscal period (ISO YYYY-MM-DD). It must end IN the corporation's tax year; the engine range-checks it against the corporation's fiscal dates when both are known.
- `schedule58.partnershipMemberNotSpecifiedMemberAttested`: Opening words of s.125.6(2.1) — the corporation must NOT be a specified member of the partnership; a specified member is excluded outright. Confirm the corporation is not one.
- `schedule58.partnershipPrescribedReturnFiledAttested`: Has the partnership filed the prescribed return (information return) for the fiscal period?
- `schedule58.partnershipWasQjoInFiscalPeriodAttested`: Was the PARTNERSHIP a qualifying journalism organization throughout the fiscal period?
- `schedule58.qcjoDesignationNumber`: Box 095 — seven designation digits; the form supplies the Q prefix.
- `schedule58.qjoPeriodFrom`: Box 050 — QJO period start (yyyy/mm/dd).
- `schedule58.qjoPeriodTo`: Box 060 — QJO period end (yyyy/mm/dd).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (11 of 31 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule58.holdsBroadcastingLicence | one of "Y", "N" |
| schedule58.isQjo | one of "Y", "N", null |
| schedule58.line135AidToPublishers | -1000000000000000 to 1000000000000000 |
| schedule58.part3Rows[].employeeName | 0 to 20000 characters |
| schedule58.part3Rows[].salaryOrWagesPayable | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule58.qcjoDesignationNumber | 0 to 20000 characters |
| schedule58.qjoPeriodFrom | 0 to 20000 characters |
| schedule58.qjoPeriodTo | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (56)

| Cell | Types |
| --- | --- |
| amount_a_pre_2023_fraction | number |
| amount_b_post_2022_fraction | number |
| amount_c_total_col_11 | number |
| amount_d_subtotal | number |
| amount_e_cjlt_credit | number |
| days_post_2022_qjo | integer |
| days_pre_2023_qjo | integer |
| days_total_qjo | integer |
| fired_gates | object |
| line_050 | null \| string |
| line_060 | null \| string |
| line_070 | null \| string |
| line_095 | null \| string |
| line_100 | null \| string |
| line_105 | array \| boolean \| null \| number \| object \| string |
| line_110 | number |
| line_115 | number |
| line_120 | number |
| line_122 | number |
| line_125 | number |
| line_130 | number |
| line_135 | number |
| missing_required[] | string |
| part3Rows[].amountOfAssistance | number |
| part3Rows[].col10CurrentQLE | number |
| part3Rows[].col11CreditAmount | number |
| part3Rows[].col5LowThresholdNetTimesA | number |
| part3Rows[].col6LowThresholdCap | number |
| part3Rows[].col7LowThresholdQLE | number |
| part3Rows[].col8CurrentNetTimesB | number |
| part3Rows[].col9CurrentCap | number |
| part3Rows[].employeeName | null \| string |
| part3Rows[].netSalaryOrWages | number |
| part3Rows[].salaryOrWagesPayable | number |
| part3Rows[].socialInsuranceNumber | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| ready | boolean |
| t2_line_798_feed_cjlt_credit | number |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| line_135_answered | boolean |

# schedule6

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s6_2025_empty_dispositions_calculation_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): aoc, foreign_affiliate_analysis, schedule13, schedule25, schedule3, schedule73

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule6"
  ],
  "inputs": {
    "taxYear": 2025,
    "dispositions": []
  }
}
```

## Input cells (69)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| dispositions | array | strict |
| fiscalEnd | null \| string |  |
| schedule6.abilAmountG | number |  |
| schedule6.activeAssetAbilAmountG | number |  |
| schedule6.allowableCapitalLosses | number |  |
| schedule6.dispositions | array |  |
| schedule6.dispositions[].acb | number |  |
| schedule6.dispositions[].allowableCapitalLoss | number |  |
| schedule6.dispositions[].assetClass | string |  |
| schedule6.dispositions[].bookGainLoss | null \| number |  |
| schedule6.dispositions[].capitalGain | number |  |
| schedule6.dispositions[].capitalLoss | number |  |
| schedule6.dispositions[].dateAcquired | string |  |
| schedule6.dispositions[].dateOfDisposition | string |  |
| schedule6.dispositions[].description | string |  |
| schedule6.dispositions[].dispositionReconciliationId | string |  |
| schedule6.dispositions[].gainOrLoss | number |  |
| schedule6.dispositions[].isBusinessInvestmentLoss | boolean |  |
| schedule6.dispositions[].isListedPersonalProperty | boolean |  |
| schedule6.dispositions[].matchMethod | string |  |
| schedule6.dispositions[].outlays | number |  |
| schedule6.dispositions[].proceeds | number |  |
| schedule6.dispositions[].propertyType | string |  |
| schedule6.dispositions[].pupPartOrSetStatus | string |  |
| schedule6.dispositions[].reportCode | string |  |
| schedule6.dispositions[].reviewReason | string |  |
| schedule6.dispositions[].reviewRequired | boolean |  |
| schedule6.dispositions[].schedule6Part | string |  |
| schedule6.dispositions[].section46AcbFraction | null \| number |  |
| schedule6.dispositions[].section46DeemedFloor | null \| number |  |
| schedule6.dispositions[].section46FloorApplied | boolean |  |
| schedule6.dispositions[].setAcb | null \| number |  |
| schedule6.dispositions[].source | string |  |
| schedule6.dispositions[].sourceRowIndex | number |  |
| schedule6.dispositions[].sourceRowKey | string |  |
| schedule6.dispositions[].sourceWorkpaperId | string |  |
| schedule6.dispositions[].taxableCapitalGain | number |  |
| schedule6.dispositions[].wholePropertyAcb | null \| number |  |
| schedule6.dispositions[].yearAcquired | null \| number |  |
| schedule6.foreignAbilAmountG | number |  |
| schedule6.form | object |  |
| schedule6.inclusionRate | number |  |
| schedule6.line880 | number |  |
| schedule6.line885 | number |  |
| schedule6.line890 | number |  |
| schedule6.line899 | number |  |
| schedule6.line901 | number |  |
| schedule6.lppAmountF | number |  |
| schedule6.lppCurrentLoss | number |  |
| schedule6.lppGainsTotal | number |  |
| schedule6.lppGrossNetGain | number |  |
| schedule6.lppLossApplied | number |  |
| schedule6.lppLossCarriedBack | number |  |
| schedule6.lppLossesTotal | number |  |
| schedule6.lppTaxableNetGain | number |  |
| schedule6.netTaxableCapitalGains | number |  |
| schedule6.partGrids | object |  |
| schedule6.provisional | boolean |  |
| schedule6.reviewRequiredCount | number |  |
| schedule6.schedule73Line275TaxableCapitalGains | number |  |
| schedule6.schedule73Line285AllowableCapitalLosses | number |  |
| schedule6.taxableCapitalGains | number |  |
| schedule6.totalACB | number |  |
| schedule6.totalCapitalGains | number |  |
| schedule6.totalCapitalLosses | number |  |
| schedule6.totalOutlays | number |  |
| schedule6.totalProceeds | number |  |
| schedule6.warnings | array |  |
| taxYear | integer \| string | always |

### Input cell notes

- `dispositions`: Capital-property disposition rows for Schedule 6 Parts 1 to 7 (ITA ss. 38 to 41); each row states explicit proceeds and acb, and propertyType picks its grid.
- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `schedule6.abilAmountG`: ITA 38(c) Part 7 amount G — the allowable business investment loss.
- `schedule6.activeAssetAbilAmountG`: The s.125(7) active-asset share of amount G. Schedule 7 subtracts it from line 710 so an ABIL on an active asset stops inflating adjusted aggregate investment income.
- `schedule6.allowableCapitalLosses`: totalCapitalLosses * inclusion rate — used by S7
- `schedule6.dispositions[].bookGainLoss`: Signed amount already included in FS income. Null means missing and is filing-blocking; literal zero means the practitioner confirmed none.
- `schedule6.dispositions[].dispositionReconciliationId`: Current-year foreign key to the canonical W08 row, when applicable.
- `schedule6.dispositions[].isBusinessInvestmentLoss`: s.39(1)(c) Part 7 flag — routes the row to the ABIL grid.
- `schedule6.dispositions[].isListedPersonalProperty`: s.41 listed-personal-property flag — silos this row into the LPP stream (out of the ordinary capital totals); Schedule 4 Part 5 displays it.
- `schedule6.dispositions[].propertyType`: E (24) Parts 1-7 grid discriminator (shares / realEstate / bonds / other / personalUse / listedPersonalProperty / businessInvestment). Empty string = unrouted (blocks the filing projection when the row carries amounts).
- `schedule6.dispositions[].pupPartOrSetStatus`: ITA 46(2)/(3): "" (unanswered), "whole", "part" or "partOfSet", mutually exclusive. 46(2) applies where part of a personal-use property is disposed of and another part retained; 46(3) deems a set disposed of by more than one disposition to one person to be a single personal-use property, so each disposition becomes a disposition of a part.
- `schedule6.dispositions[].reportCode`: The slip's report code: "O" (original), "A" (amended) or "C" (cancelled). An amendment REPLACES the lot it supersedes and a cancellation removes it; a stored cancelled row never reaches Schedule 6.
- `schedule6.dispositions[].schedule6Part`: The grid this row landed in, e.g. "part1_shares"; "" when unrouted.
- `schedule6.dispositions[].section46AcbFraction`: Derived: the part-ACB / whole-ACB fraction the floor was measured on.
- `schedule6.dispositions[].section46DeemedFloor`: Derived: the apportioned s.46(2)(a)(ii) floor actually applied.
- `schedule6.dispositions[].section46FloorApplied`: Derived: whether the s.46 floor displaced the stated ACB or proceeds.
- `schedule6.dispositions[].setAcb`: ITA 46(3) denominator — the ACB of the SET.
- `schedule6.dispositions[].sourceWorkpaperId`: Exact persisted workpaper-row lineage; blanks identify direct API rows.
- `schedule6.dispositions[].wholePropertyAcb`: ITA 46(2)(a)(ii) denominator — the ACB of the WHOLE property.
- `schedule6.foreignAbilAmountG`: The s.129(4) foreign-source share of amount G. Joins the Schedule 7 line 009 allowable losses for foreign investment income.
- `schedule6.form`: True Form View projection (grids + cascade scalars) — see frontend/lib/schedule6-form-map.ts Schedule6FormProjection.
- `schedule6.inclusionRate`: Scale: 0–1 fraction. e.g. 0.5 = 50% inclusion. Display: multiply by 100.
- `schedule6.line880`: S13 Part 1 reserve receivers (E (24) Part 8): line 880 = S13 lines 008 + 009 (opening reserve addback); line 885 = S13 line 010 (closing reserve deduction); line 890 = Amount I − line 885.
- `schedule6.line899`: Schedule 6 line 899: S73 line 275 multiplied by two.
- `schedule6.line901`: Schedule 6 line 901: S73 line 285 multiplied by two.
- `schedule6.lppAmountF`: Gross − applied = S6 Amount F.
- `schedule6.lppCurrentLoss`: s.41(3) current-year LPP loss = max(0, losses − gains) → S4 line 510.
- `schedule6.lppGainsTotal`: ΣLPP capital gains (full-capital terms).
- `schedule6.lppGrossNetGain`: s.41(2)(a) gross LPP net gain = max(0, gains − losses) — the S6 col-6 gross.
- `schedule6.lppLossApplied`: s.41(2)(b) prior-year LPP loss applied (FIFO, capped at gross) → S4 line 530 = S6 line 655.
- `schedule6.lppLossCarriedBack`: Total s.41(2)(b) LPP loss carried BACK out of this schedule's pool, ring-fenced by s.41(2)(b)(iii) to the target year's own paragraph 41(2)(a) net gain. Schedule 6 owns the s.41(3) loss and its 7-taxation-year continuity, so a Schedule 4 Part 5 carryback is a withdrawal from THIS pool — without the reduction the same loss is deducted in the target year and carried forward here as well. Ties out against Schedule 4 amount 5E.
- `schedule6.lppLossesTotal`: ΣLPP capital losses (full-capital terms).
- `schedule6.lppTaxableNetGain`: s.41(1) LITERAL-½ taxable net gain → s.3(b)(i)(B) income / S7 AII.
- `schedule6.netTaxableCapitalGains`: Net of taxable gains minus allowable losses — used by S7
- `schedule6.partGrids`: E (24) Parts 1-7 property grids — per-part row projections plus the printed column totals. Keys: part1_shares … part7_businessInvestmentLosses.
- `schedule6.schedule73Line275TaxableCapitalGains`: S73 line 275 copied to the Schedule 6 Part 9 source field.
- `schedule6.schedule73Line285AllowableCapitalLosses`: S73 line 285 copied to the Schedule 6 Part 9 source field.
- `schedule6.taxableCapitalGains`: totalCapitalGains * inclusion rate — used by S7
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (3 of 69 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| dispositions | exactly [] (pinned) |
| schedule6.dispositions[].source | one of "manual", "capital-disposition", "securities-disposition-slip" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (255)

| Cell | Types |
| --- | --- |
| abilAmountG | number |
| abilRows | array |
| activeAssetAllowableCapitalLosses | number |
| activeAssetLppTaxableNetGain | number |
| activeAssetTaxableCapitalGains | number |
| allowableCapitalLosses | number |
| bookReconciliation.complete | boolean |
| bookReconciliation.missingCount | integer |
| bookReconciliation.netBookGainLoss | number |
| bookReconciliation.sourceRows | array |
| bookReconciliation.totalBookGains | number |
| bookReconciliation.totalBookLosses | number |
| businessInvestmentLosses | number |
| capitalGainsDividends | array |
| characterFlagAdvisories | array |
| culturalPropertyExcludedCount | integer |
| deniedLosses | array |
| dispositions | array |
| excludedCulturalPropertyGains | number |
| filingProjection.activity.dispositionRowCount | integer |
| filingProjection.activity.lppDispositionRowCount | integer |
| filingProjection.activity.lppSummaryNonzero | boolean |
| filingProjection.activity.schedule73CapitalAmountsNonzero | boolean |
| filingProjection.coverageHold | array \| boolean \| null \| number \| object \| string |
| filingProjection.deemedAmountsNonzero | boolean |
| filingProjection.formId | string |
| filingProjection.reserveAmountsNonzero | boolean |
| filingProjection.schemaVersion | integer |
| filingProjection.status | string |
| filingProjection.supported | boolean |
| foreignAllowableCapitalLosses | number |
| foreignLppTaxableNetGain | number |
| foreignTaxableCapitalGains | number |
| form.amount_A | number |
| form.amount_B | number |
| form.amount_C | number |
| form.amount_D | number |
| form.amount_E | number |
| form.amount_F | number |
| form.amount_G | number |
| form.amount_H | number |
| form.amount_I | number |
| form.amount_J | number |
| form.amount_K | number |
| form.amount_L | number |
| form.amount_M | number |
| form.amount_N | number |
| form.amount_O | number |
| form.amount_P | number |
| form.amount_Q | number |
| form.amount_R | number |
| form.line_160 | number |
| form.line_655 | number |
| form.line_875 | number |
| form.line_880 | number |
| form.line_885 | number |
| form.line_890 | number |
| form.line_895 | number |
| form.line_896 | number |
| form.line_897 | number |
| form.line_898 | number |
| form.line_902 | number |
| form.line_902_portion | number |
| form.part1Table | array |
| form.part1TotalACB | number |
| form.part1TotalGainOrLoss | number |
| form.part1TotalOutlays | number |
| form.part1TotalProceeds | number |
| form.part2Table | array |
| form.part2TotalACB | number |
| form.part2TotalGainOrLoss | number |
| form.part2TotalOutlays | number |
| form.part2TotalProceeds | number |
| form.part3Table | array |
| form.part3TotalACB | number |
| form.part3TotalGainOrLoss | number |
| form.part3TotalOutlays | number |
| form.part3TotalProceeds | number |
| form.part4Table | array |
| form.part4TotalACB | number |
| form.part4TotalGainOrLoss | number |
| form.part4TotalOutlays | number |
| form.part4TotalProceeds | number |
| form.part5Table | array |
| form.part5TotalACB | number |
| form.part5TotalGainOrLoss | number |
| form.part5TotalOutlays | number |
| form.part5TotalProceeds | number |
| form.part6Table | array |
| form.part6TotalACB | number |
| form.part6TotalGainOrLoss | number |
| form.part6TotalOutlays | number |
| form.part6TotalProceeds | number |
| form.part7ColumnTotal | number |
| form.part7Table | array |
| form.part7TotalACB | number |
| form.part7TotalGainOrLoss | number |
| form.part7TotalOutlays | number |
| form.part7TotalProceeds | number |
| form.line_050 | boolean |
| inclusionRate | number |
| inclusionRatesApplied | array |
| line160Subsection112_3 | number |
| line875CapitalGainsDividends | number |
| line880 | number |
| line885 | number |
| line890 | number |
| line895 | number |
| line896 | number |
| line897 | number |
| line898 | number |
| line899 | number |
| line901 | number |
| line902 | number |
| lppAmountF | number |
| lppCurrentLoss | number |
| lppGainsTotal | number |
| lppGrossNetGain | number |
| lppLossApplied | number |
| lppLossContinuity | array |
| lppLossesTotal | number |
| lppTaxableNetGain | number |
| netTaxableCapitalGains | number |
| part8.amountH | number |
| part8.amountI | number |
| part8.line875 | number |
| part8.line880 | number |
| part8.line885 | number |
| part8.line890 | number |
| part9.amountJ | number |
| part9.amountK | number |
| part9.amountL | number |
| part9.amountM | number |
| part9.amountN | number |
| part9.amountO | number |
| part9.amountP | number |
| part9.amountQ | number |
| part9.amountR | number |
| part9.line895 | number |
| part9.line896 | number |
| part9.line897 | number |
| part9.line898 | number |
| part9.line899 | number |
| part9.line901 | number |
| part9.line902 | number |
| part9.subjectTo100PercentPortion | number |
| partGrids.part1_shares.rowCount | integer |
| partGrids.part1_shares.rows | array |
| partGrids.part1_shares.totalACB | number |
| partGrids.part1_shares.totalGainOrLoss | number |
| partGrids.part1_shares.totalOutlays | number |
| partGrids.part1_shares.totalProceeds | number |
| partGrids.part2_realEstate.rowCount | integer |
| partGrids.part2_realEstate.rows | array |
| partGrids.part2_realEstate.totalACB | number |
| partGrids.part2_realEstate.totalGainOrLoss | number |
| partGrids.part2_realEstate.totalOutlays | number |
| partGrids.part2_realEstate.totalProceeds | number |
| partGrids.part3_bonds.rowCount | integer |
| partGrids.part3_bonds.rows | array |
| partGrids.part3_bonds.totalACB | number |
| partGrids.part3_bonds.totalGainOrLoss | number |
| partGrids.part3_bonds.totalOutlays | number |
| partGrids.part3_bonds.totalProceeds | number |
| partGrids.part4_otherProperties.rowCount | integer |
| partGrids.part4_otherProperties.rows | array |
| partGrids.part4_otherProperties.totalACB | number |
| partGrids.part4_otherProperties.totalGainOrLoss | number |
| partGrids.part4_otherProperties.totalOutlays | number |
| partGrids.part4_otherProperties.totalProceeds | number |
| partGrids.part5_personalUseProperty.rowCount | integer |
| partGrids.part5_personalUseProperty.rows | array |
| partGrids.part5_personalUseProperty.totalACB | number |
| partGrids.part5_personalUseProperty.totalGainOrLoss | number |
| partGrids.part5_personalUseProperty.totalOutlays | number |
| partGrids.part5_personalUseProperty.totalProceeds | number |
| partGrids.part6_listedPersonalProperty.rowCount | integer |
| partGrids.part6_listedPersonalProperty.rows | array |
| partGrids.part6_listedPersonalProperty.totalACB | number |
| partGrids.part6_listedPersonalProperty.totalGainOrLoss | number |
| partGrids.part6_listedPersonalProperty.totalOutlays | number |
| partGrids.part6_listedPersonalProperty.totalProceeds | number |
| partGrids.part7_businessInvestmentLosses.rowCount | integer |
| partGrids.part7_businessInvestmentLosses.rows | array |
| partGrids.part7_businessInvestmentLosses.totalACB | number |
| partGrids.part7_businessInvestmentLosses.totalGainOrLoss | number |
| partGrids.part7_businessInvestmentLosses.totalOutlays | number |
| partGrids.part7_businessInvestmentLosses.totalProceeds | number |
| provisional | boolean |
| reviewRequiredCount | integer |
| revivedSuspendedLosses | array |
| schedule73Line275TaxableCapitalGains | number |
| schedule73Line285AllowableCapitalLosses | number |
| subsection39_2ForeignExchange | array |
| subsection39_3Repurchases | array |
| subsection40_1_01NqsGain.capitalGain | array \| boolean \| null \| number \| object \| string |
| subsection40_1_01NqsGain.citation | string |
| subsection40_1_01NqsGain.inclusionRate | array \| boolean \| null \| number \| object \| string |
| subsection40_1_01NqsGain.rows | array |
| subsection40_1_01NqsGain.taxableCapitalGain | array \| boolean \| null \| number \| object \| string |
| subsection40_1_01NqsGain.unprovableReason | string |
| subsection40_3_12DeemedLosses | array |
| subsection40_3_1DeemedGains | array |
| subsection40_3_6AcbAdditions | array |
| suspendedLosses | array |
| taxableCapitalGains | number |
| taxationYearInclusionFraction | array \| boolean \| null \| number \| object \| string |
| totalACB | number |
| totalCapitalGains | number |
| totalCapitalLosses | number |
| totalOutlays | number |
| totalProceeds | number |
| unroutedDispositions.netGainOrLoss | number |
| unroutedDispositions.rowCount | integer |
| unroutedDispositions.rows | array |
| filingPropositions[].schemaVersion | integer |
| filingPropositions[].propositionId | string |
| filingPropositions[].state | string |
| filingPropositions[].filingDisposition | string |
| filingPropositions[].targets[] | string |
| filingPropositions[].evidence[] | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].kind | string |
| warnings[].amount | number |
| warnings[].count | integer |
| warnings[].details[] | string |
| activeAssetAbilAmountG | number |
| foreignAbilAmountG | number |
| lppLossCarriedBack | number |
| fxConversionUnprovenCount | integer |
| section92_2AcbMismatchCount | integer |
| section92_2IncompleteCount | integer |
| section92_2NegativeAcbUnresolvedCount | integer |
| section13_5_3DeemedRecapture | number |
| section13_5_3Rows | array |
| changeOfUseReceivers | array |
| section55DeemedGains | array |
| section55Receivers | array |
| part7Subsection112_3Adjustment | number |
| schedule73ReserveAddbackTaxableCapitalGain | number |
| schedule73ReserveDeductionAllowableCapitalLoss | number |
| subsection112_7ExchangedShareAdjustments | array |
| subsection40_2_hReductions | array |
| superficialLossAcbAdditions | array |
| suspendedLossContinuity | array |
| section53_1_mAcbAdjustmentsApplied | array |
| section93ElectionsApplied | array |
| ready | boolean |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule63

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024–2025
- Strict profile: s63_2025_five_line_projection_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): foreign_affiliate_analysis, reserve_continuity, schedule1, schedule10, schedule125, schedule13, schedule130, schedule15, schedule17, schedule2, schedule21, schedule25, schedule3, schedule5, schedule6, schedule73, schedule8, t661

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule63"
  ],
  "inputs": {
    "taxYear": 2024,
    "fiscalStart": "2024-01-01",
    "fiscalEnd": "2024-12-31",
    "creditRecognizedInTrialBalanceGifi9659": false,
    "subsection12_2_2Election": {
      "amount": 78.7,
      "filed_on_time": true
    },
    "schedule63": {
      "line080_total_farming_expenses": 30000,
      "line100_gross_farming_expenses": 30000,
      "part10_days_in_tax_year": 366,
      "part10_days_by_calendar_year": {
        "2024": 366
      },
      "parts2to9_eligible_farming_expenses_by_province": {
        "ON": 30000
      },
      "line395_federal_total_excluding_partnership": 68.7,
      "line475_partnership_subtotal": 10,
      "line495_grand_total": 78.7
    },
    "isCCPC": true,
    "daysInYear": 366,
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterAmalgamation": false,
        "firstYearAfterIncorporation": true,
        "subsidiaryWindupS88": false
      }
    }
  }
}
```

## Input cells (48)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| creditRecognizedInTrialBalanceGifi9659 | boolean | strict |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule63.creditRecognizedInTrialBalanceGifi9659 | boolean \| null |  |
| schedule63.lastModifiedAt | string |  |
| schedule63.lastModifiedBy | string |  |
| schedule63.line080_total_farming_expenses | null \| number | strict |
| schedule63.line090_nal_transactions | null \| number |  |
| schedule63.line100_gross_farming_expenses | null \| number | strict |
| schedule63.line150_nl_total | null \| number |  |
| schedule63.line160_pe_total | null \| number |  |
| schedule63.line170_ns_total | null \| number |  |
| schedule63.line180_nb_total | null \| number |  |
| schedule63.line200_on_total | null \| number |  |
| schedule63.line210_mb_total | null \| number |  |
| schedule63.line220_sk_total | null \| number |  |
| schedule63.line230_ab_total | null \| number |  |
| schedule63.line350_partnership_allocation_nl | null \| number |  |
| schedule63.line360_partnership_allocation_pe | null \| number |  |
| schedule63.line370_partnership_allocation_ns | null \| number |  |
| schedule63.line380_partnership_allocation_nb | null \| number |  |
| schedule63.line395_federal_total_excluding_partnership | null \| number | strict |
| schedule63.line400_partnership_allocation_on | null \| number |  |
| schedule63.line410_partnership_allocation_mb | null \| number |  |
| schedule63.line420_partnership_allocation_sk | null \| number |  |
| schedule63.line430_partnership_allocation_ab | null \| number |  |
| schedule63.line475_partnership_subtotal | null \| number | strict |
| schedule63.line495_grand_total | null \| number | strict |
| schedule63.part10_days_by_calendar_year.2024 | integer | strict |
| schedule63.part10_days_in_tax_year | integer | strict |
| schedule63.partnershipAllocations | array \| null |  |
| schedule63.partnershipAllocations[].box237Amount | null \| number |  |
| schedule63.partnershipAllocations[].fiscalPeriodEnd | null \| string |  |
| schedule63.partnershipAllocations[].partnershipAccountNumber | null \| string |  |
| schedule63.partnershipAllocations[].partnershipName | null \| string |  |
| schedule63.partnershipAllocations[].province | null \| string |  |
| schedule63.parts2to9_eligible_farming_expenses_by_province.ON | integer | strict |
| schedule63.subsection12_2_2Election | null \| object |  |
| schedule63.subsection12_2_2Election.amount | null \| number |  |
| schedule63.subsection12_2_2Election.filed_on_time | boolean \| null |  |
| subsection12_2_2Election.amount | number | strict |
| subsection12_2_2Election.filed_on_time | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `creditRecognizedInTrialBalanceGifi9659`: Explicit answer to whether the fuel-charge credit is already booked in the trial balance at GIFI 9659 (total farm revenue, Schedule 125); controls the Schedule 1 addition.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule63.creditRecognizedInTrialBalanceGifi9659`: Whether the s.127.42(7) assistance is already in S125 GIFI 9659.
- `schedule63.partnershipAllocations`: T5013 box 237 rows (s.127.42(3)). The engine sums them into boxes 350-430 and line 475; a supplied row set governs those totals.
- `schedule63.partnershipAllocations[].box237Amount`: T5013 box 237. `null` is an UNANSWERED slip, never a nil allocation.
- `schedule63.partnershipAllocations[].fiscalPeriodEnd`: Fiscal period end of the partnership, when recorded.
- `schedule63.partnershipAllocations[].partnershipAccountNumber`: The partnership's full CRA RZ program account, e.g. 123456789RZ0001. A T5013 information return is filed under an RZ account, so a bare nine-digit business-number root does not identify the slip issuer.
- `schedule63.partnershipAllocations[].province`: One of the eight designated provinces (NL/PE/NS/NB/ON/MB/SK/AB).
- `schedule63.subsection12_2_2Election`: Optional timely s.12(2.2) election; null means no election was made.
- `schedule63.subsection12_2_2Election.amount`: Amount elected to reduce the underlying outlay under ITA s.12(2.2).
- `schedule63.subsection12_2_2Election.filed_on_time`: The s.12(2.2) election was filed by the applicable return due date.
- `subsection12_2_2Election.filed_on_time`: s.12(2.2) timing condition: the election was made on or before the return filing-due date; the engine will not assume a time-limited election was made.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (13 of 48 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule63.line080_total_farming_expenses | -1000000000000000 to 1000000000000000 |
| schedule63.line100_gross_farming_expenses | -1000000000000000 to 1000000000000000 |
| schedule63.line395_federal_total_excluding_partnership | -1000000000000000 to 1000000000000000 |
| schedule63.line475_partnership_subtotal | -1000000000000000 to 1000000000000000 |
| schedule63.line495_grand_total | -1000000000000000 to 1000000000000000 |
| schedule63.part10_days_by_calendar_year.2024 | -1000000000000000 to 1000000000000000 |
| schedule63.part10_days_in_tax_year | -1000000000000000 to 1000000000000000 |
| schedule63.parts2to9_eligible_farming_expenses_by_province.ON | -1000000000000000 to 1000000000000000 |
| subsection12_2_2Election.amount | 0 to 600000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (390)

| Cell | Types |
| --- | --- |
| answered_count | integer |
| assistance_s127_42_7.credit_amount | null \| number |
| assistance_s127_42_7.deemed_assistance_s127_42_7 | null \| number |
| assistance_s127_42_7.determined | boolean |
| assistance_s127_42_7.inclusion_taxation_year | string |
| assistance_s127_42_7.outlay_reduction_s12_2_2 | null \| number |
| assistance_s127_42_7.recognized_in_trial_balance_gifi_9659 | boolean |
| assistance_s127_42_7.s12_2_2_election.amount_elected | number |
| assistance_s127_42_7.s12_2_2_election.filed_on_time | boolean |
| assistance_s127_42_7.s12_2_2_election.reduction_applied | number |
| assistance_s127_42_7.s1_addition_s12_1_x | null \| number |
| credit_substantiated | boolean |
| eligibility_met | boolean \| null |
| fired_gates | object |
| line_080 | integer |
| line_100 | integer |
| line_395 | number |
| line_395_computed | number |
| line_475 | integer |
| line_495 | number |
| missing_required[] | string |
| part_10_day_counts.days_by_calendar_year.2024 | integer |
| part_10_day_counts.days_in_tax_year | integer |
| part_10_expenses_by_province.ON | number |
| part_10_province_totals.ON | number |
| part_10_rows[].amount | number |
| part_10_rows[].calendar_year | integer |
| part_10_rows[].days_in_calendar_year | integer |
| part_10_rows[].days_in_tax_year | integer |
| part_10_rows[].eligible_farming_expenses | number |
| part_10_rows[].form_amount | string |
| part_10_rows[].payment_rate | string |
| part_10_rows[].proration | number |
| part_10_rows[].province | string |
| part_11_partnership_detail.by_province | object |
| part_11_partnership_detail.evidence_present | boolean |
| part_11_partnership_detail.line_475 | null \| number |
| part_11_partnership_detail.line_475_computed | array \| boolean \| null \| number \| object \| string |
| part_11_partnership_detail.rows | array |
| part_1_detail.amount_1a_mandatory_inventory_adjustment | null \| number |
| part_1_detail.amount_1a_source | null \| string |
| part_1_detail.amount_1b_optional_value_of_inventory | null \| number |
| part_1_detail.amount_1b_source | null \| string |
| part_1_detail.amount_1c_subtotal | number |
| part_1_detail.line_080 | null \| number |
| part_1_detail.line_090 | array \| boolean \| null \| number \| object \| string |
| part_1_detail.line_100 | null \| number |
| part_1_detail.line_100_computed | null \| number |
| part_1_detail.line_100_entered | null \| number |
| parts_2_to_9.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.amount_f_total_salaries_and_wages | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.available | boolean |
| parts_2_to_9.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.day_counts_source | string |
| parts_2_to_9.fiscal_end | string |
| parts_2_to_9.fiscal_start | string |
| parts_2_to_9.printed_day_fractions_10a_to_10c.2024 | number |
| parts_2_to_9.rows | array |
| parts_2_to_9.single_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.unavailable_reason | string |
| parts_2_to_9.by_part.2.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.part | integer |
| parts_2_to_9.by_part.2.province | string |
| parts_2_to_9.by_part.2.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.2.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.2.s5_salaries_line | string |
| parts_2_to_9.by_part.3.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.part | integer |
| parts_2_to_9.by_part.3.province | string |
| parts_2_to_9.by_part.3.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.3.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.3.s5_salaries_line | string |
| parts_2_to_9.by_part.4.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.part | integer |
| parts_2_to_9.by_part.4.province | string |
| parts_2_to_9.by_part.4.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.4.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.4.s5_salaries_line | string |
| parts_2_to_9.by_part.5.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.part | integer |
| parts_2_to_9.by_part.5.province | string |
| parts_2_to_9.by_part.5.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.5.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.5.s5_salaries_line | string |
| parts_2_to_9.by_part.6.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.part | integer |
| parts_2_to_9.by_part.6.province | string |
| parts_2_to_9.by_part.6.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.6.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.6.s5_salaries_line | string |
| parts_2_to_9.by_part.7.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.part | integer |
| parts_2_to_9.by_part.7.province | string |
| parts_2_to_9.by_part.7.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.7.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.7.s5_salaries_line | string |
| parts_2_to_9.by_part.8.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.part | integer |
| parts_2_to_9.by_part.8.province | string |
| parts_2_to_9.by_part.8.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.8.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.8.s5_salaries_line | string |
| parts_2_to_9.by_part.9.amount_a | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_b_gross_revenue_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_c_total_gross_revenue | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_d_gross_revenue_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_e_salaries_in_province | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_f_total_salaries | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.amount_g_salaries_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.basis | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.part | integer |
| parts_2_to_9.by_part.9.province | string |
| parts_2_to_9.by_part.9.relevant_proportion | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.relevant_proportion_printed_5dp | array \| boolean \| null \| number \| object \| string |
| parts_2_to_9.by_part.9.s5_gross_revenue_line | string |
| parts_2_to_9.by_part.9.s5_salaries_line | string |
| provisional | boolean |
| ready | boolean |
| s125_tie_out.assistance_inclusion_status | string |
| s125_tie_out.available | boolean |
| s125_tie_out.expense_base_difference | array \| boolean \| null \| number \| object \| string |
| s125_tie_out.expense_base_status | string |
| s125_tie_out.farm_section_present | boolean |
| s125_tie_out.line_9659_total_farm_revenue | number |
| s125_tie_out.line_9898_total_farm_expenses | number |
| s1_feed_s127_42_7_assistance | null \| number |
| t2_line_795_feed | null \| number |
| total_count | integer |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | null \| string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| part_10_by_amount.10A.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.calendar_year | integer |
| part_10_by_amount.10A.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10A.province | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.calendar_year | integer |
| part_10_by_amount.10B.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10B.province | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10C.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10C.calendar_year | integer |
| part_10_by_amount.10C.days_in_calendar_year | integer |
| part_10_by_amount.10C.days_in_tax_year | integer |
| part_10_by_amount.10C.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10C.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10C.printed_proportion | number |
| part_10_by_amount.10C.province | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.calendar_year | integer |
| part_10_by_amount.10D.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10D.province | string |
| part_10_by_amount.10E.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.calendar_year | integer |
| part_10_by_amount.10E.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10E.province | string |
| part_10_by_amount.10F.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.calendar_year | integer |
| part_10_by_amount.10F.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10F.province | string |
| part_10_by_amount.10G.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.calendar_year | integer |
| part_10_by_amount.10G.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10G.province | string |
| part_10_by_amount.10H.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.calendar_year | integer |
| part_10_by_amount.10H.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10H.province | string |
| part_10_by_amount.10I.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.calendar_year | integer |
| part_10_by_amount.10I.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10I.province | string |
| part_10_by_amount.10J.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.calendar_year | integer |
| part_10_by_amount.10J.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10J.province | string |
| part_10_by_amount.10K.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.calendar_year | integer |
| part_10_by_amount.10K.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10K.province | string |
| part_10_by_amount.10L.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.calendar_year | integer |
| part_10_by_amount.10L.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10L.province | string |
| part_10_by_amount.10M.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.calendar_year | integer |
| part_10_by_amount.10M.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10M.province | string |
| part_10_by_amount.10N.amount | number |
| part_10_by_amount.10N.calendar_year | integer |
| part_10_by_amount.10N.days_in_calendar_year | integer |
| part_10_by_amount.10N.days_in_tax_year | integer |
| part_10_by_amount.10N.eligible_farming_expenses | number |
| part_10_by_amount.10N.payment_rate | string |
| part_10_by_amount.10N.printed_proportion | number |
| part_10_by_amount.10N.province | string |
| part_10_by_amount.10O.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.calendar_year | integer |
| part_10_by_amount.10O.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10O.province | string |
| part_10_by_amount.10P.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.calendar_year | integer |
| part_10_by_amount.10P.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10P.province | string |
| part_10_by_amount.10Q.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.calendar_year | integer |
| part_10_by_amount.10Q.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10Q.province | string |
| part_10_by_amount.10R.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.calendar_year | integer |
| part_10_by_amount.10R.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10R.province | string |
| part_10_by_amount.10S.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.calendar_year | integer |
| part_10_by_amount.10S.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10S.province | string |
| part_10_by_amount.10T.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.calendar_year | integer |
| part_10_by_amount.10T.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10T.province | string |
| part_10_by_amount.10U.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.calendar_year | integer |
| part_10_by_amount.10U.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10U.province | string |
| part_10_by_amount.10V.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.calendar_year | integer |
| part_10_by_amount.10V.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10V.province | string |
| part_10_by_amount.10W.amount | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.calendar_year | integer |
| part_10_by_amount.10W.days_in_calendar_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.days_in_tax_year | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.eligible_farming_expenses | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.payment_rate | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.printed_proportion | array \| boolean \| null \| number \| object \| string |
| part_10_by_amount.10W.province | string |

### Output cell notes

- `s1_feed_s127_42_7_assistance`: The s.12(1)(x) inclusion Schedule 1 receives, or null when the engine has not established one. A s.12(2.2) election whose timeliness is unconfirmed cannot be applied and cannot be assumed away, so the feed is UNKNOWN rather than nil: publishing 0 there would post a settled nil inclusion to Schedule 1 line 112's sibling grid on facts the engine explicitly refused.
- `t2_line_795_feed`: The grand-total s.127.42 credit T2 line 795 receives, or null when the engine has not established one. The value is null wherever the credit fails closed — an unconfirmed s.12(2.2) election timeliness among them — so a consumer can tell an unestablished credit from a computed nil instead of posting an unclaimed nil to the jacket.

# schedule67

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022–2026
- Strict profile: s67_2022_standalone_bank_crd_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule67"
  ],
  "inputs": {
    "taxYear": 2022,
    "schedule67": {
      "corporationName": "Northstar Bank of Canada",
      "businessNumber": "222333445",
      "currentTaxYearEnd": "2022-12-31",
      "hasMultiple2022TaxYears": false,
      "isBank": true,
      "isRelatedToOtherGroupMemberAtEndOf2021": false,
      "taxableIncome2020": 2000000000,
      "taxableIncome2021": 2000000000,
      "wasBankOrLifeInsurerGroupMemberInA2021TaxYear": true,
      "totalDaysIn2020TaxYears": 365,
      "totalDaysIn2021TaxYears": 365
    }
  }
}
```

## Input cells (33)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule67.businessNumber | null \| string | strict |
| schedule67.corporationName | null \| string | strict |
| schedule67.currentTaxYearEnd | null \| string | strict |
| schedule67.filed2022AmountDPerInstalment | null \| number |  |
| schedule67.filed2022CrdDeterminationAttested | boolean \| null |  |
| schedule67.filed2022IncomeDeductionLimit | null \| number |  |
| schedule67.filed2022Line230CrdPayableTotal | null \| number |  |
| schedule67.groupAllocationAgreement | array |  |
| schedule67.groupAllocationAgreement[].allocationAmount | null \| number |  |
| schedule67.groupAllocationAgreement[].memberBN | null \| string |  |
| schedule67.groupAllocationAgreement[].memberName | null \| string |  |
| schedule67.hadAmalgamationIn2020Or2021 | boolean \| null |  |
| schedule67.hadWindupIn2020Or2021 | boolean \| null |  |
| schedule67.hasMultiple2020TaxYears | boolean \| null |  |
| schedule67.hasMultiple2021TaxYears | boolean \| null |  |
| schedule67.hasMultiple2022TaxYears | boolean \| null | strict |
| schedule67.isBank | boolean \| null | strict |
| schedule67.isFinancialInstitutionRelatedToBankOrLifeInsurer | boolean \| null |  |
| schedule67.isLifeInsuranceCorpInCanada | boolean \| null |  |
| schedule67.isNonResident | boolean \| null |  |
| schedule67.isRelatedToOtherGroupMemberAtEndOf2021 | boolean \| null | strict |
| schedule67.line120IncomeDeduction | null \| number |  |
| schedule67.otherAgreementsFiledForCalendarYear | boolean \| null |  |
| schedule67.otherFiledAgreements | array |  |
| schedule67.otherFiledAgreements[].agreementDateFiled | null \| string |  |
| schedule67.otherFiledAgreements[].allocationAuthority | string |  |
| schedule67.otherFiledAgreements[].allocationToFilingCorporation | null \| number |  |
| schedule67.taxableIncome2020 | null \| number \| string | strict |
| schedule67.taxableIncome2021 | null \| number | strict |
| schedule67.totalDaysIn2020TaxYears | null \| number | strict |
| schedule67.totalDaysIn2021TaxYears | null \| number | strict |
| schedule67.wasBankOrLifeInsurerGroupMemberInA2021TaxYear | boolean \| null | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule67.businessNumber`: 9-digit BN or 15-char RC account; 'NR' is NOT permitted here (only Part 1 col 105 row-BNs allow 'NR').
- `schedule67.corporationName`: Corporation legal name (header field).
- `schedule67.currentTaxYearEnd`: TY-end YYYY-MM-DD. Engine uses to determine active instalment.
- `schedule67.filed2022AmountDPerInstalment`: Filed 2022 Schedule 67 amount D, one-fifth instalment.
- `schedule67.filed2022CrdDeterminationAttested`: Confirm that the three filed-2022 values below were taken from the filed Schedule 67. Required only when the internal filed-2022 determination is unavailable, such as first-year onboarding.
- `schedule67.filed2022IncomeDeductionLimit`: Filed 2022 income-deduction limit used in the s.191.5(2) calculation.
- `schedule67.filed2022Line230CrdPayableTotal`: Filed 2022 Schedule 67 line 230, total CRD payable.
- `schedule67.groupAllocationAgreement`: Per-row group allocation agreement (cols 100/105/110). Total must not exceed $1B per s.191.5(5).
- `schedule67.groupAllocationAgreement[].allocationAmount`: Col 110 — this row's allocation of the $1B income deduction.
- `schedule67.groupAllocationAgreement[].memberBN`: Col 105 — BN of the row's corp. 'NR' allowed for unregistered.
- `schedule67.groupAllocationAgreement[].memberName`: Col 100 — name of related-group member.
- `schedule67.hadAmalgamationIn2020Or2021`: Had an amalgamation in 2020 or 2021 → predecessor TI must be included in line 200/210 per Note 1.
- `schedule67.hadWindupIn2020Or2021`: Had a wind-up in 2020 or 2021 → subsidiary TI must be included in line 200/210 per Note 1.
- `schedule67.hasMultiple2020TaxYears`: s.191.5(4) first conjunct: did the corp have MORE THAN ONE 2020 taxation year? Proration applies only when this is true AND the total days exceed 365 — a single 366-day (leap-year) 2020 TY is never prorated. The engine fails closed when the day count exceeds 365 and this is unanswered.
- `schedule67.hasMultiple2021TaxYears`: s.191.5(4) first conjunct for 2021 (same rule as 2020).
- `schedule67.hasMultiple2022TaxYears`: More than one taxation year of the corporation ended in 2022. The Part VI.2 tax is calculated on the latest such year and ITA s.191.5(9) makes the first of the five instalments payable for that year alone, so the engine derives the active instalment ordinal from this answer. Unanswered is not a No: a blank would publish the first instalment on an earlier 2022 return, so the schedule blocks until it is stated.
- `schedule67.isBank`: The corporation is a bank; one arm of the bank or life insurer group member definition the Part VI.2 Canada recovery dividend applies to (ITA s.191.5).
- `schedule67.isFinancialInstitutionRelatedToBankOrLifeInsurer`: Is this corp a financial institution per s.190(1) that is RELATED to a bank or life-insurance corp carrying on business in Canada?
- `schedule67.isLifeInsuranceCorpInCanada`: Is this corp a life insurance corporation carrying on business in Canada? (Per s.190(1).)
- `schedule67.isNonResident`: Non-resident corp → TI substituted with "taxable income earned in Canada" per Note 1.
- `schedule67.isRelatedToOtherGroupMemberAtEndOf2021`: The corporation was related to another bank or life insurer group member at the end of 2021; the related group must then allocate the Part VI.2 income deduction under s.191.5(5).
- `schedule67.line120IncomeDeduction`: Box 120 — this corp's allocated portion of the $1B income deduction. Required if isRelatedToOtherGroupMemberAtEndOf2021 is true; defaults to $1B otherwise per Note 2. Can be $0 for a related FI without an allocation under s.191.5(5).
- `schedule67.otherAgreementsFiledForCalendarYear`: True when another s.191.5(5) agreement or a Minister allocation under s.191.5(6) allocates an amount to this corporation. The legacy field name is shared with S39/S68; null withholds a positive line 120.
- `schedule67.otherFiledAgreements`: Every allocation not shown in this copy's Part 1 table. s.191.5(7) makes the least amount across these rows and this copy binding.
- `schedule67.otherFiledAgreements[].agreementDateFiled`: Agreement filing date or Minister allocation date, when known.
- `schedule67.otherFiledAgreements[].allocationAuthority`: Allocation source.
- `schedule67.otherFiledAgreements[].allocationToFilingCorporation`: Amount the external source allocates to this corporation.
- `schedule67.taxableIncome2020`: Box 200 — TI for 2020 tax year per Part I, ignoring 111(1)(a) and (b). For non-resident corps use 'taxable income earned in Canada' substitution. Include predecessor TI on amalgamation/ wind-up.
- `schedule67.taxableIncome2021`: Box 210 — TI for 2021 tax year (same basis).
- `schedule67.totalDaysIn2020TaxYears`: Multi-short-year proration: total days across all 2020 tax years. Engine prorates line 200 by 365/totaldays per Note 1 only when hasMultiple2020TaxYears is true AND this exceeds 365.
- `schedule67.totalDaysIn2021TaxYears`: Multi-short-year proration: total days across all 2021 tax years (same conjunctive rule as 2020).
- `schedule67.wasBankOrLifeInsurerGroupMemberInA2021TaxYear`: Form-face filer test: the corporation was a bank or life insurer group member at any time during a 2021 taxation year, which is what makes Schedule 67 applicable.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (9 of 33 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule67.businessNumber | 0 to 20000 characters |
| schedule67.corporationName | 0 to 20000 characters |
| schedule67.currentTaxYearEnd | 0 to 20000 characters |
| schedule67.otherFiledAgreements[].allocationAuthority | one of "agreement", "minister" |
| schedule67.taxableIncome2020 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule67.taxableIncome2021 | -1000000000000000 to 1000000000000000 |
| schedule67.totalDaysIn2020TaxYears | -1000000000000000 to 1000000000000000 |
| schedule67.totalDaysIn2021TaxYears | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (55)

| Cell | Types |
| --- | --- |
| active_instalment_amount | number |
| active_instalment_line | null \| string |
| active_tax_year_label | null \| string |
| amount_A_sum_ti_2020_2021 | number |
| amount_B_50_percent_average | number |
| amount_C_excess_over_deduction | number |
| amount_D_per_instalment | number |
| businessNumber | null \| string |
| corporationName | null \| string |
| currentTaxYearEnd | null \| string |
| fired_gates | object |
| groupAllocationAgreement | array |
| group_allocation_residual | number |
| group_allocation_total | number |
| isBank | boolean \| null |
| isFinancialInstitutionRelatedToBankOrLifeInsurer | array \| boolean \| null \| number \| object \| string |
| isLifeInsuranceCorpInCanada | array \| boolean \| null \| number \| object \| string |
| isNonResident | array \| boolean \| null \| number \| object \| string |
| isRelatedToOtherGroupMemberAtEndOf2021 | boolean \| null |
| line_120_income_deduction | number |
| line_200_proration_applied | boolean |
| line_200_ti_2020 | number |
| line_210_proration_applied | boolean |
| line_210_ti_2021 | number |
| line_220_income_deduction | number |
| line_230_crd_payable_total | number |
| line_300_instalment_2022 | number |
| line_310_instalment_2023 | number |
| line_320_instalment_2024 | number |
| line_330_instalment_2025 | number |
| line_340_instalment_2026 | number |
| missing_required[] | string |
| provisional | boolean |
| ready | boolean |
| t2_line_725_feed | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].anchor_field | string |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |

### Output cell notes

- `active_instalment_line`: The Part 3 instalment line the return year falls on. Null when the tax year is outside the five instalment years the schedule prints.
- `active_tax_year_label`: The label of the instalment year the return falls on. Null when the tax year is outside the five instalment years the schedule prints.
- `businessNumber`: The filer's business number. Echoed back from the request. Null when the caller supplied none; the unsupplied cell is named in `missing_required` instead of being invented.
- `corporationName`: The corporation's name. Echoed back from the request. Null when the caller supplied none; the unsupplied cell is named in `missing_required` instead of being invented.
- `currentTaxYearEnd`: The current tax year end as supplied, YYYY-MM-DD. Echoed back from the request. Null when the caller supplied none; the unsupplied cell is named in `missing_required` instead of being invented.
- `isBank`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isRelatedToOtherGroupMemberAtEndOf2021`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].anchor_field`: The Filemark input anchor a preparer has to answer to clear the finding, when the box alone does not identify it.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.

# schedule68

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s68_2024_standalone_bank_additional_tax_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): division_c

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule68"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule68": {
      "corporationName": "Northstar Bank of Canada",
      "businessNumber": "222333445",
      "currentTaxYearEnd": "2025-12-31",
      "daysInTaxYear": 365,
      "isBank": true,
      "isRelatedToOtherGroupMemberAtEndOfTaxYear": false,
      "taxableIncome": 500000000
    },
    "isCCPC": true,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365
  }
}
```

## Input cells (36)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule68.agreementCalendarYear | null \| number |  |
| schedule68.agreementDateFiled | null \| string |  |
| schedule68.antiAvoidanceAddbackS123_6_6Amount | null \| number |  |
| schedule68.businessNumber | null \| string | strict |
| schedule68.corporationName | null \| string | strict |
| schedule68.currentTaxYearEnd | null \| string | strict |
| schedule68.daysInTaxYear | null \| number | strict |
| schedule68.groupAllocationAgreement | array |  |
| schedule68.groupAllocationAgreement[].allocationAmount | null \| number |  |
| schedule68.groupAllocationAgreement[].memberBN | null \| string |  |
| schedule68.groupAllocationAgreement[].memberName | null \| string |  |
| schedule68.groupAllocationAgreement[].taxationYearEnd | null \| string |  |
| schedule68.hasAntiAvoidanceAddbackS123_6_6 | boolean \| null |  |
| schedule68.hasFunctionalCurrencyElectionS261 | boolean \| null |  |
| schedule68.isAmalgamationSuccessor | boolean \| null |  |
| schedule68.isAmendedAgreement | boolean \| null |  |
| schedule68.isBank | boolean \| null | strict |
| schedule68.isFinancialInstitutionRelatedToBankOrLifeInsurer | boolean \| null |  |
| schedule68.isHoldcoUnderS190_1_e | boolean \| null |  |
| schedule68.isLifeInsuranceCorpInCanada | boolean \| null |  |
| schedule68.isNonResident | boolean \| null |  |
| schedule68.isPCInsurer | boolean \| null |  |
| schedule68.isRelatedToOtherGroupMemberAtEndOfTaxYear | boolean \| null | strict |
| schedule68.isWindupSuccessor | boolean \| null |  |
| schedule68.line275IncomeDeduction | null \| number |  |
| schedule68.otherAgreementsFiledForCalendarYear | boolean \| null |  |
| schedule68.otherFiledAgreements | array |  |
| schedule68.otherFiledAgreements[].agreementDateFiled | null \| string |  |
| schedule68.otherFiledAgreements[].allocationAuthority | string |  |
| schedule68.otherFiledAgreements[].allocationToFilingCorporation | null \| number |  |
| schedule68.taxableIncome | null \| number \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count tied to fiscalStart/fiscalEnd for the settled Part I dependency closure.
- `fiscalEnd`: Canonical taxation-year end required by the settled Part I dependency closure.
- `fiscalStart`: Canonical taxation-year start required by the settled Part I dependency closure.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule68.agreementCalendarYear`: Box 050 — calendar year of the agreement (≥ 2022).
- `schedule68.agreementDateFiled`: Box 025 — date the allocation agreement was filed.
- `schedule68.antiAvoidanceAddbackS123_6_6Amount`: s.123.6(6) addback AMOUNT — the non-arm's-length deduction deemed NOT deducted "for the purpose of computing the tax payable by the corporation under subsection (2)" ONLY (regular Part I tax and Division C taxable income are untouched). Required when hasAntiAvoidanceAddbackS123_6_6 is attested true — the engine fails closed without it; explicit 0 is valid.
- `schedule68.businessNumber`: 9-digit BN or 15-char RC account; 'NR' is NOT permitted here.
- `schedule68.corporationName`: Corporation legal name (header field).
- `schedule68.currentTaxYearEnd`: TY-end YYYY-MM-DD.
- `schedule68.daysInTaxYear`: Days in the tax year — drives both the standalone short-year $100M proration (year < 51 weeks → $100M × days/365) and the straddle-year tax proration (days-after-April-7-2022 / days).
- `schedule68.groupAllocationAgreement`: Per-row group allocation table.
- `schedule68.groupAllocationAgreement[].allocationAmount`: Col 3 (Box 120) — this row's allocation of the $100M income deduction. Per s.123.6(3) the total across all rows + all related-group tax years ending in the same calendar year cannot exceed $100M.
- `schedule68.groupAllocationAgreement[].memberBN`: Col 2 (Box 110) — BN of the row's corp. 'NR' allowed for unregistered (form face verbatim).
- `schedule68.groupAllocationAgreement[].memberName`: Col 1 (Box 100) — name of related-group member.
- `schedule68.groupAllocationAgreement[].taxationYearEnd`: Worksheet-only discriminator. The prescribed face directs one row per taxation year when a member has multiple years ending in the agreement's calendar year, although the date is not a printed grid column.
- `schedule68.hasAntiAvoidanceAddbackS123_6_6`: Anti-avoidance s.(6) addback applies.
- `schedule68.hasFunctionalCurrencyElectionS261`: Functional-currency election under s.261 — translate the $100M fixed amount under s.261(5)(b) at the first-day relevant spot rate.
- `schedule68.isAmalgamationSuccessor`: Amalgamation successor — distinct from S67/Part VI.2 rollover.
- `schedule68.isAmendedAgreement`: Box 075 — is this an amended agreement?
- `schedule68.isBank`: The corporation is a bank; paragraph (a) of the s.123.6(1) bank or life insurer group member definition.
- `schedule68.isFinancialInstitutionRelatedToBankOrLifeInsurer`: Para (c) — FI per s.190(1) related to bank/life-insurer?
- `schedule68.isHoldcoUnderS190_1_e`: s.190(1)(e) holdco of bank/life-insurer subsidiary.
- `schedule68.isLifeInsuranceCorpInCanada`: Para (b) — life insurance corp carrying on business in Canada?
- `schedule68.isNonResident`: Non-resident corp → TIEC per Note 1.
- `schedule68.isPCInsurer`: P&C insurer (NOT s.190(1) FI unless related to bank/life-insurer).
- `schedule68.isRelatedToOtherGroupMemberAtEndOfTaxYear`: The corporation was related to another bank or life insurer group member at the end of the taxation year; the related group must then allocate the s.123.6(2) $100 million income deduction by agreement.
- `schedule68.isWindupSuccessor`: Wind-up successor — same as amalgamation (no rollover).
- `schedule68.line275IncomeDeduction`: Box 275 — income deduction OF THIS CORP. Engine derives for standalone; practitioner supplies for related (may be $0).
- `schedule68.otherAgreementsFiledForCalendarYear`: ITA 123.6(5) makes B "the least amount allocated ... UNDER AN AGREEMENT described in subsection (3)". Two members of one related group can each file a conflicting agreement for the same calendar year, and nothing in this return can see the other copy, so the corporation states whether another agreement exists. null = unanswered, which withholds the income deduction rather than assuming this copy stands alone.
- `schedule68.otherFiledAgreements`: One row per OTHER filed s.123.6(3) agreement, stating the amount it allocates to THIS corporation. Required when otherAgreementsFiledForCalendarYear is true; explicit 0 is a binding nil.
- `schedule68.otherFiledAgreements[].agreementDateFiled`: Date that agreement was filed, for the practitioner's own trail.
- `schedule68.otherFiledAgreements[].allocationAuthority`: Allocation source.
- `schedule68.otherFiledAgreements[].allocationToFilingCorporation`: Income deduction that agreement allocates to the filing corporation.
- `schedule68.taxableIncome`: Box 250 — taxable income (or TIEC if non-resident per Note 1).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 36 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule68.businessNumber | 0 to 20000 characters |
| schedule68.corporationName | 0 to 20000 characters |
| schedule68.currentTaxYearEnd | 0 to 20000 characters |
| schedule68.daysInTaxYear | -1000000000000000 to 1000000000000000 |
| schedule68.otherFiledAgreements[].allocationAuthority | one of "agreement", "minister" |
| schedule68.taxableIncome | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (42)

| Cell | Types |
| --- | --- |
| agreementCalendarYear | array \| boolean \| null \| number \| object \| string |
| agreementDateFiled | array \| boolean \| null \| number \| object \| string |
| amount_2a_subtotal | number |
| businessNumber | null \| string |
| corporationName | null \| string |
| currentTaxYearEnd | string |
| daysInTaxYear | integer |
| days_after_april_7_2022 | integer |
| fired_gates | object |
| groupAllocationAgreement | array |
| group_allocation_residual | number |
| isAmendedAgreement | array \| boolean \| null \| number \| object \| string |
| isBank | boolean \| null |
| isFinancialInstitutionRelatedToBankOrLifeInsurer | array \| boolean \| null \| number \| object \| string |
| isLifeInsuranceCorpInCanada | array \| boolean \| null \| number \| object \| string |
| isNonResident | array \| boolean \| null \| number \| object \| string |
| isRelatedToOtherGroupMemberAtEndOfTaxYear | boolean \| null |
| is_short_year | boolean |
| line_250_taxable_income | number |
| line_275_income_deduction | number |
| line_300_additional_tax | number |
| missing_required[] | string |
| provisional | boolean |
| ready | boolean |
| short_year_proration_applied_to_100m | boolean |
| straddle_proration_factor | number |
| subtotal_1a_group_allocation_total | number |
| t2_line_565_feed | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].anchor_field | string |

# schedule7

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s7_2025_active_business_income_worked_example_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): division_c, schedule1, schedule21, schedule24, schedule3, schedule4, schedule6, schedule73

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule7"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "associatedGroupAII": 0,
    "specifiedInvestmentBusinessIncome": 0,
    "lifeInsurancePolicyIncome": 0,
    "accounts": [
      {
        "id": "revenue",
        "accountCode": "4000",
        "accountName": "Cedar Ridge active business revenue",
        "currentYearBalance": -100000,
        "classification": {
          "schedule1Relevant": false,
          "incomeType": "active_business",
          "foreignSource": false
        }
      }
    ],
    "incomeStatementFlags": {
      "revenue": true
    },
    "pyUCCPools": [],
    "assetData": [],
    "dispositions": [],
    "specifiedCorporateIncomeReviewed": true,
    "supplementalLinesReviewed": true,
    "supplementalLineAmounts": {},
    "specifiedPartnershipIncomeApplies": false,
    "daysInYear": 365
  }
}
```

## Input cells (87)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts | array |  |
| accounts[].accountCode | string | strict |
| accounts[].accountName | string | strict |
| accounts[].classification.foreignSource | boolean \| null | strict |
| accounts[].classification.incomeType | null \| string | strict |
| accounts[].classification.schedule1Relevant | boolean | strict |
| accounts[].currentYearBalance | integer \| null \| number | strict |
| accounts[].id | string | strict |
| assetData | array | strict |
| associatedGroupAII | null \| number | strict |
| combinedAdjustments | null \| object |  |
| daysInYear | integer | strict |
| dispositions | array | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| incomeStatementFlags | object |  |
| incomeStatementFlags.revenue | boolean \| null | strict |
| isCCPC | boolean | strict |
| lifeInsurancePolicyIncome | integer \| null \| number | strict |
| pyUCCPools | array | strict |
| schedule7.aaii | number |  |
| schedule7.aaiiBeforeSupplementalReviewGate | number |  |
| schedule7.aaiiCurrentYear | number |  |
| schedule7.aaiiCurrentYearBeforeSupplementalReviewGate | number |  |
| schedule7.abi | number |  |
| schedule7.abiBeforeSpecifiedCorporateIncomeGate | number |  |
| schedule7.accountDetails | array |  |
| schedule7.aii | number |  |
| schedule7.aiiBeforeSupplementalReviewGate | number |  |
| schedule7.fii | number |  |
| schedule7.fiiBeforeSupplementalReviewGate | number |  |
| schedule7.foreignInvestmentIncome | number |  |
| schedule7.form | object |  |
| schedule7.form.formWarnings | array |  |
| schedule7.form.part4Table | array |  |
| schedule7.form.part4Table2 | array |  |
| schedule7.form.part4Table2[].assigned420 | number |  |
| schedule7.form.part4Table2[].memberBn410 | string |  |
| schedule7.form.part4Table2[].memberName406 | string |  |
| schedule7.form.part4Table2[].memberSin411 | string |  |
| schedule7.form.part4Table2[].memberTrust412 | string |  |
| schedule7.form.part4Table2[].name405 | string |  |
| schedule7.form.part4Table2[].yearEnd416 | string |  |
| schedule7.form.part4Table2[].yearStart415 | string |  |
| schedule7.form.part4Table3 | array |  |
| schedule7.form.part4Table3[].assigned440 | number |  |
| schedule7.form.part4Table3[].memberBn430 | string |  |
| schedule7.form.part4Table3[].memberName426 | string |  |
| schedule7.form.part4Table3[].name425 | string |  |
| schedule7.form.part4Table3[].yearEnd436 | string |  |
| schedule7.form.part4Table3[].yearStart435 | string |  |
| schedule7.form.part4Table[].activeIncome300 | null \| number |  |
| schedule7.form.part4Table[].adjustments315 | null \| number |  |
| schedule7.form.part4Table[].assignedByYou336 | null \| number |  |
| schedule7.form.part4Table[].assignedToYou335 | null \| number |  |
| schedule7.form.part4Table[].days325 | null \| number |  |
| schedule7.form.part4Table[].excessL1 | null \| number |  |
| schedule7.form.part4Table[].income320 | null \| number |  |
| schedule7.form.part4Table[].lesser340 | null \| number |  |
| schedule7.form.part4Table[].limitK1 | null \| number |  |
| schedule7.form.part4Table[].name200 | string |  |
| schedule7.form.part4Table[].proratedLimit330 | null \| number |  |
| schedule7.form.part4Table[].services311 | null \| number |  |
| schedule7.form.part4Table[].share310 | null \| number |  |
| schedule7.form.part7Table | array |  |
| schedule7.form.part7Table[].bn600 | string |  |
| schedule7.form.part7Table[].income610 | number |  |
| schedule7.form.part7Table[].limit620 | number |  |
| schedule7.isSpecifiedInvestmentBusiness | boolean |  |
| schedule7.line1_netTaxableCapitalGains | number |  |
| schedule7.line2_foreignInvestmentIncome | number |  |
| schedule7.line3_netRentalIncome | number |  |
| schedule7.line4_otherPropertyIncome | number |  |
| schedule7.line4b_nonDeductibleDividends | number |  |
| schedule7.netIncome | number |  |
| schedule7.netTaxableCapitalGains | number |  |
| schedule7.provisional | boolean |  |
| schedule7.specifiedInvestmentBusinessIncome | null \| number \| string |  |
| schedule7.taxableIncome | number |  |
| schedule7.warnings | array |  |
| specifiedCorporateIncomeReviewed | boolean \| null | strict |
| specifiedInvestmentBusinessIncome | null \| number | strict |
| specifiedPartnershipIncomeApplies | boolean \| null | strict |
| supplementalLineAmounts | object | strict |
| supplementalLinesReviewed | boolean \| null | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `accounts[].classification.foreignSource`: The account's income is foreign source; schedules that split Canadian from foreign amounts route it accordingly, for example Schedule 7's foreign property and rental buckets and line 500 foreign business income.
- `accounts[].classification.schedule1Relevant`: Marks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do.
- `associatedGroupAII`: S7 s.125(5.1)(b) grind input — preceding-calendar-year AAII of the corporation + associated corporations. OMIT (don't send null) when not provided: the backend distinguishes absent (current-year line 745 proxy + info disclosure) from an explicit value, including 0.
- `combinedAdjustments`: Posted adjusting journal entries, as a map from account id to the net amount posted against that account. Each amount may be a number or a numeric string. It is added to the trial-balance balance before the account is measured, and an unreadable entry is reported as an error rather than filed as zero.
- `daysInYear`: Inclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `incomeStatementFlags.revenue`: True when the trial-balance account with this id is an income-statement account; flagged balances form net income per financial statements, Schedule 1 amount A.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `lifeInsurancePolicyIncome`: TXE-319: ITA s.125(7)(c)(ii), in the 'adjusted aggregate investment income' definition, includes amounts in respect of a life insurance policy that are included in income; the engine reads the amount as an explicit off-form statutory fact. Zero pins this witness's branch.
- `schedule7.aaii`: The s.125(5.1)(b) grind input: associatedGroupAII override (prior- calendar-year group AAII) when provided, else line 745 as a proxy.
- `schedule7.aaiiCurrentYear`: Part 2 line 745 — this corporation's current-year AAII (s.125(7)).
- `schedule7.abi`: Part 6 amount DD — income eligible for the SBD (s.125(1)(a)) → T2 400.
- `schedule7.abiBeforeSpecifiedCorporateIncomeGate`: Printed amount DD before the explicit Part 7 review/validity gate.
- `schedule7.aii`: Part 1 line 092 — aggregate investment income (s.129(4)) → T2 line 440.
- `schedule7.aiiBeforeSupplementalReviewGate`: Calculation-preview values before the supplemental-line review gate neutralizes affected downstream filing outputs.
- `schedule7.fii`: Part 3 line 079 — foreign investment income (s.129(4)) → T2 line 445.
- `schedule7.foreignInvestmentIncome`: Alias of fii.
- `schedule7.form`: True Form View projection — every printed T2 SCH 7 box.
- `schedule7.specifiedInvestmentBusinessIncome`: Signed income or loss from a specified investment business, whose ITA s.125(7) principal-purpose and employee/service tests cannot be derived from the trial balance. A CCPC must enter an explicit amount, including 0 for reviewed nil; null or omission blocks filing. ITA s.129(4) deems the in-Canada portion to be property income.
- `specifiedCorporateIncomeReviewed`: Confirms the Schedule 7 Part 7 review of ITA s.125(7) specified corporate income; until true the engine caps specified corporate income at nil and line 615 stays out of SBD-eligible income.
- `specifiedInvestmentBusinessIncome`: Total income for the year from a specified investment business carried on in Canada, the ITA s.125(7) 'income of the corporation for the year from an active business' paragraph (a) carve-out the sweep made an explicit operand. Zero pins this witness's branch: no specified investment business income.
- `specifiedPartnershipIncomeApplies`: Whether ITA s.125(7) specified partnership income applies for the year; true requires the Schedule 7 Parts 4 and 5 partnership packets.
- `supplementalLinesReviewed`: Confirms Schedule 7 lines 042, 052, 072, 720, 725, 735, 741, 029, 059, 530 and 540 were reviewed and every applicable amount entered; AII, FII, AAII and SBD-eligible income are held at zero until confirmed.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (15 of 87 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| accounts[].accountCode | 0 to 20000 characters |
| accounts[].accountName | 0 to 20000 characters |
| accounts[].classification.incomeType | one of "active_business", "property", "rental", "capital", null |
| accounts[].currentYearBalance | -1000000000000000 to 1000000000000000 |
| accounts[].id | 0 to 20000 characters |
| assetData | exactly [] (pinned) |
| associatedGroupAII | -1000000000000000 to 1000000000000000 |
| daysInYear | 1 to 1000000000000000 |
| dispositions | exactly [] (pinned) |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| lifeInsurancePolicyIncome | -1000000000000000 to 1000000000000000 |
| pyUCCPools | exactly [] (pinned) |
| specifiedInvestmentBusinessIncome | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (173)

| Cell | Types |
| --- | --- |
| aaii | number |
| aaiiBeforeSupplementalReviewGate | number |
| aaiiCurrentYear | number |
| aaiiCurrentYearBeforeSupplementalReviewGate | number |
| abi | number |
| abiBeforeSpecifiedCorporateIncomeGate | number |
| accountDetails[].accountId | string |
| accountDetails[].accountCode | string |
| accountDetails[].accountName | string |
| accountDetails[].balance | number |
| accountDetails[].incomeType | string |
| accountDetails[].foreignSource | boolean |
| accountDetails[].sourceAnswered | boolean |
| accountDetails[].line | integer |
| aii | number |
| aiiBeforeSupplementalReviewGate | number |
| associatedCorporationPropertyPayments.clause125_1_a_i_C_excluded | number |
| associatedCorporationPropertyPayments.deemedActiveBusinessIncome | number |
| associatedCorporationPropertyPayments.rowCount | integer |
| eligiblePortionCarveOut.allowableCapitalLosses | number |
| eligiblePortionCarveOut.statusChangeInAccrualPeriod | array \| boolean \| null \| number \| object \| string |
| eligiblePortionCarveOut.taxableCapitalGains | number |
| eligiblePortionCarveOut.activeAllowableCapitalLosses | number |
| eligiblePortionCarveOut.activeTaxableCapitalGains | number |
| fii | number |
| fiiBeforeSupplementalReviewGate | number |
| foreignAccrualPropertyIncomeElections.amountRemovedFromPropertyIncome | number |
| foreignAccrualPropertyIncomeElections.electionCount | integer |
| foreignAccrualPropertyIncomeElections.subsection91_4DeductionExcluded | number |
| foreignInvestmentIncome | number |
| form.amount_A | number |
| form.amount_AA | number |
| form.amount_B | number |
| form.amount_BB | number |
| form.amount_C | number |
| form.amount_CC | number |
| form.amount_D | number |
| form.amount_DD | number |
| form.amount_E | number |
| form.amount_F | number |
| form.amount_G | number |
| form.amount_H | number |
| form.amount_I | number |
| form.amount_J | number |
| form.amount_K | number |
| form.amount_L | number |
| form.amount_M | number |
| form.amount_N | number |
| form.amount_O | number |
| form.amount_P | number |
| form.amount_Q | number |
| form.amount_R | number |
| form.amount_S | number |
| form.amount_T | number |
| form.amount_U | number |
| form.amount_V | number |
| form.amount_W | number |
| form.amount_X | number |
| form.amount_Y | number |
| form.amount_Z | number |
| form.formWarnings | array |
| form.line_001 | number |
| form.line_002 | number |
| form.line_009 | number |
| form.line_012 | number |
| form.line_019 | number |
| form.line_022 | number |
| form.line_029 | number |
| form.line_032 | number |
| form.line_042 | number |
| form.line_049 | number |
| form.line_052 | number |
| form.line_059 | number |
| form.line_062 | number |
| form.line_069 | number |
| form.line_072 | number |
| form.line_079 | number |
| form.line_082 | number |
| form.line_092 | number |
| form.line_350 | number |
| form.line_360 | number |
| form.line_370 | number |
| form.line_380 | number |
| form.line_385 | number |
| form.line_390 | number |
| form.line_400 | number |
| form.line_450 | number |
| form.line_500 | number |
| form.line_520 | number |
| form.line_530 | number |
| form.line_540 | number |
| form.line_615 | number |
| form.line_625 | number |
| form.line_705 | number |
| form.line_710 | number |
| form.line_715 | number |
| form.line_720 | number |
| form.line_725 | number |
| form.line_730 | number |
| form.line_735 | number |
| form.line_740 | number |
| form.line_741 | number |
| form.line_745 | number |
| form.part4Table | array |
| form.part4Table2 | array |
| form.part4Table3 | array |
| form.part7Table | array |
| isCreditUnion | array \| boolean \| null \| number \| object \| string |
| isSpecifiedInvestmentBusiness | boolean |
| lifeInsurancePolicyIncome | number |
| line1_netTaxableCapitalGains | number |
| line2_foreignInvestmentIncome | number |
| line3_netRentalIncome | number |
| line4_otherPropertyIncome | number |
| line4b_nonDeductibleDividends | number |
| netIncome | number |
| personalServicesBusinessIncome | number |
| precedingYearOwnAAII | array \| boolean \| null \| number \| object \| string |
| propertyIncomeActiveBusinessOverrides | array |
| provisional | boolean |
| psbSbdAllocationResolved | boolean |
| psbSbdAuthority | string |
| psbTaxableIncome | number |
| specifiedCorporateIncome.activeRowCount | integer |
| specifiedCorporateIncome.businessLimitAssignedFromPayersTotal | number |
| specifiedCorporateIncome.errors | array |
| specifiedCorporateIncome.incomeFromPayersTotal | number |
| specifiedCorporateIncome.reviewed | boolean |
| specifiedCorporateIncome.valid | boolean |
| specifiedInvestmentBusinessForeignIncome | number |
| specifiedInvestmentBusinessIncome | number |
| specifiedInvestmentBusinessIncomeAsEntered | number |
| specifiedPartnershipIncome.amounts.350 | number |
| specifiedPartnershipIncome.amounts.360 | number |
| specifiedPartnershipIncome.amounts.370 | number |
| specifiedPartnershipIncome.amounts.380 | number |
| specifiedPartnershipIncome.amounts.385 | number |
| specifiedPartnershipIncome.applies | boolean \| null |
| specifiedPartnershipIncome.rowDetailSupported | boolean |
| supplementalLines.amounts.029 | number |
| supplementalLines.amounts.042 | number |
| supplementalLines.amounts.052 | number |
| supplementalLines.amounts.059 | number |
| supplementalLines.amounts.072 | number |
| supplementalLines.amounts.530 | number |
| supplementalLines.amounts.540 | number |
| supplementalLines.amounts.720 | number |
| supplementalLines.amounts.725 | number |
| supplementalLines.amounts.735 | number |
| supplementalLines.amounts.741 | number |
| supplementalLines.reviewed | boolean |
| supplementalLines.valid | boolean |
| taxableIncome | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].source | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].accountIds[] | string |
| s125AntiAvoidanceConclusions.subsection6MultiplePartnerships | array \| boolean \| null \| number \| object \| string |
| s125AntiAvoidanceConclusions.subsection9Intermediary | array \| boolean \| null \| number \| object \| string |
| s125AntiAvoidanceConclusions.subsections6_2And6_3ControlledPartnership | array \| boolean \| null \| number \| object \| string |
| psbPresent | array \| boolean \| null \| number \| object \| string |
| fired_gates | object |

# schedule71

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s71_2024_single_tier_worked_example_target_value_v1
- Payload schema version: 0.11.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule71"
  ],
  "inputs": {
    "schedule71": {
      "becameBankruptInYear": false,
      "corpTaxYearEnd": "2025-12-31",
      "corpTaxYearStart": "2025-01-01",
      "isMultiTierPartnership": false,
      "isProfessionalCorp": false,
      "multiTierAlignmentYear1Suspension": false,
      "partnershipIsForeignAffiliateSurrogate": false,
      "partnerships": [
        {
          "continuousMembershipSinceBeforeMarch22_2011": true,
          "corpSharePercentage": 50,
          "particularPeriodEnd": "2026-01-31",
          "particularPeriodStart": "2025-02-01",
          "partnershipBN": "123456782RZ0001",
          "partnershipFYEndInYear": "2025-01-31",
          "partnershipFYStartInYear": "2024-02-01",
          "partnershipName": "Cedar Ridge Operations LP",
          "significantInterestConfirmed": true,
          "var_A_share_of_income_and_tcg": 1000000,
          "var_A_tcg_component": 0,
          "var_B_acl_component": 0,
          "var_B_share_of_loss_and_acl": 0,
          "var_E_designated_qre": 0,
          "var_F_discretionary": 0,
          "corpEntitledToShareAtParticularPeriodEnd": true,
          "var_A_active_business_component": 1000000,
          "var_A_property_component": 0,
          "var_A_other_component": 0
        }
      ]
    },
    "taxYear": 2025
  }
}
```

## Input cells (68)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule71.becameBankruptInYear | boolean \| null | strict |
| schedule71.corpFilingDueDate | null \| string |  |
| schedule71.corpTaxYearEnd | null \| string | strict |
| schedule71.corpTaxYearStart | null \| string | strict |
| schedule71.isMultiTierPartnership | boolean \| null | strict |
| schedule71.isProfessionalCorp | boolean \| null | strict |
| schedule71.multiTierAlignmentYear1Suspension | boolean \| null | strict |
| schedule71.partnershipIsForeignAffiliateSurrogate | boolean \| null | strict |
| schedule71.partnerships | array |  |
| schedule71.partnerships[].actual_stub_period_accrual_s343 | null \| number |  |
| schedule71.partnerships[].avg_daily_prescribed_rate_reg_4301_a | null \| number |  |
| schedule71.partnerships[].avg_daily_prescribed_rate_reg_4301_a_source | null \| string |  |
| schedule71.partnerships[].base_year_aspa_inclusion | null \| number |  |
| schedule71.partnerships[].base_year_aspa_with_F_set_nil | null \| number |  |
| schedule71.partnerships[].base_year_var_F_discretionary | null \| number |  |
| schedule71.partnerships[].box_3A_designated_in_return_before_filing_due_date | boolean \| null |  |
| schedule71.partnerships[].box_3A_discretionary_designation | null \| number |  |
| schedule71.partnerships[].box_3B_corp_income_particular_period | null \| number |  |
| schedule71.partnerships[].box_3C_day_ratio | null \| number |  |
| schedule71.partnerships[].continuousMembershipSinceBeforeMarch22_2011 | boolean \| null | strict |
| schedule71.partnerships[].corpBankruptOrDissolvedOtherThanS881 | boolean \| null |  |
| schedule71.partnerships[].corpEntitledToShareAtParticularPeriodEnd | boolean \| null | strict |
| schedule71.partnerships[].corpNonResidentNoPE | boolean \| null |  |
| schedule71.partnerships[].corpSharePercentage | null \| number | strict |
| schedule71.partnerships[].corpTaxExempt | boolean \| null |  |
| schedule71.partnerships[].corp_income_before_reserve | null \| number |  |
| schedule71.partnerships[].days_base_year_end_to_ty_end | null \| number |  |
| schedule71.partnerships[].deemedContinuingPartnerUnderS342_14 | boolean \| null |  |
| schedule71.partnerships[].eligibleAlignmentIncome | null \| number |  |
| schedule71.partnerships[].firstQtiTaxationYearEndYear | null \| number |  |
| schedule71.partnerships[].firstTaxationYearS342_17AppliesEndYear | null \| number |  |
| schedule71.partnerships[].firstYearAspaForQti | null \| number |  |
| schedule71.partnerships[].isNewCorpMemberInParticularPeriod | boolean \| null |  |
| schedule71.partnerships[].noFiscalPeriodEndedInYear | boolean \| null |  |
| schedule71.partnerships[].particularPeriodEnd | null \| string | strict |
| schedule71.partnerships[].particularPeriodStart | null \| string | strict |
| schedule71.partnerships[].partnershipBN | null \| string | strict |
| schedule71.partnerships[].partnershipBusinessContinued | boolean \| null |  |
| schedule71.partnerships[].partnershipFYEndInYear | null \| string | strict |
| schedule71.partnerships[].partnershipFYStartInYear | null \| string | strict |
| schedule71.partnerships[].partnershipName | null \| string | strict |
| schedule71.partnerships[].post_2012_s112_s113_dividend_deductions | null \| number |  |
| schedule71.partnerships[].qtiComputedUsingMaximumDeductionsS342_15 | boolean \| null |  |
| schedule71.partnerships[].qtiReserveClaimedRow | null \| number |  |
| schedule71.partnerships[].qtiTcgComponent | null \| number |  |
| schedule71.partnerships[].qtiYearIndex | null \| number |  |
| schedule71.partnerships[].recentMembershipForReserveAvoidance | boolean \| null |  |
| schedule71.partnerships[].relatedPartyAggregatedSharePercentage | null \| number |  |
| schedule71.partnerships[].s342_16_17_qti_adjustment_amount | null \| number |  |
| schedule71.partnerships[].significantInterestConfirmed | boolean \| null | strict |
| schedule71.partnerships[].var_A_active_business_component | integer \| null \| number |  |
| schedule71.partnerships[].var_A_includes_s112_s113_dividends | boolean \| null |  |
| schedule71.partnerships[].var_A_other_component | integer \| null \| number |  |
| schedule71.partnerships[].var_A_property_component | integer \| null \| number |  |
| schedule71.partnerships[].var_A_share_of_income_and_tcg | null \| number \| string | strict |
| schedule71.partnerships[].var_A_tcg_component | null \| number | strict |
| schedule71.partnerships[].var_B_acl_component | null \| number | strict |
| schedule71.partnerships[].var_B_includes_111_1_e_lp_losses | boolean \| null |  |
| schedule71.partnerships[].var_B_share_of_loss_and_acl | null \| number | strict |
| schedule71.partnerships[].var_C_days_in_both | null \| number |  |
| schedule71.partnerships[].var_D_days_in_FYs_ending_in_year | null \| number |  |
| schedule71.partnerships[].var_E_designated_qre | null \| number | strict |
| schedule71.partnerships[].var_E_max_deductible | null \| number |  |
| schedule71.partnerships[].var_E_written_info_from_partnership_received | boolean \| null |  |
| schedule71.partnerships[].var_F_designated_in_base_year | boolean \| null |  |
| schedule71.partnerships[].var_F_discretionary | null \| number | strict |
| schedule71.wasOpenedFromDesignatedMemberFlow | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule71.becameBankruptInYear`: s.34.2(7) carve-out: the corporation became bankrupt in the year, so neither the ASPA inclusion nor the s.34.2(3) new-partner designation applies.
- `schedule71.corpFilingDueDate`: YYYY-MM-DD override of the ITA 150(1)(a) filing-due date the engine derives (six months after the tax-year end, CRA day-of-month rule, rolled off a holiday). s.34.2(3) is available only where the particular period ends on or before that date.
- `schedule71.corpTaxYearStart`: YYYY-MM-DD. Used for the variable-C / 3C day computations.
- `schedule71.isMultiTierPartnership`: Scope check: the partnership is itself a member of another partnership (s.102(2), s.249.1(1)(c)); multi-tier partnerships use Schedule 72, not Schedule 71.
- `schedule71.isProfessionalCorp`: s.34.2(2) chapeau carve-out: a professional corporation accrues stub-period income under s.34.1 instead of the ASPA regime.
- `schedule71.multiTierAlignmentYear1Suspension`: s.34.2(9): ASPA is suspended for taxation years preceding the year that includes the end of the first aligned fiscal period.
- `schedule71.partnershipIsForeignAffiliateSurrogate`: s.34.2(8) carve-out: s.34.2 does not apply in computing FAPI or foreign-affiliate surplus; the accrual flows through the surplus computation instead.
- `schedule71.partnerships[].actual_stub_period_accrual_s343`: Form 4K analogue — actual stub period accrual (s.34.3(1) A-side).
- `schedule71.partnerships[].avg_daily_prescribed_rate_reg_4301_a`: Form 4S — average daily Reg 4301(a) rate (daily, NOT annualized). Engine blocks the shortfall with an error when missing.
- `schedule71.partnerships[].avg_daily_prescribed_rate_reg_4301_a_source`: Where a practitioner-entered amount 4S daily rate comes from, as free text. ITA s.34.3(1) variable D is determined by reference to the rate prescribed under Regulation 4301(a), so an entered rate is admissible only for a variable-C window no published quarter reaches, and then only with a named source. Blank or omitted leaves the rate unusable and blocks the shortfall.
- `schedule71.partnerships[].base_year_aspa_inclusion`: Base-year ASPA inclusion under s.34.2(2) (s.34.3(1) B).
- `schedule71.partnerships[].base_year_aspa_with_F_set_nil`: Form amount 4N — base-year ASPA recomputed with F = nil (s.34.3(1) A-side cap). When null the engine derives it as amount 4L + amount 4M per the form face, floored at zero.
- `schedule71.partnerships[].base_year_var_F_discretionary`: Form amount 4M — discretionary amount designated in the BASE year (base-year amount 2K). Carried forward automatically; supplied so amount 4N can be derived.
- `schedule71.partnerships[].box_3A_designated_in_return_before_filing_due_date`: 3A support — designated in return before filing-due date?
- `schedule71.partnerships[].box_3A_discretionary_designation`: Form amount 3A — discretionary designation by the corp.
- `schedule71.partnerships[].box_3B_corp_income_particular_period`: Form amount 3B — corp income from particular period (excl s.112/113).
- `schedule71.partnerships[].box_3C_day_ratio`: Form amount 3C — day-ratio override (auto from dates if null).
- `schedule71.partnerships[].continuousMembershipSinceBeforeMarch22_2011`: s.34.2(13)(a) transitional condition: the corporation has been a member of the partnership continuously since before March 22, 2011; required for the qualifying transitional income reserve.
- `schedule71.partnerships[].corpEntitledToShareAtParticularPeriodEnd`: Whether, at the end of the year, the corporation is entitled to a share of the partnership's income, loss, taxable capital gain or allowable capital loss for the fiscal period — the ITA 34.2(2)(c) condition. Strict tri-state: true admits the row's ASPA, false applies the (2)(c) carveout and zeroes it, and an absent answer withholds the ASPA and blocks. The answer is a submitted practitioner fact and is not proof that the corporation was so entitled.
- `schedule71.partnerships[].corpSharePercentage`: Box 230 — corp share % at end of last FY (0-100).
- `schedule71.partnerships[].corp_income_before_reserve`: Cap (iii) — income before claiming the reserve.
- `schedule71.partnerships[].days_base_year_end_to_ty_end`: Form 4Q — days from day-after-base-year-end to TY-end.
- `schedule71.partnerships[].deemedContinuingPartnerUnderS342_14`: s.34.2(14) deemed-continuity exception for a successor partner.
- `schedule71.partnerships[].eligibleAlignmentIncome`: One-time eligible alignment income (persists year-over-year).
- `schedule71.partnerships[].firstQtiTaxationYearEndYear`: Calendar year in which the corporation's FIRST taxation year with qualifying transitional income ends. Selects s.34.2(1) paragraph (a) 2011, (b) 2012 or (c) 2013 outright; null derives it from qtiYearIndex.
- `schedule71.partnerships[].firstTaxationYearS342_17AppliesEndYear`: ITA 34.3(2)(b) — calendar year in which the corporation's first taxation year to which s.34.2(17) applies ends. Consulted only when this row carries QTI; ITA 34.2(16) fixes the historical year, so an absent answer blocks rather than assuming the condition is met.
- `schedule71.partnerships[].firstYearAspaForQti`: First-year ASPA component of the QTI base.
- `schedule71.partnerships[].noFiscalPeriodEndedInYear`: True iff no FY ended in TY (AoC short year / amalgamation). Per CRA T.I. 2014-0539191E5 — row ASPA = 0.
- `schedule71.partnerships[].particularPeriodEnd`: Particular [stub] period end (FY ending after TY).
- `schedule71.partnerships[].particularPeriodStart`: Box 225 — particular [stub] period start (FY beginning in TY).
- `schedule71.partnerships[].partnershipBN`: Box 210 — full 15-character RZ partnership account.
- `schedule71.partnerships[].partnershipFYEndInYear`: Box 220 — partnership FY end (last FY ending in TY). YYYY-MM-DD.
- `schedule71.partnerships[].partnershipFYStartInYear`: Partnership FY START, used to derive variable D (box 255). There is no 365-day fallback: send this or `var_D_days_in_FYs_ending_in_year`, or the row is blocked.
- `schedule71.partnerships[].partnershipName`: Box 200 — partnership's name.
- `schedule71.partnerships[].post_2012_s112_s113_dividend_deductions`: Cap (iii) — post-2012 s.112/s.113 dividend deductions.
- `schedule71.partnerships[].qtiComputedUsingMaximumDeductionsS342_15`: Confirms the s.34.2(15) maximum-deductions premise for QTI.
- `schedule71.partnerships[].qtiReserveClaimedRow`: Box 115 input — QTI reserve claimed (least-of-three capped).
- `schedule71.partnerships[].qtiTcgComponent`: The taxable-capital-gain component of this row's qualifying transitional income for the ITA 34.2(11)(b)(ii) reserve-character split. Enter 0 when the historical QTI contained no taxable capital gains; absence is unanswered when a reserve is claimed.
- `schedule71.partnerships[].qtiYearIndex`: 0 = alignment year, ..., 5+ = fully phased out. Ordinal only — the s.34.2(1) "specified percentage" is fixed by two CALENDAR years, so the engine resolves the paragraph from the corporation's TY-end year together with firstQtiTaxationYearEndYear (or this index). No paragraph reaches a particular year after 2017.
- `schedule71.partnerships[].relatedPartyAggregatedSharePercentage`: Related-party-aggregated share % for the significant-interest look-through (s.34.2(1)).
- `schedule71.partnerships[].s342_16_17_qti_adjustment_amount`: s.34.2(16)/(17) post-filing adjustment (adds to cap (ii)).
- `schedule71.partnerships[].significantInterestConfirmed`: Practitioner confirmation of the s.34.2(1) significant-interest test: the corporation, together with related or affiliated persons, holds more than 10 percent of the partnership's income entitlement.
- `schedule71.partnerships[].var_A_active_business_component`: The active-business share of this row's variable A character split. ITA 34.2(5)(a)(i) gives the adjusted stub period accrual the same character, in the same proportions, as the income the partnership allocated to the corporation — an allocation fact the corporation cannot infer. Send all three shares: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule71.partnerships[].var_A_includes_s112_s113_dividends`: Error-flag: A includes s.112/s.113 dividends (engine blocks).
- `schedule71.partnerships[].var_A_other_component`: The other-income share of this row's variable A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule71.partnerships[].var_A_property_component`: The property-income share of this row's variable A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule71.partnerships[].var_A_share_of_income_and_tcg`: Box 240 — A: corp share of income + TCG for FYs ending in TY (excl s.112/113 dividends; form amounts 2A + 2D).
- `schedule71.partnerships[].var_A_tcg_component`: TCG component inside A (drives the s.34.2(5)(a) character split and the B-side ACL cap).
- `schedule71.partnerships[].var_B_acl_component`: ACL component inside B (engine caps it at TCG-in-A).
- `schedule71.partnerships[].var_B_includes_111_1_e_lp_losses`: Error-flag: B nets s.111(1)(e) LP-loss carryforwards (engine blocks per CRA T.I. 2018-0788161E5 — those go to Schedule 4).
- `schedule71.partnerships[].var_B_share_of_loss_and_acl`: Box 245 — B: corp share of loss + ACL (form amounts 2B + 2E).
- `schedule71.partnerships[].var_C_days_in_both`: Box 250 — C: days in both TY and stub period (auto from dates when null).
- `schedule71.partnerships[].var_D_days_in_FYs_ending_in_year`: Box 255 — D: days in partnership FYs ending in TY (auto from partnershipFYStartInYear when null). There is NO default: T2 SCH 71 (19) Note 2 verbatim allows more than 365 days, and a short fiscal period or a leap year changes the filed ASPA, so a row with neither this override nor partnershipFYStartInYear is BLOCKED.
- `schedule71.partnerships[].var_E_designated_qre`: Box 260 — E: designated qualified resource expense (s.34.2(6)).
- `schedule71.partnerships[].var_E_max_deductible`: E support — max deductible under s.66.1/66.2/66.21/66.4.
- `schedule71.partnerships[].var_E_written_info_from_partnership_received`: E support — written info from partnership received before the filing-due date (s.34.2(6) requirement).
- `schedule71.partnerships[].var_F_designated_in_base_year`: Trigger: corp designated F (amount 2K) in the BASE year.
- `schedule71.partnerships[].var_F_discretionary`: Box 265 — F: discretionary designation (IRREVOCABLE, s.34.2(10)).
- `schedule71.wasOpenedFromDesignatedMemberFlow`: Disambiguation: opened from S7 "designated member" flow? Info advisory — s.125(7) concept, NOT s.34.2.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (20 of 68 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule71.corpTaxYearEnd | 0 to 20000 characters |
| schedule71.corpTaxYearStart | 0 to 20000 characters |
| schedule71.partnerships[].corpSharePercentage | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].particularPeriodEnd | 0 to 20000 characters |
| schedule71.partnerships[].particularPeriodStart | 0 to 20000 characters |
| schedule71.partnerships[].partnershipBN | 0 to 20000 characters |
| schedule71.partnerships[].partnershipFYEndInYear | 0 to 20000 characters |
| schedule71.partnerships[].partnershipFYStartInYear | 0 to 20000 characters |
| schedule71.partnerships[].partnershipName | 0 to 20000 characters |
| schedule71.partnerships[].qtiTcgComponent | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_active_business_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_other_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_property_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_share_of_income_and_tcg | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule71.partnerships[].var_A_tcg_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_B_acl_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_B_share_of_loss_and_acl | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_E_designated_qre | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_F_discretionary | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (95)

| Cell | Types |
| --- | --- |
| becameBankruptInYear | boolean \| null |
| character_split.ordinary | number |
| character_split.tcg | number |
| character_split.activeBusiness | number |
| character_split.other | number |
| character_split.property | number |
| fired_gates | object |
| isMultiTierPartnership | boolean \| null |
| isProfessionalCorp | boolean \| null |
| line_100 | number |
| line_105 | number |
| line_110 | number |
| line_115 | number |
| line_120 | number |
| line_200 | null \| string |
| line_210 | null \| string |
| line_220 | null \| string |
| line_225 | null \| string |
| line_230 | number |
| line_240 | number |
| line_245 | number |
| line_250 | integer |
| line_255 | integer |
| line_260 | number |
| line_265 | number |
| line_270 | number |
| missing_required[] | string |
| net_to_schedule_73 | number |
| partnerships[]._shortfall_inner_b_nil_s343_3 | number |
| partnerships[].amount_2I_gross_stub_for_s73_col1 | number |
| partnerships[].amount_2J_qre_for_s73_col2 | number |
| partnerships[].amount_2K_discretionary_for_s73_col3 | number |
| partnerships[].amount_3E_new_member_for_s73_col6 | number |
| partnerships[].amount_4T_shortfall_for_s73_col9 | number |
| partnerships[].amount_4W_threshold_for_s73_col10 | number |
| partnerships[].character_ordinary | number |
| partnerships[].character_tcg | number |
| partnerships[].income_shortfall_s343 | number |
| partnerships[].line_200 | string |
| partnerships[].line_210 | string |
| partnerships[].line_220 | string |
| partnerships[].line_225 | null \| string |
| partnerships[].line_230 | number |
| partnerships[].line_240 | number |
| partnerships[].line_245 | number |
| partnerships[].line_250 | integer |
| partnerships[].line_255 | integer |
| partnerships[].line_260 | number |
| partnerships[].line_265 | number |
| partnerships[].line_270 | number |
| partnerships[].prior_year_aspa_reversal_s342_4 | number |
| partnerships[].qti_reserve_addback_s342_12 | number |
| partnerships[].qti_reserve_deduction_s342_11 | number |
| partnerships[].reg_4301_a_rate_application.autoCalculated | boolean |
| partnerships[].reg_4301_a_rate_application.averageDailyRate | number |
| partnerships[].reg_4301_a_rate_application.status | string |
| partnerships[].character_active_business | number |
| partnerships[].character_breakdown_supplied | boolean |
| partnerships[].character_other | number |
| partnerships[].character_property | number |
| partnerships[].particular_period_end | null \| string |
| partnerships[].prior_year_aspa_reversal_tcg_s342_4 | array \| boolean \| null \| number \| object \| string |
| partnerships[].qti_reserve_addback_capital_s342_12_b | number |
| partnerships[].qti_reserve_deduction_capital_s342_11_b_ii | number |
| partnerships[].aspa_withheld_pending_s342_2_c_answer | number |
| provisional | boolean |
| ready | boolean |
| total_aspa_inclusion | number |
| total_income_shortfall | number |
| total_new_corp_member_inclusion | number |
| total_prior_year_aspa_reversal | number |
| total_qti_reserve_addback | number |
| total_qti_reserve_deduction | number |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| prior_year_aspa_reversal_character_known | boolean |
| total_prior_year_aspa_reversal_tcg | number |
| total_aspa_withheld_pending_entitlement | number |

### Output cell notes

- `becameBankruptInYear`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isMultiTierPartnership`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isProfessionalCorp`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `line_200`: Box 200, the partnership's name, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_210`: Box 210, the partnership's business number, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_220`: Box 220, the end of the last fiscal period ending in the year, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_225`: Box 225, the start of the particular period, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `partnerships[].line_200`: Box 200, the partnership's name on this row. Empty when the row does not state it; the unstated cell is named in `missing_required` rather than filled in.
- `partnerships[].line_210`: Box 210, the partnership's business number on this row. Empty when the row does not state it; the unstated cell is named in `missing_required` rather than filled in.
- `partnerships[].line_225`: Box 225, the start of the particular period on this row. Null when the row does not state it; the unanswered cell is named in `missing_required`.
- `partnerships[].particular_period_end`: The end of the particular period on this row, which Schedule 73 reads as its box 140. Null when the row does not state it.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule72

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s72_2024_multi_tier_worked_example_target_value_v1
- Payload schema version: 0.9.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule72"
  ],
  "inputs": {
    "schedule72": {
      "becameBankruptInYear": false,
      "corpTaxYearEnd": "2025-12-31",
      "corpTaxYearStart": "2025-01-01",
      "isProfessionalCorp": false,
      "isSingleTierPartnership": false,
      "partnershipHasPartnershipMember": true,
      "partnershipIsForeignAffiliateSurrogate": false,
      "partnerships": [
        {
          "box_2A_income": 1000000,
          "box_2B_loss": 0,
          "box_2D_tcg": 0,
          "box_2E_acl": 0,
          "box_2J_designated_qre": 0,
          "box_2K_discretionary_designation": 0,
          "continuousMembershipSinceBeforeMarch22_2011": true,
          "corpSharePercentage": 50,
          "particularPeriodEnd": "2026-01-31",
          "particularPeriodStart": "2025-02-01",
          "partnershipBN": "222222226RZ0001",
          "partnershipFYEndInYear": "2025-01-31",
          "partnershipFYStartInYear": "2024-02-01",
          "partnershipName": "Cedar Ridge Multi-Tier LP",
          "significantInterestConfirmed": true,
          "corpEntitledToShareAtParticularPeriodEnd": true,
          "box_2A_active_business_component": 1000000,
          "box_2A_property_component": 0,
          "box_2A_other_component": 0
        }
      ],
      "preFirstAlignedFiscalPeriodSuspension": false,
      "stickyMultiTierAfterStructureFlattens": false,
      "wasSubjectToMultiTierAlignment": false
    },
    "taxYear": 2025
  }
}
```

## Input cells (77)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule72.becameBankruptInYear | boolean \| null | strict |
| schedule72.corpTaxYearEnd | null \| string | strict |
| schedule72.corpTaxYearStart | null \| string | strict |
| schedule72.isProfessionalCorp | boolean \| null | strict |
| schedule72.isSingleTierPartnership | boolean \| null | strict |
| schedule72.partnershipHasPartnershipMember | boolean \| null | strict |
| schedule72.partnershipIsForeignAffiliateSurrogate | boolean \| null | strict |
| schedule72.partnerships | array |  |
| schedule72.partnerships[].avg_daily_prescribed_rate_reg_4301_a_source | null \| string |  |
| schedule72.partnerships[].box_2A_active_business_component | integer \| null \| number |  |
| schedule72.partnerships[].box_2A_includes_s112_s113_dividends | boolean \| null |  |
| schedule72.partnerships[].box_2A_income | null \| number \| string | strict |
| schedule72.partnerships[].box_2A_other_component | integer \| null \| number |  |
| schedule72.partnerships[].box_2A_property_component | integer \| null \| number |  |
| schedule72.partnerships[].box_2B_includes_111_1_e_lp_losses | boolean \| null |  |
| schedule72.partnerships[].box_2B_loss | null \| number | strict |
| schedule72.partnerships[].box_2D_tcg | null \| number | strict |
| schedule72.partnerships[].box_2E_acl | null \| number | strict |
| schedule72.partnerships[].box_2H_day_ratio | null \| number |  |
| schedule72.partnerships[].box_2J_designated_qre | null \| number | strict |
| schedule72.partnerships[].box_2J_max_deductible | null \| number |  |
| schedule72.partnerships[].box_2J_written_info_from_partnership_received | boolean \| null |  |
| schedule72.partnerships[].box_2K_designated_in_base_year | boolean \| null |  |
| schedule72.partnerships[].box_2K_discretionary_designation | null \| number | strict |
| schedule72.partnerships[].box_3A_designated_in_return_before_filing_due_date | boolean \| null |  |
| schedule72.partnerships[].box_3A_discretionary_designation | null \| number |  |
| schedule72.partnerships[].box_3B_corp_income_particular_period | null \| number |  |
| schedule72.partnerships[].box_3C_day_ratio | null \| number |  |
| schedule72.partnerships[].box_4A_base_year_income | null \| number |  |
| schedule72.partnerships[].box_4B_base_year_loss | null \| number |  |
| schedule72.partnerships[].box_4D_base_year_tcg | null \| number |  |
| schedule72.partnerships[].box_4E_base_year_acl | null \| number |  |
| schedule72.partnerships[].box_4H_base_year_day_ratio | null \| number |  |
| schedule72.partnerships[].box_4J_base_year_qre_designation | null \| number |  |
| schedule72.partnerships[].box_4L_base_year_aspa | null \| number |  |
| schedule72.partnerships[].box_4M_base_year_discretionary | null \| number |  |
| schedule72.partnerships[].box_4N_base_year_aspa_with_F_set_nil | null \| number |  |
| schedule72.partnerships[].box_4Q_days_base_year_end_to_ty_end | null \| number |  |
| schedule72.partnerships[].box_4S_avg_daily_prescribed_rate_reg_4301_a | null \| number |  |
| schedule72.partnerships[].continuousMembershipSinceBeforeMarch22_2011 | boolean \| null | strict |
| schedule72.partnerships[].corpBankruptOrDissolvedOtherThanS881 | boolean \| null |  |
| schedule72.partnerships[].corpEntitledToShareAtParticularPeriodEnd | boolean \| null | strict |
| schedule72.partnerships[].corpNonResidentNoPE | boolean \| null |  |
| schedule72.partnerships[].corpSharePercentage | null \| number | strict |
| schedule72.partnerships[].corpTaxExempt | boolean \| null |  |
| schedule72.partnerships[].corp_income_before_reserve | null \| number |  |
| schedule72.partnerships[].deemedContinuingPartnerUnderS342_14 | boolean \| null |  |
| schedule72.partnerships[].eligibleAlignmentIncome_b_i | null \| number |  |
| schedule72.partnerships[].eligibleAlignmentIncome_b_ii | null \| number |  |
| schedule72.partnerships[].firstTaxationYearS342_17AppliesEndYear | null \| number |  |
| schedule72.partnerships[].firstYearAspaForQti | null \| number |  |
| schedule72.partnerships[].isFirstAlignedFiscalPeriodYear | boolean \| null |  |
| schedule72.partnerships[].isNewCorpMemberInParticularPeriod | boolean \| null |  |
| schedule72.partnerships[].noEarlierFiscalPeriodEndedInYear | boolean \| null |  |
| schedule72.partnerships[].noFiscalPeriodEndedInYear | boolean \| null |  |
| schedule72.partnerships[].particularPeriodEnd | null \| string | strict |
| schedule72.partnerships[].particularPeriodStart | null \| string | strict |
| schedule72.partnerships[].partnershipBN | null \| string | strict |
| schedule72.partnerships[].partnershipBusinessContinued | boolean \| null |  |
| schedule72.partnerships[].partnershipFYEndInYear | null \| string | strict |
| schedule72.partnerships[].partnershipFYStartInYear | null \| string | strict |
| schedule72.partnerships[].partnershipName | null \| string | strict |
| schedule72.partnerships[].post_2012_s112_s113_dividend_deductions | null \| number |  |
| schedule72.partnerships[].qtiComputedUsingMaximumDeductionsS342_15 | boolean \| null |  |
| schedule72.partnerships[].qtiReserveClaimedRow | null \| number |  |
| schedule72.partnerships[].qtiTcgComponent | null \| number |  |
| schedule72.partnerships[].qtiYearIndex | null \| number |  |
| schedule72.partnerships[].recentMembershipForReserveAvoidance | boolean \| null |  |
| schedule72.partnerships[].relatedPartyAggregatedSharePercentage | null \| number |  |
| schedule72.partnerships[].s342_16_17_qti_adjustment_amount | null \| number |  |
| schedule72.partnerships[].significantInterestConfirmed | boolean \| null | strict |
| schedule72.partnerships[].var_D_days_in_FYs_ending_in_year | null \| number |  |
| schedule72.preFirstAlignedFiscalPeriodSuspension | boolean \| null | strict |
| schedule72.stickyMultiTierAfterStructureFlattens | boolean \| null | strict |
| schedule72.wasOpenedFromDesignatedMemberFlow | boolean \| null |  |
| schedule72.wasSubjectToMultiTierAlignment | boolean \| null | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule72.becameBankruptInYear`: s.34.2(7) carve-out: the corporation became bankrupt in the year, so neither the ASPA inclusion nor the s.34.2(3) new-partner designation applies.
- `schedule72.corpTaxYearStart`: YYYY-MM-DD. Used for box 2H / 3C day-ratio auto-computation.
- `schedule72.isProfessionalCorp`: s.34.2(2) chapeau carve-out: a professional corporation accrues stub-period income under s.34.1 instead of the ASPA regime.
- `schedule72.isSingleTierPartnership`: Scope check: an explicitly single-tier partnership belongs on Schedule 71; only a formerly multi-tier structure kept here by the sticky form-face rule stays on Schedule 72.
- `schedule72.partnershipHasPartnershipMember`: The partnership has another partnership as a member (s.102(2), s.249.1(1)(c)); one of the facts that qualifies it as multi-tier for Schedule 72.
- `schedule72.partnershipIsForeignAffiliateSurrogate`: s.34.2(8) carve-out: s.34.2 does not apply in computing FAPI or foreign-affiliate surplus; the accrual flows through the surplus computation instead.
- `schedule72.partnerships[].avg_daily_prescribed_rate_reg_4301_a_source`: Where a practitioner-entered amount 4S daily rate comes from, as free text. ITA s.34.3(1) variable D is determined by reference to the rate prescribed under Regulation 4301(a), so an entered rate is admissible only for a variable-C window no published quarter reaches, and then only with a named source. Blank or omitted leaves the rate unusable and blocks the shortfall.
- `schedule72.partnerships[].box_2A_active_business_component`: The active-business share of this row's amount 2A character split. ITA 34.2(5)(a)(i) gives the adjusted stub period accrual the same character, in the same proportions, as the income the partnership allocated to the corporation — an allocation fact the corporation cannot infer. Send all three shares: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].box_2A_includes_s112_s113_dividends`: Box 2A error-flag: practitioner has included s.112/s.113 dividends in 2A (engine blocks; remove and re-route to S3).
- `schedule72.partnerships[].box_2A_income`: Box 2A — corp share of income for FYs ending in TY (excl s.112/113).
- `schedule72.partnerships[].box_2A_other_component`: The other-income share of this row's amount 2A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].box_2A_property_component`: The property-income share of this row's amount 2A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].box_2B_includes_111_1_e_lp_losses`: Box 2B error-flag: practitioner has netted s.111(1)(e) LP loss carryforwards into 2B (engine blocks; goes to S4 per T.I. 2018-0788161E5).
- `schedule72.partnerships[].box_2B_loss`: Box 2B — corp share of loss for FYs ending in TY.
- `schedule72.partnerships[].box_2D_tcg`: Box 2D — corp share of TCG for FYs ending in TY.
- `schedule72.partnerships[].box_2E_acl`: Box 2E — corp share of ACL. Engine caps at 2D per form-face.
- `schedule72.partnerships[].box_2H_day_ratio`: Box 2H — optional reconciliation value. The engine derives C/D from the statutory day facts and blocks a contradictory entry.
- `schedule72.partnerships[].box_2J_designated_qre`: Box 2J — designated qualified resource expense (s.34.2(6)).
- `schedule72.partnerships[].box_2J_max_deductible`: Box 2J support — max deductible under s.66.1/66.2/66.21/66.4.
- `schedule72.partnerships[].box_2J_written_info_from_partnership_received`: Box 2J support — written info from partnership received before filing-due date (s.34.2(6) requirement).
- `schedule72.partnerships[].box_2K_designated_in_base_year`: Trigger: corp designated 2K (discretionary) in the BASE year.
- `schedule72.partnerships[].box_2K_discretionary_designation`: Box 2K — discretionary designation (s.34.2(1) variable F).
- `schedule72.partnerships[].box_3A_designated_in_return_before_filing_due_date`: Box 3A support — designated in return before filing-due date?
- `schedule72.partnerships[].box_3A_discretionary_designation`: Box 3A — discretionary designation by the corp.
- `schedule72.partnerships[].box_3B_corp_income_particular_period`: Box 3B — corp income from particular period (excl s.112/113).
- `schedule72.partnerships[].box_3C_day_ratio`: Box 3C — day-ratio override (engine computes from dates if null).
- `schedule72.partnerships[].box_4N_base_year_aspa_with_F_set_nil`: Amount 4N — ITA 34.3(1) variable A limb (b), the base year's adjusted stub period accrual computed with the value of F set to nil. An override, and the one to send whenever the base year's amount 2M was floored at zero, because the form's own 4N = 4L + 4M shortcut overstates variable A there. null derives the shortcut instead, floored at zero, and 4M then becomes the only way the engine can derive 4N at all. A supplied amount that disagrees with 4L + 4M is still used, with a warning. Same input surface as Schedule 71's `base_year_aspa_with_F_set_nil`.
- `schedule72.partnerships[].box_4Q_days_base_year_end_to_ty_end`: Box 4Q — days from day-after-base-year-end to current TY-end.
- `schedule72.partnerships[].box_4S_avg_daily_prescribed_rate_reg_4301_a`: Box 4S — average daily prescribed rate (Reg 4301(a)) for the 4Q period. Daily rate, NOT annualized.
- `schedule72.partnerships[].continuousMembershipSinceBeforeMarch22_2011`: s.34.2(13)(a) transitional condition: the corporation has been a member of the partnership continuously since before March 22, 2011; required for the qualifying transitional income reserve.
- `schedule72.partnerships[].corpEntitledToShareAtParticularPeriodEnd`: Whether, at the end of the year, the corporation is entitled to a share of the partnership's income, loss, taxable capital gain or allowable capital loss for the fiscal period — the ITA 34.2(2)(c) condition. Strict tri-state: true admits the row's ASPA, false applies the (2)(c) carveout and zeroes it, and an absent answer withholds the ASPA and blocks. The answer is a submitted practitioner fact and is not proof that the corporation was so entitled.
- `schedule72.partnerships[].corpSharePercentage`: Box 230 — corp share % at end of last FY (0-100).
- `schedule72.partnerships[].deemedContinuingPartnerUnderS342_14`: s.34.2(14) deemed-continuity exception for a successor partner.
- `schedule72.partnerships[].firstTaxationYearS342_17AppliesEndYear`: ITA 34.3(2)(b) — the calendar year in which the corporation's first taxation year to which s.34.2(17) applies ends. A bare year (2013), not a date. Only consulted where the row carries qualifying transitional income, which is where limb (b) is a live condition of the s.34.3(3) inclusion. ITA 34.2(16) fixes it as a corporation-level fact the worksheet cannot derive, so an absent answer blocks the row rather than being read as met.
- `schedule72.partnerships[].noEarlierFiscalPeriodEndedInYear`: Asserts that the fiscal period beginning on `partnershipFYStartInYear` was the partnership's first — that no earlier fiscal period also ended inside the taxation year. Only consulted when the declared FY start falls after the corporation's tax-year start, which otherwise proves a preceding fiscal period ended in the year and blocks. Only a real boolean true asserts; null is unanswered, never false.
- `schedule72.partnerships[].noFiscalPeriodEndedInYear`: True iff no FY ended in TY (e.g., AoC short year, amalgamation). Per CRA T.I. 2014-0539191E5 — row ASPA = 0.
- `schedule72.partnerships[].particularPeriodEnd`: Particular [stub] period end (FY ending after TY).
- `schedule72.partnerships[].particularPeriodStart`: Box 225 — particular [stub] period start (FY beginning in TY).
- `schedule72.partnerships[].partnershipBN`: Full 15-character RZ partnership account.
- `schedule72.partnerships[].partnershipFYEndInYear`: Box 220 — partnership FY end (last FY ending in TY). YYYY-MM-DD.
- `schedule72.partnerships[].partnershipFYStartInYear`: Partnership FY START, used to derive the amount 2H denominator. There is no 365-day fallback: send this or `var_D_days_in_FYs_ending_in_year`, or the row is blocked. A box 2H entry is reconciliation evidence only.
- `schedule72.partnerships[].qtiComputedUsingMaximumDeductionsS342_15`: Confirms the s.34.2(15) maximum-deductions premise for QTI.
- `schedule72.partnerships[].qtiTcgComponent`: The taxable-capital-gain component of this row's qualifying transitional income for the ITA 34.2(11)(b)(ii) reserve-character split. Enter 0 when the historical QTI contained no taxable capital gains; absence is unanswered when a reserve is claimed.
- `schedule72.partnerships[].qtiYearIndex`: qtiYearIndex — 0 = alignment year, ..., 5+ = fully phased out.
- `schedule72.partnerships[].relatedPartyAggregatedSharePercentage`: Optional override — related-party-aggregated share % for the significant-interest look-through (s.34.2(1)).
- `schedule72.partnerships[].significantInterestConfirmed`: Practitioner confirmation of the s.34.2(1) significant-interest test: the corporation, together with related or affiliated persons, holds more than 10 percent of the partnership's income entitlement.
- `schedule72.partnerships[].var_D_days_in_FYs_ending_in_year`: Amount 2H denominator — ITA 34.2(1)(a) variable D, the number of days in fiscal periods of the partnership that end in the year (the day count Schedule 71 collects at box 255). Send it whenever more than one fiscal period ended in the year: `partnershipFYStartInYear` describes only the last one. There is no default, because amounts 2A/2B/2D/2E already carry income and losses from every such period.
- `schedule72.preFirstAlignedFiscalPeriodSuspension`: s.34.2(9): ASPA is suspended for taxation years before the first aligned fiscal period ends; the catch-up arrives as eligible alignment income in the alignment-end year.
- `schedule72.stickyMultiTierAfterStructureFlattens`: Form-face rule: a partnership that changed from multi-tier to single-tier stays on Schedule 72; set true to keep filing here after the structure flattens.
- `schedule72.wasOpenedFromDesignatedMemberFlow`: Disambiguation: opened from S7 "designated member" flow? Surfaces an info advisory since "designated member" is a s.125(7) SBD concept, NOT an s.34.2 ASPA concept.
- `schedule72.wasSubjectToMultiTierAlignment`: The partnership was subject to a multi-tier alignment election; one of the facts that keeps it in Schedule 72 scope.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (20 of 77 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule72.corpTaxYearEnd | 0 to 20000 characters |
| schedule72.corpTaxYearStart | 0 to 20000 characters |
| schedule72.partnerships[].box_2A_active_business_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2A_income | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule72.partnerships[].box_2A_other_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2A_property_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2B_loss | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2D_tcg | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2E_acl | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2J_designated_qre | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2K_discretionary_designation | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].corpSharePercentage | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].particularPeriodEnd | 0 to 20000 characters |
| schedule72.partnerships[].particularPeriodStart | 0 to 20000 characters |
| schedule72.partnerships[].partnershipBN | 0 to 20000 characters |
| schedule72.partnerships[].partnershipFYEndInYear | 0 to 20000 characters |
| schedule72.partnerships[].partnershipFYStartInYear | 0 to 20000 characters |
| schedule72.partnerships[].partnershipName | 0 to 20000 characters |
| schedule72.partnerships[].qtiTcgComponent | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (169)

| Cell | Types |
| --- | --- |
| becameBankruptInYear | boolean \| null |
| character_split.ordinary | number |
| character_split.tcg | number |
| character_split.activeBusiness | number |
| character_split.other | number |
| character_split.property | number |
| fired_gates | object |
| isProfessionalCorp | boolean \| null |
| isSingleTierPartnership | boolean \| null |
| line_200 | null \| string |
| line_210 | null \| string |
| line_220 | null \| string |
| line_225 | null \| string |
| line_230 | number |
| line_2A | number |
| line_2B | number |
| line_2C | number |
| line_2D | number |
| line_2E | number |
| line_2F | number |
| line_2G | number |
| line_2H | number |
| line_2I | number |
| line_2J | number |
| line_2K | number |
| line_2L | number |
| line_2M | number |
| line_3A | number |
| line_3B | number |
| line_3C | number |
| line_3D | number |
| line_3E | number |
| line_4A | number |
| line_4B | number |
| line_4C | number |
| line_4D | number |
| line_4E | number |
| line_4F | number |
| line_4G | number |
| line_4H | number |
| line_4I | number |
| line_4J | number |
| line_4K | number |
| line_4L | number |
| line_4M | number |
| line_4N | number |
| line_4O | number |
| line_4P | number |
| line_4Q | integer |
| line_4R | number |
| line_4S | number |
| line_4T | number |
| line_4U | number |
| line_4V | number |
| line_4W | number |
| missing_required[] | string |
| net_to_s73 | number |
| net_to_schedule_73 | number |
| partnershipHasPartnershipMember | boolean \| null |
| partnerships[]._shortfall_inner_b_nil_s343_3 | number |
| partnerships[].amount_2I_gross_stub_for_s73_col1 | number |
| partnerships[].amount_2J_qre_for_s73_col2 | number |
| partnerships[].amount_2K_discretionary_for_s73_col3 | number |
| partnerships[].amount_3E_new_member_for_s73_col6 | number |
| partnerships[].amount_4T_shortfall_for_s73_col9 | number |
| partnerships[].amount_4W_threshold_for_s73_col10 | number |
| partnerships[].character_ordinary | number |
| partnerships[].character_tcg | number |
| partnerships[].line_200 | string |
| partnerships[].line_210 | string |
| partnerships[].line_220 | null \| string |
| partnerships[].line_225 | null \| string |
| partnerships[].line_230 | number |
| partnerships[].line_2A | number |
| partnerships[].line_2B | number |
| partnerships[].line_2C | number |
| partnerships[].line_2D | number |
| partnerships[].line_2E | number |
| partnerships[].line_2F | number |
| partnerships[].line_2G | number |
| partnerships[].line_2H | number |
| partnerships[].line_2I | number |
| partnerships[].line_2J | number |
| partnerships[].line_2K | number |
| partnerships[].line_2L | number |
| partnerships[].line_2M | number |
| partnerships[].line_3A | number |
| partnerships[].line_3B | number |
| partnerships[].line_3C | number |
| partnerships[].line_3D | number |
| partnerships[].line_3E | number |
| partnerships[].line_4A | number |
| partnerships[].line_4B | number |
| partnerships[].line_4C | number |
| partnerships[].line_4D | number |
| partnerships[].line_4E | number |
| partnerships[].line_4F | number |
| partnerships[].line_4G | number |
| partnerships[].line_4H | number |
| partnerships[].line_4I | number |
| partnerships[].line_4J | number |
| partnerships[].line_4K | number |
| partnerships[].line_4L | number |
| partnerships[].line_4M | number |
| partnerships[].line_4N | number |
| partnerships[].line_4O | number |
| partnerships[].line_4P | number |
| partnerships[].line_4Q | integer |
| partnerships[].line_4R | number |
| partnerships[].line_4S | number |
| partnerships[].line_4T | number |
| partnerships[].line_4U | number |
| partnerships[].line_4V | number |
| partnerships[].line_4W | number |
| partnerships[].prior_year_aspa_reversal_s342_4 | number |
| partnerships[].qti_reserve_addback_s342_12 | number |
| partnerships[].qti_reserve_deduction_s342_11 | number |
| partnerships[].reg_4301_a_rate_application.autoCalculated | boolean |
| partnerships[].reg_4301_a_rate_application.averageDailyRate | number |
| partnerships[].reg_4301_a_rate_application.status | string |
| partnerships[].character_active_business | number |
| partnerships[].character_breakdown_supplied | boolean |
| partnerships[].character_other | number |
| partnerships[].character_property | number |
| partnerships[].particular_period_end | null \| string |
| partnerships[].prior_year_aspa_reversal_tcg_s342_4 | array \| boolean \| null \| number \| object \| string |
| partnerships[].qti_reserve_addback_capital_s342_12_b | number |
| partnerships[].qti_reserve_deduction_capital_s342_11_b_ii | number |
| partnerships[].aspa_withheld_pending_s342_2_c_answer | number |
| provisional | boolean |
| ready | boolean |
| s343_3_inclusion | number |
| s343_3_safe_harbour_b | number |
| stickyMultiTierAfterStructureFlattens | boolean \| null |
| total_2M | number |
| total_3E | number |
| total_4T | number |
| total_4W | number |
| total_aspa_inclusion | number |
| total_income_shortfall | number |
| total_income_shortfall_raw_s343_1 | number |
| total_new_corp_member_inclusion | number |
| total_prior_year_aspa_reversal | number |
| total_qti_reserve_addback | number |
| total_qti_reserve_deduction | number |
| total_threshold | number |
| warnings[].box | array \| boolean \| null \| number \| object \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| wasSubjectToMultiTierAlignment | boolean \| null |
| prior_year_aspa_reversal_character_known | boolean |
| total_prior_year_aspa_reversal_tcg | number |
| total_aspa_withheld_pending_entitlement | number |

### Output cell notes

- `becameBankruptInYear`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isProfessionalCorp`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `isSingleTierPartnership`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `line_200`: Box 200, the partnership's name, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_210`: Box 210, the partnership's business number, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_220`: Box 220, the end of the last fiscal period ending in the year, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `line_225`: Box 225, the start of the particular period, taken from the first row. Null when the schedule has no partnership row to take it from, and null on a row whose own cell is unanswered; the unanswered cell is named in `missing_required`.
- `partnershipHasPartnershipMember`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `partnerships[].line_200`: Box 200, the partnership's name on this row. Empty when the row does not state it; the unstated cell is named in `missing_required` rather than filled in.
- `partnerships[].line_210`: Box 210, the partnership's business number on this row. Empty when the row does not state it; the unstated cell is named in `missing_required` rather than filled in.
- `partnerships[].line_220`: Box 220, the end of the last fiscal period ending in the year on this row. Null when the row does not state it.
- `partnerships[].line_225`: Box 225, the start of the particular period on this row. Null when the row does not state it; the unanswered cell is named in `missing_required`.
- `partnerships[].particular_period_end`: The end of the particular period on this row, which Schedule 73 reads as its box 140. Null when the row does not state it.
- `stickyMultiTierAfterStructureFlattens`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.
- `wasSubjectToMultiTierAlignment`: The caller's answer to this scope question, echoed back. Null when the request does not state it; the unanswered question is named in `missing_required` rather than read as No.

# schedule73

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2019 and later
- Strict profile: s73_2024_s71_s72_rollup_worked_example_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): schedule71, schedule72

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule73"
  ],
  "inputs": {
    "schedule71": {
      "becameBankruptInYear": false,
      "corpTaxYearEnd": "2025-12-31",
      "corpTaxYearStart": "2025-01-01",
      "isMultiTierPartnership": false,
      "isProfessionalCorp": false,
      "multiTierAlignmentYear1Suspension": false,
      "partnershipIsForeignAffiliateSurrogate": false,
      "partnerships": [
        {
          "continuousMembershipSinceBeforeMarch22_2011": true,
          "corpSharePercentage": 50,
          "particularPeriodEnd": "2026-01-31",
          "particularPeriodStart": "2025-02-01",
          "partnershipBN": "123456782RZ0001",
          "partnershipFYEndInYear": "2025-01-31",
          "partnershipFYStartInYear": "2024-02-01",
          "partnershipName": "Cedar Ridge Operations LP",
          "significantInterestConfirmed": true,
          "var_A_share_of_income_and_tcg": 1000000,
          "var_A_tcg_component": 0,
          "var_B_acl_component": 0,
          "var_B_share_of_loss_and_acl": 0,
          "var_E_designated_qre": 0,
          "var_F_discretionary": 0,
          "corpEntitledToShareAtParticularPeriodEnd": true,
          "var_A_active_business_component": 1000000,
          "var_A_property_component": 0,
          "var_A_other_component": 0
        }
      ]
    },
    "schedule72": {
      "becameBankruptInYear": false,
      "corpTaxYearEnd": "2025-12-31",
      "corpTaxYearStart": "2025-01-01",
      "isProfessionalCorp": false,
      "isSingleTierPartnership": false,
      "partnershipHasPartnershipMember": true,
      "partnershipIsForeignAffiliateSurrogate": false,
      "partnerships": [
        {
          "box_2A_income": 1000000,
          "box_2B_loss": 0,
          "box_2D_tcg": 0,
          "box_2E_acl": 0,
          "box_2J_designated_qre": 0,
          "box_2K_discretionary_designation": 0,
          "continuousMembershipSinceBeforeMarch22_2011": true,
          "corpSharePercentage": 50,
          "particularPeriodEnd": "2026-01-31",
          "particularPeriodStart": "2025-02-01",
          "partnershipBN": "222222226RZ0001",
          "partnershipFYEndInYear": "2025-01-31",
          "partnershipFYStartInYear": "2024-02-01",
          "partnershipName": "Cedar Ridge Multi-Tier LP",
          "significantInterestConfirmed": true,
          "corpEntitledToShareAtParticularPeriodEnd": true,
          "box_2A_active_business_component": 1000000,
          "box_2A_property_component": 0,
          "box_2A_other_component": 0
        }
      ],
      "preFirstAlignedFiscalPeriodSuspension": false,
      "stickyMultiTierAfterStructureFlattens": false,
      "wasSubjectToMultiTierAlignment": false
    },
    "schedule73": {
      "characterSplitOverrides": {
        "activeBusinessIncome": 1835616.44,
        "allowableCapitalLoss": 0,
        "otherIncome": 0,
        "propertyIncome": 0,
        "taxableCapitalGain": 0
      }
    },
    "taxYear": 2025
  }
}
```

## Input cells (83)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule71.becameBankruptInYear | boolean | strict |
| schedule71.corpTaxYearEnd | string | strict |
| schedule71.corpTaxYearStart | string | strict |
| schedule71.isMultiTierPartnership | boolean | strict |
| schedule71.isProfessionalCorp | boolean | strict |
| schedule71.multiTierAlignmentYear1Suspension | boolean | strict |
| schedule71.partnershipIsForeignAffiliateSurrogate | boolean | strict |
| schedule71.partnerships[].continuousMembershipSinceBeforeMarch22_2011 | boolean | strict |
| schedule71.partnerships[].corpEntitledToShareAtParticularPeriodEnd | boolean | strict |
| schedule71.partnerships[].corpSharePercentage | integer | strict |
| schedule71.partnerships[].particularPeriodEnd | string | strict |
| schedule71.partnerships[].particularPeriodStart | string | strict |
| schedule71.partnerships[].partnershipBN | string | strict |
| schedule71.partnerships[].partnershipFYEndInYear | string | strict |
| schedule71.partnerships[].partnershipFYStartInYear | string | strict |
| schedule71.partnerships[].partnershipName | string | strict |
| schedule71.partnerships[].significantInterestConfirmed | boolean | strict |
| schedule71.partnerships[].var_A_active_business_component | integer |  |
| schedule71.partnerships[].var_A_other_component | integer |  |
| schedule71.partnerships[].var_A_property_component | integer |  |
| schedule71.partnerships[].var_A_share_of_income_and_tcg | integer | strict |
| schedule71.partnerships[].var_A_tcg_component | integer | strict |
| schedule71.partnerships[].var_B_acl_component | integer | strict |
| schedule71.partnerships[].var_B_share_of_loss_and_acl | integer | strict |
| schedule71.partnerships[].var_E_designated_qre | integer | strict |
| schedule71.partnerships[].var_F_discretionary | integer | strict |
| schedule72.becameBankruptInYear | boolean | strict |
| schedule72.corpTaxYearEnd | string | strict |
| schedule72.corpTaxYearStart | string | strict |
| schedule72.isProfessionalCorp | boolean | strict |
| schedule72.isSingleTierPartnership | boolean | strict |
| schedule72.partnershipHasPartnershipMember | boolean | strict |
| schedule72.partnershipIsForeignAffiliateSurrogate | boolean | strict |
| schedule72.partnerships[].box_2A_active_business_component | integer |  |
| schedule72.partnerships[].box_2A_income | integer | strict |
| schedule72.partnerships[].box_2A_other_component | integer |  |
| schedule72.partnerships[].box_2A_property_component | integer |  |
| schedule72.partnerships[].box_2B_loss | integer | strict |
| schedule72.partnerships[].box_2D_tcg | integer | strict |
| schedule72.partnerships[].box_2E_acl | integer | strict |
| schedule72.partnerships[].box_2J_designated_qre | integer | strict |
| schedule72.partnerships[].box_2K_discretionary_designation | integer | strict |
| schedule72.partnerships[].continuousMembershipSinceBeforeMarch22_2011 | boolean | strict |
| schedule72.partnerships[].corpEntitledToShareAtParticularPeriodEnd | boolean | strict |
| schedule72.partnerships[].corpSharePercentage | integer | strict |
| schedule72.partnerships[].particularPeriodEnd | string | strict |
| schedule72.partnerships[].particularPeriodStart | string | strict |
| schedule72.partnerships[].partnershipBN | string | strict |
| schedule72.partnerships[].partnershipFYEndInYear | string | strict |
| schedule72.partnerships[].partnershipFYStartInYear | string | strict |
| schedule72.partnerships[].partnershipName | string | strict |
| schedule72.partnerships[].significantInterestConfirmed | boolean | strict |
| schedule72.preFirstAlignedFiscalPeriodSuspension | boolean | strict |
| schedule72.stickyMultiTierAfterStructureFlattens | boolean | strict |
| schedule72.wasSubjectToMultiTierAlignment | boolean | strict |
| schedule73.characterSplitOverrides | null \| object |  |
| schedule73.characterSplitOverrides.activeBusinessIncome | null \| number \| string | strict |
| schedule73.characterSplitOverrides.allowableCapitalLoss | null \| number | strict |
| schedule73.characterSplitOverrides.otherIncome | null \| number | strict |
| schedule73.characterSplitOverrides.propertyIncome | null \| number | strict |
| schedule73.characterSplitOverrides.taxableCapitalGain | null \| number | strict |
| schedule73.partnerships | array |  |
| schedule73.partnerships[].characterOrdinary | null \| number |  |
| schedule73.partnerships[].characterTCG | null \| number |  |
| schedule73.partnerships[].col10_threshold | null \| number |  |
| schedule73.partnerships[].col1_stubAccrual | null \| number |  |
| schedule73.partnerships[].col2_designatedQRE | null \| number |  |
| schedule73.partnerships[].col3_discretionary | null \| number |  |
| schedule73.partnerships[].col4CharacterActiveBusiness | null \| number |  |
| schedule73.partnerships[].col4CharacterOther | null \| number |  |
| schedule73.partnerships[].col4CharacterProperty | null \| number |  |
| schedule73.partnerships[].col6CharacterActiveBusiness | null \| number |  |
| schedule73.partnerships[].col6CharacterOther | null \| number |  |
| schedule73.partnerships[].col6CharacterProperty | null \| number |  |
| schedule73.partnerships[].col6CharacterTCG | null \| number |  |
| schedule73.partnerships[].col6_newMember | null \| number |  |
| schedule73.partnerships[].col9_shortfall | null \| number |  |
| schedule73.partnerships[].fiscalPeriodEnd | null \| string |  |
| schedule73.partnerships[].fiscalPeriodStart | null \| string |  |
| schedule73.partnerships[].multiTierFlag | null \| number |  |
| schedule73.partnerships[].partnershipBN | null \| string |  |
| schedule73.partnerships[].partnershipName | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule71.becameBankruptInYear`: s.34.2(7) carve-out: the corporation became bankrupt in the year, so neither the ASPA inclusion nor the s.34.2(3) new-partner designation applies.
- `schedule71.isMultiTierPartnership`: Scope check: the partnership is itself a member of another partnership (s.102(2), s.249.1(1)(c)); multi-tier partnerships use Schedule 72, not Schedule 71.
- `schedule71.isProfessionalCorp`: s.34.2(2) chapeau carve-out: a professional corporation accrues stub-period income under s.34.1 instead of the ASPA regime.
- `schedule71.multiTierAlignmentYear1Suspension`: s.34.2(9): ASPA is suspended for taxation years preceding the year that includes the end of the first aligned fiscal period.
- `schedule71.partnershipIsForeignAffiliateSurrogate`: s.34.2(8) carve-out: s.34.2 does not apply in computing FAPI or foreign-affiliate surplus; the accrual flows through the surplus computation instead.
- `schedule71.partnerships[].continuousMembershipSinceBeforeMarch22_2011`: s.34.2(13)(a) transitional condition: the corporation has been a member of the partnership continuously since before March 22, 2011; required for the qualifying transitional income reserve.
- `schedule71.partnerships[].corpEntitledToShareAtParticularPeriodEnd`: Whether, at the end of the year, the corporation is entitled to a share of the partnership's income, loss, taxable capital gain or allowable capital loss for the fiscal period — the ITA 34.2(2)(c) condition. Strict tri-state: true admits the row's ASPA, false applies the (2)(c) carveout and zeroes it, and an absent answer withholds the ASPA and blocks. The answer is a submitted practitioner fact and is not proof that the corporation was so entitled.
- `schedule71.partnerships[].significantInterestConfirmed`: Practitioner confirmation of the s.34.2(1) significant-interest test: the corporation, together with related or affiliated persons, holds more than 10 percent of the partnership's income entitlement.
- `schedule71.partnerships[].var_A_active_business_component`: The active-business share of this row's variable A character split. ITA 34.2(5)(a)(i) gives the adjusted stub period accrual the same character, in the same proportions, as the income the partnership allocated to the corporation — an allocation fact the corporation cannot infer. Send all three shares: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule71.partnerships[].var_A_other_component`: The other-income share of this row's variable A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule71.partnerships[].var_A_property_component`: The property-income share of this row's variable A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.becameBankruptInYear`: s.34.2(7) carve-out: the corporation became bankrupt in the year, so neither the ASPA inclusion nor the s.34.2(3) new-partner designation applies.
- `schedule72.isProfessionalCorp`: s.34.2(2) chapeau carve-out: a professional corporation accrues stub-period income under s.34.1 instead of the ASPA regime.
- `schedule72.isSingleTierPartnership`: Scope check: an explicitly single-tier partnership belongs on Schedule 71; only a formerly multi-tier structure kept here by the sticky form-face rule stays on Schedule 72.
- `schedule72.partnershipHasPartnershipMember`: The partnership has another partnership as a member (s.102(2), s.249.1(1)(c)); one of the facts that qualifies it as multi-tier for Schedule 72.
- `schedule72.partnershipIsForeignAffiliateSurrogate`: s.34.2(8) carve-out: s.34.2 does not apply in computing FAPI or foreign-affiliate surplus; the accrual flows through the surplus computation instead.
- `schedule72.partnerships[].box_2A_active_business_component`: The active-business share of this row's amount 2A character split. ITA 34.2(5)(a)(i) gives the adjusted stub period accrual the same character, in the same proportions, as the income the partnership allocated to the corporation — an allocation fact the corporation cannot infer. Send all three shares: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].box_2A_other_component`: The other-income share of this row's amount 2A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].box_2A_property_component`: The property-income share of this row's amount 2A character split, on the same ITA 34.2(5)(a)(i) terms as the active-business share. Send all three: an absent breakdown is UNKNOWN and blocks rather than filing the whole non-capital amount on T2 SCH 73 line 270.
- `schedule72.partnerships[].continuousMembershipSinceBeforeMarch22_2011`: s.34.2(13)(a) transitional condition: the corporation has been a member of the partnership continuously since before March 22, 2011; required for the qualifying transitional income reserve.
- `schedule72.partnerships[].corpEntitledToShareAtParticularPeriodEnd`: Whether, at the end of the year, the corporation is entitled to a share of the partnership's income, loss, taxable capital gain or allowable capital loss for the fiscal period — the ITA 34.2(2)(c) condition. Strict tri-state: true admits the row's ASPA, false applies the (2)(c) carveout and zeroes it, and an absent answer withholds the ASPA and blocks. The answer is a submitted practitioner fact and is not proof that the corporation was so entitled.
- `schedule72.partnerships[].significantInterestConfirmed`: Practitioner confirmation of the s.34.2(1) significant-interest test: the corporation, together with related or affiliated persons, holds more than 10 percent of the partnership's income entitlement.
- `schedule72.preFirstAlignedFiscalPeriodSuspension`: s.34.2(9): ASPA is suspended for taxation years before the first aligned fiscal period ends; the catch-up arrives as eligible alignment income in the alignment-end year.
- `schedule72.stickyMultiTierAfterStructureFlattens`: Form-face rule: a partnership that changed from multi-tier to single-tier stays on Schedule 72; set true to keep filing here after the structure flattens.
- `schedule72.wasSubjectToMultiTierAlignment`: The partnership was subject to a multi-tier alignment election; one of the facts that keeps it in Schedule 72 scope.
- `schedule73.characterSplitOverrides`: Manual character-split override (null = use the engine's auto split).
- `schedule73.characterSplitOverrides.activeBusinessIncome`: Line 270 — total active business income (can be negative).
- `schedule73.characterSplitOverrides.allowableCapitalLoss`: Line 285 — total allowable capital loss (non-negative; → S6 line 901).
- `schedule73.characterSplitOverrides.otherIncome`: Line 290 — total other income (can be negative).
- `schedule73.characterSplitOverrides.propertyIncome`: Line 280 — total property income (can be negative).
- `schedule73.characterSplitOverrides.taxableCapitalGain`: Line 275 — total taxable capital gain (non-negative; → S6 line 899).
- `schedule73.partnerships`: Standalone rows or same-identity assertions (empty in the normal flow).
- `schedule73.partnerships[].characterOrdinary`: The s.34.2(5)(a)(i) ordinary (non-capital) character of this row's column 4 — the total the three component cells below must exhaust across lines 270 / 280 / 290. It has no printed per-row box of its own. null is NOT STATED rather than nil: state it with none of the three components and the row's non-capital column 4 is withheld from those lines instead of defaulting onto line 270 as active business income. Send all three components with it — a partial split overstates line 270.
- `schedule73.partnerships[].characterTCG`: The s.34.2(5)(a)(i) taxable-capital-gain share of this row's column 4 (line 275 → S6 line 899), not column 6's — send column 6's share as `col6CharacterTCG`. Line 275 must be non-negative. null is NOT STATED and no other cell can state this gain, but unlike the ordinary side it is never withheld: line 275 carries the share even while the row's ordinary split is unknown.
- `schedule73.partnerships[].col10_threshold`: Column 10 (box 310) — threshold amount (4W).
- `schedule73.partnerships[].col1_stubAccrual`: Column 1 (box 200) — stub period accrual (S71/S72 amount 2I).
- `schedule73.partnerships[].col2_designatedQRE`: Column 2 (box 205) — designated qualified resource expenses (2J).
- `schedule73.partnerships[].col3_discretionary`: Column 3 (box 210) — discretionary amount designated (2K).
- `schedule73.partnerships[].col4CharacterActiveBusiness`: The s.34.2(5)(a)(i) active-business component of this row's column 4 (line 270 share). No printed per-row box. null is NOT STATED, not zero: a row carrying non-capital column-4 inclusion with no split behind it blocks at error severity and its amount is withheld from lines 270 / 280 / 290 rather than defaulted onto line 270 as active business income.
- `schedule73.partnerships[].col4CharacterOther`: s.34.2(5)(a)(i) character of column 4 — other-income component (line 290 share; engine key `col4CharacterOther`). null = not stated, not zero. The three components must exhaust the row's non-capital column 4; the lines 270+275+280-285+290 tie-out enforces that.
- `schedule73.partnerships[].col4CharacterProperty`: s.34.2(5)(a)(i) character of column 4 — property component (line 280 share; engine key `col4CharacterProperty`). null = not stated, not zero.
- `schedule73.partnerships[].col6CharacterActiveBusiness`: s.34.2(5)(a)(ii) character of column 6: active-business component (line 270 share). null is not stated, not zero.
- `schedule73.partnerships[].col6CharacterOther`: s.34.2(5)(a)(ii) character of column 6: other-income component (line 290 share). The four components must exhaust column 6.
- `schedule73.partnerships[].col6CharacterProperty`: s.34.2(5)(a)(ii) character of column 6: property-income component (line 280 share). null is not stated, not zero.
- `schedule73.partnerships[].col6CharacterTCG`: s.34.2(5)(a)(ii) character of column 6: taxable-capital-gain component (line 275 share). null is not stated, not zero.
- `schedule73.partnerships[].col6_newMember`: Column 6 (box 225) — income inclusion for a new corporate member (3E).
- `schedule73.partnerships[].col9_shortfall`: Column 9 (box 300) — income shortfall adjustment (4T).
- `schedule73.partnerships[].fiscalPeriodEnd`: Box 140 — fiscal period-end (YYYY-MM-DD).
- `schedule73.partnerships[].fiscalPeriodStart`: Box 130 — fiscal period-start (YYYY-MM-DD).
- `schedule73.partnerships[].multiTierFlag`: Box 150 — part of a multi-tiered structure: 1 = yes, 2 = no.
- `schedule73.partnerships[].partnershipBN`: Box 100 — partnership account number (9-digit BN / 15-char RZ / 'NR'). 'NR' is not unique; same-year matching also requires name, dates, and tier.
- `schedule73.partnerships[].partnershipName`: Box 110 — partnership's name.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (42 of 83 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule71.corpTaxYearEnd | 0 to 20000 characters |
| schedule71.corpTaxYearStart | 0 to 20000 characters |
| schedule71.partnerships[].corpSharePercentage | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].particularPeriodEnd | 0 to 20000 characters |
| schedule71.partnerships[].particularPeriodStart | 0 to 20000 characters |
| schedule71.partnerships[].partnershipBN | 0 to 20000 characters |
| schedule71.partnerships[].partnershipFYEndInYear | 0 to 20000 characters |
| schedule71.partnerships[].partnershipFYStartInYear | 0 to 20000 characters |
| schedule71.partnerships[].partnershipName | 0 to 20000 characters |
| schedule71.partnerships[].var_A_active_business_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_other_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_property_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_share_of_income_and_tcg | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_A_tcg_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_B_acl_component | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_B_share_of_loss_and_acl | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_E_designated_qre | -1000000000000000 to 1000000000000000 |
| schedule71.partnerships[].var_F_discretionary | -1000000000000000 to 1000000000000000 |
| schedule72.corpTaxYearEnd | 0 to 20000 characters |
| schedule72.corpTaxYearStart | 0 to 20000 characters |
| schedule72.partnerships[].box_2A_active_business_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2A_income | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2A_other_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2A_property_component | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2B_loss | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2D_tcg | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2E_acl | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2J_designated_qre | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].box_2K_discretionary_designation | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].corpSharePercentage | -1000000000000000 to 1000000000000000 |
| schedule72.partnerships[].particularPeriodEnd | 0 to 20000 characters |
| schedule72.partnerships[].particularPeriodStart | 0 to 20000 characters |
| schedule72.partnerships[].partnershipBN | 0 to 20000 characters |
| schedule72.partnerships[].partnershipFYEndInYear | 0 to 20000 characters |
| schedule72.partnerships[].partnershipFYStartInYear | 0 to 20000 characters |
| schedule72.partnerships[].partnershipName | 0 to 20000 characters |
| schedule73.characterSplitOverrides.activeBusinessIncome | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule73.characterSplitOverrides.allowableCapitalLoss | -1000000000000000 to 1000000000000000 |
| schedule73.characterSplitOverrides.otherIncome | -1000000000000000 to 1000000000000000 |
| schedule73.characterSplitOverrides.propertyIncome | -1000000000000000 to 1000000000000000 |
| schedule73.characterSplitOverrides.taxableCapitalGain | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (86)

| Cell | Types |
| --- | --- |
| amount_320_subtotal | number |
| amount_3A | number |
| amount_3B | number |
| amount_3C | number |
| character_split_total | number |
| fired_gates | object |
| line_100 | null \| string |
| line_110 | null \| string |
| line_130 | null \| string |
| line_140 | null \| string |
| line_150 | integer \| null |
| line_200 | number |
| line_205 | number |
| line_210 | number |
| line_215 | number |
| line_220 | number |
| line_225 | number |
| line_230 | number |
| line_260 | number |
| line_270 | number |
| line_275 | number |
| line_280 | number |
| line_285 | number |
| line_290 | number |
| line_300 | number |
| line_310 | number |
| line_320 | number |
| missing_required | array |
| partnerships[]._source | string |
| partnerships[].line_100 | string |
| partnerships[].line_110 | string |
| partnerships[].line_130 | string |
| partnerships[].line_140 | string |
| partnerships[].line_150 | integer |
| partnerships[].line_200 | number |
| partnerships[].line_205 | number |
| partnerships[].line_210 | number |
| partnerships[].line_215 | number |
| partnerships[].line_220 | number |
| partnerships[].line_225 | number |
| partnerships[].line_230 | number |
| partnerships[].line_260 | number |
| partnerships[].inclusion_char_active_business | number |
| partnerships[].inclusion_char_other | number |
| partnerships[].inclusion_char_property | number |
| partnerships[].inclusion_char_tcg | number |
| provisional | boolean |
| ready | boolean |
| s1_line_130_feed | number |
| s1_line_131_feed | number |
| s6_line_899_feed | number |
| s6_line_901_feed | number |
| shortfall_rows | array |
| total_col_1 | number |
| total_col_10 | number |
| total_col_2 | number |
| total_col_3 | number |
| total_col_4_aspa | number |
| total_col_5_prior_year_aspa | number |
| total_col_6_new_member | number |
| total_col_7_prior_year_new_member | number |
| total_col_8_net | number |
| total_col_9 | number |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| qti_reserve_addback_capital_s342_12_b | number |
| qti_reserve_addback_s342_12_total | number |
| qti_reserve_deduction_capital_s342_11_b_ii | number |
| qti_reserve_deduction_s342_11_total | number |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule74

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s74_exact_single_request_target_value_v1
- Payload schema version: 0.10.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule74"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule74": {
      "isCanadianCorporation": "Y",
      "isExemptFromTaxUnderPartI": "N",
      "nrcanProjectCode": "NRCAN-PUBLIC-74",
      "firstDayComplianceperiod": "2025-01-01",
      "projectExpectedCarbonIntensity": 0.5,
      "isTaxShelterInvestment": "N",
      "part1Rows": [
        {
          "propertyIdentifier": "FA-74-0001",
          "ccaClassNumber": "43.1",
          "assetCode": "01",
          "provinceOrTerritory": "AB",
          "acquisitionDate": "2024-11-01",
          "availableForUseDate": "2025-06-15",
          "designatedWorkSites": "WS-74",
          "capitalCost": 100000,
          "adjustments": 0,
          "electingLabourRequirements": "Y",
          "otherCleanEconomyCreditClaimedOnProperty": "N",
          "percentageForHydrogenProduction": 1,
          "percentageForAmmoniaProduction": 0,
          "preparedOrInstalledDate": "2025-06-15",
          "previouslyUsedOrAcquiredForUseOrLease": "N"
        }
      ],
      "signingOfficerFirstName": "Jane",
      "signingOfficerLastName": "Smith",
      "signingOfficerPosition": "CFO",
      "attestationDate": "2025-12-01",
      "metLabourRequirements": "Y"
    }
  }
}
```

## Input cells (99)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string |  |
| fiscalStart | string |  |
| schedule74.apprenticeHoursActual | null \| number |  |
| schedule74.apprenticeHoursRequired | null \| number |  |
| schedule74.attestationDate | null \| string | strict |
| schedule74.dateOfPurchase | null \| string |  |
| schedule74.dateOfSale | null \| string |  |
| schedule74.daysBelowPrevailingWage | null \| number |  |
| schedule74.eligiblePathway | null \| string |  |
| schedule74.firstDayComplianceperiod | null \| string |  |
| schedule74.firstDayHydrogenProduced | null \| string |  |
| schedule74.firstElectionDelay | null \| string |  |
| schedule74.isCanadianCorporation | null \| string |  |
| schedule74.isExemptFromTaxUnderPartI | null \| string |  |
| schedule74.isTaxShelterInvestment | null \| string |  |
| schedule74.lastAnnualCiReportDate | null \| string |  |
| schedule74.line190PartnershipAllocatedItc | null \| number |  |
| schedule74.line335PartnershipAllocatedLabourAddition | null \| number |  |
| schedule74.line645PartnershipAllocatedRecapture | null \| number |  |
| schedule74.line700ExpectedCarbonIntensity | null \| number |  |
| schedule74.line705ComplianceperiodEndedDate | null \| string |  |
| schedule74.line710AverageActualCarbonIntensity | null \| number |  |
| schedule74.line715FiledRevisedPlan | null \| string |  |
| schedule74.line720DeemedAverageActualCarbonIntensity | null \| number |  |
| schedule74.line760PartnershipAllocatedRecoveryTax | null \| number |  |
| schedule74.metLabourRequirements | null \| string |  |
| schedule74.nrcanProjectCode | null \| string | strict |
| schedule74.part1Rows | array |  |
| schedule74.part1Rows[].acquisitionDate | null \| string | strict |
| schedule74.part1Rows[].adjustments | null \| number | strict |
| schedule74.part1Rows[].amountEligibleForItc | null \| number |  |
| schedule74.part1Rows[].assetCode | null \| string | strict |
| schedule74.part1Rows[].assistanceRepaid | null \| number |  |
| schedule74.part1Rows[].availableForUseDate | null \| string | strict |
| schedule74.part1Rows[].capitalCost | null \| number | strict |
| schedule74.part1Rows[].ccaClassNumber | null \| string | strict |
| schedule74.part1Rows[].cleanHydrogenItcAmount | null \| number |  |
| schedule74.part1Rows[].cleanHydrogenPortion | null \| number |  |
| schedule74.part1Rows[].designatedWorkSites | null \| string | strict |
| schedule74.part1Rows[].electingLabourRequirements | null \| string | strict |
| schedule74.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | null \| string | strict |
| schedule74.part1Rows[].percentageForAmmoniaProduction | null \| number |  |
| schedule74.part1Rows[].percentageForHydrogenProduction | null \| number | strict |
| schedule74.part1Rows[].percentageForQualifiedProject | null \| number |  |
| schedule74.part1Rows[].preparedOrInstalledDate | null \| string |  |
| schedule74.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | null \| string | strict |
| schedule74.part1Rows[].propertyIdentifier | null \| string |  |
| schedule74.part1Rows[].provinceOrTerritory | null \| string | strict |
| schedule74.part1Rows[].specifiedPercentageAmmonia | null \| number |  |
| schedule74.part1Rows[].specifiedPercentageHydrogen | null \| number |  |
| schedule74.part4Rows | array |  |
| schedule74.part4Rows[].daysNotOperating | null \| number |  |
| schedule74.part4Rows[].endDate | null \| string |  |
| schedule74.part4Rows[].operatingYear | number |  |
| schedule74.part4Rows[].startDate | null \| string |  |
| schedule74.part6Rows | array |  |
| schedule74.part6Rows[].adjustedItc | null \| number |  |
| schedule74.part6Rows[].assetCode | null \| string |  |
| schedule74.part6Rows[].availableForUseDate | null \| string |  |
| schedule74.part6Rows[].capitalCost | null \| number |  |
| schedule74.part6Rows[].ccaClassNumber | null \| string |  |
| schedule74.part6Rows[].cleanHydrogenItcRecaptured | null \| number |  |
| schedule74.part6Rows[].originalCleanHydrogenItcAmount | null \| number |  |
| schedule74.part6Rows[].priorRecoveryTaxPaid | null \| number |  |
| schedule74.part6Rows[].proceedsOrFmv | null \| number |  |
| schedule74.part6Rows[].provinceOrTerritory | null \| string |  |
| schedule74.part7Rows | array |  |
| schedule74.part7Rows[].assetCode | null \| string |  |
| schedule74.part7Rows[].availableForUseDate | null \| string |  |
| schedule74.part7Rows[].capitalCost | null \| number |  |
| schedule74.part7Rows[].ccaClassNumber | null \| string |  |
| schedule74.part7Rows[].electingLabourRequirements | null \| string |  |
| schedule74.part7Rows[].preparedOrInstalledDate | null \| string |  |
| schedule74.part7Rows[].provinceOrTerritory | null \| string |  |
| schedule74.part7Rows[].recoveryTax | null \| number |  |
| schedule74.part7Rows[].specifiedPercentageUsed | null \| number |  |
| schedule74.part7Rows[].specifiedPercentageWouldApply | null \| number |  |
| schedule74.priorYearRegularRateClaimForInstallationYear | null \| string |  |
| schedule74.projectExpectedCarbonIntensity | null \| number | strict |
| schedule74.purchaserBusinessNumber | null \| string |  |
| schedule74.purchaserElectionTick | null \| string |  |
| schedule74.purchaserName | null \| string |  |
| schedule74.purchaserSignedDate | null \| string |  |
| schedule74.purchaserSigningOfficer | null \| string |  |
| schedule74.secondElectionDelay | null \| string |  |
| schedule74.signingOfficerFirstName | null \| string | strict |
| schedule74.signingOfficerLastName | null \| string | strict |
| schedule74.signingOfficerPosition | null \| string | strict |
| schedule74.signingOfficerTelephone | null \| string |  |
| schedule74.submittedFinalDesigns | null \| string |  |
| schedule74.taxationYearEndDate | null \| string |  |
| schedule74.taxationYearStartDate | null \| string |  |
| schedule74.vendorBusinessNumber | null \| string |  |
| schedule74.vendorElectionTick | null \| string |  |
| schedule74.vendorName | null \| string |  |
| schedule74.vendorSignedDate | null \| string |  |
| schedule74.vendorSigningOfficer | null \| string |  |
| schedule74.workersBelowPrevailingWageCount | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule74.firstDayComplianceperiod`: Line 105: the first day of the project's compliance period. Required before the s.127.48(30) post-compliance carbon-intensity substitution can be tested for any acquired property.
- `schedule74.isCanadianCorporation`: s.89(1) claimant fact: the corporation is a Canadian corporation. With isExemptFromTaxUnderPartI it establishes the qualifying taxpayer (a taxable Canadian corporation) the clean-economy credit definitions require; unanswered, the engine refuses the credit.
- `schedule74.isExemptFromTaxUnderPartI`: s.89(1) claimant fact: whether the corporation is exempt from Part I tax. 'N' with isCanadianCorporation 'Y' establishes the qualifying taxpayer; unanswered, the engine refuses the credit.
- `schedule74.isTaxShelterInvestment`: s.127.48(14) — is the eligible clean hydrogen property (or an interest in a person or partnership that has an interest in it) a tax shelter investment for the purpose of s.143.2? "Y" denies the credit on every Part 1 row and blocks the filing. No CRA box; tri-state with null = unanswered.
- `schedule74.line710AverageActualCarbonIntensity`: Line 710. Required for a Part 1 property acquired after the compliance period even when no Part 7 recovery-tax row is filed.
- `schedule74.metLabourRequirements`: Part 3 line-300 answer confirming that the elected prevailing-wage and apprenticeship requirements were met.
- `schedule74.part1Rows[].acquisitionDate`: The real acquisition date (ISO YYYY-MM-DD). Paragraph (a) of the s.127.48(1) "eligible clean hydrogen property" definition tests acquisition and available-for-use separately, so the AFU date alone cannot establish the acquisition limb. No CRA box — an engine operand, like the Part 6/7 AFU dates. Absent, the row blocks with a box-120 error; supplied, s.127.48(5) picks the later of the two dates to select the specified-percentage bracket.
- `schedule74.part1Rows[].adjustments`: T2 SCH 74 Part 1 column 1G: government and non-government assistance in respect of the property that was received, is receivable, or can reasonably be expected. ITA 127.48(10)(c) reduces the capital cost the credit runs on by that total, so the amount is established before the credit is computed. Enter 0 when there is none; a blank is not a nil and holds the row's credit at zero.
- `schedule74.part1Rows[].assistanceRepaid`: Column 1H — assistance repaid or no longer reasonably expected (s.127.48(11)). INCREASES the amount eligible for ITC. Blank is the ordinary "nothing was repaid" state; an unreadable entry blocks.
- `schedule74.part1Rows[].otherCleanEconomyCreditClaimedOnProperty`: Was an investment tax credit or any other clean economy tax credit deducted on this property by any person? ITA 127.48(10)(a)(ii) allows one clean economy credit per property, and a competing claim can sit on another taxpayer's return, so only an explicit N admits the row.
- `schedule74.part1Rows[].percentageForAmmoniaProduction`: Column 1M: the expected-use percentage allocated to ammonia production. Both s.127.48(10)(g) allocation legs must be readable - an explicit zero, never a blank.
- `schedule74.part1Rows[].percentageForHydrogenProduction`: Column 1L. Enter explicitly, including 0, unless code 06 proves the statutory sole-ammonia use.
- `schedule74.part1Rows[].preparedOrInstalledDate`: The date preparation or installation of the property was COMPLETED (ISO YYYY-MM-DD). The s.127.46(1) "installation taxation year" operand, and the only date that decides whether the labour requirements reach the property — the available-for-use date is not a substitute for it. No CRA box — an engine operand, the same one Schedule 75 and Schedule 78 collect. Blank blocks a claiming row; there is no fallback.
- `schedule74.part1Rows[].previouslyUsedOrAcquiredForUseOrLease`: Had the property been used, or acquired for use or lease, by any person or partnership for any purpose before the corporation acquired it? Paragraph (b) of the ITA 127.48(1) definition of eligible clean hydrogen property requires previously unused property, so an explicit N is what admits the row. The prescribed form prints no column for it, which does not make the definition optional.
- `schedule74.part1Rows[].propertyIdentifier`: Free-text asset key shared with the other clean-economy Part 1 grids. Use the SAME key on every clean-economy schedule for the same asset: matching normalizes case and whitespace only, never a partial match. No CRA box — it exists so one property carrying a clean-economy credit on two schedules is detected, which s.127.48(10)(a)(ii) and the parallel s.127.45(5)(a)(ii) / s.127.49(5)(a)(ii) forbid.
- `schedule74.part7Rows[].electingLabourRequirements`: The row's s.127.46(2) labour-requirements election, on the same terms as the Part 1 column 1Q answer. The s.127.48(18) counterfactual varies the carbon intensity alone and holds the labour status constant, so column 7F mirrors this answer. Unanswered leaves 7F at the regular rate and reports the status as unproven rather than inventing one. No CRA box — an engine operand.
- `schedule74.part7Rows[].preparedOrInstalledDate`: The date preparation or installation of the property was COMPLETED (ISO YYYY-MM-DD; slashes tolerated). The s.127.46(1) "installation taxation year" operand, and the only date that decides whether the labour requirements reach the property at all: a date before the 2023-11-27 cutover puts the property outside s.127.46 entirely, so the election answer cannot change column 7F. A malformed value is treated as unproven, never as the cutover date. The same operand the Part 1 grid collects. No CRA box.
- `schedule74.priorYearRegularRateClaimForInstallationYear`: s.127.46(6)/(7) assess the addition in the INSTALLATION taxation year for a credit claimed at the regular rate "in a taxation year" — which need not be this one. Current Part 1 rows cannot prove an earlier year's claim, so the corporation states it. Unanswered holds lines 315/330.
- `schedule74.taxationYearStartDate`: Taxation-year bounds (ISO YYYY-MM-DD). They gate every Part 1 s.127.48 date against the real taxation period rather than its calendar label, and they drive the s.127.46(8) proration of the Part 3 additions to tax. Read-only display, never a preparer entry: the server imposes the return's own fiscalStart/fiscalEnd and blocks a blob carrying a different period. No CRA box.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (39 of 99 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule74.attestationDate | 1 to 10 characters |
| schedule74.firstDayComplianceperiod | 0 to 20000 characters |
| schedule74.firstElectionDelay | one of "Y", "N" |
| schedule74.isCanadianCorporation | one of "Y", "N", null |
| schedule74.isExemptFromTaxUnderPartI | one of "Y", "N", null |
| schedule74.isTaxShelterInvestment | one of "Y", "N", null |
| schedule74.line715FiledRevisedPlan | one of "Y", "N" |
| schedule74.metLabourRequirements | one of "Y", "N", null |
| schedule74.nrcanProjectCode | 1 to 15 characters |
| schedule74.part1Rows[].acquisitionDate | 1 to 10 characters |
| schedule74.part1Rows[].adjustments | -1000000000000000 to 1000000000000000 |
| schedule74.part1Rows[].assetCode | one of "01", "02", "03", "04", "05", "06", "07", "08", "09", null |
| schedule74.part1Rows[].availableForUseDate | 1 to 10 characters |
| schedule74.part1Rows[].capitalCost | -1000000000000000 to 1000000000000000 |
| schedule74.part1Rows[].ccaClassNumber | 1 to 4 characters |
| schedule74.part1Rows[].designatedWorkSites | 1 to 5 characters |
| schedule74.part1Rows[].electingLabourRequirements | one of "Y", "N", null |
| schedule74.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | one of "Y", "N", null |
| schedule74.part1Rows[].percentageForAmmoniaProduction | -1000000000000000 to 1000000000000000 |
| schedule74.part1Rows[].percentageForHydrogenProduction | -1000000000000000 to 1000000000000000 |
| schedule74.part1Rows[].preparedOrInstalledDate | 0 to 20000 characters |
| schedule74.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | one of "Y", "N", null |
| schedule74.part1Rows[].propertyIdentifier | 1 to 10 characters |
| schedule74.part1Rows[].provinceOrTerritory | 1 to 2 characters |
| schedule74.part6Rows[].assetCode | one of "01", "02", "03", "04", "05", "06", "07", "08", "09" |
| schedule74.part7Rows[].assetCode | one of "01", "02", "03", "04", "05", "06", "07", "08", "09" |
| schedule74.part7Rows[].electingLabourRequirements | one of "Y", "N" |
| schedule74.priorYearRegularRateClaimForInstallationYear | one of "Y", "N" |
| schedule74.projectExpectedCarbonIntensity | -1000000000000000 to 1000000000000000 |
| schedule74.purchaserElectionTick | one of "Y", "N" |
| schedule74.secondElectionDelay | one of "Y", "N" |
| schedule74.signingOfficerFirstName | 1 to 4 characters |
| schedule74.signingOfficerLastName | 1 to 5 characters |
| schedule74.signingOfficerPosition | 1 to 3 characters |
| schedule74.submittedFinalDesigns | one of "Y", "N" |
| schedule74.vendorElectionTick | one of "Y", "N" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (134)

| Cell | Types |
| --- | --- |
| line_099 | null \| string |
| line_100 | array \| boolean \| null \| number \| object \| string |
| line_101 | array \| boolean \| null \| number \| object \| string |
| line_102 | array \| boolean \| null \| number \| object \| string |
| line_103 | array \| boolean \| null \| number \| object \| string |
| line_104 | array \| boolean \| null \| number \| object \| string |
| line_105 | null \| string |
| line_106 | null \| string |
| line_110 | null \| string |
| line_115 | null \| string |
| line_120 | null \| string |
| line_125 | null \| string |
| line_130 | number |
| line_135 | number |
| line_140 | number |
| line_145 | number |
| line_150 | number |
| line_155 | number |
| line_160 | number |
| line_165 | number |
| line_170 | number |
| line_175 | number |
| line_180 | number |
| line_185 | null \| string |
| line_190 | number |
| line_195 | number |
| part1Rows[].propertyIdentifier | null \| string |
| part1Rows[].ccaClassNumber | null \| string |
| part1Rows[].assetCode | null \| string |
| part1Rows[].provinceOrTerritory | null \| string |
| part1Rows[].availableForUseDate | null \| string |
| part1Rows[].designatedWorkSites | null \| string |
| part1Rows[].capitalCost | number |
| part1Rows[].adjustments | number |
| part1Rows[].assistanceRepaid | number |
| part1Rows[].amountEligibleForItc | number |
| part1Rows[].percentageForQualifiedProject | number |
| part1Rows[].cleanHydrogenPortion | number |
| part1Rows[].percentageForHydrogenProduction | number |
| part1Rows[].percentageForAmmoniaProduction | number |
| part1Rows[].specifiedPercentageHydrogen | number |
| part1Rows[].specifiedPercentageAmmonia | number |
| part1Rows[].cleanHydrogenItcAmount | number |
| part1Rows[].electingLabourRequirements | null \| string |
| part1Rows[]._labourReductionApplied | boolean |
| line_200 | null \| string |
| line_201 | null \| string |
| line_202 | null \| string |
| line_203 | null \| string |
| line_204 | array \| boolean \| null \| number \| object \| string |
| line_300 | null \| string |
| line_305 | number |
| line_310 | number |
| line_315 | number |
| line_320 | number |
| line_325 | number |
| line_330 | number |
| line_335 | number |
| line_340 | number |
| line_400 | array \| boolean \| null \| number \| object \| string |
| line_401 | number |
| line_402 | array \| boolean \| null \| number \| object \| string |
| line_403 | array \| boolean \| null \| number \| object \| string |
| part4Rows | array |
| line_500 | array \| boolean \| null \| number \| object \| string |
| line_501 | array \| boolean \| null \| number \| object \| string |
| line_502 | array \| boolean \| null \| number \| object \| string |
| line_503 | array \| boolean \| null \| number \| object \| string |
| line_504 | array \| boolean \| null \| number \| object \| string |
| line_505 | array \| boolean \| null \| number \| object \| string |
| line_506 | array \| boolean \| null \| number \| object \| string |
| line_507 | array \| boolean \| null \| number \| object \| string |
| line_508 | array \| boolean \| null \| number \| object \| string |
| line_509 | array \| boolean \| null \| number \| object \| string |
| line_510 | array \| boolean \| null \| number \| object \| string |
| line_511 | array \| boolean \| null \| number \| object \| string |
| line_600 | array \| boolean \| null \| number \| object \| string |
| line_605 | array \| boolean \| null \| number \| object \| string |
| line_610 | array \| boolean \| null \| number \| object \| string |
| line_615 | number |
| line_620 | number |
| line_625 | number |
| line_630 | number |
| line_635 | number |
| line_640 | number |
| line_645 | number |
| line_650 | number |
| part6Rows | array |
| line_700 | number |
| line_705 | array \| boolean \| null \| number \| object \| string |
| line_710 | number |
| line_715 | array \| boolean \| null \| number \| object \| string |
| line_720 | number |
| line_725 | array \| boolean \| null \| number \| object \| string |
| line_730 | array \| boolean \| null \| number \| object \| string |
| line_735 | array \| boolean \| null \| number \| object \| string |
| line_740 | number |
| line_745 | number |
| line_750 | number |
| line_755 | number |
| line_760 | number |
| line_765 | number |
| part7Rows | array |
| total_itc_line_195 | number |
| total_labour_addition_line_340 | number |
| total_recapture_line_650 | number |
| total_recovery_tax_line_765 | number |
| s31_feed_clean_hydrogen_itc | number |
| s31_feed_clean_hydrogen_clawback | number |
| t2_line_580_feed_labour_addition | number |
| warnings[].box | string |
| warnings[].anchor_field | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.verified_at | string |
| warnings[].anchor_row | string |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| missing_required[] | string |
| recovery_tax_assessment_year_unproven | boolean |
| amount_a_total_col_1p | number |
| amount_b_total_col_6i | number |
| amount_c_total_col_7g | number |

# schedule75

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023 and later
- Strict profile: s75_exact_single_request_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule75"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule75": {
      "isTaxShelterInvestment": "N",
      "isCanadianCorporation": "Y",
      "isExemptFromTaxUnderPartI": "N",
      "part1Rows": [
        {
          "propertyIdentifier": "FA-75-0001",
          "ccaClassNumber": "43.2",
          "cleanTechPropertyParagraphDRoute": "d_i",
          "isTestWindTurbine": "N",
          "cleanTechPropertyDescription": "Rooftop solar photovoltaic system",
          "acquisitionDate": "2025-06-15",
          "availableForUseDate": "2025-06-15",
          "preparedOrInstalledDate": "2025-04-15",
          "designatedWorkSites": "WS-75",
          "capitalCost": 100000,
          "adjustments": 0,
          "situatedAndUsedExclusivelyInCanada": "Y",
          "previouslyUsedOrAcquiredForUseOrLease": "N",
          "leasedToAnotherPerson": "N",
          "substantialEnvironmentalNonCompliance": "N",
          "otherCleanEconomyCreditClaimedOnProperty": "N",
          "electingLabourRequirements": "Y"
        }
      ],
      "part2Rows": [
        {
          "ccaClassNumber": "43.2",
          "availableForUseDate": "2025-02-01",
          "originalItcAmount": 3000,
          "proceedsOrFmv": 4000,
          "capitalCost": 10000
        }
      ],
      "part5Rows": [
        {
          "partnershipName": "Cedar Ridge Energy LP",
          "partnershipAccountNumber": "123456789RZ0001",
          "itcAllocated": 2500,
          "itcRecaptureAllocated": 0,
          "labourAdditionAllocated": 0
        }
      ],
      "signingOfficerLastName": "Smith",
      "signingOfficerFirstName": "Jane",
      "signingOfficerPosition": "CFO",
      "attestationDate": "2025-12-01",
      "metLabourRequirements": "Y"
    }
  }
}
```

## Input cells (85)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string |  |
| fiscalStart | string |  |
| schedule75.apprenticeHoursActual | null \| number |  |
| schedule75.apprenticeHoursRequired | null \| number |  |
| schedule75.apprenticeshipRequirementsAdditionToTax | null \| number |  |
| schedule75.attestationDate | null \| string | strict |
| schedule75.daysBelowPrevailingWage | null \| number |  |
| schedule75.isCanadianCorporation | boolean \| null \| number \| string | strict |
| schedule75.isExemptFromTaxUnderPartI | boolean \| null \| number \| string | strict |
| schedule75.isRealEstateInvestmentTrustMutualFundTrust | boolean \| null \| number \| string |  |
| schedule75.isTaxShelterInvestment | null \| string |  |
| schedule75.line160PartnershipAllocatedItc | null \| number |  |
| schedule75.line240PartnershipAllocatedRecapture | null \| number |  |
| schedule75.line425PartnershipAllocatedLabourAddition | null \| number |  |
| schedule75.metLabourRequirements | null \| string | strict |
| schedule75.part1Rows | array |  |
| schedule75.part1Rows[].acquisitionDate | null \| string |  |
| schedule75.part1Rows[].adjustments | null \| number | strict |
| schedule75.part1Rows[].amountEligibleForItc | null \| number |  |
| schedule75.part1Rows[].assistanceRepaid | null \| number |  |
| schedule75.part1Rows[].availableForUseDate | null \| string | strict |
| schedule75.part1Rows[].capitalCost | null \| number | strict |
| schedule75.part1Rows[].ccaClassNumber | null \| string | strict |
| schedule75.part1Rows[].claimsClass431ElectricalStorage | null \| string |  |
| schedule75.part1Rows[].claimsEligibleTransmissionEquipment | null \| string |  |
| schedule75.part1Rows[].class431Subparagraph | null \| string |  |
| schedule75.part1Rows[].cleanTechAssetCode | null \| string |  |
| schedule75.part1Rows[].cleanTechItcAmount | null \| number |  |
| schedule75.part1Rows[].cleanTechPropertyDescription | null \| string |  |
| schedule75.part1Rows[].cleanTechPropertyParagraphDRoute | string |  |
| schedule75.part1Rows[].designatedWorkSites | null \| string | strict |
| schedule75.part1Rows[].electingLabourRequirements | null \| string | strict |
| schedule75.part1Rows[].eligibleGenerationEnergyTransmittedPct | null \| number |  |
| schedule75.part1Rows[].isBuilding | null \| string |  |
| schedule75.part1Rows[].isTestWindTurbine | null \| string |  |
| schedule75.part1Rows[].leaseMeetsQualifyingLesseeConditions | null \| string |  |
| schedule75.part1Rows[].leasedToAnotherPerson | null \| string | strict |
| schedule75.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | null \| string | strict |
| schedule75.part1Rows[].preparedOrInstalledDate | null \| string |  |
| schedule75.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | null \| string | strict |
| schedule75.part1Rows[].propertyIdentifier | null \| string |  |
| schedule75.part1Rows[].provinceOrTerritory | null \| string |  |
| schedule75.part1Rows[].situatedAndUsedExclusivelyInCanada | null \| string | strict |
| schedule75.part1Rows[].specifiedPercentage | null \| number |  |
| schedule75.part1Rows[].storageEnergyConditionMet | null \| string |  |
| schedule75.part1Rows[].storageExcludedCategory | null \| string |  |
| schedule75.part1Rows[].storageFixedLocation | null \| string |  |
| schedule75.part1Rows[].storagePrimaryPurposeConfirmed | null \| string |  |
| schedule75.part1Rows[].substantialEnvironmentalNonCompliance | null \| string | strict |
| schedule75.part1Rows[].systemExtractsFossilFuelsForSale | null \| string |  |
| schedule75.part1Rows[].transmittedEnergyFromEligibleGenerationPct | null \| number |  |
| schedule75.part1Rows[].usedExclusivelyToGenerateEnergySolelyFromGeothermalEnergy | null \| string |  |
| schedule75.part1Rows[].usedPrimarilyToChargeOrDispenseHydrogenToClass56 | null \| string |  |
| schedule75.part1Rows[].usedWithEligibleGenerationEquipment | null \| string |  |
| schedule75.part1Rows[].usesFossilFuelInOperation | null \| string |  |
| schedule75.part2Rows | array |  |
| schedule75.part2Rows[].availableForUseDate | null \| string | strict |
| schedule75.part2Rows[].capitalCost | null \| number | strict |
| schedule75.part2Rows[].ccaClassNumber | null \| string | strict |
| schedule75.part2Rows[].cleanTechAssetCode | null \| string |  |
| schedule75.part2Rows[].originalItcAmount | null \| number | strict |
| schedule75.part2Rows[].proceedsOrFmv | null \| number | strict |
| schedule75.part2Rows[].proportionRecaptured | null \| number |  |
| schedule75.part2Rows[].provinceOrTerritory | null \| string |  |
| schedule75.part2Rows[].purchaserContinuesEligibleUse | null \| string |  |
| schedule75.part2Rows[].purchaserIsTaxableCanadianCorp | null \| string |  |
| schedule75.part2Rows[].purchaserRelationship | null \| string |  |
| schedule75.part2Rows[].recapturedAmount | null \| number |  |
| schedule75.part5Rows | array |  |
| schedule75.part5Rows[].itcAllocated | null \| number | strict |
| schedule75.part5Rows[].itcRecaptureAllocated | null \| number | strict |
| schedule75.part5Rows[].labourAdditionAllocated | null \| number | strict |
| schedule75.part5Rows[].partnershipAccountNumber | null \| string | strict |
| schedule75.part5Rows[].partnershipName | null \| string | strict |
| schedule75.priorYearRegularRateClaimForInstallationYear | null \| string |  |
| schedule75.signingOfficerFirstName | null \| string | strict |
| schedule75.signingOfficerLastName | null \| string | strict |
| schedule75.signingOfficerPosition | null \| string | strict |
| schedule75.signingOfficerTelephone | null \| string |  |
| schedule75.taxationYearEndDate | null \| string |  |
| schedule75.taxationYearStartDate | null \| string |  |
| schedule75.totalLabourAdditionToTax | null \| number |  |
| schedule75.wageRequirementsAdditionToTax | null \| number |  |
| schedule75.workersBelowPrevailingWageCount | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule75.apprenticeHoursActual`: Box 420 — Total hours of labour actually performed by apprentices plus hours of paragraph 127.46(5)(a)/(b) compliance.
- `schedule75.apprenticeHoursRequired`: Box 415 — Total hours of labour required to be performed by apprentices registered in a Red Seal trade.
- `schedule75.apprenticeshipRequirementsAdditionToTax`: Box 422 — Derived: (line 415 − line 420) × $50 (inflation-indexed per s.127.46(8) after 2023).
- `schedule75.attestationDate`: Box 303 — Date of attestation (yyyy/mm/dd).
- `schedule75.daysBelowPrevailingWage`: Box 410 — Total covered-worker-days below prevailing wage.
- `schedule75.isCanadianCorporation`: Is the claimant a Canadian corporation (s.89(1))? ITA 127.45(2) deems the payment only for a qualifying taxpayer, defined in s.127.45(1) as 'a taxable Canadian corporation or a mutual fund trust that is a real estate investment trust (as defined in subsection 122.1(1))'. Status is a condition of a refundable credit, so an unanswered claimant is unproven, never qualifying, and the credit is held out of lines 150 to 165.
- `schedule75.isExemptFromTaxUnderPartI`: Is the claimant exempt from tax under Part I? A corporation exempt under Part I is not a taxable Canadian corporation (s.89(1)), so it is not the qualifying taxpayer s.127.45(1) requires. Answer with isCanadianCorporation, or state isRealEstateInvestmentTrustMutualFundTrust for the s.122.1(1) real estate investment trust route instead.
- `schedule75.isRealEstateInvestmentTrustMutualFundTrust`: Whether the claimant is a mutual fund trust that is a real estate investment trust as defined in ITA s.122.1(1). It is the second, independent route to qualifying-taxpayer status under s.127.45(1): Yes establishes the condition on its own and the two corporate answers are then not required. Booleans, the numbers 0 and 1, and the yes and no spellings are all accepted.
- `schedule75.isTaxShelterInvestment`: s.127.45(10) — is the clean technology property (or an interest in a person or partnership that has an interest in it) a tax shelter investment for the purpose of s.143.2? "Y" denies the credit on every Part 1 row and blocks the filing. Tri-state: null = unanswered.
- `schedule75.line160PartnershipAllocatedItc`: Box 160 — Clean technology ITC allocated from partnerships (sum of T5013 box 265 amounts + any partnership letters).
- `schedule75.line240PartnershipAllocatedRecapture`: Box 240 — Clean technology ITC recapture allocated from partnerships (T5013 box 267 + letters).
- `schedule75.line425PartnershipAllocatedLabourAddition`: Box 425 — Labour requirements addition to tax allocated from partnerships (T5013 box 266).
- `schedule75.metLabourRequirements`: Box 400 — Did the corp meet the labour requirements? When "Y" the rest of Part 4 does not apply.
- `schedule75.part1Rows[].acquisitionDate`: Optional s.127.45(1) 'specified percentage' operand: the REAL acquisition date. Paragraph (a) reads, verbatim, 'before March 28, 2023, determined without reference to subsection (4), nil', and 'without reference to subsection (4)' disapplies the available-for-use deeming for that test, so availableForUseDate cannot stand in for it. Absent, the engine cannot tell a 30% row from a statutory nil and claims no clean technology ITC for the row (error-severity s75_acquisition_date_required, ready false) - it never assumes 30% on a refundable credit.
- `schedule75.part1Rows[].adjustments`: Column 1H assistance. ITA 127.45(5)(b.1) reduces the capital cost by government and non-government assistance received, receivable, or reasonably expected to be received. An unknown reduction is not a nil one, so the figure is stated outright: enter 0 where there is none.
- `schedule75.part1Rows[].amountEligibleForItc`: Box 140 — Derived: column 1F (capital cost) − 1G (assistance) + 1H (repaid).
- `schedule75.part1Rows[].assistanceRepaid`: Box 135 — Assistance repaid (or no longer expected) (s.127.45(7)). INCREASES the amount eligible for ITC.
- `schedule75.part1Rows[].availableForUseDate`: Box 115 — Available-for-use date (yyyy/mm/dd). Drives the specified-percentage bracket selection.
- `schedule75.part1Rows[].capitalCost`: Box 125 — Capital cost (s.127.45(9) exclusion: amounts unpaid 180 days after year-end are excluded; included when later paid).
- `schedule75.part1Rows[].ccaClassNumber`: Box 100 — CCA class number (typically 43.1(d), 43.2, or 56).
- `schedule75.part1Rows[].cleanTechAssetCode`: Box 106 — Clean technology property asset code (CRA-prescribed).
- `schedule75.part1Rows[].cleanTechItcAmount`: Box 150 — Derived: column 1I × column 1J.
- `schedule75.part1Rows[].cleanTechPropertyDescription`: Optional E (26) box 105 (column 1B). Absent means a blank description.
- `schedule75.part1Rows[].cleanTechPropertyParagraphDRoute`: Optional s.127.45(1) 'clean technology property' paragraph (d) route. Paragraph (d) names particular subparagraphs of Class 43.1 / 43.2 and names only Class 56 in whole, so a bare family class leaves the paragraph question open; absent on such a class the engine claims no credit and blocks.
- `schedule75.part1Rows[].designatedWorkSites`: Box 122 — Designated work site number (practitioner-assigned; identifier kept on file per form footnote 1).
- `schedule75.part1Rows[].electingLabourRequirements`: Box 155 — Per-row election to meet labour requirements under s.127.46(2). When null AND property prepared/installed after 2023-11-27 AND property is NOT Class 43.1(d)(i)/Class 56, the specified % is reduced by 10 pct points.
- `schedule75.part1Rows[].isTestWindTurbine`: Optional s.127.45(1)(d)(i) carve-out fact ('but excluding a test wind turbine'). Required once route (d)(i) is in play; absent the engine claims no credit and blocks.
- `schedule75.part1Rows[].leaseMeetsQualifyingLesseeConditions`: s.127.45(1) para (c)(i)-(ii) — the lease is to a qualifying taxpayer (or a partnership all of whose members are taxable Canadian corporations) AND is in the ordinary course of a business in Canada of a lessor whose principal business is selling, servicing or leasing property of that type. Required once `leasedToAnotherPerson` is "Y"; unanswered fails closed.
- `schedule75.part1Rows[].leasedToAnotherPerson`: ITA 127.45(1) paragraph (c) attaches lessee and lessor-business conditions to property the taxpayer leases out, so the fact is answered before the row is priced. Blank claims no clean technology ITC for the row.
- `schedule75.part1Rows[].otherCleanEconomyCreditClaimedOnProperty`: ITA 127.45(5)(a)(ii) excludes from capital cost any amount 'in respect of which any other clean economy tax credit (as defined in subsection 127.47(1)) was deducted by any person'. The competing claim can sit on another return, so only an explicit N admits the row; blank claims no clean technology ITC for it.
- `schedule75.part1Rows[].preparedOrInstalledDate`: Optional s.127.46(1) 'installation taxation year' operand. Absent, the engine fails closed to 'the labour requirements apply'.
- `schedule75.part1Rows[].previouslyUsedOrAcquiredForUseOrLease`: ITA 127.45(1) paragraph (b) admits only property 'that has not been used, or acquired for use or lease, for any purpose whatever before it was acquired by the taxpayer'. Y disqualifies the row; blank claims no clean technology ITC for it.
- `schedule75.part1Rows[].propertyIdentifier`: Free-text asset key shared with the other clean-economy Part 1 grids. Use the SAME key on every clean-economy schedule for the same asset: matching normalizes case and whitespace only, never a partial match. No CRA box — it exists so one property carrying a clean-economy credit on two schedules is detected, which s.127.45(5)(a)(ii) and the parallel s.127.48(10)(a)(ii) / s.127.49(5)(a)(ii) forbid.
- `schedule75.part1Rows[].provinceOrTerritory`: Box 110 — Province or territory of the property.
- `schedule75.part1Rows[].situatedAndUsedExclusivelyInCanada`: ITA 127.45(1) 'clean technology property' paragraph (a): the property is 'situated in Canada ... and intended for use exclusively in Canada'. Answer Y or N; blank claims no clean technology ITC for the row.
- `schedule75.part1Rows[].specifiedPercentage`: Box 145 — Specified percentage (s.127.45(1)). Engine derives from available-for-use date; practitioner override surfaces a warning if it disagrees with the statutory bracket. Stored as decimal fraction 0-1 (e.g. 0.30 for 30%).
- `schedule75.part1Rows[].substantialEnvironmentalNonCompliance`: ITA 127.45(5.1) deems the property not to be clean technology property where there was substantial non-compliance with an environmental law, by-law or regulation at the time it became available for use. Blank claims no clean technology ITC for the row.
- `schedule75.part1Rows[].systemExtractsFossilFuelsForSale`: Route (d)(v)(A) condition — the equipment must be part of a system that does not extract fossil fuels for sale. "Y" denies the route. Optional on every other route; null or omission is unanswered on route (d)(v).
- `schedule75.part1Rows[].usedExclusivelyToGenerateEnergySolelyFromGeothermalEnergy`: Route (d)(v)(B) condition — the equipment must be used exclusively to generate electrical or heat energy solely from geothermal energy. Anything other than "Y" denies the route. Optional on every other route; null or omission is unanswered on route (d)(v).
- `schedule75.part1Rows[].usedPrimarilyToChargeOrDispenseHydrogenToClass56`: Route (d)(iv.1) condition — the paragraph qualifies the property only where it is "used primarily to charge or dispense hydrogen to property described in Class 56". Anything other than "Y" denies the route.
- `schedule75.part1Rows[].usesFossilFuelInOperation`: Route (d)(ii) carve-out — paragraph (d)(ii) applies "but excluding equipment that uses any fossil fuel in operation". "Y" excludes the property.
- `schedule75.part2Rows[].availableForUseDate`: Box 212 — Available-for-use date of the disposed/converted property (yyyy/mm/dd). NEW on E (26); passthrough.
- `schedule75.part2Rows[].capitalCost`: Box 225 — Original capital cost (the denominator for the recapture-proportion formula).
- `schedule75.part2Rows[].ccaClassNumber`: Box 200 — CCA class number of disposed/converted property.
- `schedule75.part2Rows[].cleanTechAssetCode`: Box 206 — Clean technology asset code.
- `schedule75.part2Rows[].originalItcAmount`: Box 215 — Original clean technology ITC amount claimed on the property (cumulative across the 10-year recapture window).
- `schedule75.part2Rows[].proceedsOrFmv`: Box 220 — Proceeds of disposition (arm's length) or fair market value (NAL or conversion/export).
- `schedule75.part2Rows[].proportionRecaptured`: Box 230 — Derived: column 2E × (2F / 2G). The proportion-of-ITC-recaptured formula per s.127.45(10).
- `schedule75.part2Rows[].provinceOrTerritory`: Box 210 — Province or territory.
- `schedule75.part2Rows[].purchaserContinuesEligibleUse`: s.127.45(13) — does the purchaser continue the eligible clean technology use of the property?
- `schedule75.part2Rows[].purchaserIsTaxableCanadianCorp`: s.127.45(13) — is the purchaser a taxable Canadian corporation?
- `schedule75.part2Rows[].purchaserRelationship`: Relationship of the purchaser to the transferor.
- `schedule75.part2Rows[].recapturedAmount`: Box 235 — Derived: lesser of column 2E (full ITC) and 2H (proportion). The actual recapture amount.
- `schedule75.part5Rows`: Per-partnership detail rows. When present, totals 550/555/560 are authoritative for lines 160/240/425; the flat line* scalars above remain the fallback when this table is empty.
- `schedule75.part5Rows[].itcAllocated`: Box 510 — Clean technology ITC allocated from the partnership (T5013 box 265 or letter). Total 550 feeds line 160.
- `schedule75.part5Rows[].itcRecaptureAllocated`: Box 515 — Clean technology ITC recapture allocated from the partnership (T5013 box 267). Total 555 feeds line 240.
- `schedule75.part5Rows[].labourAdditionAllocated`: Box 520 — Labour requirements addition to tax allocated from the partnership (T5013 box 266). Total 560 feeds line 425.
- `schedule75.part5Rows[].partnershipAccountNumber`: Box 505 — Partnership account number.
- `schedule75.part5Rows[].partnershipName`: Box 500 — Partnership's name.
- `schedule75.priorYearRegularRateClaimForInstallationYear`: s.127.46(6)/(7) assess the addition in the INSTALLATION taxation year for a credit claimed at the regular rate "in a taxation year" — which need not be this one. Current Part 1 rows cannot prove an earlier year's claim, so the corporation states it. Unanswered holds lines 412/422.
- `schedule75.signingOfficerFirstName`: Box 301 — Signing officer's first name.
- `schedule75.signingOfficerLastName`: Box 300 — Signing officer's last name.
- `schedule75.signingOfficerPosition`: Box 302 — Position, office, or title.
- `schedule75.signingOfficerTelephone`: Box 304 — Signing officer's telephone number.
- `schedule75.taxationYearStartDate`: Taxation-year bounds (ISO YYYY-MM-DD) for the s.127.46(8) inflation proration of the Part 4 additions to tax. Without both bounds an otherwise-computable addition blocks rather than shipping a flat $20/$50 rate. They also gate the Part 1 s.127.45 available-for-use test against the real period instead of its calendar label. Read-only display, never a preparer entry: the server imposes the return's own fiscalStart/fiscalEnd and blocks a blob carrying a different period. No CRA box.
- `schedule75.totalLabourAdditionToTax`: Box 430 — Derived: 412 + 422 + 425. Feeds T2 line 580.
- `schedule75.wageRequirementsAdditionToTax`: Box 412 — Derived: line 410 × $20 (inflation-indexed after 2023 per s.127.46(8); engine uses base $20 plus indexation for installation tax years after 2023).
- `schedule75.workersBelowPrevailingWageCount`: Box 405 — Number of covered workers paid below the prevailing wage requirements (s.127.46(6) count).
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (56 of 85 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule75.attestationDate | 1 to 10 characters |
| schedule75.isCanadianCorporation | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule75.isExemptFromTaxUnderPartI | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule75.isTaxShelterInvestment | one of "Y", "N", null |
| schedule75.metLabourRequirements | one of "Y", "N", null |
| schedule75.part1Rows[].acquisitionDate | 1 to 10 characters |
| schedule75.part1Rows[].adjustments | -1000000000000000 to 1000000000000000 |
| schedule75.part1Rows[].availableForUseDate | 1 to 10 characters |
| schedule75.part1Rows[].capitalCost | -1000000000000000 to 1000000000000000 |
| schedule75.part1Rows[].ccaClassNumber | 1 to 4 characters |
| schedule75.part1Rows[].claimsClass431ElectricalStorage | one of "Y", "N" |
| schedule75.part1Rows[].claimsEligibleTransmissionEquipment | one of "Y", "N" |
| schedule75.part1Rows[].class431Subparagraph | one of "d(ii)", "d(v)", "d(vi)", "d(vii)", "d(xiv)", "d(xix)" |
| schedule75.part1Rows[].cleanTechPropertyDescription | 1 to 33 characters |
| schedule75.part1Rows[].cleanTechPropertyParagraphDRoute | 1 to 6 characters |
| schedule75.part1Rows[].designatedWorkSites | 1 to 5 characters |
| schedule75.part1Rows[].electingLabourRequirements | one of "Y", "N", null |
| schedule75.part1Rows[].isBuilding | one of "Y", "N" |
| schedule75.part1Rows[].isTestWindTurbine | one of "Y", "N", null |
| schedule75.part1Rows[].leaseMeetsQualifyingLesseeConditions | one of "Y", "N" |
| schedule75.part1Rows[].leasedToAnotherPerson | one of "Y", "N", null |
| schedule75.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | one of "Y", "N", null |
| schedule75.part1Rows[].preparedOrInstalledDate | 1 to 10 characters |
| schedule75.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | one of "Y", "N", null |
| schedule75.part1Rows[].propertyIdentifier | 1 to 10 characters |
| schedule75.part1Rows[].situatedAndUsedExclusivelyInCanada | one of "Y", "N", null |
| schedule75.part1Rows[].storageEnergyConditionMet | one of "Y", "N" |
| schedule75.part1Rows[].storageExcludedCategory | one of "none", "building", "pumped_hydroelectric_storage", "hydroelectric_dam_or_reservoir", "backup_only", "motor_vehicle_battery", "other_vehicle_battery", "other_automotive_equipment_battery", "vehicle_or_automotive_charging_property", "steam_methane_fuel_cell", "class_10_or_17" |
| schedule75.part1Rows[].storageFixedLocation | one of "Y", "N" |
| schedule75.part1Rows[].storagePrimaryPurposeConfirmed | one of "Y", "N" |
| schedule75.part1Rows[].substantialEnvironmentalNonCompliance | one of "Y", "N", null |
| schedule75.part1Rows[].systemExtractsFossilFuelsForSale | one of "Y", "N" |
| schedule75.part1Rows[].usedExclusivelyToGenerateEnergySolelyFromGeothermalEnergy | one of "Y", "N" |
| schedule75.part1Rows[].usedPrimarilyToChargeOrDispenseHydrogenToClass56 | one of "Y", "N" |
| schedule75.part1Rows[].usedWithEligibleGenerationEquipment | one of "Y", "N" |
| schedule75.part1Rows[].usesFossilFuelInOperation | one of "Y", "N" |
| schedule75.part2Rows[].availableForUseDate | 1 to 10 characters |
| schedule75.part2Rows[].capitalCost | -1000000000000000 to 1000000000000000 |
| schedule75.part2Rows[].ccaClassNumber | 1 to 4 characters |
| schedule75.part2Rows[].originalItcAmount | -1000000000000000 to 1000000000000000 |
| schedule75.part2Rows[].proceedsOrFmv | -1000000000000000 to 1000000000000000 |
| schedule75.part2Rows[].purchaserContinuesEligibleUse | one of "Y", "N" |
| schedule75.part2Rows[].purchaserIsTaxableCanadianCorp | one of "Y", "N" |
| schedule75.part2Rows[].purchaserRelationship | one of "related", "arms_length" |
| schedule75.part5Rows[].itcAllocated | -1000000000000000 to 1000000000000000 |
| schedule75.part5Rows[].itcRecaptureAllocated | -1000000000000000 to 1000000000000000 |
| schedule75.part5Rows[].labourAdditionAllocated | -1000000000000000 to 1000000000000000 |
| schedule75.part5Rows[].partnershipAccountNumber | 1 to 15 characters |
| schedule75.part5Rows[].partnershipName | 1 to 24 characters |
| schedule75.priorYearRegularRateClaimForInstallationYear | one of "Y", "N" |
| schedule75.signingOfficerFirstName | 1 to 4 characters |
| schedule75.signingOfficerLastName | 1 to 5 characters |
| schedule75.signingOfficerPosition | 1 to 3 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (109)

| Cell | Types |
| --- | --- |
| formId | string |
| formRevision | string |
| taxYear | integer |
| coverageStatus | string |
| line_100 | null \| string |
| line_105 | null \| string |
| line_106 | array \| boolean \| null \| number \| object \| string |
| line_110 | array \| boolean \| null \| number \| object \| string |
| line_115 | null \| string |
| line_122 | null \| string |
| line_125 | number |
| line_130 | number |
| line_135 | number |
| line_140 | number |
| line_145 | number |
| line_150 | number |
| line_155 | null \| string |
| line_160 | number |
| line_165 | number |
| amount_a_total_col_1k | number |
| part1Rows[].propertyIdentifier | null \| string |
| part1Rows[].ccaClassNumber | null \| string |
| part1Rows[].cleanTechPropertyDescription | null \| string |
| part1Rows[].cleanTechAssetCode | array \| boolean \| null \| number \| object \| string |
| part1Rows[].provinceOrTerritory | array \| boolean \| null \| number \| object \| string |
| part1Rows[].availableForUseDate | null \| string |
| part1Rows[].designatedWorkSites | null \| string |
| part1Rows[].capitalCost | number |
| part1Rows[].adjustments | number |
| part1Rows[].assistanceRepaid | number |
| part1Rows[].amountEligibleForItc | number |
| part1Rows[].specifiedPercentage | number |
| part1Rows[].cleanTechItcAmount | number |
| part1Rows[].electingLabourRequirements | null \| string |
| part1Rows[]._labourReductionApplied | boolean |
| line_200 | null \| string |
| line_206 | array \| boolean \| null \| number \| object \| string |
| line_210 | array \| boolean \| null \| number \| object \| string |
| line_212 | null \| string |
| line_215 | number |
| line_220 | number |
| line_225 | number |
| line_230 | number |
| line_235 | number |
| line_240 | number |
| line_245 | number |
| amount_b_total_col_2h | number |
| part2Rows[].ccaClassNumber | null \| string |
| part2Rows[].cleanTechAssetCode | array \| boolean \| null \| number \| object \| string |
| part2Rows[].provinceOrTerritory | array \| boolean \| null \| number \| object \| string |
| part2Rows[].availableForUseDate | null \| string |
| part2Rows[].originalItcAmount | number |
| part2Rows[].proceedsOrFmv | number |
| part2Rows[].capitalCost | number |
| part2Rows[].proportionRecaptured | number |
| part2Rows[].recapturedAmount | number |
| line_300 | null \| string |
| line_301 | null \| string |
| line_302 | null \| string |
| line_303 | null \| string |
| line_304 | array \| boolean \| null \| number \| object \| string |
| line_400 | null \| string |
| line_405 | number |
| line_410 | number |
| line_412 | number |
| line_415 | number |
| line_420 | number |
| line_422 | number |
| line_425 | number |
| line_430 | number |
| line_500 | null \| string |
| line_505 | null \| string |
| line_510 | number |
| line_515 | number |
| line_520 | number |
| line_550 | number |
| line_555 | number |
| line_560 | number |
| part5Rows[].partnershipName | null \| string |
| part5Rows[].partnershipAccountNumber | null \| string |
| part5Rows[].itcAllocated | number |
| part5Rows[].itcRecaptureAllocated | number |
| part5Rows[].labourAdditionAllocated | number |
| total_itc_line_165 | number |
| total_recapture_line_245 | number |
| total_labour_addition_line_430 | number |
| s31_feed_clean_tech_itc | number |
| s31_feed_recapture | number |
| t2_line_580_feed_labour_addition | number |
| warnings[].box | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.verified_at | string |
| warnings[].anchor_row | string |
| warnings[].anchor_field | string |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| missing_required | array |

### Output cell notes

- `amount_a_total_col_1k`: FROZEN-LEGACY key name: the letters are the E (25) face's; on the served E (26) face Amount A totals column 1L. Value is correct — the identifier is wire contract and never renamed.
- `amount_b_total_col_2h`: FROZEN-LEGACY key name: the letters are the E (25) face's; on the served E (26) face Amount B totals column 2I. Value is correct — the identifier is wire contract and never renamed.

# schedule76

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2024 and later
- Strict profile: s76_exact_single_request_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule76"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule76": {
      "isCanadianCorporation": "Y",
      "isExemptFromTaxUnderPartI": "N",
      "isTaxShelterInvestment": "N",
      "part1Rows": [
        {
          "propertyIdentifier": "FA-76-0001",
          "ccaClassNumber": "53",
          "ctmPropertyDescription": "Manufacturing press",
          "ctmUseCode": "01",
          "ctmUseIsAllOrSubstantiallyAll": "Y",
          "provinceOrTerritory": "ON",
          "acquisitionDate": "2025-06-15",
          "availableForUseDate": "2025-06-15",
          "capitalCost": 100000,
          "adjustments": 0,
          "assistanceRepaid": 0,
          "situatedAndUsedExclusivelyInCanada": "Y",
          "previouslyUsedOrAcquiredForUseOrLease": "N",
          "leasedToAnotherPerson": "N",
          "otherCleanEconomyCreditClaimedOnProperty": "N"
        }
      ]
    }
  }
}
```

## Input cells (76)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string |  |
| fiscalStart | string |  |
| schedule76.isCanadianCorporation | null \| string |  |
| schedule76.isExemptFromTaxUnderPartI | null \| string |  |
| schedule76.isTaxShelterInvestment | null \| string |  |
| schedule76.line150PartnershipAllocatedItc | null \| number |  |
| schedule76.line240PartnershipAllocatedRecapture | null \| number |  |
| schedule76.part1Rows | array |  |
| schedule76.part1Rows[].acquisitionDate | null \| string |  |
| schedule76.part1Rows[].adjustments | null \| number | strict |
| schedule76.part1Rows[].amountEligibleForItc | null \| number |  |
| schedule76.part1Rows[].assistanceRepaid | null \| number | strict |
| schedule76.part1Rows[].availableForUseDate | null \| string | strict |
| schedule76.part1Rows[].batteryProductionBenefitsFromContributionAgreement | null \| string |  |
| schedule76.part1Rows[].capitalCost | null \| number | strict |
| schedule76.part1Rows[].ccaClassNumber | null \| string | strict |
| schedule76.part1Rows[].claimsClass431ElectricalStorage | null \| string |  |
| schedule76.part1Rows[].claimsEligibleTransmissionEquipment | null \| string |  |
| schedule76.part1Rows[].class431Subparagraph | null \| string |  |
| schedule76.part1Rows[].ctmItcAmount | null \| number |  |
| schedule76.part1Rows[].ctmPropertyDescription | null \| string | strict |
| schedule76.part1Rows[].ctmPropertyScheduleIIRoute | null \| string |  |
| schedule76.part1Rows[].ctmUseCode | null \| object \| string | strict |
| schedule76.part1Rows[].ctmUseIsAllOrSubstantiallyAll | null \| string |  |
| schedule76.part1Rows[].ctmUseMineralOutputTestMet | null \| string |  |
| schedule76.part1Rows[].designedForStreetOrHighwayUse | null \| string |  |
| schedule76.part1Rows[].eligibleGenerationEnergyTransmittedPct | null \| number |  |
| schedule76.part1Rows[].isBuilding | null \| string |  |
| schedule76.part1Rows[].leaseMeetsQualifyingLesseeConditions | null \| string |  |
| schedule76.part1Rows[].leasedToAnotherPerson | null \| string | strict |
| schedule76.part1Rows[].mineralCertification | null \| object |  |
| schedule76.part1Rows[].mineralCertification.certificationDate | null \| string |  |
| schedule76.part1Rows[].mineralCertification.certificationFiledWithReturn | null \| string |  |
| schedule76.part1Rows[].mineralCertification.certifierDesignation | null \| object |  |
| schedule76.part1Rows[].mineralCertification.certifierIsIndependent | null \| string |  |
| schedule76.part1Rows[].mineralCertification.certifyingProfessionalName | null \| string |  |
| schedule76.part1Rows[].mineralCertification.mineOrWellSite | null \| string |  |
| schedule76.part1Rows[].mineralCertification.planPrimarilyTargetsQualifyingMaterials | null \| string |  |
| schedule76.part1Rows[].mineralValuationElection | null \| object |  |
| schedule76.part1Rows[].mineralValuationElection.electionDate | null \| string |  |
| schedule76.part1Rows[].mineralValuationElection.electionFiledWithReturn | null \| string |  |
| schedule76.part1Rows[].mineralValuationElection.valuationMethod | null \| object |  |
| schedule76.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | null \| string | strict |
| schedule76.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | null \| string | strict |
| schedule76.part1Rows[].propertyIdentifier | null \| string |  |
| schedule76.part1Rows[].provinceOrTerritory | null \| string | strict |
| schedule76.part1Rows[].situatedAndUsedExclusivelyInCanada | null \| string | strict |
| schedule76.part1Rows[].specifiedPercentage | null \| number |  |
| schedule76.part1Rows[].storageEnergyConditionMet | null \| string |  |
| schedule76.part1Rows[].storageExcludedCategory | null \| string |  |
| schedule76.part1Rows[].storageFixedLocation | null \| string |  |
| schedule76.part1Rows[].storagePrimaryPurposeConfirmed | null \| string |  |
| schedule76.part1Rows[].transmittedEnergyFromEligibleGenerationPct | null \| number |  |
| schedule76.part1Rows[].usedWithEligibleGenerationEquipment | null \| string |  |
| schedule76.part2Rows | array |  |
| schedule76.part2Rows[].availableForUseDate | null \| string |  |
| schedule76.part2Rows[].capitalCost | null \| number |  |
| schedule76.part2Rows[].ccaClassNumber | null \| string |  |
| schedule76.part2Rows[].ctmItcRecaptured | null \| number |  |
| schedule76.part2Rows[].ctmPropertyDescription | null \| string |  |
| schedule76.part2Rows[].ctmUseCode | null \| object |  |
| schedule76.part2Rows[].originalCtmItcAmount | null \| number |  |
| schedule76.part2Rows[].proceedsOrFmv | null \| number |  |
| schedule76.part2Rows[].proportionRecaptured | null \| number |  |
| schedule76.part2Rows[].provinceOrTerritory | null \| string |  |
| schedule76.part2Rows[].purchaserContinuesCtmUse | null \| string |  |
| schedule76.part2Rows[].purchaserIsQualifyingTaxpayer | null \| string |  |
| schedule76.part2Rows[].purchaserRelationship | null \| string |  |
| schedule76.part3Rows | array |  |
| schedule76.part3Rows[].ctmItcAllocated | null \| number |  |
| schedule76.part3Rows[].ctmItcRecaptureAllocated | null \| number |  |
| schedule76.part3Rows[].partnershipAccountNumber | null \| string |  |
| schedule76.part3Rows[].partnershipName | null \| string |  |
| schedule76.taxationYearEndDate | null \| string |  |
| schedule76.taxationYearStartDate | null \| string |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule76.isCanadianCorporation`: s.89(1) claimant fact: the corporation is a Canadian corporation. With isExemptFromTaxUnderPartI it establishes the qualifying taxpayer (a taxable Canadian corporation) the clean-economy credit definitions require; unanswered, the engine refuses the credit.
- `schedule76.isExemptFromTaxUnderPartI`: s.89(1) claimant fact: whether the corporation is exempt from Part I tax. 'N' with isCanadianCorporation 'Y' establishes the qualifying taxpayer; unanswered, the engine refuses the credit.
- `schedule76.isTaxShelterInvestment`: s.127.49(10) — is the CTM property (or an interest in a person or partnership that has an interest in it) a tax shelter investment for the purpose of s.143.2? "Y" denies the credit on every Part 1 row and blocks the filing. Tri-state: null = unanswered.
- `schedule76.part1Rows[].acquisitionDate`: Optional s.127.49(1) 'specified percentage' operand: the REAL acquisition date. Paragraph (a) reads, verbatim, 'before January 1, 2024, determined without reference to subsection (4), nil', and 'without reference to subsection (4)' disapplies the available-for-use deeming for that test, so availableForUseDate cannot stand in for it. Absent, the engine cannot tell a 30% row from a statutory nil and claims no CTM ITC for the row (error-severity s76_acquisition_date_required, ready false) - it never assumes 30% on a refundable credit.
- `schedule76.part1Rows[].adjustments`: Box 120 / column 1G — Adjustments: government and non-government assistance received, receivable, or reasonably expected (s.127.49(5)(c)). REDUCES the amount eligible for ITC. Required on a claiming row: enter 0 where there is no assistance. Left blank it is unanswered, not nil, and the row claims no CTM ITC until it is entered.
- `schedule76.part1Rows[].amountEligibleForItc`: Box 130 / column 1I — Derived: 1F − 1G + 1H.
- `schedule76.part1Rows[].assistanceRepaid`: Box 125 / column 1H — Assistance repaid (or no longer reasonably expected) per s.127.49(7). INCREASES the amount eligible for ITC. Blank is the ordinary "nothing was repaid" state; an unreadable entry blocks.
- `schedule76.part1Rows[].availableForUseDate`: Box 110 / column 1E — Available-for-use date (yyyy/mm/dd). Per s.127.49(4), CTM property is deemed not to have been acquired until AFU; this date is one of the TWO dates that drive the specified-percentage bracket (30/20/10/5/nil) — it settles paragraphs (b)-(c) through the s.127.49(4) deeming but never paragraph (a), which belongs to `acquisitionDate` above.
- `schedule76.part1Rows[].batteryProductionBenefitsFromContributionAgreement`: s.127.49(1) "excluded property" — property used in the production of battery cells or modules where that production "has benefitted from, or can reasonably be expected to benefit from, support under a contribution agreement with the Government of Canada referred to in section 7300 of the Income Tax Regulations" (Strategic Innovation Fund / Canada Growth Fund). REQUIRED where the property description names a battery cell or module; "Y" denies the credit and unanswered fails closed.
- `schedule76.part1Rows[].capitalCost`: Box 115 / column 1F — Capital cost (excludes any amount unpaid 180 days after the year-end per s.127.49(9); add back when later paid).
- `schedule76.part1Rows[].ccaClassNumber`: Box 100 / column 1A — CCA class number (must be one of: 8, 10, 12, 38, 41, 41.2, 43, 43.1, 43.2, 53, or 56 per s.127.49(1) 'CTM property' para (d)).
- `schedule76.part1Rows[].ctmItcAmount`: Box 145 / column 1K — Derived: 1I × 1J.
- `schedule76.part1Rows[].ctmPropertyDescription`: Box 105 / column 1B — CTM property description (free text).
- `schedule76.part1Rows[].ctmPropertyScheduleIIRoute`: s.127.49(1) "CTM property" para (d) — which of the seven Schedule II routes describes this property. REQUIRED on every class except 53 and 56 (the only two paragraph (d) names in whole); a route that cannot reach the entered class is a contradiction between two independent preparer assertions and denies the credit, as does an unanswered one.
- `schedule76.part1Rows[].ctmUseCode`: Box 106 / column 1C — rev-(26) CTM-use asset code. Codes 30/31 are qualifying-mineral-activity property; all other values identify the particular Reg 5202 zero-emission manufacturing asset.
- `schedule76.part1Rows[].ctmUseIsAllOrSubstantiallyAll`: s.127.49(1) "CTM use" means "the use of a property ALL OR SUBSTANTIALLY ALL in" the listed activities, and "CTM investment tax credit" para (a) allows the specified percentage only on property acquired "for a CTM use". The box-106 asset code records WHICH activity the property serves, not that all or substantially all of its use is that activity — and s.127.49(1) "non-CTM use" counts every other use against the test. REQUIRED on every Part 1 row; "N" denies the credit and unanswered fails closed.
- `schedule76.part1Rows[].ctmUseMineralOutputTestMet`: s.127.49(1) "CTM use" mineral OUTPUT test — separate from the chapeau all-or-substantially-all test on USE. The asset code selects the threshold: paragraph (b) (code 30) asks whether the property produces PRIMARILY qualifying materials; paragraph (c) (code 31) asks whether it produces ALL OR SUBSTANTIALLY ALL qualifying materials. Both are "determined based on the value of all commercial outputs in accordance with subsection (2.2)". REQUIRED on a mineral row; "N" denies the credit and unanswered fails closed.
- `schedule76.part1Rows[].designedForStreetOrHighwayUse`: s.127.49(1) "CTM property" para (d)(v)(A) — the Class 10 / Class 38 route excludes "any property that is designed or adapted for use on streets and highways". REQUIRED on a Class 10 or Class 38 row; "Y" denies the credit and unanswered fails closed. Irrelevant on every other class.
- `schedule76.part1Rows[].leaseMeetsQualifyingLesseeConditions`: s.127.49(1) "CTM property" paragraph (c)(i)-(ii) — the lease is to a qualifying taxpayer (or a partnership all of whose members are qualifying taxpayers) AND is in the ordinary course of a business in Canada of a lessor whose principal business is selling or servicing property of that type, or leasing property, lending money and the related financing businesses the paragraph lists. Required once `leasedToAnotherPerson` is "Y"; unanswered fails closed.
- `schedule76.part1Rows[].leasedToAnotherPerson`: Is the property to be leased by the corporation to another person or partnership? Paragraph (c) of the ITA 127.49(1) definition of CTM property excludes a lease unless the qualifying-lessee conditions are met, so the answer is stated rather than assumed.
- `schedule76.part1Rows[].mineralCertification`: s.127.49(2.1) independent engineer / geoscientist certification. REQUIRED on an asset-code-30 row, ignored on every other code.
- `schedule76.part1Rows[].mineralCertification.certificationDate`: Date on the certification (yyyy-mm-dd). Must fall inside the s.127.49(3) filing window for the return.
- `schedule76.part1Rows[].mineralCertification.certificationFiledWithReturn`: Practitioner confirmation that the certification is attached to this schedule and filed with the return. "N" denies the row.
- `schedule76.part1Rows[].mineralCertification.certifierDesignation`: s.127.49(1) "independent engineer or geoscientist" paragraph (a).
- `schedule76.part1Rows[].mineralCertification.certifierIsIndependent`: s.127.49(1) "independent engineer or geoscientist" paragraph (b) — the individual "is at all times at arm's length with, independent of, and not employed by" the corporation. "N" denies the row.
- `schedule76.part1Rows[].mineralCertification.certifyingProfessionalName`: Name of the individual signing the certification.
- `schedule76.part1Rows[].mineralCertification.mineOrWellSite`: s.127.49(2.1)(a) — the "particular mine site or well site" the certification names.
- `schedule76.part1Rows[].mineralCertification.planPrimarilyTargetsQualifyingMaterials`: s.127.49(2.1)(b) — the property is used "in accordance with a plan that primarily targets qualifying materials". "N" denies the row.
- `schedule76.part1Rows[].mineralValuationElection`: s.127.49(2.2) valuation-method election. REQUIRED on an asset-code-30 or -31 row, ignored on every other code.
- `schedule76.part1Rows[].mineralValuationElection.electionDate`: Date of the election (yyyy-mm-dd).
- `schedule76.part1Rows[].mineralValuationElection.electionFiledWithReturn`: Practitioner confirmation that the election is filed together with this schedule. "N" denies the row.
- `schedule76.part1Rows[].mineralValuationElection.valuationMethod`: The elected method. Binding for all relevant tax years.
- `schedule76.part1Rows[].otherCleanEconomyCreditClaimedOnProperty`: Was an investment tax credit or any other clean economy tax credit deducted on this property by any person? ITA 127.49(5)(a)(ii) allows one clean economy credit per property, and a competing claim can sit on another taxpayer's return, so only an explicit N admits the row.
- `schedule76.part1Rows[].previouslyUsedOrAcquiredForUseOrLease`: Had the property been used, or acquired for use or lease, for any purpose before the corporation acquired it? Paragraph (b) of the ITA 127.49(1) definition of CTM property requires previously unused property, so an explicit N is what admits the row.
- `schedule76.part1Rows[].propertyIdentifier`: Free-text asset key shared with the other clean-economy Part 1 grids. Use the SAME key on every clean-economy schedule for the same asset: matching normalizes case and whitespace only, never a partial match. No CRA box — it exists so one property carrying a clean-economy credit on two schedules is detected, which s.127.49(5)(a)(ii) and the parallel s.127.45(5)(a)(ii) / s.127.48(10)(a)(ii) forbid.
- `schedule76.part1Rows[].provinceOrTerritory`: Box 108 / column 1D — Province or territory of the property.
- `schedule76.part1Rows[].situatedAndUsedExclusivelyInCanada`: Is the property situated in Canada and intended for use exclusively in Canada? Paragraph (a) of the ITA 127.49(1) definition of CTM property, so an explicit Y is what admits the row.
- `schedule76.part1Rows[].specifiedPercentage`: Box 135 / column 1J — Specified percentage (s.127.49(1)). Engine derives from the AFU date; practitioner override surfaces a warning if it disagrees with the statutory bracket. Stored as decimal fraction 0-1 (e.g. 0.30 for 30%).
- `schedule76.part2Rows[].availableForUseDate`: Box 210 / E(26) column 2E — Original available-for-use date. The 10-year recapture window per s.127.49(11)(a) is anchored on this date (current tax year + 10 preceding calendar years).
- `schedule76.part2Rows[].capitalCost`: Box 225 / E(26) column 2H — Capital cost on which the CTM ITC was deducted (denominator of the recapture-proportion formula).
- `schedule76.part2Rows[].ccaClassNumber`: Box 200 / column 2A — CCA class number of disposed/converted/exported CTM property.
- `schedule76.part2Rows[].ctmItcRecaptured`: Box 235 / E(26) column 2J — Derived: lesser of 2F and 2I.
- `schedule76.part2Rows[].ctmPropertyDescription`: Box 205 / column 2B — CTM property description.
- `schedule76.part2Rows[].ctmUseCode`: Box 206 / E(26) column 2C - CTM-use asset code for the property being recaptured. Required current-form evidence; never inferred from class.
- `schedule76.part2Rows[].originalCtmItcAmount`: Box 215 / E(26) column 2F — Original CTM ITC amount claimed for the particular property.
- `schedule76.part2Rows[].proceedsOrFmv`: Box 220 / E(26) column 2G — Proceeds of disposition (arm's length) or fair market value (non-arm's length / conversion to non-CTM use / export from Canada). Per s.127.49(12) footnote 6 + B(i)/B(ii).
- `schedule76.part2Rows[].proportionRecaptured`: Box 230 / E(26) column 2I — Derived: 2F × (2G / 2H).
- `schedule76.part2Rows[].provinceOrTerritory`: Box 208 / E(26) column 2D — Province or territory.
- `schedule76.part2Rows[].purchaserContinuesCtmUse`: s.127.49(13) — is the property "used by the purchaser for a CTM use"?
- `schedule76.part2Rows[].purchaserIsQualifyingTaxpayer`: s.127.49(13) — is the purchaser a qualifying taxpayer?
- `schedule76.part2Rows[].purchaserRelationship`: Relationship of the purchaser to the transferor.
- `schedule76.part3Rows`: Rev-(26) per-partnership detail. This is the authority for lines 150/240 and totals 350/355.
- `schedule76.part3Rows[].ctmItcAllocated`: Line 310 / column 3C - CTM ITC allocated from T5013 box 292 or letter.
- `schedule76.part3Rows[].ctmItcRecaptureAllocated`: Line 315 / column 3D - CTM ITC recapture allocated from T5013 box 293 or letter.
- `schedule76.part3Rows[].partnershipAccountNumber`: Line 305 / column 3B - partnership account number.
- `schedule76.part3Rows[].partnershipName`: Line 300 / column 3A - partnership's legal name.
- `schedule76.taxationYearStartDate`: Taxation-year bounds (ISO YYYY-MM-DD). Form Part 1 footnote 2 requires the available-for-use date to be "within the current tax year", and that test runs against the real taxation period rather than its calendar label. That date gate is all the bounds do here: S76 has no s.127.46 indexed amount to prorate, since labour requirements do not apply to CTM property. Read-only display, never a preparer entry: the server imposes the return's own fiscalStart/fiscalEnd and blocks a blob carrying a different period. No CRA box.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (42 of 76 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule76.isCanadianCorporation | one of "Y", "N", null |
| schedule76.isExemptFromTaxUnderPartI | one of "Y", "N", null |
| schedule76.isTaxShelterInvestment | one of "Y", "N", null |
| schedule76.part1Rows[].acquisitionDate | 1 to 10 characters |
| schedule76.part1Rows[].adjustments | -1000000000000000 to 1000000000000000 |
| schedule76.part1Rows[].assistanceRepaid | -1000000000000000 to 1000000000000000 |
| schedule76.part1Rows[].availableForUseDate | 1 to 10 characters |
| schedule76.part1Rows[].batteryProductionBenefitsFromContributionAgreement | one of "Y", "N" |
| schedule76.part1Rows[].capitalCost | -1000000000000000 to 1000000000000000 |
| schedule76.part1Rows[].ccaClassNumber | 1 to 2 characters |
| schedule76.part1Rows[].claimsClass431ElectricalStorage | one of "Y", "N" |
| schedule76.part1Rows[].claimsEligibleTransmissionEquipment | one of "Y", "N" |
| schedule76.part1Rows[].class431Subparagraph | one of "d(ii)", "d(v)", "d(vi)", "d(vii)", "d(xiv)", "d(xix)" |
| schedule76.part1Rows[].ctmPropertyDescription | 1 to 19 characters |
| schedule76.part1Rows[].ctmPropertyScheduleIIRoute | one of "d_i", "d_ii", "d_iii", "d_iv", "d_v", "d_vi", "d_vii" |
| schedule76.part1Rows[].ctmUseCode | 1 to 2 characters |
| schedule76.part1Rows[].ctmUseIsAllOrSubstantiallyAll | one of "Y", "N", null |
| schedule76.part1Rows[].ctmUseMineralOutputTestMet | one of "Y", "N" |
| schedule76.part1Rows[].designedForStreetOrHighwayUse | one of "Y", "N" |
| schedule76.part1Rows[].isBuilding | one of "Y", "N" |
| schedule76.part1Rows[].leaseMeetsQualifyingLesseeConditions | one of "Y", "N" |
| schedule76.part1Rows[].leasedToAnotherPerson | one of "Y", "N", null |
| schedule76.part1Rows[].mineralCertification.certificationFiledWithReturn | one of "Y", "N" |
| schedule76.part1Rows[].mineralCertification.certifierIsIndependent | one of "Y", "N" |
| schedule76.part1Rows[].mineralCertification.planPrimarilyTargetsQualifyingMaterials | one of "Y", "N" |
| schedule76.part1Rows[].mineralValuationElection.electionFiledWithReturn | one of "Y", "N" |
| schedule76.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | one of "Y", "N", null |
| schedule76.part1Rows[].previouslyUsedOrAcquiredForUseOrLease | one of "Y", "N", null |
| schedule76.part1Rows[].propertyIdentifier | 1 to 10 characters |
| schedule76.part1Rows[].provinceOrTerritory | 1 to 2 characters |
| schedule76.part1Rows[].situatedAndUsedExclusivelyInCanada | one of "Y", "N", null |
| schedule76.part1Rows[].storageEnergyConditionMet | one of "Y", "N" |
| schedule76.part1Rows[].storageExcludedCategory | one of "none", "building", "pumped_hydroelectric_storage", "hydroelectric_dam_or_reservoir", "backup_only", "motor_vehicle_battery", "other_vehicle_battery", "other_automotive_equipment_battery", "vehicle_or_automotive_charging_property", "steam_methane_fuel_cell", "class_10_or_17" |
| schedule76.part1Rows[].storageFixedLocation | one of "Y", "N" |
| schedule76.part1Rows[].storagePrimaryPurposeConfirmed | one of "Y", "N" |
| schedule76.part1Rows[].usedWithEligibleGenerationEquipment | one of "Y", "N" |
| schedule76.part2Rows[].purchaserContinuesCtmUse | one of "Y", "N" |
| schedule76.part2Rows[].purchaserIsQualifyingTaxpayer | one of "Y", "N" |
| schedule76.part2Rows[].purchaserRelationship | one of "related", "arms_length" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (80)

| Cell | Types |
| --- | --- |
| line_100 | null \| string |
| line_105 | null \| string |
| line_106 | null \| string |
| line_108 | null \| string |
| line_110 | null \| string |
| line_115 | number |
| line_120 | number |
| line_125 | number |
| line_130 | number |
| line_135 | number |
| line_145 | number |
| line_150 | number |
| line_155 | number |
| amount_a_total_col_1k | number |
| part1Rows[].propertyIdentifier | null \| string |
| part1Rows[].ccaClassNumber | null \| string |
| part1Rows[].ctmPropertyDescription | null \| string |
| part1Rows[].ctmUseCode | null \| string |
| part1Rows[].provinceOrTerritory | null \| string |
| part1Rows[].availableForUseDate | null \| string |
| part1Rows[].capitalCost | number |
| part1Rows[].adjustments | number |
| part1Rows[].assistanceRepaid | number |
| part1Rows[].amountEligibleForItc | number |
| part1Rows[].specifiedPercentage | number |
| part1Rows[].ctmItcAmount | number |
| line_200 | array \| boolean \| null \| number \| object \| string |
| line_205 | array \| boolean \| null \| number \| object \| string |
| line_206 | array \| boolean \| null \| number \| object \| string |
| line_208 | array \| boolean \| null \| number \| object \| string |
| line_210 | array \| boolean \| null \| number \| object \| string |
| line_215 | number |
| line_220 | number |
| line_225 | number |
| line_230 | number |
| line_235 | number |
| line_240 | number |
| line_245 | number |
| amount_b_total_col_2j | number |
| part2Rows | array |
| line_300 | array \| boolean \| null \| number \| object \| string |
| line_305 | array \| boolean \| null \| number \| object \| string |
| line_310 | number |
| line_315 | number |
| line_350 | number |
| line_355 | number |
| part3_total_itc_line_350 | number |
| part3_total_recapture_line_355 | number |
| part3Rows | array |
| total_itc_line_155 | number |
| total_recapture_line_245 | number |
| s31_feed_ctm_itc | number |
| s31_feed_recapture | number |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| warnings[].anchor_field | string |
| warnings[].anchor_row | string |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| missing_required | array |
| coverageStatus | string |
| coverageReason | string |

### Output cell notes

- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].anchor_field`: The Filemark input anchor a preparer has to answer to clear the finding, when the box alone does not identify it.
- `warnings[].anchor_row`: The Filemark input anchor for the grid ROW a row-scoped finding is about.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.

# schedule78

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s78_exact_single_request_target_value_v1
- Payload schema version: 0.8.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule78"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule78": {
      "nrcanProjectCode": "NRC-PUBLIC-78",
      "isCanadianCorporation": "Y",
      "isExemptFromTaxUnderPartI": "N",
      "isProjectTaxShelter": "N",
      "firstDayOfCommercialOperations": "2028-01-01",
      "crdReportRequired": "N",
      "part1Rows": [
        {
          "ccaClassNumber": "57",
          "expenditureCategory": "carbon_capture_dac",
          "currentYearExpenditure": 100000,
          "adjustments": 0,
          "expenditureIncurredDate": "2025-06-15",
          "qualifiedExpenditureFormula": 1,
          "commercialOperationsStatus": "pre_cod",
          "designatedWorkSites": "WS-78",
          "electingLabourRequirements": "Y",
          "otherCleanEconomyCreditClaimedOnProperty": "N",
          "specifiedNaturalGasEnergySystemCleanElectricityItcClaimed": "N",
          "propertySituatedInCanada": "Y",
          "qualifiedProjectPropertyConfirmed": "Y"
        }
      ],
      "signingOfficerLastName": "Smith",
      "signingOfficerFirstName": "Jane",
      "signingOfficerPosition": "CFO",
      "attestationDate": "2025-12-01",
      "claimFiledDate": "2026-06-30",
      "metLabourRequirements": "Y",
      "expectedProjectQualifiedCcusExpenditures": 5000000,
      "line175CumulativeDevCreditPreviousYear": 0
    }
  }
}
```

## Input cells (98)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | string |  |
| fiscalStart | string |  |
| schedule78.amountFCumulativeDevCreditAtCommercialOps | null \| number |  |
| schedule78.amountGCumulativeDevIfProjectedEqualsActual | null \| number |  |
| schedule78.amountHPreviouslyRepaidDevCredits | null \| number |  |
| schedule78.amountITotalRefurbCredits | null \| number |  |
| schedule78.amountJRefurbIfProjectedEqualsActual | null \| number |  |
| schedule78.amountKPreviouslyRepaidRefurbCredits | null \| number |  |
| schedule78.apprenticeHoursActual | null \| number |  |
| schedule78.apprenticeHoursRequired | null \| number |  |
| schedule78.attestationDate | null \| string | strict |
| schedule78.claimFiledDate | null \| string |  |
| schedule78.crdReportDueDay | null \| string |  |
| schedule78.crdReportRequired | null \| string | strict |
| schedule78.daysBelowPrevailingWage | null \| number |  |
| schedule78.expectedProjectQualifiedCcusExpenditures | null \| number | strict |
| schedule78.firstDayOfCommercialOperations | null \| string | strict |
| schedule78.isCanadianCorporation | null \| string |  |
| schedule78.isExemptFromTaxUnderPartI | null \| string |  |
| schedule78.isProjectTaxShelter | null \| string | strict |
| schedule78.latestCrdReportDate | null \| string |  |
| schedule78.line170AdjustmentDownward | null \| number |  |
| schedule78.line175CumulativeDevCreditPreviousYear | null \| number |  |
| schedule78.line175CumulativePreCodQualifiedAggregate | null \| number |  |
| schedule78.line175CumulativePreCodQualifiedAggregateSource | null \| string |  |
| schedule78.line185CumulativePostCodQualifiedAggregate | null \| number |  |
| schedule78.line185CumulativePostCodQualifiedAggregateSource | null \| string |  |
| schedule78.line190PartnershipAllocatedItc | null \| number |  |
| schedule78.line325PartnershipAllocatedLabourAddition | null \| number |  |
| schedule78.line465PartnershipAllocatedPartXii7Tax | null \| number |  |
| schedule78.metLabourRequirements | null \| string | strict |
| schedule78.nrcanProjectCode | null \| string | strict |
| schedule78.ownsInterestInQualifiedCcusProject | null \| string |  |
| schedule78.part1Rows | array |  |
| schedule78.part1Rows[].adjustments | null \| number |  |
| schedule78.part1Rows[].assistanceRepaid | null \| number |  |
| schedule78.part1Rows[].ccaClassNumber | null \| string | strict |
| schedule78.part1Rows[].ccusItcAmount | null \| number |  |
| schedule78.part1Rows[].commercialOperationsStatus | null \| string | strict |
| schedule78.part1Rows[].currentYearExpenditure | null \| number | strict |
| schedule78.part1Rows[].designatedWorkSites | null \| string | strict |
| schedule78.part1Rows[].dualUseCapitalCost | null \| number |  |
| schedule78.part1Rows[].dualUseCcusExpectedQuantity | null \| number |  |
| schedule78.part1Rows[].dualUseComputedProportion | null \| number |  |
| schedule78.part1Rows[].dualUseEquipment | null \| string |  |
| schedule78.part1Rows[].dualUseProportion | null \| number |  |
| schedule78.part1Rows[].dualUseTotalExpectedQuantity | null \| number |  |
| schedule78.part1Rows[].electingLabourRequirements | null \| string | strict |
| schedule78.part1Rows[].eligibleCcusExpenditure | null \| number |  |
| schedule78.part1Rows[].expenditureCategory | string | strict |
| schedule78.part1Rows[].expenditureDescription | null \| string |  |
| schedule78.part1Rows[].expenditureIncurredDate | null \| string | strict |
| schedule78.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | null \| string | strict |
| schedule78.part1Rows[].preparedOrInstalledDate | null \| string |  |
| schedule78.part1Rows[].propertyId | null \| string |  |
| schedule78.part1Rows[].propertySituatedInCanada | null \| string | strict |
| schedule78.part1Rows[].provinceOrTerritory | null \| string |  |
| schedule78.part1Rows[].qualifiedCcusExpenditure | null \| number |  |
| schedule78.part1Rows[].qualifiedExpenditureFormula | null \| number | strict |
| schedule78.part1Rows[].qualifiedProjectPropertyConfirmed | null \| string | strict |
| schedule78.part1Rows[].specifiedNaturalGasEnergySystemCleanElectricityItcClaimed | string |  |
| schedule78.part1Rows[].specifiedPercentage | null \| number |  |
| schedule78.part4DispositionRows | array |  |
| schedule78.part4DispositionRows[].capitalCost | null \| number |  |
| schedule78.part4DispositionRows[].ccaClassNumber | null \| string |  |
| schedule78.part4DispositionRows[].ccusItcAmount | null \| number |  |
| schedule78.part4DispositionRows[].creditType | null \| string |  |
| schedule78.part4DispositionRows[].dispositionDate | null \| string |  |
| schedule78.part4DispositionRows[].expenditureDescription | null \| string |  |
| schedule78.part4DispositionRows[].netRecoveryAmount | null \| number |  |
| schedule78.part4DispositionRows[].previouslyPaidRecovery | null \| number |  |
| schedule78.part4DispositionRows[].proceedsOrFmv | null \| number |  |
| schedule78.part4DispositionRows[].projectSaleElection211_92_11 | null \| string |  |
| schedule78.part4DispositionRows[].propertyId | null \| string |  |
| schedule78.part4DispositionRows[].proportionRecaptured | null \| number |  |
| schedule78.part5Rows | array |  |
| schedule78.part5Rows[].ccusItcAllocated | null \| number |  |
| schedule78.part5Rows[].labourAdditionAllocated | null \| number |  |
| schedule78.part5Rows[].partXii7TaxAllocated | null \| number |  |
| schedule78.part5Rows[].partnershipAccountNumber | null \| string |  |
| schedule78.part5Rows[].partnershipName | null \| string |  |
| schedule78.priorYearRegularRateClaimForInstallationYear | null \| string |  |
| schedule78.projectPeriodRows | array |  |
| schedule78.projectPeriodRows[].actualEligibleUsePct | null \| number |  |
| schedule78.projectPeriodRows[].calendarYear | null \| string |  |
| schedule78.projectPeriodRows[].capturedCarbonTonnesEligibleUse | null \| number |  |
| schedule78.projectPeriodRows[].capturedCarbonTonnesTotal | null \| number |  |
| schedule78.projectPeriodRows[].projectPeriod | null \| string |  |
| schedule78.projectPeriodRows[].projectedEligibleUsePct | null \| number |  |
| schedule78.signingOfficerFirstName | null \| string | strict |
| schedule78.signingOfficerLastName | null \| string | strict |
| schedule78.signingOfficerPosition | null \| string | strict |
| schedule78.signingOfficerTelephone | null \| string |  |
| schedule78.t2FilingDueDate | null \| string |  |
| schedule78.taxationYearEndDate | null \| string |  |
| schedule78.taxationYearStartDate | null \| string |  |
| schedule78.workersBelowPrevailingWageCount | null \| number |  |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule78.amountFCumulativeDevCreditAtCommercialOps`: Current E (25) amount D — cumulative dev TC for the year that includes first commercial operations. The property name retains its E (24) amount-F identity for persisted-payload compatibility.
- `schedule78.amountGCumulativeDevIfProjectedEqualsActual`: Current E (25) amount E — recomputed D if projected EU% = actual EU%. The property name retains its E (24) amount-G identity.
- `schedule78.amountHPreviouslyRepaidDevCredits`: Current E (25) amount F — development credits previously repaid. The property name retains its E (24) amount-H identity.
- `schedule78.amountITotalRefurbCredits`: Current E (25) amount G — total refurbishment credits for current and previous years. The property name retains its E (24) amount-I identity.
- `schedule78.amountJRefurbIfProjectedEqualsActual`: Current E (25) amount H — recomputed G if projected EU% = actual EU%. The property name retains its E (24) amount-J identity.
- `schedule78.amountKPreviouslyRepaidRefurbCredits`: Current E (25) amount I — refurbishment credits previously repaid. The property name retains its E (24) amount-K identity.
- `schedule78.apprenticeHoursActual`: Box 320 — Hours actually performed by Red Seal apprentices.
- `schedule78.apprenticeHoursRequired`: Box 315 — Hours required to be performed by Red Seal apprentices.
- `schedule78.attestationDate`: Box 215 — Date of attestation (yyyy/mm/dd).
- `schedule78.claimFiledDate`: Exact Schedule 78 filing date used with the authoritative T2 due date to enforce ITA 127.44(17)'s claim deadline.
- `schedule78.crdReportDueDay`: Reporting-due day for the climate risk disclosure report. Required when box 102 is Yes so the s.211.93(1)(b) deadline can be tested.
- `schedule78.crdReportRequired`: Box 102 — Required to file CRD (climate risk disclosure) report? Per s.211.93(5) failure attracts lesser-of-(4% of CCUS credits, $1M) penalty.
- `schedule78.daysBelowPrevailingWage`: Box 310 — Total covered-worker-days below prevailing wage.
- `schedule78.expectedProjectQualifiedCcusExpenditures`: Expected qualified CCUS expenditures for the whole project. Required when box 102 is No to test the s.211.92(1) $20 million exemption.
- `schedule78.firstDayOfCommercialOperations`: Box 101 — First day of commercial operations (yyyy/mm/dd). Defined in s.127.44(1) as 120 days after first ongoing CO2 delivery.
- `schedule78.isCanadianCorporation`: s.89(1) claimant fact: the corporation is a Canadian corporation. With isExemptFromTaxUnderPartI it establishes the qualifying taxpayer (a taxable Canadian corporation) the clean-economy credit definitions require; unanswered, the engine refuses the credit.
- `schedule78.isExemptFromTaxUnderPartI`: s.89(1) claimant fact: whether the corporation is exempt from Part I tax. 'N' with isCanadianCorporation 'Y' establishes the qualifying taxpayer; unanswered, the engine refuses the credit.
- `schedule78.isProjectTaxShelter`: ITA 127.44(16) project-level tax-shelter denial fact. The exact admitted request states that no project property or relevant interest is a tax shelter investment.
- `schedule78.latestCrdReportDate`: Box 103 — Date of latest CRD report disclosed (yyyy/mm/dd).
- `schedule78.line170AdjustmentDownward`: Downward adjustment to line 170 — practitioner-side write-down per form note 6 / s.127.44(6) when projected EU% is reduced prior to first day of commercial operations. The only path that allows line 400 (s.211.92(2) recovery of cumulative dev TC) to fire. Enter a positive absolute amount.
- `schedule78.line175CumulativeDevCreditPreviousYear`: Box 175 — cumulative CCUS development tax credit for the previous year, which T2 SCH 78 E (25) p.2 defines as "line 170 of the previous year". Do not subtract the prior year's line 400: s.211.92 recovers tax and does not shrink the cumulative credit carried forward. Supplied by the frozen prior-filed continuity envelope when an authenticated prior return is linked, and a disagreeing entry then blocks. null is an unproven opening, not a nil one, and blocks a return claiming a current development credit; enter 0 for the project's first year.
- `schedule78.line175CumulativePreCodQualifiedAggregate`: Cumulative pre-COD qualified expenditure aggregate carried forward (used to evaluate the 10% s.127.44(9)(b)(v) refurbishment cap in refurbishment-only years).
- `schedule78.line175CumulativePreCodQualifiedAggregateSource`: Provenance marker stating that the line 175 cumulative pre-commercial-operations aggregate came from the prior filing. Without it a non-zero aggregate is treated as unproven, excluded from the 10 percent ITA s.127.44(9)(b)(v) cap base, and the return is blocked.
- `schedule78.line185CumulativePostCodQualifiedAggregate`: The lifetime post-commercial-operations qualified CCUS expenditure already counted against the 10 percent ITA s.127.44(9)(b)(v) cap, carried forward from the prior filing. Enter 0 for the project's first post-commercial-operations year, because a blank blocks.
- `schedule78.line185CumulativePostCodQualifiedAggregateSource`: Provenance marker stating that the line 185 cumulative post-commercial-operations aggregate came from the prior filing. A non-zero aggregate without it still counts against the cap but blocks the return until it is reconciled.
- `schedule78.line190PartnershipAllocatedItc`: Box 190 — CCUS ITC allocated from partnerships (T5013 box 245). Subject to s.127.47 at-risk amount cap for limited partners.
- `schedule78.line325PartnershipAllocatedLabourAddition`: Box 325 — Labour addition allocated from partnerships (T5013 box 246).
- `schedule78.line465PartnershipAllocatedPartXii7Tax`: Box 465 — Part XII.7 tax allocated from partnerships (T5013 box 269). Sourced from Part 5 total 560 when part5Rows are present.
- `schedule78.metLabourRequirements`: Box 300 — Met prevailing wage AND apprenticeship requirements?
- `schedule78.nrcanProjectCode`: Box 100 — NRCan project code (one schedule per project per s.127.44(8)).
- `schedule78.ownsInterestInQualifiedCcusProject`: Whether the corporation owns a direct or indirect interest in a qualified CCUS project. A No answer supports the s.211.92(1) exemption where expected project expenditures reach $20 million.
- `schedule78.part1Rows[].adjustments`: Box 130: non-government assistance reducing the expenditure (s.127.44(9)(a)(ii)). A constitutive reduction - an entered 0 is the answer; blank is unknown and holds the row.
- `schedule78.part1Rows[].assistanceRepaid`: Box 135 — Assistance repaid (column 1H) per s.127.44(10).
- `schedule78.part1Rows[].ccaClassNumber`: Box 105 — CCA class number (typically Class 57 or 58).
- `schedule78.part1Rows[].ccusItcAmount`: Box 160 — Derived: column 1K × column 1L.
- `schedule78.part1Rows[].commercialOperationsStatus`: Commercial-operations status — directs the expenditure to the development credit pool (pre-COD, line 170) or refurbishment pool (post-COD, line 185). Per s.127.44(4)/(5).
- `schedule78.part1Rows[].currentYearExpenditure`: Box 125 — Current year CCUS expenditure (column 1F). Per s.127.44(12), exclude any amount unpaid 180 days post-YE.
- `schedule78.part1Rows[].designatedWorkSites`: Box 122 — Designated work site number.
- `schedule78.part1Rows[].dualUseCapitalCost`: Off-face: full capital cost before the s.127.44(1) dual-use apportionment. The engine derives box 125 from this amount.
- `schedule78.part1Rows[].dualUseCcusExpectedQuantity`: Off-face: expected quantity supporting the qualified CCUS process.
- `schedule78.part1Rows[].dualUseComputedProportion`: Derived output: authoritative expected-quantity ratio.
- `schedule78.part1Rows[].dualUseEquipment`: Box 115 — Dual-use equipment (Y/N).
- `schedule78.part1Rows[].dualUseProportion`: Off-face: stated applicable proportion, reconciled to the two expected quantities before the credit can feed downstream.
- `schedule78.part1Rows[].dualUseTotalExpectedQuantity`: Off-face: total expected quantity in the same units and on the same most-recent-project-plan basis.
- `schedule78.part1Rows[].electingLabourRequirements`: Box 165 — Per-row election to meet labour requirements under s.127.46(2). When 'N' AND prepared/installed after 2023-11-27, the specified % is reduced by 10pp. CCUS has NO exempt classes (distinct from S75 which exempts 43.1(d)(i) + 56).
- `schedule78.part1Rows[].eligibleCcusExpenditure`: Box 140 — Derived: column 1F − 1G + 1H.
- `schedule78.part1Rows[].expenditureDescription`: Box 110 — Description of qualified CCUS expenditure. Free-form; engine scans for "enhanced oil recovery" / "EOR" tokens to surface the s.127.44(1) 'ineligible use' para (b) statutory exclusion.
- `schedule78.part1Rows[].expenditureIncurredDate`: Expenditure incurred date (yyyy/mm/dd). Drives the s.127.44(1) rate bracket selection. NOT available-for-use date — CCUS uses expenditure-date specifically (distinct from S75/S76).
- `schedule78.part1Rows[].otherCleanEconomyCreditClaimedOnProperty`: T2 SCH 78 Part 1: was an investment tax credit or any other clean economy tax credit (ITA 127.47(1)) deducted on this expenditure by any person? ITA 127.44(9)(b)(ii)(C) excludes such an expenditure from the qualified CCUS expenditure, and the competing claim can sit on another taxpayer's return, so only an explicit N admits the row. Blank, absent and every unreadable value hold the row's credit out of lines 170 and 185.
- `schedule78.part1Rows[].preparedOrInstalledDate`: Prepared-or-installed date (yyyy/mm/dd). Drives the s.127.46(2) labour-cutover gate. Defaults to expenditureIncurredDate if not separately provided.
- `schedule78.part1Rows[].propertyId`: Stable identifier for the property this expenditure acquired. Used to match against the Part 4 disposition table for the s.127.44(9)(b)(vi) same-taxation-year disposition / export exclusion. When a Part 4 row carries no propertyId AND this row carries none either, the engine cannot evaluate the exclusion and holds this row's credit out of lines 170 / 185. Matching is exact and CASE-SENSITIVE — use the same string on both tables.
- `schedule78.part1Rows[].propertySituatedInCanada`: Box 120 — is the property situated IN Canada? A "qualified CCUS expenditure" is the capital cost to acquire "a property (other than property situated outside of Canada)". null = unanswered.
- `schedule78.part1Rows[].provinceOrTerritory`: Box 120 — Province or territory.
- `schedule78.part1Rows[].qualifiedCcusExpenditure`: Box 150 — Derived: column 1I × column 1J.
- `schedule78.part1Rows[].qualifiedExpenditureFormula`: Box 145 — Qualified expenditure formula (column 1J). For capture/transport: projected-eligible-use weighted formula result per s.127.44(1) 'qualified carbon capture / transportation expenditure'. For storage/use: enter 1 (no weighting).
- `schedule78.part1Rows[].qualifiedProjectPropertyConfirmed`: Box 110 — are the qualified-CCUS-project property conditions confirmed? The expenditure qualifies only if the property is described in the applicable paragraph of Class 57 or 58, is acquired "in respect of a qualified CCUS project", is not excluded or previously-used property or preliminary work, and any dual-use apportionment and s.21 treatment are settled. null = unanswered.
- `schedule78.part1Rows[].specifiedNaturalGasEnergySystemCleanElectricityItcClaimed`: s.127.44(9)(b)(ii)(D) anti-stacking limb: whether any person deducted a clean electricity ITC on property in a specified natural gas energy system this expenditure is for. Unanswered, the row's CCUS credit is held.
- `schedule78.part1Rows[].specifiedPercentage`: Box 155 — Specified percentage (column 1L). Engine-derived from category + expenditure-incurred-date + labour-election state. Stored as decimal fraction 0-1 (e.g. 0.60 for 60%; 0.0875 for the post-2030 transport reduced-rate floor).
- `schedule78.part4DispositionRows`: Disposition table per s.211.92(9)/(10).
- `schedule78.part4DispositionRows[].capitalCost`: Box 435 — Original capital cost (column 4E).
- `schedule78.part4DispositionRows[].ccaClassNumber`: Box 415 — CCA class number of disposed/exported property.
- `schedule78.part4DispositionRows[].ccusItcAmount`: Box 425 — Original CCUS ITC amount claimed (column 4C).
- `schedule78.part4DispositionRows[].creditType`: Credit type — routes net recovery to line 455 (development) or line 460 (refurbishment).
- `schedule78.part4DispositionRows[].dispositionDate`: Date of the disposition or export (yyyy/mm/dd).
- `schedule78.part4DispositionRows[].expenditureDescription`: Box 420 — Description of qualified CCUS expenditure.
- `schedule78.part4DispositionRows[].netRecoveryAmount`: Box 450 — Derived: column 4F − 4G (net per-row recovery).
- `schedule78.part4DispositionRows[].previouslyPaidRecovery`: Box 445 — CCUS dev/refurb credits recovery previously paid (4G).
- `schedule78.part4DispositionRows[].proceedsOrFmv`: Box 430 — Proceeds of disposition (AL) or FMV (NAL / export). Per form note 11, cannot exceed capital cost.
- `schedule78.part4DispositionRows[].projectSaleElection211_92_11`: Has an election under s.211.92(11) been made on a sale of the whole CCUS project? When "Y" the acquisition expenditure remains qualified notwithstanding the same-year disposition — this is the "except where subsection 211.92(11) applies" carve-out in s.127.44(9)(b)(vi).
- `schedule78.part4DispositionRows[].propertyId`: Stable identifier of the disposed/exported property. MUST match the propertyId on the Part 1 row that acquired it, so the engine can apply the s.127.44(9)(b)(vi) same-taxation-year exclusion. Leaving it blank makes every unidentified Part 1 row fail closed. Matching is exact and case-sensitive.
- `schedule78.part4DispositionRows[].proportionRecaptured`: Box 440 — Derived: column 4C × 4D / 4E.
- `schedule78.part5Rows`: Per-partnership ledger behind lines 190 / 325 / 465. When present, totals 550/555/560 are authoritative for those three lines and a disagreeing flat entry is an error naming both figures.
- `schedule78.part5Rows[].ccusItcAllocated`: Box 510 — CCUS ITC allocated from the partnership (column 5C, T5013 box 245). Sums into line 550 → line 190.
- `schedule78.part5Rows[].labourAdditionAllocated`: Box 515 — Labour requirements addition to tax allocated from the partnership (column 5D, T5013 box 246). Sums into line 555 → line 325.
- `schedule78.part5Rows[].partXii7TaxAllocated`: Box 520 — Part XII.7 tax allocated from the partnership (column 5E, T5013 box 269). Sums into line 560 → line 465.
- `schedule78.part5Rows[].partnershipAccountNumber`: Box 505 — Partnership account number (column 5B).
- `schedule78.part5Rows[].partnershipName`: Box 500 — Partnership's name (column 5A).
- `schedule78.priorYearRegularRateClaimForInstallationYear`: s.127.46(6)/(7) assess the addition in the INSTALLATION taxation year for a credit claimed at the regular rate "in a taxation year" — which need not be this one. Current Part 1 rows cannot prove an earlier year's claim, so the corporation states it. Unanswered holds Amounts B and C.
- `schedule78.projectPeriodRows[].actualEligibleUsePct`: Box 003 — Actual eligible use percentage (decimal 0-1). DERIVED by the engine as box 004 ÷ box 005 per the s.211.92(1) definition; an entry here is reconciled against that quotient and must agree.
- `schedule78.projectPeriodRows[].calendarYear`: Box 001 (second column) — Calendar year the row reports. s.211.92(3) tests actual eligible use "during any YEAR during the project's total CCUS project review period", so a bare period number cannot identify the year being reported.
- `schedule78.projectPeriodRows[].capturedCarbonTonnesEligibleUse`: Box 004 — Quantity of captured carbon in tonnes for storage or use in eligible use. Element A of the s.211.92(1) A ÷ B formula, and part (a) of the s.211.93(7) report.
- `schedule78.projectPeriodRows[].capturedCarbonTonnesTotal`: Box 005 — Total quantity of captured carbon in tonnes for storage or use in BOTH eligible and ineligible use. Element B of the s.211.92(1) A ÷ B formula, and part (b) of the s.211.93(7) report. Until both tonnages are filed the actual eligible use percentage is deemed nil.
- `schedule78.projectPeriodRows[].projectPeriod`: Box 001 — Project period number (1-4).
- `schedule78.projectPeriodRows[].projectedEligibleUsePct`: Box 002 — Projected eligible use percentage (decimal 0-1).
- `schedule78.signingOfficerFirstName`: Box 205 — Signing officer first name.
- `schedule78.signingOfficerLastName`: Box 200 — Signing officer last name.
- `schedule78.signingOfficerPosition`: Box 210 — Position, office, or title.
- `schedule78.signingOfficerTelephone`: Box 220 — Telephone number.
- `schedule78.t2FilingDueDate`: The T2 filing-due date, as a full ISO YYYY-MM-DD date, read together with claimFiledDate to test whether the CCUS claim was filed inside the ITA s.127.44(17) window. The canonical value the batch body carries wins; this blob spelling is the fallback for a direct call that has no jacket beside it.
- `schedule78.taxationYearStartDate`: Taxation-year bounds (ISO YYYY-MM-DD) for the s.127.46(8) inflation proration of the Part 3 labour-requirement additions to tax — the same blob keys, and the same rule, as Schedule75Data. A straddling year owes the 2024 rate on its 2024 days and the 2025 rate on its 2025 days, so without both bounds an addition blocks rather than shipping a flat rate. Populate from the batch identification block (identification.taxYearStart / taxYearEnd) rather than asking the preparer for a date the return already carries. No CRA box.
- `schedule78.workersBelowPrevailingWageCount`: Box 305 — Number of covered workers paid below prevailing wage.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (38 of 98 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule78.attestationDate | 0 to 20000 characters |
| schedule78.claimFiledDate | 0 to 20000 characters |
| schedule78.crdReportRequired | one of "Y", "N", null |
| schedule78.expectedProjectQualifiedCcusExpenditures | -1000000000000000 to 1000000000000000 |
| schedule78.firstDayOfCommercialOperations | 0 to 20000 characters |
| schedule78.isCanadianCorporation | one of "Y", "N", null |
| schedule78.isExemptFromTaxUnderPartI | one of "Y", "N", null |
| schedule78.isProjectTaxShelter | one of "Y", "N", null |
| schedule78.line175CumulativeDevCreditPreviousYear | -1000000000000000 to 1000000000000000 |
| schedule78.line175CumulativePreCodQualifiedAggregateSource | one of "prior_filed_carryforward" |
| schedule78.line185CumulativePostCodQualifiedAggregateSource | one of "prior_filed_carryforward" |
| schedule78.metLabourRequirements | one of "Y", "N", null |
| schedule78.nrcanProjectCode | 0 to 20000 characters |
| schedule78.ownsInterestInQualifiedCcusProject | one of "Y", "N" |
| schedule78.part1Rows[].adjustments | -1000000000000000 to 1000000000000000 |
| schedule78.part1Rows[].ccaClassNumber | 0 to 20000 characters |
| schedule78.part1Rows[].commercialOperationsStatus | one of "pre_cod", "post_cod", null |
| schedule78.part1Rows[].currentYearExpenditure | -1000000000000000 to 1000000000000000 |
| schedule78.part1Rows[].designatedWorkSites | 0 to 20000 characters |
| schedule78.part1Rows[].dualUseEquipment | one of "Y", "N" |
| schedule78.part1Rows[].electingLabourRequirements | one of "Y", "N", null |
| schedule78.part1Rows[].expenditureCategory | 0 to 20000 characters |
| schedule78.part1Rows[].expenditureIncurredDate | 0 to 20000 characters |
| schedule78.part1Rows[].otherCleanEconomyCreditClaimedOnProperty | one of "Y", "N", null |
| schedule78.part1Rows[].propertySituatedInCanada | one of "Y", "N", null |
| schedule78.part1Rows[].qualifiedExpenditureFormula | -1000000000000000 to 1000000000000000 |
| schedule78.part1Rows[].qualifiedProjectPropertyConfirmed | one of "Y", "N", null |
| schedule78.part1Rows[].specifiedNaturalGasEnergySystemCleanElectricityItcClaimed | 0 to 20000 characters |
| schedule78.part4DispositionRows[].creditType | one of "development", "refurbishment" |
| schedule78.part4DispositionRows[].projectSaleElection211_92_11 | one of "Y", "N" |
| schedule78.priorYearRegularRateClaimForInstallationYear | one of "Y", "N" |
| schedule78.projectPeriodRows[].projectPeriod | one of "1", "2", "3", "4" |
| schedule78.signingOfficerFirstName | 0 to 20000 characters |
| schedule78.signingOfficerLastName | 0 to 20000 characters |
| schedule78.signingOfficerPosition | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (127)

| Cell | Types |
| --- | --- |
| amount_a_ccus_itc | number |
| amount_b_wage_addition | number |
| amount_c_apprenticeship_addition | number |
| amount_l_total_part_xii7_tax | number |
| fired_gates | object |
| form_coverage_hold | array \| boolean \| null \| number \| object \| string |
| held_downstream_components[] | string |
| line_001 | array \| boolean \| null \| number \| object \| string |
| line_002 | number |
| line_003 | number |
| line_100 | null \| string |
| line_101 | null \| string |
| line_102 | null \| string |
| line_103 | array \| boolean \| null \| number \| object \| string |
| line_105 | null \| string |
| line_110 | array \| boolean \| null \| number \| object \| string |
| line_115 | array \| boolean \| null \| number \| object \| string |
| line_120 | array \| boolean \| null \| number \| object \| string |
| line_122 | null \| string |
| line_125 | number |
| line_130 | number |
| line_135 | number |
| line_140 | number |
| line_145 | number |
| line_150 | number |
| line_155 | number |
| line_160 | number |
| line_165 | null \| string |
| line_170 | number |
| line_175 | number |
| line_180 | number |
| line_185 | number |
| line_190 | number |
| line_200 | null \| string |
| line_205 | null \| string |
| line_210 | null \| string |
| line_215 | null \| string |
| line_220 | array \| boolean \| null \| number \| object \| string |
| line_300 | null \| string |
| line_305 | number |
| line_310 | number |
| line_312 | number |
| line_315 | number |
| line_320 | number |
| line_322 | number |
| line_325 | number |
| line_330 | number |
| line_330_total_labour_addition | number |
| line_400 | number |
| line_405 | number |
| line_410 | number |
| line_415 | array \| boolean \| null \| number \| object \| string |
| line_420 | array \| boolean \| null \| number \| object \| string |
| line_425 | number |
| line_430 | number |
| line_435 | number |
| line_440 | number |
| line_445 | number |
| line_450 | number |
| line_455 | number |
| line_460 | number |
| line_465 | number |
| missing_required | array |
| part1Rows[]._eligibilityHeld | boolean |
| part1Rows[]._labourReductionApplied | boolean |
| part1Rows[]._regularRateLabourClaim | boolean |
| part1Rows[].adjustments | number |
| part1Rows[].assistanceRepaid | number |
| part1Rows[].ccaClassNumber | null \| string |
| part1Rows[].ccusItcAmount | number |
| part1Rows[].commercialOperationsStatus | string |
| part1Rows[].currentYearExpenditure | number |
| part1Rows[].designatedWorkSites | null \| string |
| part1Rows[].dualUseEquipment | array \| boolean \| null \| number \| object \| string |
| part1Rows[].electingLabourRequirements | null \| string |
| part1Rows[].eligibleCcusExpenditure | number |
| part1Rows[].expenditureCategory | string |
| part1Rows[].expenditureDescription | array \| boolean \| null \| number \| object \| string |
| part1Rows[].expenditureIncurredDate | null \| string |
| part1Rows[].preparedOrInstalledDate | array \| boolean \| null \| number \| object \| string |
| part1Rows[].propertyId | array \| boolean \| null \| number \| object \| string |
| part1Rows[].propertySituatedInCanada | null \| string |
| part1Rows[].provinceOrTerritory | array \| boolean \| null \| number \| object \| string |
| part1Rows[].qualifiedCcusExpenditure | number |
| part1Rows[].qualifiedExpenditureFormula | number |
| part1Rows[].qualifiedProjectPropertyConfirmed | null \| string |
| part1Rows[].rateBracket | null \| string |
| part1Rows[].specifiedPercentage | number |
| part4DispositionRows | array |
| projectPeriodRows | array |
| provisional | boolean |
| ready | boolean |
| s31_feed_ccus_itc_line_200 | number |
| t2_line_580_feed_labour_addition | number |
| t2_line_726_feed_part_xii7_tax | number |
| total_post_cod_qualified | number |
| total_pre_cod_qualified | number |
| total_pre_cod_qualified_cumulative | number |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].anchor_field | string |
| warnings[].missing_required | boolean |
| line_004 | array \| boolean \| null \| number \| object \| string |
| line_005 | array \| boolean \| null \| number \| object \| string |
| line_500 | array \| boolean \| null \| number \| object \| string |
| line_505 | array \| boolean \| null \| number \| object \| string |
| line_510 | number |
| line_515 | number |
| line_520 | number |
| line_550 | number |
| line_555 | number |
| line_560 | number |
| part5Rows | array |
| total_post_cod_qualified_cumulative | number |
| claim_filing_deadline | null \| string |

### Output cell notes

- `line_100`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_101`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_102`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_105`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_122`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_165`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_200`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_205`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_210`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_215`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `line_300`: Printed Schedule 78 form-face cell. Null when the request does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].ccaClassNumber`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].designatedWorkSites`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].electingLabourRequirements`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].expenditureIncurredDate`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].propertySituatedInCanada`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].qualifiedProjectPropertyConfirmed`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `part1Rows[].rateBracket`: Part 1 row cell. Null when the row does not state it; the unanswered cell is reported rather than filled with a substitute value.
- `warnings[].gate_id`: Identifier of the registered T4012 gate that raised the finding; travels with `citation`.
- `warnings[].code`: Stable machine identity of the finding, independent of its prose. Present on a finding a consumer is expected to branch on; absent on a prose-only review finding.
- `warnings[].anchor_field`: The Filemark input anchor a preparer has to answer to clear the finding, when the box alone does not identify it.
- `warnings[].missing_required`: True on a finding that also records the box in `missing_required`.
- `claim_filing_deadline`: The claim's filing deadline, YYYY-MM-DD. Null when the period the deadline is measured from is not stated.

# schedule8

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2025 and later
- Strict profile: s8_2025_class8_continuing_year_worked_example_target_value_v1
- Payload schema version: 0.12.0
- Dependencies (run automatically): schedule23, schedule24, schedule6

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule8"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isCCPC": true,
    "daysInYear": 365,
    "pyUCCPools": [
      {
        "ccaClass": "8",
        "closingUCC": 0
      }
    ],
    "assetData": [],
    "dispositions": [],
    "schedule8AdjustmentCoverage": {
      "schemaVersion": 2,
      "reviewed": true,
      "reviewedAt": "2026-07-19T12:00:00Z",
      "column205AdjustmentsApplicable": false,
      "column221AssistanceAfterDispositionApplicable": false,
      "column222RepaymentsAfterDispositionApplicable": false,
      "rentalPropertySeparateClassApplicable": false,
      "purposeBuiltRentalPropertyRulesApplicable": false,
      "rentalIncomeCcaLimitApplicable": false,
      "leasingPropertyRulesApplicable": false,
      "specifiedLeasingPropertyRulesApplicable": false,
      "affiliatedPersonStopLossApplicable": false,
      "reg1101_5qElectionApplies": false,
      "multipleClass10_1VehiclesPresent": false,
      "otherPrescribedSeparateClassRuleApplies": false,
      "specialDispositionRolloverOrDeferralApplies": false,
      "class14_1TransitionalOpeningBalanceApplicable": false,
      "specifiedEnergyPropertyRulesApplicable": false,
      "class1NrbAdditionalAllowanceEligible": false,
      "class1UnmodelledAdditionalAllowanceApplies": false,
      "class12ParagraphHalfYearExclusionApplies": false,
      "diepEligibilityAndAllocationConfirmed": false,
      "capitalGainRoutingComplete": false
    },
    "t2Jacket": {
      "filingStatus": {
        "firstYearAfterIncorporation": false,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    }
  }
}
```

## Input cells (100)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| accounts | array |  |
| assetData | array | strict |
| daysInYear | null \| number | strict |
| dispositions | array | strict |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| functionalCurrencyContext | null \| object |  |
| isCCPC | boolean | strict |
| pyUCCPools[].ccaClass | string | strict |
| pyUCCPools[].closingUCC | integer | strict |
| schedule8.acquisitionOfControlDate | null \| string |  |
| schedule8.classes | array |  |
| schedule8.classes[].additions | number |  |
| schedule8.classes[].aiipAdditions | number |  |
| schedule8.classes[].aiipFactor | null \| number |  |
| schedule8.classes[].aiipUccAdjustment | number |  |
| schedule8.classes[].assetsRemaining | number |  |
| schedule8.classes[].ccaAtMaxRate | number |  |
| schedule8.classes[].ccaBase | number |  |
| schedule8.classes[].ccaClaimed | number |  |
| schedule8.classes[].ccaClass | string |  |
| schedule8.classes[].ccaRate | number |  |
| schedule8.classes[].class13ManualDeterminationRequired | boolean |  |
| schedule8.classes[].className | string |  |
| schedule8.classes[].closingUCC | number |  |
| schedule8.classes[].diepAdditions | number |  |
| schedule8.classes[].diepUcc | number |  |
| schedule8.classes[].formClassNumber | string |  |
| schedule8.classes[].hadDiep | boolean |  |
| schedule8.classes[].halfYearReduction | number |  |
| schedule8.classes[].immediateExpensing | number |  |
| schedule8.classes[].immediateExpensingDesignatedAmount | number |  |
| schedule8.classes[].isOverridden | boolean |  |
| schedule8.classes[].isStraightLine | boolean |  |
| schedule8.classes[].manualClass13ContinuationDetermination | boolean |  |
| schedule8.classes[].manualClass14Determination | boolean |  |
| schedule8.classes[].netAiipAdditions | number |  |
| schedule8.classes[].normalCCAAfterProration | number |  |
| schedule8.classes[].normalCCABeforeProration | number |  |
| schedule8.classes[].openingUCC | number |  |
| schedule8.classes[].proceedsReducingAiip | number |  |
| schedule8.classes[].propertyId | string |  |
| schedule8.classes[].recapture | number |  |
| schedule8.classes[].remainderAdditions | number |  |
| schedule8.classes[].shortYearFactor | number |  |
| schedule8.classes[].terminalLoss | number |  |
| schedule8.classes[].uccBeforeCCA | number |  |
| schedule8.classes[].uccColumn10 | number |  |
| schedule8.classes[].uccReductionOnDispositions | number |  |
| schedule8.daysInYear | number |  |
| schedule8.fiscalEnd | null \| string |  |
| schedule8.fiscalStart | null \| string |  |
| schedule8.form | object |  |
| schedule8.form.formWarnings | array |  |
| schedule8.form.line101Election | boolean \| null |  |
| schedule8.form.line105Agreement | boolean \| null |  |
| schedule8.form.line125ImmediateExpensingLimit | null \| number |  |
| schedule8.form.part1TotalPercentage | null \| number |  |
| schedule8.form.part2Table | array |  |
| schedule8.formRevision | string |  |
| schedule8.immediateExpensingLimitInput | number |  |
| schedule8.immediateExpensingLimitProrated | number |  |
| schedule8.immediateExpensingRemaining | number |  |
| schedule8.immediateExpensingUsed | number |  |
| schedule8.isCCPC | boolean |  |
| schedule8.missing_required | array |  |
| schedule8.provisional | boolean |  |
| schedule8.ready | boolean |  |
| schedule8.shortYearFactor | number |  |
| schedule8.taxYear | number |  |
| schedule8.totalCCAClaimed | number |  |
| schedule8.totalRecapture | number |  |
| schedule8.totalTerminalLoss | number |  |
| schedule8AdjustmentCoverage.affiliatedPersonStopLossApplicable | boolean | strict |
| schedule8AdjustmentCoverage.capitalGainRoutingComplete | boolean | strict |
| schedule8AdjustmentCoverage.class12ParagraphHalfYearExclusionApplies | boolean | strict |
| schedule8AdjustmentCoverage.class14_1TransitionalOpeningBalanceApplicable | boolean | strict |
| schedule8AdjustmentCoverage.class1NrbAdditionalAllowanceEligible | boolean | strict |
| schedule8AdjustmentCoverage.class1UnmodelledAdditionalAllowanceApplies | boolean | strict |
| schedule8AdjustmentCoverage.column205AdjustmentsApplicable | boolean | strict |
| schedule8AdjustmentCoverage.column221AssistanceAfterDispositionApplicable | boolean | strict |
| schedule8AdjustmentCoverage.column222RepaymentsAfterDispositionApplicable | boolean | strict |
| schedule8AdjustmentCoverage.diepEligibilityAndAllocationConfirmed | boolean | strict |
| schedule8AdjustmentCoverage.leasingPropertyRulesApplicable | boolean | strict |
| schedule8AdjustmentCoverage.multipleClass10_1VehiclesPresent | boolean | strict |
| schedule8AdjustmentCoverage.otherPrescribedSeparateClassRuleApplies | boolean | strict |
| schedule8AdjustmentCoverage.purposeBuiltRentalPropertyRulesApplicable | boolean | strict |
| schedule8AdjustmentCoverage.reg1101_5qElectionApplies | boolean | strict |
| schedule8AdjustmentCoverage.rentalIncomeCcaLimitApplicable | boolean | strict |
| schedule8AdjustmentCoverage.rentalPropertySeparateClassApplicable | boolean | strict |
| schedule8AdjustmentCoverage.reviewed | boolean | strict |
| schedule8AdjustmentCoverage.reviewedAt | string | strict |
| schedule8AdjustmentCoverage.schemaVersion | integer | strict |
| schedule8AdjustmentCoverage.specialDispositionRolloverOrDeferralApplies | boolean | strict |
| schedule8AdjustmentCoverage.specifiedEnergyPropertyRulesApplicable | boolean | strict |
| schedule8AdjustmentCoverage.specifiedLeasingPropertyRulesApplicable | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Number of days in the taxation year, as a positive whole number, driving the ITA s.125(5)(b) short-year proration of the business limit. The third member of the canonical taxation-period trio with fiscalStart and fiscalEnd: all three are mandatory whenever the request reaches Part I through its dependency closure, which most targets do. A missing member is refused before any computation, and a day count that disagrees with the two dates is an error.
- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `fiscalStart`: The first day of the taxation year (ISO YYYY-MM-DD). With fiscalEnd and daysInYear it is the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure — the request is refused before any computation when one is missing. The bounds also drive Schedule 8's Reg 1100(3) short-year CCA proration and the Reg 1104(3.5)(b) immediate-expensing limit proration.
- `functionalCurrencyContext`: The functional-currency election sidecar for the taxation year, used to restate statutory dollar thresholds under ITA s.261(5)(b). Send it only for a functional-currency filer; it carries reportingCurrency, periodStart, a firstDayRate object with rate, spotRateSource and firstDayDate, and optional statutoryThresholdRoundingOverrides.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule8.classes[].aiipFactor`: The Reg 1100(2) "relevant factor" the engine ACTUALLY applied to this class this year: the incentive-base-weighted mean of the per-row element A / A.1 factors, equivalently `1 + aiipUccAdjustment / netIncentiveBase`. That is the same weighting Reg 1100(2.01)/(2.011) prescribes for a straddle year — "(A(B) + C(D))/(B + D)". null when no addition to the class carried an element A / A.1 factor this year, since there is then no relevant factor to report. Per-row factors still differ; this is their applied mean, not a lookup.
- `schedule8.classes[].ccaRate`: Scale: 0–1 fraction. e.g. 0.20 = 20% Class 8. Display: multiply by 100.
- `schedule8.classes[].formClassNumber`: Statutory class printed/exported; internal 1-NRB projects as 1.
- `schedule8.classes[].immediateExpensing`: Immediate expensing claimed for this class (Reg 1100(0.1)). Historical / pre-2025 computation only; the E (26) form has no DIEP column.
- `schedule8.classes[].immediateExpensingDesignatedAmount`: Present when the W08 agreement block supplies the taxpayer's explicit E (24) column-12 amount for this Reg 1101 pool.
- `schedule8.classes[].propertyId`: The Reg 1101 per-property identity that, with `ccaClass`, is this pool's whole key. Reg 1101(1af) prescribes a separate class for each Class 10.1 passenger vehicle and Reg 1101(5b.1) for each elected eligible non-residential building, so `classes` can hold several rows of one `ccaClass` and only the pair tells them apart. Empty string on every pooled class, where the class number IS the legal class.
- `schedule8.classes[].shortYearFactor`: Scale: 0–1 fraction. Reg 1100(3) short-year proration (days/365).
- `schedule8.classes[].uccColumn10`: Internal Schedule 8 class decomposition used to project the E (26) Part 2 columns.
- `schedule8.form`: True Form View projection — every printed T2 SCH 8 box, always present.
- `schedule8.form.formWarnings`: Tie-out mismatches (defensive — impossible by construction today) and the grid-overflow notice (the printed grid holds 8 class rows; bound column totals always include every class). The form view renders these — nothing is silently truncated.
- `schedule8.form.line101Election`: Reg 1101(5q) election (line 101), projected only from a complete W08 coverage review. Null leaves both Yes/No choices blank.
- `schedule8.form.line105Agreement`: E (24) line 105. Absent on E (26); null when DIEP is material but the agreement authority is missing.
- `schedule8.formRevision`: Present when an amendment's filed-render pin overrides ordinary year-based face resolution; otherwise lifecycle formRevisions supplies it.
- `schedule8.shortYearFactor`: Scale: 0–1 fraction. Reg 1100(3) short-year proration (days/365).
- `schedule8AdjustmentCoverage.affiliatedPersonStopLossApplicable`: Whether the ITA s.13(21.2) affiliated-person depreciable-property stop-loss applies to a loss disposition; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.capitalGainRoutingComplete`: Confirms the required Schedule 6 reconciliation for W08 depreciable-property dispositions above cost; the excess over capital cost is a capital gain, not recapture.
- `schedule8AdjustmentCoverage.class12ParagraphHalfYearExclusionApplies`: A Class 12 Schedule II paragraph listed in Reg 1100(2) element F(b)(i) applies, which the generic class-number calculation cannot identify; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.class14_1TransitionalOpeningBalanceApplicable`: The Class 14.1 opening balance derives from pre-2017 eligible capital property or Schedule 10 transitional amounts under Reg 1100(1)(c.1); true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.class1NrbAdditionalAllowanceEligible`: Class-scope conclusion on the Reg 1104(2) prior-use exclusion, the Reg 1100(1)(a.1) and (a.2) floor-space use tests, and the Reg 1101(5b.1) separate-class election for Class 1 non-residential buildings.
- `schedule8AdjustmentCoverage.class1UnmodelledAdditionalAllowanceApplies`: A Reg 1100(1)(a.1) or (a.2) additional building allowance applies that is not represented by a confirmed Class 1 NRB key; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.column205AdjustmentsApplicable`: Whether column 205 other UCC adjustments or transfers apply; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.column221AssistanceAfterDispositionApplicable`: Whether column 221 assistance received after disposition applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.column222RepaymentsAfterDispositionApplicable`: Whether column 222 repayments of assistance after disposition apply; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.diepEligibilityAndAllocationConfirmed`: Confirms the Reg 1100(0.1) to (0.3) and Reg 1104(3.1) to (3.3) DIEP eligibility, transfer restrictions, and allocated remaining limit for the immediate-expensing claim.
- `schedule8AdjustmentCoverage.leasingPropertyRulesApplicable`: Whether the Reg 1101(5c) separate-class or Reg 1100(15) aggregate CCA ceiling rules for leasing property apply; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.multipleClass10_1VehiclesPresent`: More than one passenger vehicle must be tracked in separate Class 10.1 pools; true blocks because the engine keys pools by class number alone.
- `schedule8AdjustmentCoverage.otherPrescribedSeparateClassRuleApplies`: Any other prescribed separate-class rule not represented by the class key applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.purposeBuiltRentalPropertyRulesApplicable`: Whether the separate class or additional allowance for new purpose-built residential rentals applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.reg1101_5qElectionApplies`: Whether the Schedule 8 line 101 election under Reg 1101(5q) (separate Class 8 or 43 classes) applies; true sets line 101 and blocks the unmodelled split.
- `schedule8AdjustmentCoverage.rentalIncomeCcaLimitApplicable`: Whether the Reg 1100(11) rental-income CCA ceiling applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.rentalPropertySeparateClassApplicable`: Whether the Reg 1101(1ac) separate-class rule for rental property costing at least $50,000 applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.reviewed`: Master flag of the reviewed W08 coverage packet: the preparer reviewed the unmodelled Schedule 8 adjustment rules below; false or missing fails closed.
- `schedule8AdjustmentCoverage.specialDispositionRolloverOrDeferralApplies`: A replacement-property or other special disposition rule, including an ITA s.13(4) or s.44 election or deferral, applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.specifiedEnergyPropertyRulesApplicable`: Whether the Reg 1100(24) income ceiling for specified energy property (Classes 34, 43.1, 43.2, 47 and 48) applies; true blocks the result as applicable but not modelled.
- `schedule8AdjustmentCoverage.specifiedLeasingPropertyRulesApplicable`: Whether the Reg 1101(5n) and Reg 1100(1.1) specified-leasing-property rules apply; true blocks the result as applicable but not modelled.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 100 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| assetData | exactly [] (pinned) |
| daysInYear | 1 to 1000000000000000 |
| dispositions | exactly [] (pinned) |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| pyUCCPools[].ccaClass | 0 to 20000 characters |
| pyUCCPools[].closingUCC | -1000000000000000 to 1000000000000000 |
| schedule8AdjustmentCoverage.reviewedAt | 0 to 20000 characters |
| schedule8AdjustmentCoverage.schemaVersion | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (166)

| Cell | Types |
| --- | --- |
| classes[].ccaClass | string |
| classes[].formClassNumber | string |
| classes[].className | string |
| classes[].openingUCC | number |
| classes[].additions | number |
| classes[].uccBeforeCCA | number |
| classes[].recapture | number |
| classes[].terminalLoss | number |
| classes[].halfYearReduction | number |
| classes[].aiipFactor | array \| boolean \| null \| number \| object \| string |
| classes[].ccaBase | number |
| classes[].ccaRate | number |
| classes[].ccaAtMaxRate | number |
| classes[].normalCCABeforeProration | number |
| classes[].normalCCAAfterProration | number |
| classes[].shortYearFactor | number |
| classes[].ccaClaimed | number |
| classes[].closingUCC | number |
| classes[].assetsRemaining | integer |
| classes[].isOverridden | boolean |
| classes[].manualClass14Determination | boolean |
| classes[].manualClass13ContinuationDetermination | boolean |
| classes[].class13ManualDeterminationRequired | boolean |
| classes[].immediateExpensing | number |
| classes[].uccColumn10 | number |
| classes[].aiipAdditions | number |
| classes[].riipAdditions | number |
| classes[].proceedsReducingIncentive | number |
| classes[].netAiipAdditions | number |
| classes[].proceedsReducingRiip | number |
| classes[].netRiipAdditions | number |
| classes[].aiipUccAdjustment | number |
| classes[].riipUccAdjustment | number |
| classes[].isStraightLine | boolean |
| classes[].diepAdditions | number |
| classes[].diepProceeds | number |
| classes[].diepUcc | number |
| classes[].hadDiep | boolean |
| classes[].deniedTerminalLoss | number |
| classes[].recaptureSuppressed101 | boolean |
| classes[].propertyId | string |
| classes[].resourceAllowanceMaximum | array \| boolean \| null \| number \| object \| string |
| classes[].resourceQuantityClaimed | array \| boolean \| null \| number \| object \| string |
| classes[].resourceRatePerUnit | array \| boolean \| null \| number \| object \| string |
| classes[].resourceSchedule | array \| boolean \| null \| number \| object \| string |
| classes[].uccReductionOnDispositions | number |
| classes[].eligibleLiquefactionActivitiesIncomeBeforeCca | array \| boolean \| null \| number \| object \| string |
| classes[].liquefactionAdditionalAllowanceAtMax | number |
| classes[].liquefactionAdditionalAllowanceAuthority | array \| boolean \| null \| number \| object \| string |
| classes[].liquefactionAdditionalAllowanceClaimed | number |
| classes[].liquefactionBasicAndImmediateExpensingAtMax | number |
| classes[].liquefactionFacilityId | array \| boolean \| null \| number \| object \| string |
| classes[].liquefactionReg1101SeparateClass | array \| boolean \| null \| number \| object \| string |
| classes[].mineAdditionalAllowanceAtMax | number |
| classes[].mineAdditionalAllowanceAuthority | array \| boolean \| null \| number \| object \| string |
| classes[].mineId | array \| boolean \| null \| number \| object \| string |
| classes[].mineReg1101SeparateClass | array \| boolean \| null \| number \| object \| string |
| classes[].railwayAdditionalAllowanceAtMax | number |
| classes[].railwayAdditionalAllowanceAuthority | array \| boolean \| null \| number \| object \| string |
| classes[].railwayReg1101SeparateClass | array \| boolean \| null \| number \| object \| string |
| classes[].reg1101_2aCanadianVessel | boolean |
| totalCCAClaimed | number |
| totalRecapture | number |
| totalTerminalLoss | number |
| netSchedule8Adjustment | number |
| immediateExpensingUsed | number |
| immediateExpensingRemaining | number |
| immediateExpensingLimitInput | number |
| immediateExpensingLimitProrated | number |
| daysInYear | integer |
| shortYearFactor | number |
| fiscalStart | null \| string |
| fiscalEnd | null \| string |
| acquisitionOfControlDate | array \| boolean \| null \| number \| object \| string |
| aoc | array \| boolean \| null \| number \| object \| string |
| adjustmentCoverage.schemaVersion | integer |
| adjustmentCoverage.reviewed | boolean |
| adjustmentCoverage.column205AdjustmentsApplicable | boolean |
| adjustmentCoverage.column221AssistanceAfterDispositionApplicable | boolean |
| adjustmentCoverage.column222RepaymentsAfterDispositionApplicable | boolean |
| adjustmentCoverage.rentalPropertySeparateClassApplicable | boolean |
| adjustmentCoverage.purposeBuiltRentalPropertyRulesApplicable | boolean |
| adjustmentCoverage.rentalIncomeCcaLimitApplicable | boolean |
| adjustmentCoverage.leasingPropertyRulesApplicable | boolean |
| adjustmentCoverage.specifiedLeasingPropertyRulesApplicable | boolean |
| adjustmentCoverage.affiliatedPersonStopLossApplicable | boolean |
| adjustmentCoverage.reg1101_5qElectionApplies | boolean |
| adjustmentCoverage.multipleClass10_1VehiclesPresent | boolean |
| adjustmentCoverage.otherPrescribedSeparateClassRuleApplies | boolean |
| adjustmentCoverage.specialDispositionRolloverOrDeferralApplies | boolean |
| adjustmentCoverage.class14_1TransitionalOpeningBalanceApplicable | boolean |
| adjustmentCoverage.specifiedEnergyPropertyRulesApplicable | boolean |
| adjustmentCoverage.class1NrbAdditionalAllowanceEligible | boolean |
| adjustmentCoverage.class1UnmodelledAdditionalAllowanceApplies | boolean |
| adjustmentCoverage.class12ParagraphHalfYearExclusionApplies | boolean |
| adjustmentCoverage.diepEligibilityAndAllocationConfirmed | boolean |
| adjustmentCoverage.capitalGainRoutingComplete | boolean |
| adjustmentCoverage.detectedMultipleClass10_1Pools | array |
| adjustmentCoverage.capitalGainRoutingRequired | boolean |
| adjustmentCoverage.schedule6EvidenceComplete | boolean |
| adjustmentCoverage.detectedCapitalGainClasses | array |
| adjustmentCoverage.class1NrbReviewRequired | boolean |
| adjustmentCoverage.class1BuildingReviewRequired | boolean |
| adjustmentCoverage.class12HalfYearReviewRequired | boolean |
| adjustmentCoverage.explicitDiepReviewRequired | boolean |
| adjustmentCoverage.immediateExpensingAllocationProvided | boolean |
| adjustmentCoverage.status | string |
| adjustmentCoverage.affiliatedStopLossRowsEvidenced | boolean |
| adjustmentCoverage.affiliatedStopLossRowsPresent | boolean |
| adjustmentCoverage.rentalIncomeCeilingReviewRequired | boolean |
| adjustmentCoverage.specifiedEnergyCeilingReviewRequired | boolean |
| adjustmentCoverage.class14_1TransitionalReviewRequired | boolean |
| adjustmentCoverage.nonArmsLengthAcquisitionCapitalCostAdjustmentApplicable | boolean |
| adjustmentCoverage.nonArmsLengthAcquisitionReviewRequired | boolean |
| adjustmentCoverage.leasingPropertyRulesReviewRequired | boolean |
| missing_required[] | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].actual | number |
| warnings[].citation.display | string |
| warnings[].citation.kind | string |
| warnings[].citation.section | string |
| warnings[].expected | null \| number |
| warnings[].key | string |
| warnings[].kind | string |
| warnings[].reason | string |
| taxYear | integer |
| isCCPC | boolean |
| provisional | boolean |
| ready | boolean |
| form.line101Election | boolean \| null |
| form.part2Table[].classNumber | string |
| form.part2Table[].openingUcc | number |
| form.part2Table[].acquisitions | number |
| form.part2Table[].aiipAdditions | number |
| form.part2Table[].riipAdditions | number |
| form.part2Table[].adjustments | number |
| form.part2Table[].assistanceAfterDisposition | array \| boolean \| null \| number \| object \| string |
| form.part2Table[].repaidAfterDisposition | array \| boolean \| null \| number \| object \| string |
| form.part2Table[].proceeds | number |
| form.part2Table[].ucc10 | number |
| form.part2Table[].proceedsReducingIncentive | number |
| form.part2Table[].netAiipAdditions | number |
| form.part2Table[].proceedsReducingRiip | number |
| form.part2Table[].netRiipAdditions | number |
| form.part2Table[].aiipUccAdjustment | number |
| form.part2Table[].riipUccAdjustment | number |
| form.part2Table[].halfYearAdjustment | number |
| form.part2Table[].ccaRatePercent | string |
| form.part2Table[].recapture | number |
| form.part2Table[].terminalLoss | number |
| form.part2Table[].cca | number |
| form.part2Table[].closingUcc | number |
| form.formWarnings | array |
| recaptureOnGiftsOfDepreciableProperty.amount | number |
| recaptureOnGiftsOfDepreciableProperty.citation | string |
| recaptureOnGiftsOfDepreciableProperty.disposingClassesAnsweredNotGift | integer |
| recaptureOnGiftsOfDepreciableProperty.giftClasses | array |
| recaptureOnGiftsOfDepreciableProperty.unprovableReason | array \| boolean \| null \| number \| object \| string |
| formRevision | string |
| resourceAllowanceGrossCostCoverage.scheduleIVClass15 | number |
| resourceAllowanceGrossCostCoverage.scheduleVITimberLimitsAndRights | number |
| resourceAllowanceGrossCostCoverage.scheduleVIndustrialMinerals | number |
| totalResourceAllowanceClaimed | number |
| changeOfUseReceivers | array |

### Output cell notes

- `warnings[].code`: Which continuity obligation this row is about.
- `warnings[].severity`: Always an error: a divergent or unprovable opening blocks the return.
- `warnings[].actual`: The opening amount this return states.
- `warnings[].citation.display`: The citation as it is shown to a preparer.
- `warnings[].citation.kind`: The authority family the section belongs to.
- `warnings[].citation.section`: The cited provision.
- `warnings[].expected`: The closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against.
- `warnings[].key`: The reconciled balance, named for a preparer.
- `warnings[].kind`: Always the validation family.
- `warnings[].reason`: What broke and what to do about it.

# schedule88

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2013 and later
- Strict profile: s88_versioned_profile_target_value_v1
- Payload schema version: 0.4.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule88"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule88": {
      "webpageCount": 1,
      "urls": [
        "  cedarridgemanufacturing.ca  "
      ],
      "percentInternetRevenue": 42.5
    }
  }
}
```

## Input cells (5)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule88.percentInternetRevenue | null \| number | strict |
| schedule88.urls | array \| null |  |
| schedule88.urls[] | null \| string | strict |
| schedule88.webpageCount | null \| number | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule88.percentInternetRevenue`: Percentage units from 0 through 100 inclusive, or explicit null when unanswered. For example, 0.42 means 0.42 percent, not 42 percent.
- `schedule88.urls`: The corporation's income-generating website addresses in printed slot order, one string or null per slot. The form prints five slots, boxes 277 to 281, and entries past the fifth are ignored.
- `schedule88.urls[]`: A bounded text slot or explicit null. URI syntax is intentionally not asserted because neither the form nor the current engine validates it.
- `schedule88.webpageCount`: The number of income-generating web pages or websites, or explicit null when unanswered. Numeric strings, booleans, fractions, and negative values are rejected by this strict candidate instead of using the legacy engine coercions.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (4 of 5 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule88.percentInternetRevenue | 0 to 100 |
| schedule88.urls[] | matches \S; 0 to 2048 characters |
| schedule88.webpageCount | 0 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (74)

| Cell | Types |
| --- | --- |
| webpage_count | integer \| null |
| url_slots[] | null \| string |
| percent_internet_revenue | null \| number |
| non_blank_url_count | integer |
| warnings[].box | string |
| warnings[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.form_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.applies_to_boxes | array |
| warnings[].citation.verified_at | string |
| fired_gates.boxes_277_281_top_five_by_revenue.gate_id | string |
| fired_gates.boxes_277_281_top_five_by_revenue.form_id | string |
| fired_gates.boxes_277_281_top_five_by_revenue.rule | string |
| fired_gates.boxes_277_281_top_five_by_revenue.cra_text_verbatim | string |
| fired_gates.boxes_277_281_top_five_by_revenue.source | string |
| fired_gates.boxes_277_281_top_five_by_revenue.source_url | string |
| fired_gates.boxes_277_281_top_five_by_revenue.form_revision | string |
| fired_gates.boxes_277_281_top_five_by_revenue.applies_to_boxes | array |
| fired_gates.boxes_277_281_top_five_by_revenue.verified_at | string |
| fired_gates.filing_required_when_internet_income.gate_id | string |
| fired_gates.filing_required_when_internet_income.form_id | string |
| fired_gates.filing_required_when_internet_income.rule | string |
| fired_gates.filing_required_when_internet_income.cra_text_verbatim | string |
| fired_gates.filing_required_when_internet_income.source | string |
| fired_gates.filing_required_when_internet_income.source_url | string |
| fired_gates.filing_required_when_internet_income.form_revision | string |
| fired_gates.filing_required_when_internet_income.applies_to_boxes | array |
| fired_gates.filing_required_when_internet_income.verified_at | string |
| provisional | boolean |
| ready | boolean |
| fired_gates.box_276_count_required.gate_id | string |
| fired_gates.box_276_count_required.form_id | string |
| fired_gates.box_276_count_required.rule | string |
| fired_gates.box_276_count_required.cra_text_verbatim | string |
| fired_gates.box_276_count_required.source | string |
| fired_gates.box_276_count_required.source_url | string |
| fired_gates.box_276_count_required.form_revision | string |
| fired_gates.box_276_count_required.applies_to_boxes | array |
| fired_gates.box_276_count_required.verified_at | string |
| fired_gates.boxes_277_281_at_least_one_url.gate_id | string |
| fired_gates.boxes_277_281_at_least_one_url.form_id | string |
| fired_gates.boxes_277_281_at_least_one_url.rule | string |
| fired_gates.boxes_277_281_at_least_one_url.cra_text_verbatim | string |
| fired_gates.boxes_277_281_at_least_one_url.source | string |
| fired_gates.boxes_277_281_at_least_one_url.source_url | string |
| fired_gates.boxes_277_281_at_least_one_url.form_revision | string |
| fired_gates.boxes_277_281_at_least_one_url.applies_to_boxes | array |
| fired_gates.boxes_277_281_at_least_one_url.verified_at | string |
| fired_gates.box_282_percentage_required.gate_id | string |
| fired_gates.box_282_percentage_required.form_id | string |
| fired_gates.box_282_percentage_required.rule | string |
| fired_gates.box_282_percentage_required.cra_text_verbatim | string |
| fired_gates.box_282_percentage_required.source | string |
| fired_gates.box_282_percentage_required.source_url | string |
| fired_gates.box_282_percentage_required.form_revision | string |
| fired_gates.box_282_percentage_required.applies_to_boxes | array |
| fired_gates.box_282_percentage_required.verified_at | string |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |

# schedule89

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2022 and later
- Strict profile: s89_2025_zero_balance_verification_v1
- Payload schema version: 0.6.0
- Dependencies (run automatically): pool_tracking

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule89"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "t2Jacket": {
      "identification": {
        "typeOfCorporation": "1",
        "isResidentOfCanada": true
      },
      "filingStatus": {
        "firstYearAfterIncorporation": true,
        "firstYearAfterAmalgamation": false,
        "subsidiaryWindupS88": false
      }
    },
    "schedule89": {
      "cdaBalanceAsOfDate": "2025-12-31",
      "isBalanceVerificationRequest": "Yes",
      "isT2054RelatedRequest": "No",
      "predecessorRows": [],
      "filingCorpRows": [],
      "line400EcpPre2018": 0,
      "line410LifeInsuranceCdaPre1985": 0,
      "line420PredecessorPre1990": 0
    }
  }
}
```

## Input cells (77)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| schedule89.businessNumber | null \| string |  |
| schedule89.cdaBalanceAsOfDate | null \| string | strict |
| schedule89.contactExtension | string |  |
| schedule89.contactName | string |  |
| schedule89.contactPhone | string |  |
| schedule89.cumulativeHistoryComplete | null \| string |  |
| schedule89.dividendsFromCorps | array |  |
| schedule89.dividendsFromCorps[].businessNumber | string |  |
| schedule89.dividendsFromCorps[].corporationName | string |  |
| schedule89.dividendsFromCorps[].datePayable | null \| string |  |
| schedule89.dividendsFromTrusts | array |  |
| schedule89.dividendsFromTrusts[].datePayable | null \| string |  |
| schedule89.dividendsFromTrusts[].trustAccountNumber | string |  |
| schedule89.dividendsFromTrusts[].trustName | string |  |
| schedule89.ecpPost2000 | array |  |
| schedule89.ecpPost2000[].badDebtPortion | null \| number |  |
| schedule89.ecpPost2000[].costAcquired | null \| number |  |
| schedule89.ecpPost2000[].proceedsSale | null \| number |  |
| schedule89.ecpPost2000[].taxYearEnd | null \| string |  |
| schedule89.ecpPre2000 | array |  |
| schedule89.ecpPre2000[].costAcquired | null \| number |  |
| schedule89.ecpPre2000[].proceedsSale | null \| number |  |
| schedule89.ecpPre2000[].taxYearEnd | null \| string |  |
| schedule89.filingCorpRows | array |  |
| schedule89.filingCorpRows[].capitalDividendsFromTrust | null \| number | strict |
| schedule89.filingCorpRows[].capitalDividendsPayable | null \| number | strict |
| schedule89.filingCorpRows[].capitalDividendsReceived | null \| number | strict |
| schedule89.filingCorpRows[].netLifeInsuranceProceeds | null \| number | strict |
| schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016 | null \| number | strict |
| schedule89.filingCorpRows[].nonTaxablePortionCapGains | null \| number | strict |
| schedule89.filingCorpRows[].taxYearEndOrRelevantDate | null \| string | strict |
| schedule89.firmName | string |  |
| schedule89.isBalanceVerificationRequest | null \| string | strict |
| schedule89.isT2054RelatedRequest | null \| string | strict |
| schedule89.lifeInsurancePolicy1 | null \| object |  |
| schedule89.lifeInsurancePolicy1.adjustedCostBase | null \| number |  |
| schedule89.lifeInsurancePolicy1.beneficiaryName | string |  |
| schedule89.lifeInsurancePolicy1.dateOfDeath | null \| string |  |
| schedule89.lifeInsurancePolicy1.insuredName | string |  |
| schedule89.lifeInsurancePolicy1.policyNumber | string |  |
| schedule89.lifeInsurancePolicy1.policyRedemptionDate | null \| string |  |
| schedule89.lifeInsurancePolicy1.proceedsReceivedDate | null \| string |  |
| schedule89.lifeInsurancePolicy1.totalNetProceedsReceived | null \| number |  |
| schedule89.lifeInsurancePolicy2 | null \| object |  |
| schedule89.lifeInsurancePolicy2.adjustedCostBase | null \| number |  |
| schedule89.lifeInsurancePolicy2.beneficiaryName | string |  |
| schedule89.lifeInsurancePolicy2.dateOfDeath | null \| string |  |
| schedule89.lifeInsurancePolicy2.insuredName | string |  |
| schedule89.lifeInsurancePolicy2.policyNumber | string |  |
| schedule89.lifeInsurancePolicy2.policyRedemptionDate | null \| string |  |
| schedule89.lifeInsurancePolicy2.proceedsReceivedDate | null \| string |  |
| schedule89.lifeInsurancePolicy2.totalNetProceedsReceived | null \| number |  |
| schedule89.line400EcpPre2018 | null \| number \| string | strict |
| schedule89.line410LifeInsuranceCdaPre1985 | null \| number | strict |
| schedule89.line420PredecessorPre1990 | null \| number | strict |
| schedule89.predecessorRows | array |  |
| schedule89.predecessorRows[].amalgamationDate | null \| string | strict |
| schedule89.predecessorRows[].capitalDividendsFromTrust | null \| number | strict |
| schedule89.predecessorRows[].capitalDividendsPayable | null \| number | strict |
| schedule89.predecessorRows[].capitalDividendsReceived | null \| number | strict |
| schedule89.predecessorRows[].cdaBalanceImmediatelyBeforeEvent | null \| number |  |
| schedule89.predecessorRows[].cdaParagraphABalanceImmediatelyBeforeEvent | null \| number |  |
| schedule89.predecessorRows[].continuityEventType | null \| string |  |
| schedule89.predecessorRows[].netLifeInsuranceProceeds | null \| number | strict |
| schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016 | null \| number | strict |
| schedule89.predecessorRows[].nonTaxablePortionCapGains | null \| number | strict |
| schedule89.predecessorRows[].predecessorBusinessNumber | string | strict |
| schedule89.predecessorRows[].s83_2_1HypotheticalDividendTaxable | boolean \| null |  |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| t2Jacket.identification.typeOfCorporation | string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Inclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds.
- `schedule89.businessNumber`: The corporation's CRA RC business number for the Schedule 89 filing header. It is normalized and checksum-validated before the filing projection is released.
- `schedule89.cdaBalanceAsOfDate`: The date the CDA balance is stated as of, pinned to a date aligned with the return. It does not establish the corporation's actual last tax year-end or the CDA history covered through that date.
- `schedule89.cumulativeHistoryComplete`: Practitioner attestation that the cumulative CDA component history in Parts 2A/2B (and the supporting Parts 3-6 detail) is COMPLETE for the period since the corporation last became a private corporation, or that the corporation has no CDA components. The s.89(1) CDA is period-based: empty grids assert "no components ever", not "history unknown", so the engine warns on empty grids until this is "Yes" and errors on "No" (known-incomplete history). null = unanswered (default).
- `schedule89.filingCorpRows[].capitalDividendsFromTrust`: Column 6 (line 150) — s.89(1)(g) capital dividends from a trust.
- `schedule89.filingCorpRows[].capitalDividendsPayable`: Column 7 (line 160) — capital dividends payable per s.83(2).
- `schedule89.filingCorpRows[].capitalDividendsReceived`: Column 3 (line 120) — s.89(1)(b) capital dividends received.
- `schedule89.filingCorpRows[].netLifeInsuranceProceeds`: Column 4 (line 130) — s.89(1)(d) net life-insurance proceeds.
- `schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016`: Column 5 (line 140) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016.
- `schedule89.filingCorpRows[].nonTaxablePortionCapGains`: Column 2 (line 110) — s.89(1)(a) non-taxable cap gain / non-deductible loss.
- `schedule89.filingCorpRows[].taxYearEndOrRelevantDate`: Column 1 (line 100) — tax year-end or relevant date (ISO YYYY-MM-DD).
- `schedule89.isBalanceVerificationRequest`: Line 004 — request is a standalone balance verification (mutually exclusive with 005).
- `schedule89.isT2054RelatedRequest`: Line 005 — request supports a T2054 s.83(2) capital-dividend election (mutually exclusive with 004).
- `schedule89.lifeInsurancePolicy1.dateOfDeath`: Date of death. Not a CRA box. Subparagraph 89(1)(d)(iii) measures the adjusted cost basis "immediately before the death" and forks on whether the death occurs before March 22, 2016; limbs (iv), (v) and (vi) are gated on it too. Routinely a different taxation year than the receipt.
- `schedule89.lifeInsurancePolicy1.policyRedemptionDate`: Box 355 / 365 — the CRA-prescribed Part 6 identity disclosure.
- `schedule89.lifeInsurancePolicy1.proceedsReceivedDate`: Date the proceeds were RECEIVED by the corporation. Not a CRA box. Subparagraphs 89(1)(d)(i) and (ii) admit only proceeds "received by the corporation in the period", so this — not box 355 — places the amount in the s.89(1) period. The engine falls back to box 355 when it is blank.
- `schedule89.lifeInsurancePolicy2.dateOfDeath`: Date of death. Not a CRA box. Subparagraph 89(1)(d)(iii) measures the adjusted cost basis "immediately before the death" and forks on whether the death occurs before March 22, 2016; limbs (iv), (v) and (vi) are gated on it too. Routinely a different taxation year than the receipt.
- `schedule89.lifeInsurancePolicy2.policyRedemptionDate`: Box 355 / 365 — the CRA-prescribed Part 6 identity disclosure.
- `schedule89.lifeInsurancePolicy2.proceedsReceivedDate`: Date the proceeds were RECEIVED by the corporation. Not a CRA box. Subparagraphs 89(1)(d)(i) and (ii) admit only proceeds "received by the corporation in the period", so this — not box 355 — places the amount in the s.89(1) period. The engine falls back to box 355 when it is blank.
- `schedule89.line400EcpPre2018`: Pinned to zero by this profile. The schema does not establish the historical ECP calculation.
- `schedule89.line410LifeInsuranceCdaPre1985`: Pinned to zero by this profile. The schema does not establish the pre-May 24, 1985 balance.
- `schedule89.line420PredecessorPre1990`: Pinned to zero by this profile. The schema does not establish the pre-July 14, 1990 predecessor or wind-up history.
- `schedule89.predecessorRows[].amalgamationDate`: Column 2 (line 082) — amalgamation date (ISO YYYY-MM-DD).
- `schedule89.predecessorRows[].capitalDividendsFromTrust`: Column 7 (line 092) — s.89(1)(g) capital dividends from a trust.
- `schedule89.predecessorRows[].capitalDividendsPayable`: Column 8 (line 094) — capital dividends payable per s.83(2).
- `schedule89.predecessorRows[].capitalDividendsReceived`: Column 4 (line 086) — s.89(1)(b) capital dividends received.
- `schedule89.predecessorRows[].cdaBalanceImmediatelyBeforeEvent`: CDA immediately before the amalgamation/wind-up. This supplemental off-form aggregate proves every statutory CDA limb for successor continuity; the printed component columns remain the face detail. Explicit 0 is a completed nil answer; null/absence is unanswered.
- `schedule89.predecessorRows[].cdaParagraphABalanceImmediatelyBeforeEvent`: The signed paragraph-(a) running component immediately before the event. Schedule 89 requires a negative predecessor component to carry into the successor; only the measured paragraph-(a) contribution is floored at nil.
- `schedule89.predecessorRows[].continuityEventType`: Filemark continuity classification for this Part 2A row. The printed grid serves both amalgamated predecessors and wound-up subsidiaries; the type is required before an event-time balance can feed the pool.
- `schedule89.predecessorRows[].netLifeInsuranceProceeds`: Column 5 (line 088) — s.89(1)(d) net life-insurance proceeds.
- `schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016`: Column 6 (line 090) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016.
- `schedule89.predecessorRows[].nonTaxablePortionCapGains`: Column 3 (line 084) — s.89(1)(a) non-taxable cap gain / non-deductible loss.
- `schedule89.predecessorRows[].predecessorBusinessNumber`: Column 1 (line 080) — predecessor business number.
- `schedule89.predecessorRows[].s83_2_1HypotheticalDividendTaxable`: Net reviewed s.83(2.1) conclusion for the hypothetical full-CDA dividend in ITA 87(2)(z.1), after applying the non-application rules in subsections 83(2.2)–(2.4). Yes excludes this entity's CDA continuity; No permits it; null is unanswered and blocks the aggregate.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (30 of 77 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule89.cdaBalanceAsOfDate | date (YYYY-MM-DD); 10 to 10 characters |
| schedule89.cumulativeHistoryComplete | one of "Yes", "No" |
| schedule89.filingCorpRows[].capitalDividendsFromTrust | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].capitalDividendsPayable | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].capitalDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].netLifeInsuranceProceeds | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016 | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].nonTaxablePortionCapGains | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].taxYearEndOrRelevantDate | 0 to 20000 characters |
| schedule89.isBalanceVerificationRequest | one of "Yes", "No", null |
| schedule89.isT2054RelatedRequest | one of "Yes", "No", null |
| schedule89.line400EcpPre2018 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule89.line410LifeInsuranceCdaPre1985 | -1000000000000000 to 1000000000000000 |
| schedule89.line420PredecessorPre1990 | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].amalgamationDate | 0 to 20000 characters |
| schedule89.predecessorRows[].capitalDividendsFromTrust | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].capitalDividendsPayable | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].capitalDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].cdaBalanceImmediatelyBeforeEvent | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].cdaParagraphABalanceImmediatelyBeforeEvent | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].continuityEventType | one of "amalgamation", "windup", null |
| schedule89.predecessorRows[].netLifeInsuranceProceeds | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016 | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].nonTaxablePortionCapGains | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].predecessorBusinessNumber | 0 to 20000 characters |
| t2Jacket.identification.typeOfCorporation | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027; 0 to 20000 characters |

## Output cells (99)

| Cell | Types |
| --- | --- |
| cumulative_history.latestComponentRowDate | array \| boolean \| null \| number \| object \| string |
| cumulative_history.part2AComponentRows | integer |
| cumulative_history.part2BComponentRows | integer |
| cumulative_history.rawComponentSubtotals.7A | number |
| cumulative_history.rawComponentSubtotals.7B | number |
| cumulative_history.rawComponentSubtotals.7C | number |
| cumulative_history.rawComponentSubtotals.7D | number |
| cumulative_history.rawComponentSubtotals.7E | number |
| cumulative_history.rawComponentSubtotals.7G | number |
| fired_gates | object |
| line_003_cda_balance_as_of_date | string |
| line_004_balance_verification_request | boolean |
| line_005_t2054_related_request | boolean |
| line_400_derivation | object |
| line_400_ecp_pre_2018 | number |
| line_410_life_insurance_cda_pre_1985 | number |
| line_420_predecessor_pre_1990 | number |
| line_430_cda_balance | number |
| provisional | boolean |
| ready | boolean |
| subtotals | object |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].actual | number |
| warnings[].expected | number |
| form.part2ARows[].amalgamationDate | null \| string |
| form.part2ARows[].businessNumberReference | null \| string |
| form.part2ARows[].businessNumberRoot | null \| string |
| form.part2ARows[].capitalDividendsFromTrust | null \| number |
| form.part2ARows[].capitalDividendsPayable | null \| number |
| form.part2ARows[].capitalDividendsReceived | null \| number |
| form.part2ARows[].netLifeInsuranceProceeds | null \| number |
| form.part2ARows[].nonTaxableCapGainsTrustPre2016 | null \| number |
| form.part2ARows[].nonTaxablePortionCapGains | null \| number |
| form.part2ARows[].predecessorBusinessNumber | null \| string |
| form.part2BRows[].capitalDividendsFromTrust | null \| number |
| form.part2BRows[].capitalDividendsPayable | null \| number |
| form.part2BRows[].capitalDividendsReceived | null \| number |
| form.part2BRows[].netLifeInsuranceProceeds | null \| number |
| form.part2BRows[].nonTaxableCapGainsTrustPre2016 | null \| number |
| form.part2BRows[].nonTaxablePortionCapGains | null \| number |
| form.part2BRows[].taxYearEndOrRelevantDate | null \| string |
| form.part3SectionARows[].costAcquired | null \| number |
| form.part3SectionARows[].proceedsSale | null \| number |
| form.part3SectionARows[].taxYearEnd | null \| string |
| form.part3SectionBRows[].badDebtPortion | null \| number |
| form.part3SectionBRows[].costAcquired | null \| number |
| form.part3SectionBRows[].proceedsSale | null \| number |
| form.part3SectionBRows[].taxYearEnd | null \| string |
| form.part4Rows[].businessNumber | null \| string |
| form.part4Rows[].businessNumberReference | null \| string |
| form.part4Rows[].businessNumberRoot | null \| string |
| form.part4Rows[].corporationName | null \| string |
| form.part4Rows[].datePayable | null \| string |
| form.part5Rows[].datePayable | null \| string |
| form.part5Rows[].trustAccountNumber | null \| string |
| form.part5Rows[].trustName | null \| string |
| form.part6Policy1 | object |
| form.part6Policy1.insuredName | null \| string |
| form.part6Policy1.beneficiaryName | null \| string |
| form.part6Policy1.policyNumber | null \| string |
| form.part6Policy1.adjustedCostBase | null \| number |
| form.part6Policy1.totalNetProceedsReceived | null \| number |
| form.part6Policy1.policyRedemptionDate | null \| string |
| form.part6Policy2 | object |
| form.part6Policy2.insuredName | null \| string |
| form.part6Policy2.beneficiaryName | null \| string |
| form.part6Policy2.policyNumber | null \| string |
| form.part6Policy2.adjustedCostBase | null \| number |
| form.part6Policy2.totalNetProceedsReceived | null \| number |
| form.part6Policy2.policyRedemptionDate | null \| string |
| canonicalCdaReconciliation.canonicalAsOf | null \| string |
| canonicalCdaReconciliation.canonicalClosing | null \| number |
| canonicalCdaReconciliation.differenceFromForm | number |
| canonicalCdaReconciliation.form7F | number |
| canonicalCdaReconciliation.form7G | number |
| canonicalCdaReconciliation.formLine430 | number |
| canonicalCdaReconciliation.line430 | number |
| canonicalCdaReconciliation.paragraphH | null \| number |
| canonicalCdaReconciliation.status | string |
| coverageReason | string |
| coverageStatus | string |
| formId | string |
| formRevision | string |
| missing_required | array |
| taxYear | integer |
| warnings[] | object |

# schedule9

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s9_versioned_profile_target_value_v1
- Payload schema version: 0.3.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule9"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule9": {
      "rows": [
        {
          "name": "Birchline Tools Ltd.",
          "businessNumber": "222222226",
          "relationshipCode": 3,
          "commonShareCount": 100,
          "commonSharePercent": 25,
          "preferredShareCount": 0,
          "preferredSharePercent": 0,
          "bookValueCapitalStock": 125000
        }
      ]
    }
  }
}
```

## Input cells (11)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule9.rows | array |  |
| schedule9.rows[].bookValueCapitalStock | null \| number | strict |
| schedule9.rows[].businessNumber | null \| string | strict |
| schedule9.rows[].commonShareCount | null \| number | strict |
| schedule9.rows[].commonSharePercent | null \| number | strict |
| schedule9.rows[].countryOfResidence | null \| string |  |
| schedule9.rows[].name | null \| string | strict |
| schedule9.rows[].preferredShareCount | null \| number | strict |
| schedule9.rows[].preferredSharePercent | null \| number | strict |
| schedule9.rows[].relationshipCode | null \| number \| object | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule9.rows`: The printed form has 14 rows. Empty rows are no-ops. Filemark retains row 15+ and blocks its current export pending filing-method review; the current public form does not prescribe an overflow carrier.
- `schedule9.rows[].bookValueCapitalStock`: Bounded submitted JSON number whose sign is preserved. The symmetric range is the printed form's own capacity for box 700: the fillable Schedule 9 XFA binds that cell (AllocationTable Row*.Cell9) to CoreFunctions.validateKeystrokeNumeric(this, 12, false), a 12-digit keystroke validator whose false positiveOnly argument permits negatives, so the form carries at most 999,999,999,999 in either direction. Values outside that are unfileable and can only reach the unready branch this contract's output schema refuses. The bound is a form-capacity fact, not a tax-cost or impairment conclusion.
- `schedule9.rows[].businessNumber`: A nine-digit submitted BN root. Schedule 9 Note 1 admits NR for a corporation with no business number; this branch states a number instead, and the engine checks it against the federal Modulus-10 rule before the row is filed, so a digit string that fails the check holds the schedule rather than filing an invented BN. Format and checksum conformance do not verify that the number exists or belongs to the named corporation.
- `schedule9.rows[].commonShareCount`: Positive whole-number branch restriction under Filemark's mechanical policy. The upper bound is the printed form's own capacity for box 500: the fillable Schedule 9 XFA binds that cell (AllocationTable Row*.Cell5) to CoreFunctions.validateKeystrokeNumeric(this, 11, false), an 11-digit keystroke validator, so 99,999,999,999 is the largest value the CRA form can carry. Larger values are unfileable and can only reach the unready branch this contract's output schema refuses, so they are rejected before execution.
- `schedule9.rows[].commonSharePercent`: Positive integer percent-unit branch restriction. The engine also supports up to two decimal places, but this candidate intentionally excludes that wider branch.
- `schedule9.rows[].countryOfResidence`: This narrow branch leaves the printed other-than-Canada country field blank. Blank does not prove Canadian residence.
- `schedule9.rows[].name`: A single-line corporation name with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field maximum.
- `schedule9.rows[].preferredShareCount`: Box 600 — Number of preferred shares the filing corp owns. Filemark requires a non-negative integer.
- `schedule9.rows[].preferredSharePercent`: Box 650 — % of preferred shares the filing corp owns. Same Filemark percent-unit and precision policy as box 550.
- `schedule9.rows[].relationshipCode`: Literal Schedule 9 Note 2 value 3, Associated. This submitted code is corroborating disclosure only and is not an independent legal association determination.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (10 of 11 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule9.rows[].bookValueCapitalStock | -999999999999 to 999999999999 |
| schedule9.rows[].businessNumber | matches ^[0-9]{9}$; 0 to 9 characters |
| schedule9.rows[].commonShareCount | 1 to 99999999999 |
| schedule9.rows[].commonSharePercent | 1 to 100 |
| schedule9.rows[].countryOfResidence | 0 to 20000 characters |
| schedule9.rows[].name | matches ^(?=\S)(?:[^\r\n]*\S)?$; 1 to 10000 characters |
| schedule9.rows[].preferredShareCount | -1000000000000000 to 1000000000000000 |
| schedule9.rows[].preferredSharePercent | -1000000000000000 to 1000000000000000 |
| schedule9.rows[].relationshipCode | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (47)

| Cell | Types |
| --- | --- |
| rows_count | integer |
| rows[].row_label | integer |
| rows[].name | null \| string |
| rows[].countryOfResidence | null \| string |
| rows[].businessNumber | null \| string |
| rows[].relationshipCode | integer \| null |
| rows[].commonShareCount | integer \| null |
| rows[].commonSharePercent | null \| number |
| rows[].preferredShareCount | integer \| null |
| rows[].preferredSharePercent | null \| number |
| rows[].bookValueCapitalStock | null \| number |
| relationship_breakdown.1 | integer |
| relationship_breakdown.2 | integer |
| relationship_breakdown.3 | integer |
| relationship_breakdown.4 | integer |
| has_code_3_rows | boolean |
| has_code_1_rows | boolean |
| has_associated_corps | boolean |
| has_subsidiary_corps | boolean |
| warnings | array |
| fired_gates.filing_required_when_related_or_associated | object |
| provisional | boolean |
| ready | boolean |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].taxYear | integer |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| fired_gates | object |

### Output cell notes

- `has_associated_corps`: True when ANY disclosed row carries Note 2 relationship code 1, 2 or 3. ITA 256(1)(a) is symmetric in the two corporations, so both printed control labels report an associated corporation whichever way the form means the direction of its Parent/Subsidiary labels, and code 4 (Related but not associated) is the form's only affirmative not-associated answer. It remains a disclosure projection off the printed relationship codes, not an independent legal association conclusion. This branch admits a code-3-only roster, so the projection is pinned true.
- `has_subsidiary_corps`: Legacy compatibility alias for the raw code-1 projection. It does not establish row direction or control.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier.

# schedule91

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2008 and later
- Strict profile: s91_2025_tcp_gain_worked_example_target_value_v1
- Payload schema version: 0.7.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule91"
  ],
  "inputs": {
    "taxYear": 2025,
    "schedule91": {
      "countryTaxpayerId": "US-EIN 98-7654321",
      "countryYearEnd": "2024-12-31",
      "part2": {
        "tcpRows": [
          {
            "description": "5,000 shares of Cedar Ridge Manufacturing Inc.",
            "proceeds": 500000,
            "cost": 300000,
            "incomeGainLoss": 200000
          }
        ],
        "treatyArticle": "Canada-US Treaty Art. XIII(4) (Gains)"
      }
    }
  }
}
```

## Input cells (53)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule91.countryTaxpayerId | null \| string | strict |
| schedule91.countryYearEnd | null \| string | strict |
| schedule91.part1 | null \| object |  |
| schedule91.part1.activityCode | null \| string |  |
| schedule91.part1.customerRowsSupplementaryListAttached | null \| string |  |
| schedule91.part1.customers | array |  |
| schedule91.part1.customers[].endDate | null \| string |  |
| schedule91.part1.customers[].name | null \| string |  |
| schedule91.part1.customers[].startDate | null \| string |  |
| schedule91.part1.employees | object |  |
| schedule91.part1.employees.canadianResidentAmount | null \| number |  |
| schedule91.part1.employees.canadianResidentCount | null \| number |  |
| schedule91.part1.employees.nonResidentAmount | null \| number |  |
| schedule91.part1.employees.nonResidentCount | null \| number |  |
| schedule91.part1.employees.nonResidentDaysInCanada | null \| number |  |
| schedule91.part1.employees.periodEnd | null \| string |  |
| schedule91.part1.employees.periodStart | null \| string |  |
| schedule91.part1.otherActivitySpec | null \| string |  |
| schedule91.part1.physicalFacilities | null \| string |  |
| schedule91.part1.physicalFacilitiesDetail | array |  |
| schedule91.part1.physicalFacilitiesDetail[].address | null \| string |  |
| schedule91.part1.physicalFacilitiesDetail[].nature | null \| string |  |
| schedule91.part1.province | null \| string |  |
| schedule91.part1.reg105WaiverApplied | null \| string |  |
| schedule91.part1.reg105WaiverGranted | null \| string |  |
| schedule91.part1.revenueFinancing | null \| number |  |
| schedule91.part1.revenueGoodsSold | null \| number |  |
| schedule91.part1.revenueOther | null \| number |  |
| schedule91.part1.revenueServicesProvided | null \| number |  |
| schedule91.part1.revenueTotal | null \| number |  |
| schedule91.part1.subcontractors | object |  |
| schedule91.part1.subcontractors.canadianResidentAmount | null \| number |  |
| schedule91.part1.subcontractors.canadianResidentCount | null \| number |  |
| schedule91.part1.subcontractors.nonResidentAmount | null \| number |  |
| schedule91.part1.subcontractors.nonResidentCount | null \| number |  |
| schedule91.part1.subcontractors.nonResidentDaysInCanada | null \| number |  |
| schedule91.part1.subcontractors.periodEnd | null \| string |  |
| schedule91.part1.subcontractors.periodStart | null \| string |  |
| schedule91.part1.t4aNrSlipAttestation | null \| string |  |
| schedule91.part1.t4aNrSlipAttestationReason | null \| string |  |
| schedule91.part1.treatyArticle | null \| string |  |
| schedule91.part2 | null \| object |  |
| schedule91.part2.tcpRows | array |  |
| schedule91.part2.tcpRowsSupplementaryListAttached | null \| string |  |
| schedule91.part2.tcpRows[].cost | null \| number | strict |
| schedule91.part2.tcpRows[].description | null \| string | strict |
| schedule91.part2.tcpRows[].incomeGainLoss | null \| number | strict |
| schedule91.part2.tcpRows[].outlaysAndExpenses | null \| number |  |
| schedule91.part2.tcpRows[].proceeds | null \| number \| string | strict |
| schedule91.part2.tcpRows[].s116ClearanceReason | null \| string |  |
| schedule91.part2.tcpRows[].s116ClearanceStatus | null \| string |  |
| schedule91.part2.treatyArticle | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `schedule91.countryTaxpayerId`: Box 105 — Taxpayer identification number in country of residence.
- `schedule91.countryYearEnd`: Box 110 — Tax year-end in country of residence (YYYY-MM-DD).
- `schedule91.part1`: Part 1 — Treaty-protected business in Canada (null when no Part 1 content).
- `schedule91.part1.customerRowsSupplementaryListAttached`: 155 — the printed form holds 5 customer rows. With more than 5, this must be "Y" (a supplementary list is attached); null and "N" both fail closed.
- `schedule91.part1.customers[].endDate`: Box 159 — Contract/project completed (YYYY-MM-DD).
- `schedule91.part1.customers[].name`: Box 155 — Customer corporation's name.
- `schedule91.part1.customers[].startDate`: Box 158 — Contract/project started (YYYY-MM-DD).
- `schedule91.part1.employees.canadianResidentAmount`: Box 161 — Salary/wages paid to Canadian-resident employees.
- `schedule91.part1.employees.canadianResidentCount`: Box 160 — Number of Canadian-resident employees.
- `schedule91.part1.employees.nonResidentAmount`: Box 166 — Salary/wages paid to non-resident employees.
- `schedule91.part1.employees.nonResidentCount`: Box 165 — Number of non-resident employees.
- `schedule91.part1.employees.nonResidentDaysInCanada`: Box 175 — Days non-resident employee physically present in Canada (services-PE trigger).
- `schedule91.part1.employees.periodEnd`: Box 171 — Employment period completed (YYYY-MM-DD).
- `schedule91.part1.employees.periodStart`: Box 170 — Employment period started (YYYY-MM-DD).
- `schedule91.part1.physicalFacilitiesDetail`: 135 detail — nature + address of each facility. Required (non-empty, every row complete) whenever box 135 = "Y"; must be empty otherwise.
- `schedule91.part1.physicalFacilitiesDetail[].address`: Address of the facility in Canada.
- `schedule91.part1.physicalFacilitiesDetail[].nature`: Nature of the facility (office, warehouse, workshop, site …).
- `schedule91.part1.subcontractors.canadianResidentAmount`: Box 181 — Fees paid to Canadian-resident subcontractors.
- `schedule91.part1.subcontractors.canadianResidentCount`: Box 180 — Number of Canadian-resident subcontractors.
- `schedule91.part1.subcontractors.nonResidentAmount`: Box 186 — Fees paid to non-resident subcontractors.
- `schedule91.part1.subcontractors.nonResidentCount`: Box 185 — Number of non-resident subcontractors.
- `schedule91.part1.subcontractors.nonResidentDaysInCanada`: Box 192 — Days non-resident subcontractor physically present in Canada.
- `schedule91.part1.subcontractors.periodEnd`: Box 191 — Employment period completed (YYYY-MM-DD).
- `schedule91.part1.subcontractors.periodStart`: Box 190 — Employment period started (YYYY-MM-DD).
- `schedule91.part1.t4aNrSlipAttestation`: 155 — "attach copies of all T4A-NR slips". Required once the customer table is populated; null = unanswered and the engine fails closed.
- `schedule91.part1.t4aNrSlipAttestationReason`: 155 — reason no T4A-NR slip was required. Mandatory when the attestation is "NOT_REQUIRED".
- `schedule91.part2`: Part 2 — Disposing of TCP/TPP (null when no Part 2 content).
- `schedule91.part2.tcpRowsSupplementaryListAttached`: The printed form holds 5 TCP rows. With more than 5, this must be "Y" (a supplementary list is attached); null and "N" both fail closed.
- `schedule91.part2.tcpRows[].cost`: Box 203 — Cost or adjusted cost base.
- `schedule91.part2.tcpRows[].description`: Box 201 — Description of TCP disposed of.
- `schedule91.part2.tcpRows[].incomeGainLoss`: Box 204 — Income, gain, or loss (= 202 − 203 − outlaysAndExpenses, per ITA 40(1)(a)(i)). Leave blank to let the engine derive it once outlays are answered.
- `schedule91.part2.tcpRows[].outlaysAndExpenses`: Outlays and expenses of disposition. ITA 40(1)(a)(i) subtracts these in computing the gain, so box 204 is 202 − 203 − outlays, not 202 − 203. Blank is not nil: when box 204 is also blank the engine refuses to derive it. Enter 0 if there were none. Must be ≥ 0.
- `schedule91.part2.tcpRows[].proceeds`: Box 202 — Proceeds of disposition.
- `schedule91.part2.tcpRows[].s116ClearanceReason`: Box 201 — written reason, mandatory when the status is "T2062C_TREATY_EXEMPT_NOTIFICATION_FILED" or "NOT_REQUIRED".
- `schedule91.part2.tcpRows[].s116ClearanceStatus`: Box 201 — which s.116 clearance applies to this disposition. null = unanswered and the engine fails closed.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (17 of 53 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule91.countryTaxpayerId | 0 to 20000 characters |
| schedule91.countryYearEnd | 0 to 20000 characters |
| schedule91.part1.activityCode | one of "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11" |
| schedule91.part1.customerRowsSupplementaryListAttached | one of "Y", "N" |
| schedule91.part1.physicalFacilities | one of "Y", "N" |
| schedule91.part1.province | one of "AB", "BC", "MB", "NB", "NL", "NT", "NS", "NU", "ON", "PE", "QC", "SK", "YT", "MJ" |
| schedule91.part1.reg105WaiverApplied | one of "Y", "N" |
| schedule91.part1.reg105WaiverGranted | one of "Y", "N" |
| schedule91.part1.t4aNrSlipAttestation | one of "ATTACHED", "NOT_REQUIRED" |
| schedule91.part2.tcpRowsSupplementaryListAttached | one of "Y", "N" |
| schedule91.part2.tcpRows[].cost | -1000000000000000 to 1000000000000000 |
| schedule91.part2.tcpRows[].description | 0 to 20000 characters |
| schedule91.part2.tcpRows[].incomeGainLoss | -1000000000000000 to 1000000000000000 |
| schedule91.part2.tcpRows[].proceeds | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule91.part2.tcpRows[].s116ClearanceStatus | one of "T2064_CERTIFICATE_ATTACHED", "T2068_CERTIFICATE_ATTACHED", "T2062C_TREATY_EXEMPT_NOTIFICATION_FILED", "NOT_REQUIRED" |
| schedule91.part2.treatyArticle | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (36)

| Cell | Types |
| --- | --- |
| header.countryTaxpayerId | null \| string |
| header.countryYearEnd | null \| string |
| part1 | array \| boolean \| null \| number \| object \| string |
| part2.tcpRows[].description | null \| string |
| part2.tcpRows[].proceeds | null \| number |
| part2.tcpRows[].cost | null \| number |
| part2.tcpRows[].incomeGainLoss | null \| number |
| part2.tcpRows[].outlaysAndExpenses | array \| boolean \| null \| number \| object \| string |
| part2.tcpRows[].s116ClearanceReason | array \| boolean \| null \| number \| object \| string |
| part2.tcpRows[].s116ClearanceStatus | array \| boolean \| null \| number \| object \| string |
| part2.treatyArticle | null \| string |
| part2.tcpRowsSupplementaryListAttached | array \| boolean \| null \| number \| object \| string |
| computed_revenue_total | array \| boolean \| null \| number \| object \| string |
| tcp_computed_gains[] | string |
| warnings[].box | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule92

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2023–2027
- Strict profile: s92_2026_domestic_part_xiii1_calculation_sheet_v1
- Payload schema version: 2.0.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule92"
  ],
  "inputs": {
    "taxYear": 2026,
    "schedule92": {
      "authorizedForeignBank": "Yes",
      "section20_2InterestDeducted": 10000000,
      "section20_2LiabilityInterestDeducted": 2000000,
      "section20_2AmountsReviewed": "Yes",
      "treatyStatus": "no_treaty"
    }
  }
}
```

## Input cells (17)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| schedule92.agreementHasForceOfLawInCanadaAtYearEnd | null \| string |  |
| schedule92.authorizedForeignBank | boolean \| null \| string | strict |
| schedule92.directPartXIII1RatePct | null \| number |  |
| schedule92.directPartXIII1RateProvision | null \| string |  |
| schedule92.directPartXIII1RateStatus | null \| string |  |
| schedule92.relatedPersonInterestRatePct | null \| number |  |
| schedule92.relatedPersonInterestRateProvision | null \| string |  |
| schedule92.relatedPersonInterestRateStatus | null \| string |  |
| schedule92.residentAtYearEnd | null \| string |  |
| schedule92.section20_2AmountsReviewed | null \| string | strict |
| schedule92.section20_2InterestDeducted | null \| number \| string | strict |
| schedule92.section20_2LiabilityInterestDeducted | null \| number | strict |
| schedule92.similarTaxWouldBePayableByCanadianBank | null \| string |  |
| schedule92.treatyCountry | null \| string |  |
| schedule92.treatyEntitlementConfirmed | null \| string |  |
| schedule92.treatyStatus | null \| string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (12 of 17 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| schedule92.agreementHasForceOfLawInCanadaAtYearEnd | one of "Yes", "No" |
| schedule92.authorizedForeignBank | 0 to 20000 characters |
| schedule92.directPartXIII1RateStatus | one of "specified", "not_specified" |
| schedule92.relatedPersonInterestRateStatus | one of "specified", "not_specified" |
| schedule92.residentAtYearEnd | one of "Yes", "No" |
| schedule92.section20_2AmountsReviewed | one of "Yes", "No", null |
| schedule92.section20_2InterestDeducted | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule92.section20_2LiabilityInterestDeducted | -1000000000000000 to 1000000000000000 |
| schedule92.similarTaxWouldBePayableByCanadianBank | one of "Yes", "No" |
| schedule92.treatyEntitlementConfirmed | one of "Yes", "No" |
| schedule92.treatyStatus | one of "no_treaty", "treaty_country", null |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (41)

| Cell | Types |
| --- | --- |
| amountA | null \| number |
| amountB | null \| number |
| applicable | boolean |
| calculationSheet.currency | string |
| calculationSheet.identity | object |
| calculationSheet.rows[].amount | number |
| calculationSheet.rows[].label | string |
| calculationSheet.rows[].ratePct | number |
| calculationSheet.statutoryAuthority | string |
| calculationSheet.taxYear | integer |
| calculationSheet.title | string |
| calculationSheetComplete | boolean |
| effectiveRatePct | null \| number |
| excess | null \| number |
| missingRequired[] | string |
| partXIII1TaxPayable | null \| number |
| provisional | boolean |
| rateBranch | null \| string |
| ready | boolean |
| schedule | string |
| t2_line_727_feed | null \| number |
| taxableInterestExpense | null \| number |
| treatyExempt | boolean |
| warnings[].field | string |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].sources[] | string |
| warnings[].taxYear | integer |
| warnings[].taxYears[] | integer |
| t2_line_727_feed_citation.applies_to_boxes[] | string |
| t2_line_727_feed_citation.cra_text_verbatim | string |
| t2_line_727_feed_citation.form_id | string |
| t2_line_727_feed_citation.form_revision | string |
| t2_line_727_feed_citation.gate_id | string |
| t2_line_727_feed_citation.rule | string |
| t2_line_727_feed_citation.source | string |
| t2_line_727_feed_citation.source_url | string |
| t2_line_727_feed_citation.verified_at | string |

### Output cell notes

- `warnings[].code`: Stable machine identity of the disclosure, independent of its prose.
- `warnings[].notes`: What the rate manifest records against the year, including what is still outstanding before the year can be verified.
- `warnings[].section`: The module that emitted the disclosure.
- `warnings[].taxYear`: The taxation year whose rate tables are unverified.

# schedule97

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2011 and later
- Strict profile: s97_versioned_profile_target_value_v1
- Payload schema version: 0.5.0
- Dependencies (run automatically): schedule20, schedule91, schedule92

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "schedule97"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "daysInYear": 365,
    "schedule97": {
      "incorporationCountry": "United States",
      "nrCategoryCode": "10"
    },
    "isCCPC": false
  }
}
```

## Input cells (10)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| daysInYear | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| isCCPC | boolean |  |
| schedule97.certificateOfDiscontinuance | null \| string |  |
| schedule97.code08TreatyEligible | boolean \| null |  |
| schedule97.incorporationCountry | null \| string | strict |
| schedule97.nrCategoryCode | null \| string | strict |
| schedule97.section216_4UndertakingFiled | boolean \| null |  |
| taxYear | integer \| string | always |

### Input cell notes

- `daysInYear`: Days in the taxation year. It must equal the inclusive fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. The 377-day upper bound admits the longest acquisition-of-control-elected year under ITA 249.1(1)(a) and 249(4)(b); the canonical batch seam still rejects a period that ITA 249(3) deems split.
- `fiscalEnd`: Last day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear; the engine rejects any other combination before computing.
- `fiscalStart`: First day of the taxation year, as YYYY-MM-DD. ITA s.249(1)(a) makes the taxation year the fiscal period, and the Part I rates and limits this candidate's dependency closure computes are day-weighted, so the engine requires the stated period instead of assuming a calendar year. It must fall in the taxYear stated above or the year before it.
- `isCCPC`: The corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year.
- `schedule97.certificateOfDiscontinuance`: This candidate excludes the Canada-incorporation branch, so box 210 must be explicit JSON null.
- `schedule97.code08TreatyEligible`: Code-08 sidecar: whether the entity claims Canada-U.S. Treaty benefits under Article IV(6). False requires Schedule 20 for Part XIV tax.
- `schedule97.incorporationCountry`: A single line of country text with no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit. Values whose first word is Canada, in any casing, are excluded.
- `schedule97.nrCategoryCode`: Branch-limited box 300 value: code 10 (life insurance business in Canada) or code 11 (insurance business in Canada other than life insurance). No implication about filing completeness or companion requirements is made.
- `schedule97.section216_4UndertakingFiled`: Schedule-side persistence home for the non-resident's undertaking under ITA 216(4), commonly filed on Form NR6. This is not a printed S97 box.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (7 of 10 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule97.certificateOfDiscontinuance | one of "Y", "N", null |
| schedule97.incorporationCountry | matches ^\S(?:[^\r\n]*\S)?$; 1 to 10000 characters |
| schedule97.nrCategoryCode | one of "10", "11", "01", "02", "03", "04" |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (39)

| Cell | Types |
| --- | --- |
| incorporationCountry | null \| string |
| incorporatedInCanada | boolean \| null |
| certificateOfDiscontinuance | null \| string |
| nrCategoryCode | null \| string |
| categoryImplications.requires_s91 | boolean |
| categoryImplications.requires_tcp_form | boolean |
| categoryImplications.requires_s20 | boolean |
| categoryImplications.requires_schedule_92 | boolean |
| categoryImplications.is_section_216_election | boolean |
| categoryImplications.is_actor_election | boolean |
| categoryImplications.is_emigrant | boolean |
| categoryImplications.is_llc_llp_lllp_treaty_hybrid | boolean |
| warnings | array |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| warnings[].code | string |
| warnings[].message | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].severity | string |
| warnings[].taxYear | integer |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| missing_required | array |
| warnings[].box | null \| string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].gate_id | string |

### Output cell notes

- `incorporationCountry`: Box 200, the country of incorporation. Null when the request does not state it, which is itself one of the gated conditions.
- `incorporatedInCanada`: Whether box 200 names Canada. Null when box 200 is unanswered.
- `certificateOfDiscontinuance`: Box 210, echoed from the request. The form asks it only of a corporation incorporated in Canada, so answering it on this candidate's non-Canada branch raises a gate.
- `nrCategoryCode`: Box 300, the non-resident category code. Null when the request does not state it, which is itself one of the gated conditions.
- `fired_gates`: Every registered gate this result raised, keyed by gate identifier. At least one member is what selects this branch.
- `warnings[].box`: The form box the finding is about, or the em dash the engine prints when the gate is about the form rather than one box.

# t2142

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 2025 and later
- Strict profile: t2142_2026_exact_prescribed_form_v1
- Payload schema version: 2.0.0
- Dependencies (run automatically): none

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "t2142"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "isLifeInsurer": true,
    "t2142": {
      "amendedReturn": false,
      "isNonResident": false,
      "corporationName": "Harbourlight Life Insurance Company",
      "businessNumberRoot": "123456782",
      "businessNumberReference": "0001",
      "address": "1 Main Street",
      "city": "Toronto",
      "provinceTerritoryState": "ON",
      "postalOrZipCode": "M5V1A1",
      "country": "Canada",
      "contactPerson": "Jane Smith",
      "firmName": "Northstar Tax LLP",
      "telephoneNumber": "4165551212",
      "reg1401ReserveReviewStatus": "complete",
      "reg1401ReserveRows": [
        {
          "policyId": "P1",
          "sourceRef": "certified actuarial reserve packet",
          "actuarialCertificationConfirmed": true,
          "policyGroup": "individual",
          "paragraph": "a",
          "segregatedFundLiability": false,
          "taxabilityCategory": "taxable",
          "direction": "direct",
          "current": {
            "reportedLiability": 1000000
          },
          "prior": {
            "reportedLiability": 1000000
          }
        }
      ],
      "investmentPolicyReviewStatus": "complete",
      "investmentPolicyRows": [
        {
          "policyId": "P1",
          "classificationConfirmed": true,
          "taxableLifePolicyConfirmed": true,
          "investmentRateClass": "full_rate",
          "currentMaximumReserve": 1000000,
          "priorMaximumReserve": 1000000
        }
      ],
      "cfrReviewStatus": "no_cfr_policies",
      "cfrPolicyRows": [],
      "policyholderAdjustmentReviewStatus": "no_policyholder_adjustments",
      "policyholderAdjustmentRows": [],
      "lossContinuityStatus": "no_prior_losses",
      "lossRows": [],
      "instalmentPayments": [],
      "amountEnclosed": 0,
      "estimatedCurrentYearPartXii3Tax": 2046,
      "priorYearPartXii3Tax": 0,
      "priorYearDaysExcludingFebruary29": 365,
      "officerName": "Jane Smith",
      "officerTitle": "CFO",
      "certificationDate": "2026-03-01",
      "certificationConfirmed": true
    }
  }
}
```

## Input cells (54)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| isLifeInsurer | boolean | strict |
| t2142 | null \| object |  |
| t2142.address | string | strict |
| t2142.amendedReturn | boolean | strict |
| t2142.amountEnclosed | integer | strict |
| t2142.businessNumberReference | null \| string | strict |
| t2142.businessNumberRoot | null \| string | strict |
| t2142.certificationConfirmed | boolean | strict |
| t2142.certificationDate | string | strict |
| t2142.cfrPolicyRows | array \| null | strict |
| t2142.cfrReviewStatus | null \| string | strict |
| t2142.city | string | strict |
| t2142.contactPerson | string | strict |
| t2142.corporationName | string | strict |
| t2142.country | string | strict |
| t2142.estimatedCurrentYearPartXii3Tax | null \| number \| string | strict |
| t2142.firmName | string | strict |
| t2142.instalmentPayments | array | strict |
| t2142.investmentPolicyReviewStatus | null \| string | strict |
| t2142.investmentPolicyRows | array \| null |  |
| t2142.investmentPolicyRows[].classificationConfirmed | boolean | strict |
| t2142.investmentPolicyRows[].currentMaximumReserve | integer | strict |
| t2142.investmentPolicyRows[].investmentRateClass | string | strict |
| t2142.investmentPolicyRows[].policyId | string | strict |
| t2142.investmentPolicyRows[].priorMaximumReserve | integer | strict |
| t2142.investmentPolicyRows[].taxableLifePolicyConfirmed | boolean | strict |
| t2142.isNonResident | boolean \| null | strict |
| t2142.lossContinuityStatus | null \| string | strict |
| t2142.lossRows | array \| null | strict |
| t2142.officerName | string | strict |
| t2142.officerTitle | string | strict |
| t2142.policyholderAdjustmentReviewStatus | null \| string | strict |
| t2142.policyholderAdjustmentRows | array \| null | strict |
| t2142.postalOrZipCode | string | strict |
| t2142.priorYearDaysExcludingFebruary29 | null \| number | strict |
| t2142.priorYearPartXii3Tax | null \| number \| string | strict |
| t2142.provinceTerritoryState | string | strict |
| t2142.reg1401ReserveReviewStatus | null \| string | strict |
| t2142.reg1401ReserveRows | array \| null |  |
| t2142.reg1401ReserveRows[].actuarialCertificationConfirmed | boolean | strict |
| t2142.reg1401ReserveRows[].current.reportedLiability | integer | strict |
| t2142.reg1401ReserveRows[].direction | string | strict |
| t2142.reg1401ReserveRows[].paragraph | string | strict |
| t2142.reg1401ReserveRows[].policyGroup | string | strict |
| t2142.reg1401ReserveRows[].policyId | string | strict |
| t2142.reg1401ReserveRows[].prior.reportedLiability | integer | strict |
| t2142.reg1401ReserveRows[].segregatedFundLiability | boolean | strict |
| t2142.reg1401ReserveRows[].sourceRef | string | strict |
| t2142.reg1401ReserveRows[].taxabilityCategory | string | strict |
| t2142.taxpayerIdentificationNumber | null \| string |  |
| t2142.telephoneNumber | string | strict |
| taxYear | integer \| string | always |

### Input cell notes

- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `fiscalStart`: The first day of the taxation year (ISO YYYY-MM-DD). With fiscalEnd and daysInYear it is the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure — the request is refused before any computation when one is missing. The bounds also drive Schedule 8's Reg 1100(3) short-year CCA proration and the Reg 1104(3.5)(b) immediate-expensing limit proration.
- `t2142`: Part XII.3 life-insurer return inputs. The server injects canonical identity, life-insurer status, and the signed prior-return closure.
- `t2142.businessNumberReference`: The four-digit RC account reference printed at T2142 line 001.
- `t2142.businessNumberRoot`: The nine-digit business-number root printed at T2142 line 001.
- `t2142.cfrPolicyRows`: Reviewed Canadian federal and provincial registered-policy rows for T2142 Part 5. Send an empty array with a no_cfr_policies review status when none exist.
- `t2142.cfrReviewStatus`: Conclusion of the T2142 Canadian federal and provincial registered-policy review.
- `t2142.estimatedCurrentYearPartXii3Tax`: Practitioner estimate of current-year Part XII.3 tax used to calculate the monthly ITA section 211.3 instalment base.
- `t2142.investmentPolicyReviewStatus`: Conclusion of the T2142 taxable investment-policy review.
- `t2142.investmentPolicyRows`: Reviewed taxable investment-policy rows for T2142 Part 4. Send an empty array with a no_taxable_policies review status when none exist.
- `t2142.isNonResident`: T2142 line 003 answer stating whether the life insurer is non-resident.
- `t2142.lossContinuityStatus`: Conclusion of the authenticated Part XII.3 loss-continuity review.
- `t2142.lossRows`: Authenticated Part XII.3 loss-continuity rows for T2142 Part 7. Send an empty array with a no_prior_losses status when no prior losses remain.
- `t2142.policyholderAdjustmentReviewStatus`: Conclusion of the T2142 policyholder-adjustment review.
- `t2142.policyholderAdjustmentRows`: Reviewed policyholder-adjustment rows for T2142 Part 6. Send an empty array with a no_policyholder_adjustments status when none exist.
- `t2142.priorYearDaysExcludingFebruary29`: Authenticated prior taxation-year day count excluding February 29, used to annualize prior Part XII.3 tax for sections 211.3 and 211.5. The signed prior-filed closure overwrites this editable copy.
- `t2142.priorYearPartXii3Tax`: Authenticated prior-year Part XII.3 tax used for the sections 211.3 and 211.5 instalment bases. The signed prior-filed closure overwrites this editable copy and reconciliation detects a stale mismatch.
- `t2142.reg1401ReserveReviewStatus`: Conclusion of the Regulation 1401 reserve review for T2142 Part 3.
- `t2142.reg1401ReserveRows`: Reviewed Regulation 1401 policy reserve rows for T2142 Part 3. Send an empty array with a no_reserves status when none exist.
- `t2142.taxpayerIdentificationNumber`: Non-resident taxpayer identification number printed at T2142 line 020; required when line 003 is Yes.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (42 of 54 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| t2142.address | 0 to 20000 characters |
| t2142.amountEnclosed | -1000000000000000 to 1000000000000000 |
| t2142.businessNumberReference | 0 to 20000 characters |
| t2142.businessNumberRoot | 0 to 20000 characters |
| t2142.certificationDate | 0 to 20000 characters |
| t2142.cfrPolicyRows | exactly [] (pinned) |
| t2142.cfrReviewStatus | one of "complete", "no_cfr_policies", null |
| t2142.city | 0 to 20000 characters |
| t2142.contactPerson | 0 to 20000 characters |
| t2142.corporationName | 0 to 20000 characters |
| t2142.country | 0 to 20000 characters |
| t2142.estimatedCurrentYearPartXii3Tax | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t2142.firmName | 0 to 20000 characters |
| t2142.instalmentPayments | exactly [] (pinned) |
| t2142.investmentPolicyReviewStatus | one of "complete", "no_taxable_policies", null |
| t2142.investmentPolicyRows[].currentMaximumReserve | -1000000000000000 to 1000000000000000 |
| t2142.investmentPolicyRows[].investmentRateClass | 0 to 20000 characters |
| t2142.investmentPolicyRows[].policyId | 0 to 20000 characters |
| t2142.investmentPolicyRows[].priorMaximumReserve | -1000000000000000 to 1000000000000000 |
| t2142.lossContinuityStatus | one of "complete", "no_prior_losses", null |
| t2142.lossRows | exactly [] (pinned) |
| t2142.officerName | 0 to 20000 characters |
| t2142.officerTitle | 0 to 20000 characters |
| t2142.policyholderAdjustmentReviewStatus | one of "complete", "no_policyholder_adjustments", null |
| t2142.policyholderAdjustmentRows | exactly [] (pinned) |
| t2142.postalOrZipCode | 0 to 20000 characters |
| t2142.priorYearDaysExcludingFebruary29 | -1000000000000000 to 1000000000000000 |
| t2142.priorYearPartXii3Tax | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t2142.provinceTerritoryState | 0 to 20000 characters |
| t2142.reg1401ReserveReviewStatus | one of "complete", "no_reserves", null |
| t2142.reg1401ReserveRows[].current.reportedLiability | -1000000000000000 to 1000000000000000 |
| t2142.reg1401ReserveRows[].direction | 0 to 20000 characters |
| t2142.reg1401ReserveRows[].paragraph | 0 to 20000 characters |
| t2142.reg1401ReserveRows[].policyGroup | 0 to 20000 characters |
| t2142.reg1401ReserveRows[].policyId | 0 to 20000 characters |
| t2142.reg1401ReserveRows[].prior.reportedLiability | -1000000000000000 to 1000000000000000 |
| t2142.reg1401ReserveRows[].sourceRef | 0 to 20000 characters |
| t2142.reg1401ReserveRows[].taxabilityCategory | 0 to 20000 characters |
| t2142.telephoneNumber | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (292)

| Cell | Types |
| --- | --- |
| applicable | boolean \| null |
| attachments.instalmentList | array |
| attachments.part4Overflow | array |
| attachments.part7Overflow | array |
| authority | string |
| cfrPolicyCalculations | array |
| daysExcludingFebruary29 | integer |
| filingProjectionReady | boolean |
| filingWarnings[].code | string |
| filingWarnings[].field | string |
| filingWarnings[].message | string |
| filingWarnings[].severity | string |
| fiscalEnd | string |
| fiscalStart | string |
| form.address | string |
| form.amendedReturn | boolean |
| form.businessNumberReference | string |
| form.businessNumberRoot | string |
| form.certificationDate | string |
| form.city | string |
| form.contactPerson | string |
| form.corporationName | string |
| form.country | string |
| form.extensionNumber | string |
| form.firmName | string |
| form.fiscalEnd | string |
| form.fiscalStart | string |
| form.fullRatePolicies[].currentMaximumReserve | number |
| form.fullRatePolicies[].guaranteedRateFraction | number |
| form.fullRatePolicies[].guaranteedRatePct | number |
| form.fullRatePolicies[].investmentRateClass | string |
| form.fullRatePolicies[].meanMaximumReserve | number |
| form.fullRatePolicies[].policyId | string |
| form.fullRatePolicies[].prePercentageAmount | number |
| form.fullRatePolicies[].priorMaximumReserve | number |
| form.fullRatePolicies[].rateDifferenceFraction | number |
| form.fullRatePolicies[].rateDifferencePct | number |
| form.isNonResident | boolean |
| form.lines.100 | number |
| form.lines.105 | number |
| form.lines.110 | number |
| form.lines.115 | number |
| form.lines.120 | number |
| form.lines.125 | number |
| form.lines.130 | number |
| form.lines.135 | number |
| form.lines.200 | number |
| form.lines.202 | number |
| form.lines.204 | number |
| form.lines.206 | number |
| form.lines.208 | number |
| form.lines.210 | number |
| form.lines.212 | number |
| form.lines.214 | number |
| form.lines.216 | number |
| form.lines.218 | number |
| form.lines.220 | number |
| form.lines.222 | number |
| form.lines.224 | number |
| form.lines.226 | number |
| form.lines.228 | number |
| form.lines.230 | number |
| form.lines.232 | number |
| form.lines.234 | number |
| form.lines.236 | number |
| form.lines.238 | number |
| form.lines.240 | number |
| form.lines.242 | number |
| form.lines.244 | number |
| form.lines.400 | number |
| form.lines.530 | number |
| form.lines.565 | number |
| form.lines.570 | number |
| form.lines.575 | number |
| form.lines.600 | number |
| form.lines.610 | number |
| form.lines.620 | number |
| form.lines.630 | number |
| form.lines.640 | number |
| form.lines.650 | number |
| form.lines.660 | number |
| form.lines.670 | number |
| form.lines.700 | number |
| form.lines.701 | number |
| form.lines.702 | number |
| form.lines.703 | number |
| form.lines.704 | number |
| form.lines.705 | number |
| form.lines.706 | number |
| form.lines.707 | number |
| form.lines.708 | number |
| form.lines.709 | number |
| form.lines.710 | number |
| form.lines.711 | number |
| form.lines.712 | number |
| form.lines.713 | number |
| form.lines.714 | number |
| form.lines.715 | number |
| form.lines.716 | number |
| form.lines.717 | number |
| form.lines.718 | number |
| form.lines.719 | number |
| form.lines.720 | number |
| form.lines.721 | number |
| form.lines.722 | number |
| form.lines.723 | number |
| form.lines.724 | number |
| form.lines.725 | number |
| form.lines.726 | number |
| form.lines.727 | number |
| form.lines.728 | number |
| form.lines.729 | number |
| form.lines.730 | number |
| form.lines.A | number |
| form.lines.B | number |
| form.lines.C | number |
| form.lines.D | number |
| form.lines.E | number |
| form.lines.F | number |
| form.lines.G | number |
| form.lines.H | number |
| form.lines.I | number |
| form.lines.J | number |
| form.lines.K | number |
| form.lines.L | number |
| form.lines.M | number |
| form.lines.N | number |
| form.lines.O | number |
| form.lines.P | number |
| form.lines.Q | number |
| form.lines.R | number |
| form.lossContinuity | array |
| form.officerName | string |
| form.officerTitle | string |
| form.policyholderAdjustments[].adjustment | number |
| form.policyholderAdjustments[].percentage | number |
| form.policyholderAdjustments[].section12_2Amount | number |
| form.policyholderAdjustments[].section56_1_jAmount | number |
| form.policyholderAdjustments[].taxableYearCount | integer \| string |
| form.policyholderAdjustments[].total | number |
| form.postalOrZipCode | string |
| form.provinceTerritoryState | string |
| form.reducedRatePolicies | array |
| form.taxpayerIdentificationNumber | string |
| form.telephoneNumber | string |
| formId | string |
| instalmentPayments | array |
| investmentPolicyCalculations[].currentMaximumReserve | number |
| investmentPolicyCalculations[].guaranteedRateFraction | number |
| investmentPolicyCalculations[].guaranteedRatePct | number |
| investmentPolicyCalculations[].investmentRateClass | string |
| investmentPolicyCalculations[].meanMaximumReserve | number |
| investmentPolicyCalculations[].policyId | string |
| investmentPolicyCalculations[].prePercentageAmount | number |
| investmentPolicyCalculations[].priorMaximumReserve | number |
| investmentPolicyCalculations[].rateDifferenceFraction | number |
| investmentPolicyCalculations[].rateDifferencePct | number |
| lines.100 | number |
| lines.105 | number |
| lines.110 | number |
| lines.115 | number |
| lines.120 | number |
| lines.125 | number |
| lines.130 | number |
| lines.135 | number |
| lines.200 | number |
| lines.202 | number |
| lines.204 | number |
| lines.206 | number |
| lines.208 | number |
| lines.210 | number |
| lines.212 | number |
| lines.214 | number |
| lines.216 | number |
| lines.218 | number |
| lines.220 | number |
| lines.222 | number |
| lines.224 | number |
| lines.226 | number |
| lines.228 | number |
| lines.230 | number |
| lines.232 | number |
| lines.234 | number |
| lines.236 | number |
| lines.238 | number |
| lines.240 | number |
| lines.242 | number |
| lines.244 | number |
| lines.400 | number |
| lines.530 | number |
| lines.565 | number |
| lines.570 | number |
| lines.575 | number |
| lines.600 | number |
| lines.610 | number |
| lines.620 | number |
| lines.630 | number |
| lines.640 | number |
| lines.650 | number |
| lines.660 | number |
| lines.670 | number |
| lines.700 | number |
| lines.701 | number |
| lines.702 | number |
| lines.703 | number |
| lines.704 | number |
| lines.705 | number |
| lines.706 | number |
| lines.707 | number |
| lines.708 | number |
| lines.709 | number |
| lines.710 | number |
| lines.711 | number |
| lines.712 | number |
| lines.713 | number |
| lines.714 | number |
| lines.715 | number |
| lines.716 | number |
| lines.717 | number |
| lines.718 | number |
| lines.719 | number |
| lines.720 | number |
| lines.721 | number |
| lines.722 | number |
| lines.723 | number |
| lines.724 | number |
| lines.725 | number |
| lines.726 | number |
| lines.727 | number |
| lines.728 | number |
| lines.729 | number |
| lines.730 | number |
| lines.A | number |
| lines.B | number |
| lines.C | number |
| lines.D | number |
| lines.E | number |
| lines.F | number |
| lines.G | number |
| lines.H | number |
| lines.I | number |
| lines.J | number |
| lines.K | number |
| lines.L | number |
| lines.M | number |
| lines.N | number |
| lines.O | number |
| lines.P | number |
| lines.Q | number |
| lines.R | number |
| lossContinuity | array |
| missing_required[] | string |
| partXii3Obligations.actualCurrentAnnualizedTax | number |
| partXii3Obligations.estimatedCurrentAnnualizedTax | null \| number |
| partXii3Obligations.priorAnnualizedTax | null \| number |
| partXii3Obligations.section211_3MonthlyObligations[].amount | number |
| partXii3Obligations.section211_3MonthlyObligations[].nominalDueDate | string |
| partXii3Obligations.section211_3MonthlyObligations[].statutoryBasis | string |
| partXii3Obligations.section211_5ActualInterestBaseObligations[].amount | number |
| partXii3Obligations.section211_5ActualInterestBaseObligations[].nominalDueDate | string |
| partXii3Obligations.section211_5ActualInterestBaseObligations[].statutoryBasis | string |
| partXii3TaxPayable | number |
| policyholderAdjustmentCalculations | array |
| priorClosureAuthenticated | boolean |
| priorClosureLineage | array \| boolean \| null \| number \| object \| string |
| provisional | boolean |
| rate.fraction | number |
| rate.observationCount | integer |
| rate.percent | number |
| rate.rawResponseSha256 | string |
| rate.series | string |
| rate.sourceUrl | string |
| rate.windowEnd | string |
| rate.windowStart | string |
| ready | boolean |
| reserveCalculations[].currentMaximum | number |
| reserveCalculations[].disabledCurrent | number |
| reserveCalculations[].disabledPrior | number |
| reserveCalculations[].line | string |
| reserveCalculations[].paragraph | string |
| reserveCalculations[].policyId | string |
| reserveCalculations[].priorMaximum | number |
| schedule | string |
| shortYearProrationApplies | boolean |
| taxYear | integer |
| taxableCanadianLifeInvestmentIncome | number |
| warnings[].code | string |
| warnings[].field | string |
| warnings[].message | string |
| warnings[].severity | string |
| firstReturnAttestationAccepted | boolean |
| priorAuthorityAccepted | boolean |

# t661

T2 Corporation Income Tax Return

- Kind: batch
- Supported tax years: 1985 and later
- Strict profile: t661_2025_synthetic_proxy_arithmetic_v1
- Payload schema version: 0.15.0
- Dependencies (run automatically): aoc

## Example request

Send this body to `POST /api/v1/computations/batch`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "compute": [
    "t661"
  ],
  "inputs": {
    "fiscalEnd": "2025-12-31",
    "fiscalStart": "2025-01-01",
    "t661": {
      "businessNumber": "123456782RC0001",
      "corporationName": "Cedar Ridge Manufacturing Inc.",
      "line300SalariesDirectlyEngaged": 200000,
      "line305SalariesSpecified": 50000,
      "line307SalariesNAL": 0,
      "line309SalariesSpecifiedOutsideCanada": 0,
      "line310PriorUnpaidSalariesPaidThisYear": 0,
      "line315CurrentYearUnpaidSalaries": 0,
      "line320MaterialsConsumed": 30000,
      "line325MaterialsTransformed": 0,
      "line340ContractPaymentsAL": 20000,
      "line345ContractPaymentsNAL": 0,
      "line350LeaseCostsAllOrSubstantiallyAll": 0,
      "line355LeaseCostsPrimarily": 0,
      "line360OverheadTraditional": 0,
      "line370ThirdPartyPayments": 0,
      "line390CapitalExpenditures": 0,
      "line502ProxyAmount": 110000,
      "line410CapitalLegacy": 0,
      "line429ProvincialGovernmentAssistance": 10000,
      "line429ProvincialGovernmentAssistanceRelatingToCurrent": 10000,
      "line429ProvincialGovernmentAssistanceRelatingToCapital": 0,
      "line431OtherGovernmentAssistance": 0,
      "line431OtherGovernmentAssistanceRelatingToCurrent": 0,
      "line431OtherGovernmentAssistanceRelatingToCapital": 0,
      "line432NonGovernmentAssistance": 0,
      "line432NonGovernmentAssistanceRelatingToCurrent": 0,
      "line432NonGovernmentAssistanceRelatingToCapital": 0,
      "contractPaymentsReceivedForQualifiedExpenditures": 0,
      "contractPaymentsReceivedForQualifiedExpendituresRelatingToCurrent": 0,
      "contractPaymentsReceivedForQualifiedExpendituresRelatingToCapital": 0,
      "line435PriorYearItcApplied": 0,
      "line440SaleCapitalAssetsAndOtherDeductions": 0,
      "line450OpeningPool": 0,
      "line460DeductionClaimed": 290000,
      "line560RepaymentsAssistanceContractPayments": 0,
      "methodElected": "proxy",
      "proxySalaryBase": 200000,
      "sredSpecifiedEmployeeCapApplied": true,
      "sredSpecifiedEmployeeBonusOrProfitRemuneration": 0,
      "sredProxySalaryBaseExclusionsReg2900_9": 0,
      "sredContractPayeeRows": [
        {
          "payeeId": "contractor-340",
          "paymentLine": "340",
          "amount": 20000,
          "payeeResidentInCanada": true,
          "payeeIsCanadianPartnership": false,
          "amountRelatesToBusinessThroughCanadianPe": false
        }
      ],
      "sredNalSupplierPurchasesDisclosed": true,
      "sredUnpaidRemunerationReviewed": true,
      "sredExpendituresIncludedInBookIncome": 0,
      "sredExemptIncomeExclusionReviewed": true,
      "sredCurrentExpendituresRelatedToExemptIncome": 0,
      "sredCapitalExpendituresRelatedToExemptIncome": 0,
      "sredItcUnpaidAmountsReviewed": true,
      "sredProxyOverallCapAmount": 1000000,
      "sredFilingDueDate": "2026-06-30",
      "sredPrescribedFormFiledDate": "2026-06-30",
      "sredPrescribedInformationComplete": true
    },
    "taxYear": 2025
  }
}
```

## Input cells (157)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| fiscalEnd | null \| string | strict |
| fiscalStart | null \| string | strict |
| t661 | object |  |
| t661.businessNumber | null \| string | strict |
| t661.contractPaymentsReceivedForQualifiedExpenditures | null \| number | strict |
| t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCapital | null \| number \| string | strict |
| t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCurrent | null \| number \| string | strict |
| t661.corporationName | null \| string | strict |
| t661.leaseCostExpenditureDate | null \| string |  |
| t661.leaseCostIsGeneralPurposeOfficeEquipmentOrFurniture | boolean \| null |  |
| t661.line300SalariesDirectlyEngaged | null \| number | strict |
| t661.line305SalariesSpecified | null \| number | strict |
| t661.line307ForeignSalaryEligibilityAttested | boolean \| null |  |
| t661.line307Nature | null \| string |  |
| t661.line307SalariesNAL | null \| number | strict |
| t661.line309SalariesSpecifiedOutsideCanada | null \| number | strict |
| t661.line310PriorUnpaidSalariesPaidThisYear | null \| number | strict |
| t661.line315CurrentYearUnpaidSalaries | null \| number | strict |
| t661.line320MaterialsConsumed | null \| number | strict |
| t661.line325MaterialsTransformed | null \| number | strict |
| t661.line340ContractPaymentsAL | null \| number | strict |
| t661.line345ContractPaymentsNAL | null \| number | strict |
| t661.line350LeaseCostsAllOrSubstantiallyAll | null \| number | strict |
| t661.line355LeaseCostsPrimarily | null \| number | strict |
| t661.line360OverheadTraditional | null \| number | strict |
| t661.line370ThirdPartyPayments | null \| number | strict |
| t661.line390CapitalAvailableForUse | boolean \| null |  |
| t661.line390CapitalExpenditureAcquisitionDate | null \| string |  |
| t661.line390CapitalExpenditurePart6BRows | array |  |
| t661.line390CapitalExpenditurePart6BRows[].acquisitionDate | string |  |
| t661.line390CapitalExpenditurePart6BRows[].adjustedSellingCostToSupplier | null \| number |  |
| t661.line390CapitalExpenditurePart6BRows[].capitalExpenditureAmount | null \| number |  |
| t661.line390CapitalExpenditurePart6BRows[].nonArmsLengthSupplier | boolean \| null |  |
| t661.line390CapitalExpenditurePart6BRows[].projectNumbers | string |  |
| t661.line390CapitalExpenditurePart6BRows[].propertyName | string |  |
| t661.line390CapitalExpenditures | null \| number | strict |
| t661.line390CapitalIsDepreciablePropertyNotLand | boolean \| null |  |
| t661.line410CapitalLegacy | null \| number | strict |
| t661.line429ProvincialGovernmentAssistance | null \| number | strict |
| t661.line429ProvincialGovernmentAssistanceRelatingToCapital | null \| number \| string | strict |
| t661.line429ProvincialGovernmentAssistanceRelatingToCurrent | null \| number \| string | strict |
| t661.line431OtherGovernmentAssistance | null \| number | strict |
| t661.line431OtherGovernmentAssistanceRelatingToCapital | null \| number \| string | strict |
| t661.line431OtherGovernmentAssistanceRelatingToCurrent | null \| number \| string | strict |
| t661.line432NonGovernmentAssistance | null \| number | strict |
| t661.line432NonGovernmentAssistanceRelatingToCapital | null \| number \| string | strict |
| t661.line432NonGovernmentAssistanceRelatingToCurrent | null \| number \| string | strict |
| t661.line435PriorYearItcApplied | null \| number | strict |
| t661.line440SaleCapitalAssetsAndOtherDeductions | null \| number | strict |
| t661.line445AssistanceRepayments | null \| number |  |
| t661.line450OpeningPool | null \| number | strict |
| t661.line452PoolTransferOnAmalgamationOrWindUp | null \| number |  |
| t661.line453PriorYearItcRecaptured | null \| number |  |
| t661.line453PriorYearItcRecapturedConfirmed | boolean \| null |  |
| t661.line460ClaimFullPool | boolean \| null |  |
| t661.line460DeductionClaimed | null \| number | strict |
| t661.line500PriorYearUnpaidAmountsPaid | null \| number |  |
| t661.line502ProxyAmount | null \| number | strict |
| t661.line504SUEAllPropertiesAcquiredAfter20241215 | boolean \| null |  |
| t661.line504SUEAllPropertiesAvailableForUse | boolean \| null |  |
| t661.line504SUEAllPropertiesDepreciableNotPrescribed | boolean \| null |  |
| t661.line504SUEAllPropertiesUsedPrimarilyForSredInCanada | boolean \| null |  |
| t661.line504SUECapitalCostAfterS127_11_6 | null \| number |  |
| t661.line504SUENoGeneralPurposeOfficeEquipmentOrFurniture | boolean \| null |  |
| t661.line504SUEPart6CDetailsComplete | boolean \| null |  |
| t661.line504SUEPart6CRows | array |  |
| t661.line504SUEPart6CRows[].adjustedCapitalCostAfterS127_11_6 | null \| number |  |
| t661.line504SUEPart6CRows[].availableForUse | boolean \| null |  |
| t661.line504SUEPart6CRows[].depreciableNotPrescribed | boolean \| null |  |
| t661.line504SUEPart6CRows[].notGeneralPurposeOfficeEquipmentOrFurniture | boolean \| null |  |
| t661.line504SUEPart6CRows[].projectNumbers | string |  |
| t661.line504SUEPart6CRows[].propertyName | string |  |
| t661.line504SUEPart6CRows[].purchaseDate | string |  |
| t661.line504SUEPart6CRows[].qualifyingAmount25Percent | null \| number |  |
| t661.line504SUEPart6CRows[].term | integer \| null |  |
| t661.line504SUEPart6CRows[].usedPrimarilyForSredInCanada | boolean \| null |  |
| t661.line504SUETermsConfirmed | boolean \| null |  |
| t661.line504SharedUseEquipmentCapital | null \| number |  |
| t661.line508QualifiedExpendituresTransferredIn | null \| number |  |
| t661.line508TransferAgreementAmount | null \| number |  |
| t661.line508TransferPrescribedFormFiled | boolean \| null |  |
| t661.line508TransferorAggregateAllocatedToAllTransferees | null \| number |  |
| t661.line508TransferorArmsLengthEquivalentAmount | null \| number |  |
| t661.line508TransferorButForQualifiedExpenditurePool | null \| number |  |
| t661.line510QualifiedExpendituresTransferredInCapital | null \| number |  |
| t661.line520UnpaidCurrentExpendituresAtDay180 | null \| number |  |
| t661.line544QualifiedExpendituresTransferredOut | null \| number |  |
| t661.line546QualifiedExpendituresTransferredOutCapital | null \| number |  |
| t661.line558QSECapital | null \| number |  |
| t661.line558QSECapitalAcquiredAfter20241215 | boolean \| null |  |
| t661.line558QSECapitalAvailableForUse | boolean \| null |  |
| t661.line558QSECapitalBuildingHasLargerParticles | boolean \| null |  |
| t661.line558QSECapitalBuildingMaxDisplacementMicrometres | null \| number |  |
| t661.line558QSECapitalBuildingParticleDiameterMicrometres | null \| number |  |
| t661.line558QSECapitalBuildingParticlesPer0028CubicMetre | null \| number |  |
| t661.line558QSECapitalIntendedAllOrSubstantiallyAllSredUse | boolean \| null |  |
| t661.line558QSECapitalIsBuildingOrBuildingLeasehold | boolean \| null |  |
| t661.line558QSECapitalIsDepreciablePropertyNotLand | boolean \| null |  |
| t661.line558QSECapitalNotPreviouslyUsedProperty | boolean \| null |  |
| t661.line558QSECapitalNotQualifiedProperty | boolean \| null |  |
| t661.line560RepaymentsAssistanceContractPayments | null \| number | strict |
| t661.methodElected | null \| string | strict |
| t661.proxySalaryBase | null \| number | strict |
| t661.sredAocOriginalPreEventPool | null \| number |  |
| t661.sredAocPriorYearAbsorption | null \| number |  |
| t661.sredAocSingleBusinessAttested | boolean \| null |  |
| t661.sredBusinessContinuesPostAoc | boolean \| null |  |
| t661.sredCapitalExpendituresRelatedToExemptIncome | null \| number | strict |
| t661.sredContractPayeeRows | array \| null |  |
| t661.sredContractPayeeRows[].amount | null \| number | strict |
| t661.sredContractPayeeRows[].amountRelatesToBusinessThroughCanadianPe | boolean \| null | strict |
| t661.sredContractPayeeRows[].line370RelatedToTaxpayerBusiness | boolean \| null |  |
| t661.sredContractPayeeRows[].line370TaxpayerEntitledToExploitResults | boolean \| null |  |
| t661.sredContractPayeeRows[].payeeId | null \| string | strict |
| t661.sredContractPayeeRows[].payeeIsCanadianPartnership | boolean \| null | strict |
| t661.sredContractPayeeRows[].payeeName | null \| string |  |
| t661.sredContractPayeeRows[].payeeResidentInCanada | boolean \| null | strict |
| t661.sredContractPayeeRows[].paymentLine | null \| string | strict |
| t661.sredContractPayeeRows[].reg8201Facts | null \| object |  |
| t661.sredContractPayeeRows[].reg8201Facts.controlledSubsidiaryOnly | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.employeeOrAgentEstablishedAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.fixedPlaceJurisdiction | null \| string |  |
| t661.sredContractPayeeRows[].reg8201Facts.generalContractingAuthorityAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.hasFixedPlaceOfBusiness | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.independentAgentOnly | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.insurerRegisteredOrLicensedJurisdictions | array |  |
| t661.sredContractPayeeRows[].reg8201Facts.isInsurer | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.personOwnedStockAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.principalPlaceOfBusinessAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.purchaseOnlyOfficeOnly | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.regularlyFillsOrdersFromStockAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.substantialMachineryOrEquipmentUsedAtTarget | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.treatyExists | boolean \| null |  |
| t661.sredContractPayeeRows[].reg8201Facts.treatyPermanentEstablishmentArticle | null \| string |  |
| t661.sredContractPayeeRows[].reg8201Facts.treatyPermanentEstablishmentConclusion | boolean \| null |  |
| t661.sredContractPayeesAreTaxableSuppliers | boolean \| null |  |
| t661.sredCurrentExpendituresRelatedToExemptIncome | null \| number | strict |
| t661.sredExemptIncomeExclusionReviewed | boolean \| null | strict |
| t661.sredExpendituresIncludedInBookIncome | null \| number | strict |
| t661.sredFilingDueDate | null \| string | strict |
| t661.sredItcUnpaidAmountsReviewed | boolean \| null | strict |
| t661.sredNalSupplierCostAdjustment | null \| number |  |
| t661.sredNalSupplierCostAdjustmentRelatingToCapital | null \| number |  |
| t661.sredNalSupplierCostAdjustmentRelatingToCurrent | null \| number |  |
| t661.sredNalSupplierPurchasesDisclosed | boolean \| null | strict |
| t661.sredPrescribedFormFiledDate | null \| string | strict |
| t661.sredPrescribedInformationComplete | boolean \| null | strict |
| t661.sredPriorLossRestrictionEventDate | null \| string |  |
| t661.sredProxyOverallCapAmount | null \| number | strict |
| t661.sredProxySalaryBaseExclusionsReg2900_9 | null \| number | strict |
| t661.sredSameOrSimilarBusinessIncome | null \| number |  |
| t661.sredSpecifiedEmployeeBonusOrProfitRemuneration | null \| number | strict |
| t661.sredSpecifiedEmployeeCapApplied | boolean \| null | strict |
| t661.sredTraditionalOverheadDirectlyAttributableReviewed | boolean \| null |  |
| t661.sredTraditionalOverheadPrescribedExpenditureAmount | null \| number |  |
| t661.sredUnpaidRemunerationReviewed | boolean \| null | strict |
| taxYear | number \| string | always |

### Input cell notes

- `fiscalEnd`: The last day of the taxation year in ISO YYYY-MM-DD form, which bounds every disposition date. Send it with fiscalStart and daysInYear: the three are the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure. Strict YYYY-MM-DD, and not before fiscalStart.
- `fiscalStart`: The first day of the taxation year (ISO YYYY-MM-DD). With fiscalEnd and daysInYear it is the canonical taxation-period trio, and all three are mandatory whenever the request reaches Part I through its dependency closure — the request is refused before any computation when one is missing. The bounds also drive Schedule 8's Reg 1100(3) short-year CCA proration and the Reg 1104(3.5)(b) immediate-expensing limit proration.
- `t661.businessNumber`: 9-digit BN or 15-char RC account.
- `t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCapital`: The capital-expenditure limb of contract payments received for qualified expenditures. Send it with the current limb; an unattributed total blocks the claim.
- `t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCurrent`: The current-expenditure limb of contract payments received for qualified expenditures. Send it with the capital limb; an unattributed total blocks the claim.
- `t661.leaseCostExpenditureDate`: Exact expenditure date proving the restored lease window.
- `t661.leaseCostIsGeneralPurposeOfficeEquipmentOrFurniture`: General-purpose office equipment or furniture is excluded.
- `t661.line300SalariesDirectlyEngaged`: T661 line 300 face amount, already excluding the line-315 unpaid memo.
- `t661.line305SalariesSpecified`: T661 line 305 face amount after applicable limits and after excluding the line-315 unpaid memo.
- `t661.line307ForeignSalaryEligibilityAttested`: s.37(1.5) + s.37(9)(b) — is the line 307 salary eligible? The employee must have been resident in Canada when the work was performed, the work must support SR&ED carried on in Canada, and the taxpayer must reasonably believe the salary is NOT subject to foreign income or profits tax. null and false both exclude the amount. Admitted amounts are further capped at 10% of Canadian SR&ED salary (lines 300 + 305).
- `t661.line307Nature`: What is the line 307 amount? Only "foreign_salary" is admissible — s.37(1.4)/(1.5) deems SALARY OR WAGES paid to an employee of the taxpayer who was resident in Canada, for SR&ED carried on outside Canada in support of SR&ED carried on IN Canada, to have been made in Canada. A non-arm's-length CONTRACT payment belongs on line 350 instead. Anything but "foreign_salary" excludes the amount from both the s.37 deduction and the ITC base.
- `t661.line307SalariesNAL`: Line 307: permissible foreign SR&ED salary after the aggregate limit; already excludes the line-315 unpaid memo.
- `t661.line309SalariesSpecifiedOutsideCanada`: Line 309: permissible specified-employee foreign SR&ED salary after applicable limits; already excludes the line-315 unpaid memo.
- `t661.line310PriorUnpaidSalariesPaidThisYear`: Line 310: prior-year unpaid salary paid in this tax year.
- `t661.line315CurrentYearUnpaidSalaries`: Line 315 disclosure memo: current salary unpaid 180 days after year end. T4088 requires this amount to be excluded already from lines 300-309 and 360, so the engine never subtracts it again from line 380.
- `t661.line350LeaseCostsAllOrSubstantiallyAll`: Line 350: lease costs used 90% or more for SR&ED.
- `t661.line355LeaseCostsPrimarily`: Line 355: the 50% proxy-method amount for lease use above 50% and below 90%.
- `t661.line360OverheadTraditional`: Traditional-method overhead, printed at line 360.
- `t661.line390CapitalExpenditurePart6BRows`: T661 Part 6B property ledger; boxes 780/782/786 break line 390 down by property.
- `t661.line390CapitalExpenditurePart6BRows[].acquisitionDate`: Acquisition date (YYYY-MM-DD); box 780 only reaches property acquired after December 15, 2024.
- `t661.line390CapitalExpenditurePart6BRows[].adjustedSellingCostToSupplier`: The supplier's adjusted selling cost of the property.
- `t661.line390CapitalExpenditurePart6BRows[].capitalExpenditureAmount`: Part 6B box 782: the capital expenditure amount for this property.
- `t661.line390CapitalExpenditurePart6BRows[].nonArmsLengthSupplier`: Was the property bought from a supplier the corporation does not deal with at arm's length?
- `t661.line390CapitalExpenditurePart6BRows[].projectNumbers`: Part 6B box 786: the SR&ED project numbers this property was used in.
- `t661.line390CapitalExpenditurePart6BRows[].propertyName`: Part 6B box 780: name of the capital property acquired after December 15, 2024 that was used for SR&ED.
- `t661.line410CapitalLegacy`: Pre-2014 legacy balance — POOL CONTINUITY only. The engine error-blocks a non-zero entry: fold it into line450OpeningPool (it is not a current-year expenditure and must not mint ITC).
- `t661.line429ProvincialGovernmentAssistanceRelatingToCapital`: The capital-expenditure limb of the line 429 government assistance reduction. Send it with the current limb: the engine will not guess a split, and an unattributed total blocks the claim.
- `t661.line429ProvincialGovernmentAssistanceRelatingToCurrent`: The current-expenditure limb of the line 429 government assistance reduction. Send it with the capital limb: the engine will not guess a split, and an unattributed total blocks the claim.
- `t661.line431OtherGovernmentAssistanceRelatingToCapital`: The capital-expenditure limb of the line 431 other-government assistance reduction. Send it with the current limb; an unattributed total blocks the claim.
- `t661.line431OtherGovernmentAssistanceRelatingToCurrent`: The current-expenditure limb of the line 431 other-government assistance reduction. Send it with the capital limb; an unattributed total blocks the claim.
- `t661.line432NonGovernmentAssistanceRelatingToCapital`: The capital-expenditure limb of the line 432 non-government assistance reduction. Send it with the current limb; an unattributed total blocks the claim.
- `t661.line432NonGovernmentAssistanceRelatingToCurrent`: The current-expenditure limb of the line 432 non-government assistance reduction. Send it with the capital limb; an unattributed total blocks the claim.
- `t661.line435PriorYearItcApplied`: s.37(1)(e) — prior-year SR&ED ITC deducted under s.127(5) (or refunded) attributable to the proxy amount / current-nature qualified expenditures. Reduces the pool. The engine warns when an opening pool exists and this is unset.
- `t661.line440SaleCapitalAssetsAndOtherDeductions`: Form E (26) line 440 — proceeds on the 'sale of SR&ED capital assets and other deductions', taken off the pool before the line 455 amount available for deduction. Null is UNANSWERED, not nil: with an opening pool the engine says so at box 440 and applies no reduction while the question is open. Enter 0 to confirm no such disposition occurred. A positive answer can take the pool below the claimed deduction, where the s.37(1) bound blocks at error severity, or below zero, which line 455 handles by its printed instruction '(enter positive amount only, include negative amount in income)'.
- `t661.line445AssistanceRepayments`: Line 445 — repayments of government assistance, non-government assistance and contract payments. s.37(1)(c) adds them to the pool, so a blank UNDERSTATES the pool and the s.37 deduction.
- `t661.line450OpeningPool`: Form E (26) line 450 — the opening balance of the pool of deductible SR&ED expenditures carried in from the preceding taxation year. Null is UNANSWERED, not nil: a caller that carries a pool states it here, and the s.37(1)(c.2) prior-year ITC recapture add-back at line 453 is only armed once it is stated. A pool balance is an accumulated non-negative amount, so the contract floors it at 0 rather than letting a negative carry-in reach the engine.
- `t661.line452PoolTransferOnAmalgamationOrWindUp`: Line 452 — SR&ED pool transferred IN on an amalgamation or the wind-up of a subsidiary. ITA 87(2)(l) deems the new corporation "the same corporation as, and a continuation of, each predecessor corporation" for the purposes of section 37, and 88(1)(e.2) applies paragraphs 87(2)(g) to (l) to a winding-up. Pool ADDITION — a blank understates the pool and the s.37 deduction.
- `t661.line453PriorYearItcRecaptured`: Form T661 Part E item (26) line 453 — SR&ED ITC recaptured in a preceding year, which ITA 37(1)(c.2) adds back to the pool. That is the prior year's Schedule 31 corporate recapture amounts 17A + 17B; amount 17C is partnership-level and does not enter the corporate partner's next-year pool. Absent does NOT mean nil: where an opening pool or a prior-year continuity exists, a blank blocks the claim at error severity rather than filing an understated pool. An explicit 0 is a valid affirmative answer.
- `t661.line453PriorYearItcRecapturedConfirmed`: Affirm only when a deliberately supported line-453 entry differs from the authenticated prior filed Schedule 31 amounts 17A + 17B. Blank/No leaves the authenticated amount authoritative. This is not carried forward.
- `t661.line460ClaimFullPool`: Elects to deduct the maximum available ITA s.37(1) pool on printed line 460 instead of naming an amount in line460DeductionClaimed. Only the JSON boolean true is an election.
- `t661.line460DeductionClaimed`: Line 460: deduction claimed this year.
- `t661.line500PriorYearUnpaidAmountsPaid`: Form E (26) line 500. The ITA 127(26) add-back: a prior year's unpaid amount deemed not incurred is treated as incurred when it is paid. Absent means nil.
- `t661.line502ProxyAmount`: Prescribed proxy amount, printed at line 502.
- `t661.line504SUEAllPropertiesAcquiredAfter20241215`: Every line-504 property was acquired after December 15, 2024.
- `t661.line504SUEAllPropertiesAvailableForUse`: Every line-504 property has become available for use.
- `t661.line504SUEAllPropertiesDepreciableNotPrescribed`: Every property is depreciable and not prescribed depreciable property.
- `t661.line504SUEAllPropertiesUsedPrimarilyForSredInCanada`: Every property was used primarily for SR&ED in Canada in its term.
- `t661.line504SUECapitalCostAfterS127_11_6`: Aggregate capital cost after the s.127(11.6) supplier-cost limit.
- `t661.line504SUENoGeneralPurposeOfficeEquipmentOrFurniture`: No line-504 property is general-purpose office equipment or furniture.
- `t661.line504SUEPart6CDetailsComplete`: Part 6C boxes 788-796 are complete for every property in line 504.
- `t661.line504SUEPart6CRows`: T661 Part 6C property ledger; boxes 788-796 own line 504.
- `t661.line504SUEPart6CRows[].projectNumbers`: Part 6C box 796.
- `t661.line504SUEPart6CRows[].propertyName`: Part 6C box 788.
- `t661.line504SUEPart6CRows[].purchaseDate`: Part 6C box 790 (YYYY-MM-DD).
- `t661.line504SUEPart6CRows[].qualifyingAmount25Percent`: Part 6C box 792: 25% of adjusted capital cost.
- `t661.line504SUEPart6CRows[].term`: Part 6C box 794.
- `t661.line504SUETermsConfirmed`: Box 794 first-/second-term classifications have been confirmed.
- `t661.line504SharedUseEquipmentCapital`: T661 line 504 — restored shared-use-equipment capital QSE.
- `t661.line508QualifiedExpendituresTransferredIn`: Form E (26) line 508. Element B of the s.127(9) qualified expenditure pool - an amount transferred to the corporation under a s.127(13) agreement. It is admitted only once the prescribed-form attestation is true AND all four transferor-supplied operands below are given, and then only at the computed s.127(13)(a)-(c) least-of; the closing words deem it nil outright on an over-allocation. Otherwise the engine excludes it and says so at error severity, never silently.
- `t661.line508TransferAgreementAmount`: ITA 127(13)(a) - "the amount specified in the agreement" (Form T1146). Transferor-supplied evidence: the corporation claiming the transfer cannot self-prove it. Absent blocks line 508.
- `t661.line508TransferPrescribedFormFiled`: ITA 127(9) "SR&ED qualified expenditure pool", element B: the transferred amount counts only where the taxpayer "files with the Minister a prescribed form containing prescribed information by the day that is 12 months after the taxpayer's filing-due date for the year" (Form T1146). Absent/false excludes line 508.
- `t661.line508TransferorAggregateAllocatedToAllTransferees`: ITA 127(13) closing words - the total the transferor specified across ALL its s.127(13) agreements for the particular year. Where it exceeds the transferor's but-for pool, "the least of the amounts determined under paragraphs 127(13)(a) to 127(13)(c) in respect of each such agreement is deemed to be nil" - every agreement of that transferor, this one included, not a pro-rata reduction. Transferor-supplied evidence. Absent blocks line 508.
- `t661.line508TransferorArmsLengthEquivalentAmount`: ITA 127(13)(c) - the total of the amounts that, if the transferor were dealing at arm's length with the transferee, would be contract payments paid within 180 days of the transferor's year end. Transferor-supplied evidence from the Form T1146 agreement. Absent blocks line 508.
- `t661.line508TransferorButForQualifiedExpenditurePool`: ITA 127(13)(b) - "the amount that but for the agreement would be the transferor's SR&ED qualified expenditure pool at the end of the particular year". Transferor-supplied evidence read off the transferor's own T661. Absent blocks line 508.
- `t661.line510QualifiedExpendituresTransferredInCapital`: T661 line 510 — capital QSE transferred to the corporation.
- `t661.line520UnpaidCurrentExpendituresAtDay180`: Form E (26) line 520 — s.37(1)(a) expenditures still unpaid 180 days after the year end, which ITA 127(26) deems not to have been incurred in the year for ITC purposes. It covers materials, contract payments, third-party payments, lease and overhead, not just remuneration, and it is the amount the required `sredItcUnpaidAmountsReviewed` attestation is about. Enter contract and third-party components at their 80% qualified value. Absent means nil unpaid.
- `t661.line544QualifiedExpendituresTransferredOut`: Form E (26) line 544. Element H of the s.127(9) qualified expenditure pool - an amount the corporation transferred OUT under a s.127(13) agreement. Absent means nil.
- `t661.line546QualifiedExpendituresTransferredOutCapital`: The capital slice of qualified expenditures transferred out under an ITA s.127(13) agreement, form line 546. Send 0 to confirm none, because leaving the key absent is not an answer.
- `t661.line558QSECapital`: Form E (26) line 558, pre-2014 SR&ED capital in the qualified expenditure base. Reg 2902(b) carves capital out unless every condition below holds, so the amount is admitted only with its three attestations; unattested it blocks at error severity on box 558.
- `t661.line558QSECapitalAcquiredAfter20241215`: s.37(1)(b)(ii) — was the property acquired AFTER 2024-12-15?
- `t661.line558QSECapitalAvailableForUse`: s.37(1.2) — has the property become AVAILABLE FOR USE? Capital expenditure is not deductible before then.
- `t661.line558QSECapitalBuildingHasLargerParticles`: Reg 2903 — are there any particles larger than the selected diameter? Only an explicit false can meet the definition.
- `t661.line558QSECapitalBuildingMaxDisplacementMicrometres`: Reg 2903 — maximum working-area displacement in any direction, µm.
- `t661.line558QSECapitalBuildingParticleDiameterMicrometres`: Reg 2903 selected particle-size alternative: 0.1, 0.2, 0.3 or 0.5 µm.
- `t661.line558QSECapitalBuildingParticlesPer0028CubicMetre`: Reg 2903 particle count at/below the selected diameter per 0.028 m³.
- `t661.line558QSECapitalIntendedAllOrSubstantiallyAllSredUse`: Reg 2902(b)(i)(B): at the time of acquisition it was intended that the premises, facilities or equipment would be used during all or substantially all of its operating time - or that all or substantially all of its value would be consumed - in the prosecution of SR&ED in Canada. Shared-use equipment under (b)(i)(A) is the form's separate lines 504/510 track, not this line.
- `t661.line558QSECapitalIsBuildingOrBuildingLeasehold`: ITA 37(8)(e)(i) — is the property a building or a leasehold interest in a building? If yes, only a Reg 2903 special-purpose building can remain eligible.
- `t661.line558QSECapitalIsDepreciablePropertyNotLand`: s.37(1)(b)(ii) — is the property DEPRECIABLE property (and not land, or a leasehold interest in land)?
- `t661.line558QSECapitalNotPreviouslyUsedProperty`: Reg 2902(b)(iii): the property had not been used, or acquired for use or lease, for any purpose whatever before the corporation acquired it.
- `t661.line558QSECapitalNotQualifiedProperty`: Reg 2902(b)(ii): the property is not "qualified property" as defined in s.127(9) - property earning the regular ITC cannot also enter the SR&ED base.
- `t661.line560RepaymentsAssistanceContractPayments`: Line 560: repayments added to the line-559 qualified-expenditure subtotal.
- `t661.methodElected`: Method election per s.37(8)(a)(ii)(B) — PER TAXATION YEAR (s.37(10) locks it only for a year whose T661 has been first filed).
- `t661.proxySalaryBase`: Gross proxy salary base per Reg 2900(4), before the Reg 2900(9) remuneration-character exclusions below.
- `t661.sredAocOriginalPreEventPool`: s.37(6.1)(a) element A: the original pre-event SR&ED pool fixed at the loss-restriction event. The engine computes it in the event year and carries it unchanged. Edit only to reconcile a legacy filing; a later-year opening balance has already shrunk by prior deductions.
- `t661.sredAocPriorYearAbsorption`: s.37(6.1)(b)(ii) — pre-AoC pool amounts already absorbed in PRECEDING post-AoC years (per year, the lesser of that year's (b)(i) income and its s.37(1) deduction). The carryforward computes the cumulative amount; edit only to reconcile a legacy filing.
- `t661.sredAocSingleBusinessAttested`: s.37(6.1) — is the pre-AoC pool attributable to a SINGLE business, the same business the corporation carried on after the acquisition of control? Required once a pre-AoC segment would otherwise be deductible; until attested that segment is excluded from this year's deductible pool and carries forward. null and false both hold.
- `t661.sredBusinessContinuesPostAoc`: Tri-state: was the SR&ED business carried on for profit (or with a reasonable expectation of profit) throughout the post-AoC year — including a business deriving substantially all its income from SIMILAR properties/services (s.37(6.1)(b)(i)(B); NOT s.111(5.1), which is the depreciable-property UCC write-down)? null = unanswered — the engine fails closed: the pre-AoC pool segment is excluded from this year's deductible pool (it carries forward) and the result is provisional until answered.
- `t661.sredCapitalExpendituresRelatedToExemptIncome`: Capital-column QSE excluded because it relates to exempt income.
- `t661.sredContractPayeeRows`: ITA 127(9)(g): one reviewed row per line-340/370 payee. Row amounts must reconcile each face line. Non-residents qualify only where the particular amount relates to business through a Canadian Reg. 8201 PE.
- `t661.sredContractPayeesAreTaxableSuppliers`: ITA 127(9) "qualified expenditure" paragraph (g) — are the contract and third-party payees TAXABLE SUPPLIERS? Read against lines 340 + 370. Until asserted the payments remain 100% DEDUCTIBLE under s.37(1)(a) but are excluded from the ITC base (the 80% qualified- SR&ED-expenditure inclusion is withheld). null and false both hold.
- `t661.sredCurrentExpendituresRelatedToExemptIncome`: Current-column QSE excluded because it relates to exempt income.
- `t661.sredExemptIncomeExclusionReviewed`: ITA 127(9)(l) review for expenditures related to exempt income.
- `t661.sredExpendituresIncludedInBookIncome`: The year's SR&ED expenditures already included in BOOK income (i.e. expensed in the financial statements). Required once line 400 is positive — it is the S1 line 118 add-back. Without it the same expenditure would be relieved twice, so the engine fails closed. Explicit 0 is a valid answer; blank is not.
- `t661.sredFilingDueDate`: The taxpayer's filing-due date for this taxation year (YYYY-MM-DD). The s.37(11) T661 deadline is 12 months after this date.
- `t661.sredItcUnpaidAmountsReviewed`: ITA s.127(26) review: non-salary SR&ED expenditures unpaid 180 days after year end leave the ITC base; confirm the 180-day test and state any unpaid amount.
- `t661.sredNalSupplierCostAdjustment`: s.127(11.6) — total NAL supplier cost adjustment.
- `t661.sredNalSupplierCostAdjustmentRelatingToCapital`: Restored-capital portion of the s.127(11.6) adjustment.
- `t661.sredNalSupplierCostAdjustmentRelatingToCurrent`: Current-expenditure portion of the s.127(11.6) adjustment.
- `t661.sredNalSupplierPurchasesDisclosed`: ITA s.127(11.6) disclosure: purchases from non-arm's-length suppliers are limited to the supplier's adjusted selling or service cost; answer whether any exist and state the adjustment.
- `t661.sredPrescribedFormFiledDate`: First date on which the prescribed T661 information was or will be filed with the Minister (YYYY-MM-DD).
- `t661.sredPrescribedInformationComplete`: ITA 37(11)/(11.1): does that filing contain the prescribed expenditure and claim-preparer information? Only true supports the current claim.
- `t661.sredPriorLossRestrictionEventDate`: Date of the loss-restriction event / acquisition of control (ISO YYYY-MM-DD). Setting it ARMS the s.37(6.1) restriction on the opening pool, and it is replayed on carryforward so a later year cannot escape the restriction.
- `t661.sredProxyOverallCapAmount`: Reg 2900(6) — the OVERALL CAP on the prescribed proxy amount (the aggregate limit the PPA may not exceed). null = unanswered and the engine admits NO prescribed proxy amount into the qualified- expenditure base until it is supplied.
- `t661.sredProxySalaryBaseExclusionsReg2900_9`: Reg 2900(9) aggregate included in the gross proxy base for s.6/7 amounts, s.78(4)-deemed remuneration, bonuses and profit-based remuneration. The engine subtracts it before applying 55%.
- `t661.sredSameOrSimilarBusinessIncome`: s.37(6.1)(b)(i) — the year's income, before any s.37(1) deduction, from the same business plus clause (B) similar-business income. Read only when the continuation flag is asserted true. null = not supplied (fails closed while asserted); explicit 0 is valid.
- `t661.sredSpecifiedEmployeeBonusOrProfitRemuneration`: ITA 37(9)(a) — bonus or remuneration based on profits included in the gross line-305 amount. The engine subtracts it from both the s.37 expenditure and the qualified-expenditure base. Explicit 0 confirms none; null is unanswered and holds line 305.
- `t661.sredSpecifiedEmployeeCapApplied`: Asserts the ITA s.37(9.1) specified-employee salary cap (5 times YMPE, day-prorated), any s.37(9.2) and (9.3) associated-group allocation, and the Reg 2900(7) proxy cap were applied to line 305.
- `t661.sredTraditionalOverheadDirectlyAttributableReviewed`: Reg 2900(2)/(3) review that line 360 is directly attributable to SR&ED.
- `t661.sredTraditionalOverheadPrescribedExpenditureAmount`: Reg 2902(a) prescribed current expenditure included in line 360.
- `t661.sredUnpaidRemunerationReviewed`: ITA s.78(4) review: SR&ED remuneration unpaid 180 days after year end is deemed incurred when paid; confirm the test and state any unpaid amount.
- `taxYear`: Four-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon.

### Strict profile accepted values (63 of 157 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| t661.businessNumber | 0 to 20000 characters |
| t661.contractPaymentsReceivedForQualifiedExpenditures | -1000000000000000 to 1000000000000000 |
| t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCapital | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.contractPaymentsReceivedForQualifiedExpendituresRelatingToCurrent | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.corporationName | 0 to 20000 characters |
| t661.line300SalariesDirectlyEngaged | -1000000000000000 to 1000000000000000 |
| t661.line305SalariesSpecified | -1000000000000000 to 1000000000000000 |
| t661.line307Nature | one of "foreign_salary", "other" |
| t661.line307SalariesNAL | -1000000000000000 to 1000000000000000 |
| t661.line309SalariesSpecifiedOutsideCanada | -1000000000000000 to 1000000000000000 |
| t661.line310PriorUnpaidSalariesPaidThisYear | -1000000000000000 to 1000000000000000 |
| t661.line315CurrentYearUnpaidSalaries | -1000000000000000 to 1000000000000000 |
| t661.line320MaterialsConsumed | -1000000000000000 to 1000000000000000 |
| t661.line325MaterialsTransformed | -1000000000000000 to 1000000000000000 |
| t661.line340ContractPaymentsAL | -1000000000000000 to 1000000000000000 |
| t661.line345ContractPaymentsNAL | -1000000000000000 to 1000000000000000 |
| t661.line350LeaseCostsAllOrSubstantiallyAll | -1000000000000000 to 1000000000000000 |
| t661.line355LeaseCostsPrimarily | -1000000000000000 to 1000000000000000 |
| t661.line360OverheadTraditional | -1000000000000000 to 1000000000000000 |
| t661.line370ThirdPartyPayments | -1000000000000000 to 1000000000000000 |
| t661.line390CapitalExpenditures | -1000000000000000 to 1000000000000000 |
| t661.line410CapitalLegacy | -1000000000000000 to 1000000000000000 |
| t661.line429ProvincialGovernmentAssistance | -1000000000000000 to 1000000000000000 |
| t661.line429ProvincialGovernmentAssistanceRelatingToCapital | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line429ProvincialGovernmentAssistanceRelatingToCurrent | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line431OtherGovernmentAssistance | -1000000000000000 to 1000000000000000 |
| t661.line431OtherGovernmentAssistanceRelatingToCapital | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line431OtherGovernmentAssistanceRelatingToCurrent | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line432NonGovernmentAssistance | -1000000000000000 to 1000000000000000 |
| t661.line432NonGovernmentAssistanceRelatingToCapital | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line432NonGovernmentAssistanceRelatingToCurrent | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| t661.line435PriorYearItcApplied | -1000000000000000 to 1000000000000000 |
| t661.line440SaleCapitalAssetsAndOtherDeductions | 0 to 600000000000 |
| t661.line450OpeningPool | 0 to 600000000000 |
| t661.line453PriorYearItcRecaptured | 0 to 600000000000 |
| t661.line460DeductionClaimed | -1000000000000000 to 1000000000000000 |
| t661.line500PriorYearUnpaidAmountsPaid | 0 to 600000000000 |
| t661.line502ProxyAmount | -1000000000000000 to 1000000000000000 |
| t661.line508QualifiedExpendituresTransferredIn | 0 to 600000000000 |
| t661.line508TransferAgreementAmount | 0 to 600000000000 |
| t661.line508TransferorAggregateAllocatedToAllTransferees | 0 to 600000000000 |
| t661.line508TransferorArmsLengthEquivalentAmount | 0 to 600000000000 |
| t661.line508TransferorButForQualifiedExpenditurePool | 0 to 600000000000 |
| t661.line520UnpaidCurrentExpendituresAtDay180 | 0 to 600000000000 |
| t661.line544QualifiedExpendituresTransferredOut | 0 to 600000000000 |
| t661.line558QSECapital | 0 to 600000000000 |
| t661.line560RepaymentsAssistanceContractPayments | -1000000000000000 to 1000000000000000 |
| t661.methodElected | one of "proxy", "traditional", null |
| t661.proxySalaryBase | -1000000000000000 to 1000000000000000 |
| t661.sredCapitalExpendituresRelatedToExemptIncome | -1000000000000000 to 1000000000000000 |
| t661.sredContractPayeeRows[].amount | -1000000000000000 to 1000000000000000 |
| t661.sredContractPayeeRows[].payeeId | 0 to 20000 characters |
| t661.sredContractPayeeRows[].paymentLine | one of "340", "370", null |
| t661.sredCurrentExpendituresRelatedToExemptIncome | -1000000000000000 to 1000000000000000 |
| t661.sredExpendituresIncludedInBookIncome | -1000000000000000 to 1000000000000000 |
| t661.sredFilingDueDate | 0 to 20000 characters |
| t661.sredPrescribedFormFiledDate | 0 to 20000 characters |
| t661.sredProxyOverallCapAmount | -1000000000000000 to 1000000000000000 |
| t661.sredProxySalaryBaseExclusionsReg2900_9 | -1000000000000000 to 1000000000000000 |
| t661.sredSpecifiedEmployeeBonusOrProfitRemuneration | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\s*(?:1[0-9]{3}\|2(?:0(?:[0-1][0-9]{1}\|2[0-7])))\s*$; 1000 to 2027 |

## Output cells (88)

| Cell | Types |
| --- | --- |
| addback_for_s1_line_118_cy | null \| number |
| businessNumber | null \| string |
| closing_pool_for_carryforward | number |
| corporationName | null \| string |
| current_expenditures_deductible_cy | number |
| deduction_for_s1_line_411 | number |
| fired_gates | object |
| line_300_salaries_directly_engaged_cy | number |
| line_305_salaries_specified_cy | number |
| line_340_contract_payments_al_cy | number |
| line_410_capital_legacy_cy | number |
| line_420_total_sred_expenditures_cy | number |
| line_445_assistance_repayments_cy | number |
| line_452_pool_transfer_cy | number |
| line_453_prior_year_itc_recaptured_cy | number |
| line_508_qualified_expenditures_transferred_in_cy | number |
| line_557_qse_current_cy | number |
| line_558_qse_capital_cy | number |
| line_559_qse_total_cy | number |
| method_elected | null \| string |
| missing_required[] | string |
| pool_available_cy | number |
| pool_deductible_addition_cy | number |
| pool_opening_reduced_by_excess_assistance_cy | number |
| prior_year_itc_applied_cy | number |
| provisional | boolean |
| qse_current_gross_cy | number |
| qse_for_s31_part_8 | number |
| ready | boolean |
| s37_negative_pool_income_inclusion_cy | number |
| t661Line559SredPool | number |
| taxYearEnd | string |
| taxYearStart | string |
| warnings[].box | null \| string |
| warnings[].citation.read_on | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.statute | string |
| warnings[].citation.verbatim | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.verified_at | string |
| warnings[].citation.applies_to_internal_models[] | string |
| warnings[].claimSupportAttestation | boolean |
| warnings[].gate_id | null \| string |
| warnings[].message | string |
| warnings[].severity | string |
| line_500_prior_year_unpaid_paid_cy | number |
| line_520_unpaid_current_expenditures_cy | number |
| line_544_qualified_expenditures_transferred_out_cy | number |
| line_306_salary_subtotal_cy | number |
| line_307_salaries_other_than_specified_outside_canada_cy | number |
| line_309_salaries_specified_outside_canada_cy | number |
| line_310_prior_unpaid_salaries_paid_cy | number |
| line_315_current_unpaid_salaries_cy | number |
| line_320_materials_consumed_cy | number |
| line_325_materials_transformed_cy | number |
| line_345_contract_payments_nal_cy | number |
| line_350_lease_costs_all_or_substantially_all_cy | number |
| line_355_lease_costs_primarily_cy | number |
| line_360_overhead_traditional_cy | number |
| line_370_third_party_payments_cy | number |
| line_380_total_current_expenditures_cy | number |
| line_390_capital_expenditures_cy | number |
| line_400_total_allowable_expenditures_cy | number |
| line_429_provincial_government_assistance_cy | number |
| line_431_other_government_assistance_cy | number |
| line_432_non_government_assistance_cy | number |
| line_435_prior_year_itc_applied_cy | number |
| line_440_sale_capital_assets_and_other_deductions_cy | number |
| line_442_subtotal_cy | number |
| line_450_opening_pool_cy | number |
| line_450_pre_aoc_grind_cy | number |
| line_455_amount_available_for_deduction_cy | number |
| line_460_deduction_claimed_cy | number |
| line_470_closing_pool_cy | number |
| line_502_proxy_amount_cy | number |
| line_560_repayments_assistance_contract_payments_cy | number |
| line_570_total_qse_for_itc_cy | number |
| line_546_qualified_expenditures_transferred_out_capital_cy | number |
| line_504_shared_use_equipment_capital_cy | number |
| part6CSharedUseEquipmentRows | array |
| part6BCapitalExpenditureRows | array |
| line_510_qualified_expenditures_transferred_in_capital_cy | number |

### Output cell notes

- `businessNumber`: The filer's business number as supplied on the request, or null when the caller did not supply one. An unsupplied identification cell is named in `missing_required` instead of being invented.
- `corporationName`: The corporation's name as supplied on the request, or null when the caller did not supply one. An unsupplied identification cell is named in `missing_required` instead of being invented.
- `method_elected`: The overhead method the claim elects: `proxy` or `traditional`. Null when the request states neither, which the engine reports rather than assuming a method.
- `warnings[].box`: The form box the finding is about, or null when the finding is about the return rather than a printed box.

# butterfly

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 6.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/butterfly`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "share": {
      "classLabel": "Cedar Ridge Manufacturing common",
      "dividendAmount": 120000,
      "inherentGain": 200000,
      "inherentGainDetermined": true,
      "isStockDividend": false,
      "stockDividendPucIncrease": null,
      "stockDividendFmv": null,
      "subsection55_2_3Applies": null
    },
    "safe_income": {
      "postFilingRetainedEarningsAttributable": 0,
      "s55_5_b_adjustments": 0,
      "s55_5_c_adjustments": 0,
      "statutoryPeriods": [
        {
          "status": "private",
          "periodStart": "2019-01-01",
          "periodEnd": "2025-06-30",
          "incomeEarnedOrRealized": 110000,
          "taxFreeSurplusBalance": null,
          "sharesFairMarketValue": null
        }
      ],
      "safeIncomeOnHandGrinds": 5000,
      "safeIncomeDeterminationTime": "2025-06-30"
    },
    "butterfly_checklist": {
      "distributionType": "single-wing",
      "proRataEachPropertyType": true,
      "anyDisqualifyingEvent_55_3_1": false,
      "relatedPartyException_55_3_a": false,
      "distributingCorporationWoundUp": false,
      "allTransfereeSharesRedeemedOrCancelled": true,
      "redemptionWasExchange_51_85_86": false,
      "permittedRedemptionOrWindingUp": true
    },
    "dividend_recipient": {
      "residentCorporationInCanada": true,
      "deductibleUnder112Or138_6": true,
      "purposeOrResultTestMet": "not_determined",
      "s55PartIVTaxPayableForDividend": null,
      "s55PartIVTaxRefundedInSeries": null,
      "s55UnrefundedPartIVProtectedExcessPortion": null,
      "s55PartIVEvidenceReference": null
    }
  }
}
```

## Input cells (34)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| butterfly_checklist.allTransfereeSharesRedeemedOrCancelled | boolean \| null | strict |
| butterfly_checklist.anyDisqualifyingEvent_55_3_1 | boolean \| null | strict |
| butterfly_checklist.distributingCorporationWoundUp | boolean \| null | strict |
| butterfly_checklist.distributionType | string | strict |
| butterfly_checklist.permittedRedemptionOrWindingUp | boolean \| null | strict |
| butterfly_checklist.proRataEachPropertyType | boolean | strict |
| butterfly_checklist.redemptionWasExchange_51_85_86 | boolean \| null | strict |
| butterfly_checklist.relatedPartyException_55_3_a | boolean | strict |
| dividend_recipient.deductibleUnder112Or138_6 | boolean \| null | strict |
| dividend_recipient.purposeOrResultTestMet | null \| string | strict |
| dividend_recipient.residentCorporationInCanada | boolean \| null | strict |
| dividend_recipient.s55PartIVEvidenceReference | null \| string | strict |
| dividend_recipient.s55PartIVTaxPayableForDividend | null \| number | strict |
| dividend_recipient.s55PartIVTaxRefundedInSeries | null \| number | strict |
| dividend_recipient.s55UnrefundedPartIVProtectedExcessPortion | null \| number | strict |
| safe_income.postFilingRetainedEarningsAttributable | number | strict |
| safe_income.s55_5_b_adjustments | number | strict |
| safe_income.s55_5_c_adjustments | number | strict |
| safe_income.safeIncomeDeterminationTime | null \| string | strict |
| safe_income.safeIncomeOnHandGrinds | null \| number | strict |
| safe_income.statutoryPeriods[].incomeEarnedOrRealized | null \| number | strict |
| safe_income.statutoryPeriods[].periodEnd | string | strict |
| safe_income.statutoryPeriods[].periodStart | string | strict |
| safe_income.statutoryPeriods[].sharesFairMarketValue | null \| number | strict |
| safe_income.statutoryPeriods[].status | string | strict |
| safe_income.statutoryPeriods[].taxFreeSurplusBalance | null \| number | strict |
| share.classLabel | string | strict |
| share.dividendAmount | number | strict |
| share.inherentGain | number | strict |
| share.inherentGainDetermined | boolean \| null | strict |
| share.isStockDividend | boolean \| null | strict |
| share.stockDividendFmv | null \| number | strict |
| share.stockDividendPucIncrease | null \| number | strict |
| share.subsection55_2_3Applies | boolean \| null | strict |

### Input cell notes

- `butterfly_checklist.anyDisqualifyingEvent_55_3_1`: Whether any s.55(3.1) disqualifying event occurred; s.55(3.1) overrides the s.55(3)(b) exception outright, and an unanswered question leaves the exception not established.
- `butterfly_checklist.proRataEachPropertyType`: s.55(3)(b) pro-rata test: each of cash, business and investment property was distributed in proportion to each transferee's interest.
- `butterfly_checklist.relatedPartyException_55_3_a`: Whether the s.55(3)(a) related-party exception is relied on; absence does not establish the relieving exception.
- `dividend_recipient.s55PartIVEvidenceReference`: Payer-return and series workpaper reference supporting the Part IV payable, refunded, and protected-excess amounts; required for a non-zero packet.
- `dividend_recipient.s55PartIVTaxPayableForDividend`: Part IV tax payable on this dividend before any refund caused by a dividend paid as part of the series. Required with a positive protected excess portion; enter 0 only when reviewed nil.
- `dividend_recipient.s55PartIVTaxRefundedInSeries`: Part IV tax refunded as a consequence of a dividend paid as part of the subsection 55(2.1) series. It cannot exceed the Part IV tax payable above.
- `dividend_recipient.s55UnrefundedPartIVProtectedExcessPortion`: The protected portion of the paragraph 55(5)(f)(ii) excess dividend whose Part IV tax remains unrefunded. This is a DIVIDEND amount, not the tax liability, and cannot exceed the computed excess. Enter 0 when the reviewed protected portion is nil.
- `safe_income.postFilingRetainedEarningsAttributable`: Legacy three-number fallback component; must be zero when statutoryPeriods supplies the paragraph 55(5)(b)/(c)/(d) income build.
- `safe_income.s55_5_b_adjustments`: Legacy three-number fallback component; must be zero when statutoryPeriods supplies the paragraph 55(5)(b)/(c)/(d) income build.
- `safe_income.s55_5_c_adjustments`: Legacy three-number fallback component; must be zero when statutoryPeriods supplies the paragraph 55(5)(b)/(c)/(d) income build.
- `safe_income.safeIncomeDeterminationTime`: Required when statutoryPeriods is non-empty because s.55(2.1)(c) counts income only after 1971 and before the safe-income determination time.
- `safe_income.safeIncomeOnHandGrinds`: Required when statutoryPeriods is non-empty; enter an explicit 0 when the reviewed on-hand grind is nil.
- `safe_income.statutoryPeriods[].periodEnd`: Required period end. A row that straddles the safe-income determination time must be split so the pre-time income is authenticated separately.
- `safe_income.statutoryPeriods[].periodStart`: Required period start, on or after 1972-01-01; split a period that crosses the after-1971 boundary.
- `safe_income.statutoryPeriods[].status`: Governing paragraph 55(5) status: (b)/(c) tests status throughout the period, while (d) tests foreign-affiliate status at period end.
- `share.subsection55_2_3Applies`: Complete conclusion after applying subsections 55(2.3) and (2.4), including whether subsection 55(2) would apply if paragraph 55(2.1)(c) were omitted. Required when this is a stock dividend and issued-share FMV exceeds the dividend-related PUC increase; null holds the ordinary paragraph 55(5)(f) and Part-IV outputs.

### Strict profile accepted values (22 of 34 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| butterfly_checklist.distributionType | one of "none", "single-wing", "split-up" |
| dividend_recipient.purposeOrResultTestMet | one of "yes", "no", "not_determined", null |
| dividend_recipient.s55PartIVEvidenceReference | 1 to 2000 characters |
| dividend_recipient.s55PartIVTaxPayableForDividend | 0 to 600000000000 |
| dividend_recipient.s55PartIVTaxRefundedInSeries | 0 to 600000000000 |
| dividend_recipient.s55UnrefundedPartIVProtectedExcessPortion | 0 to 600000000000 |
| safe_income.postFilingRetainedEarningsAttributable | 0 to 600000000000 |
| safe_income.s55_5_b_adjustments | 0 to 600000000000 |
| safe_income.s55_5_c_adjustments | 0 to 600000000000 |
| safe_income.safeIncomeDeterminationTime | date (YYYY-MM-DD); at most 10 characters |
| safe_income.safeIncomeOnHandGrinds | 0 to 600000000000 |
| safe_income.statutoryPeriods[].incomeEarnedOrRealized | 0 to 600000000000 |
| safe_income.statutoryPeriods[].periodEnd | date (YYYY-MM-DD); 1 to 2000 characters |
| safe_income.statutoryPeriods[].periodStart | date (YYYY-MM-DD); 1 to 2000 characters |
| safe_income.statutoryPeriods[].sharesFairMarketValue | 0 to 600000000000 |
| safe_income.statutoryPeriods[].status | one of "resident_non_private", "private", "foreign_affiliate" |
| safe_income.statutoryPeriods[].taxFreeSurplusBalance | 0 to 600000000000 |
| share.classLabel | 1 to 2000 characters |
| share.dividendAmount | 0 to 600000000000 |
| share.inherentGain | 0 to 600000000000 |
| share.stockDividendFmv | 0 to 600000000000 |
| share.stockDividendPucIncrease | 0 to 600000000000 |

## Output cells (60)

| Cell | Types |
| --- | --- |
| share.classLabel | string |
| share.dividendAmount | number |
| share.inherentGain | number |
| safeIncomeOnHand | number |
| safeIncomeComponents.postFilingRetainedEarningsAttributable | number |
| safeIncomeComponents.s55_5_b_adjustments | number |
| safeIncomeComponents.s55_5_c_adjustments | number |
| safeIncomeComponents.statutoryPeriodTotal | null \| number |
| safeIncomeComponents.safeIncomeOnHandGrinds | null \| number |
| safeIncomeBasis | string |
| safeIncomeDeterminationTime | null \| string |
| dividendAmount | number |
| amountTestedUnder55_2_1_c | null \| number |
| shelteringSafeIncome | number |
| shelterCeilingStatus | string |
| subsection55_2_3Status | string |
| cushion | null \| number |
| excessOverSafeIncome | null \| number |
| partIVTaxPayableForDividend | null \| number |
| partIVTaxRefundedInSeries | null \| number |
| nonRefundedPartIVProtectedExcessPortion | null \| number |
| partIVEvidenceReference | null \| string |
| excessAfterNonRefundedPartIV | null \| number |
| dividendExceedsSafeIncome | boolean \| null |
| s55_2_1Conditions.preambleResidentCorporationInCanada | string |
| s55_2_1Conditions.paragraphA | string |
| s55_2_1Conditions.paragraphB | string |
| s55_2_1Conditions.paragraphC | string |
| checklist.distributionType | string |
| checklist.isButterfly | boolean |
| checklist.proRataEachPropertyType | boolean |
| checklist.anyDisqualifyingEvent_55_3_1 | boolean \| null |
| checklist.relatedPartyException_55_3_a | boolean |
| checklist.distributingCorporationWoundUp | boolean \| null |
| checklist.allTransfereeSharesRedeemedOrCancelled | boolean \| null |
| checklist.redemptionWasExchange_51_85_86 | boolean \| null |
| checklist.permittedRedemptionOrWindingUp | boolean \| null |
| checklist.butterflyExceptionStatus | string |
| checklist.butterflyExceptionAvailable | boolean |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

### Output cell notes

- `excessAfterNonRefundedPartIV`: Paragraph 55(5)(f)(ii) excess remaining after the authenticated protected DIVIDEND portion is excluded under subsection 55(2); null when that portion is unanswered or when subsection 55(2.3) applies or is unresolved.

# capital-dividend-account

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 8.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/capital-dividend-account`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "cda_components": {
      "nonTaxableCapitalGainsNet": 100000,
      "aocTimingAdjustment111_4_f": 0,
      "trustCapitalGainDistributionsPostSep2016": 0,
      "capitalDividendsReceived": 0,
      "preFeb2000RequiredInclusions89_1_c": 0,
      "lifeInsuranceProceedsNetAcb": 0,
      "nonTaxableEcpGains": 0,
      "lifeInsuranceCdaBeforeMay24_1985": 0,
      "trustCapitalGainDistributionsPreSep2016": 0,
      "trustNonTaxableDividendDistributions104_20": 0,
      "foreignAffiliateDividendDeductions113_1": 0,
      "capitalDividendsPreviouslyPaid": 0
    },
    "election": {
      "dividendDeclared": 80000,
      "cdaBalanceImmediatelyBeforeDividendPayable": 100000,
      "isPrivateCorporation": true,
      "isCcpcThroughoutYearOrSubstantiveCcpc": null,
      "dividendPayableDate": "2026-03-31",
      "firstPaymentDate": "2026-04-15",
      "s83_2ElectionDate": "2026-03-31",
      "t2054PrescribedFormCompleted": true,
      "t2054CertifiedResolutionOrAuthorizationAttached": true,
      "t2054CdaComputationScheduleAttached": true,
      "t2054EvidenceReference": "binder://t2054-package",
      "s83_3AuthorizedBeforeFiling": null,
      "s83_3EstimatedPenaltyPaidWithElection": null,
      "s83_3EstimatedPenaltyPaidAmount": null,
      "s83_3PenaltyPaymentDate": null,
      "s83_3_1MinisterRequestServedAndNotAnsweredWithin90Days": null,
      "sharesAcquiredForDividendPurpose": "no",
      "s83_2_2Or2_3Or2_4ReliefApplies": null
    },
    "options": {
      "s184_3ElectionFiled": false,
      "noticeOfAssessmentSentDate": null,
      "s184_3ElectionDate": null,
      "originalDividendPayableDate": null,
      "corporationAndKnownAddressShareholdersConcur": null,
      "allDividendRecipientShareholdersConcur": null,
      "allDeemedRecipientsExemptFromPartI": null,
      "identifiedPortionOfExcess": null,
      "identifiedPortionSecondElectionMade": null
    }
  }
}
```

## Input cells (39)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| cda_components.aocTimingAdjustment111_4_f | number | strict |
| cda_components.capitalDividendsPreviouslyPaid | number | strict |
| cda_components.capitalDividendsReceived | number | strict |
| cda_components.foreignAffiliateDividendDeductions113_1 | number | strict |
| cda_components.lifeInsuranceCdaBeforeMay24_1985 | number | strict |
| cda_components.lifeInsuranceProceedsNetAcb | number | strict |
| cda_components.nonTaxableCapitalGainsNet | number | strict |
| cda_components.nonTaxableEcpGains | number | strict |
| cda_components.preFeb2000RequiredInclusions89_1_c | number | strict |
| cda_components.trustCapitalGainDistributionsPostSep2016 | number | strict |
| cda_components.trustCapitalGainDistributionsPreSep2016 | number | strict |
| cda_components.trustNonTaxableDividendDistributions104_20 | number | strict |
| election.cdaBalanceImmediatelyBeforeDividendPayable | null \| number | strict |
| election.dividendDeclared | number | strict |
| election.dividendPayableDate | null \| string | strict |
| election.firstPaymentDate | null \| string | strict |
| election.isCcpcThroughoutYearOrSubstantiveCcpc | boolean \| null | strict |
| election.isPrivateCorporation | boolean \| null | strict |
| election.s83_2ElectionDate | null \| string | strict |
| election.s83_2_2Or2_3Or2_4ReliefApplies | boolean \| null | strict |
| election.s83_3AuthorizedBeforeFiling | boolean \| null | strict |
| election.s83_3EstimatedPenaltyPaidAmount | null \| number | strict |
| election.s83_3EstimatedPenaltyPaidWithElection | boolean \| null | strict |
| election.s83_3PenaltyPaymentDate | null \| string | strict |
| election.s83_3_1MinisterRequestServedAndNotAnsweredWithin90Days | boolean \| null | strict |
| election.sharesAcquiredForDividendPurpose | null \| string | strict |
| election.t2054CdaComputationScheduleAttached | boolean \| null | strict |
| election.t2054CertifiedResolutionOrAuthorizationAttached | boolean \| null | strict |
| election.t2054EvidenceReference | null \| string | strict |
| election.t2054PrescribedFormCompleted | boolean \| null | strict |
| options.allDeemedRecipientsExemptFromPartI | boolean \| null | strict |
| options.allDividendRecipientShareholdersConcur | boolean \| null | strict |
| options.corporationAndKnownAddressShareholdersConcur | boolean \| null | strict |
| options.identifiedPortionOfExcess | null \| number | strict |
| options.identifiedPortionSecondElectionMade | boolean \| null | strict |
| options.noticeOfAssessmentSentDate | null \| string | strict |
| options.originalDividendPayableDate | null \| string | strict |
| options.s184_3ElectionDate | null \| string | strict |
| options.s184_3ElectionFiled | boolean | strict |

### Input cell notes

- `options.s184_3ElectionFiled`: Asserts the s.184(3) election to treat the excess dividend as a separate taxable dividend was filed; an assertion only, the s.184(3) to (5) conditions still decide the Part III result.

### Strict profile accepted values (25 of 39 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| cda_components.aocTimingAdjustment111_4_f | -600000000000 to 600000000000 |
| cda_components.capitalDividendsPreviouslyPaid | 0 to 600000000000 |
| cda_components.capitalDividendsReceived | 0 to 600000000000 |
| cda_components.foreignAffiliateDividendDeductions113_1 | 0 to 600000000000 |
| cda_components.lifeInsuranceCdaBeforeMay24_1985 | 0 to 600000000000 |
| cda_components.lifeInsuranceProceedsNetAcb | 0 to 600000000000 |
| cda_components.nonTaxableCapitalGainsNet | -600000000000 to 600000000000 |
| cda_components.nonTaxableEcpGains | 0 to 600000000000 |
| cda_components.preFeb2000RequiredInclusions89_1_c | 0 to 600000000000 |
| cda_components.trustCapitalGainDistributionsPostSep2016 | 0 to 600000000000 |
| cda_components.trustCapitalGainDistributionsPreSep2016 | 0 to 600000000000 |
| cda_components.trustNonTaxableDividendDistributions104_20 | 0 to 600000000000 |
| election.cdaBalanceImmediatelyBeforeDividendPayable | 0 to 600000000000 |
| election.dividendDeclared | 0 to 600000000000 |
| election.dividendPayableDate | date (YYYY-MM-DD); at most 10 characters |
| election.firstPaymentDate | date (YYYY-MM-DD); at most 10 characters |
| election.s83_2ElectionDate | date (YYYY-MM-DD); at most 10 characters |
| election.s83_3EstimatedPenaltyPaidAmount | 0 to 600000000000 |
| election.s83_3PenaltyPaymentDate | date (YYYY-MM-DD); at most 10 characters |
| election.sharesAcquiredForDividendPurpose | one of "yes", "no", "not_determined", null |
| election.t2054EvidenceReference | 1 to 2000 characters |
| options.identifiedPortionOfExcess | 0 to 600000000000 |
| options.noticeOfAssessmentSentDate | date (YYYY-MM-DD); at most 10 characters |
| options.originalDividendPayableDate | date (YYYY-MM-DD); at most 10 characters |
| options.s184_3ElectionDate | date (YYYY-MM-DD); at most 10 characters |

## Output cells (68)

| Cell | Types |
| --- | --- |
| cdaComponents.nonTaxableCapitalGainsNet | number |
| cdaComponents.trustCapitalGainDistributionsPostSep2016 | number |
| cdaComponents.capitalDividendsReceived | number |
| cdaComponents.preFeb2000RequiredInclusions89_1_c | number |
| cdaComponents.lifeInsuranceProceedsNetAcb | number |
| cdaComponents.nonTaxableEcpGains | number |
| cdaComponents.lifeInsuranceCdaBeforeMay24_1985 | number |
| cdaComponents.trustCapitalGainDistributionsPreSep2016 | number |
| cdaComponents.trustNonTaxableDividendDistributions104_20 | number |
| cdaComponents.foreignAffiliateDividendDeductions113_1 | number |
| cdaComponents.capitalDividendsPreviouslyPaid | number |
| paragraph89_1_hStatus | string |
| paragraph89_1_hAmountIncluded | number |
| cdaBalance | null \| number |
| cdaBalanceRunning | number |
| cdaBalanceStatus | string |
| dividendDeclared | number |
| capitalDividendPortion | null \| number |
| excessOverCda | null \| number |
| partIIIRate | number |
| partIIITax | null \| number |
| s184_3ElectionFiled | boolean |
| s184_3ElectionAvailable | boolean \| null |
| s184_3ElectionStatus | string |
| s184_3Deadline90Day | null \| string |
| s184_4Deadline30Month | null \| string |
| identifiedPortionOfExcess | null \| number |
| identifiedPortionSecondElectionStatus | string |
| identifiedPortionDeemedSeparateForAllPurposes | null \| number |
| secondElectionCdaAvailable | null \| number |
| secondElectionPartIIITax | null \| number |
| separateTaxableDividend_184_3_c | null \| number |
| taxableDividendIfElected | null \| number |
| s83_2ElectionStatus | string |
| s83_2ElectionDeadline | null \| string |
| s83_3LateElectionStatus | string |
| s83_3MonthsOrPartMonthsLate | integer |
| s83_3Penalty | number |
| s83_3DeemedElectionDate | null \| string |
| s83_2_1Applies | string |
| dividendCharacterization | string |
| cleanCapitalDividend | boolean |
| capabilityStatus | string |
| authoritativeForBatch | boolean |
| productionAuthorities[] | string |
| cdaBalanceSource | string |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

# debt-forgiveness

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 9.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/debt-forgiveness`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "forgiven_amount": 100000,
    "attributes": {
      "nonCapitalLossesOrdinary": 15000,
      "nonCapitalLossesAbilByYear": [
        {
          "year": 1995,
          "amount": 2500,
          "applicableFraction": null
        },
        {
          "year": 2002,
          "amount": 2500,
          "applicableFraction": null
        }
      ],
      "farmLosses": 0,
      "restrictedFarmLosses": 0,
      "netCapitalLossesByYear": null,
      "netCapitalLosses": 10000,
      "netCapitalLossesYear": 1995,
      "netCapitalLossesFraction": null,
      "ccaUcc": 20000,
      "cumulativeEligibleCapital": 0,
      "resourcePools": 0,
      "abilAndOtherAcb": 0,
      "section80_9CapitalPropertyAcb": 0,
      "section80_10SpecifiedShareholderPropertyAcb": 0,
      "currentYearCapitalLosses": 0,
      "subsection88_1_2Amount": 0,
      "currentYearCapitalGains": 0,
      "priorSubsection80_12Gains": 0,
      "unrecognizedLosses": 0,
      "priorDReductions": 0,
      "totalSection80_13InclusionsForYear": 100000,
      "assetsFmvAtYearEnd": 90000,
      "totalLiabilitiesAtYearEnd": 40000,
      "taxesPaidForYear": 0,
      "nonArmsLengthDistributions12Months": 0,
      "distressPreferredSharePrincipal": 0,
      "incomeBefore61_3And61_4": 100000,
      "paragraph80_15_a_deductions": 0,
      "section61_4ReserveClaimed": 50000,
      "section56_3InclusionForYear": 0,
      "section61_4PriorYearAmountsComplete": true,
      "section61_4PriorYearAmounts": []
    },
    "designations": {
      "applyToPoolsAmount": null,
      "s80_5Amount": 20000,
      "s80_8Amount": null,
      "s80_9Amount": null,
      "s80_10Amount": null,
      "s80_11Amount": null,
      "residualBalance": null,
      "section80_04AgreementAmount": 0
    },
    "party": {
      "isPartnership": false,
      "isResidentInCanadaThroughoutYear": true,
      "isExemptFromTaxUnderPartI": false,
      "subsection61_3_3Applies": false,
      "carriedOnBusinessThroughFixedPlaceInCanadaAtYearEnd": null,
      "commencedWindUpInYear": false,
      "subsection88_1AppliesToWindUp": null
    }
  }
}
```

## Input cells (55)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| attributes.abilAndOtherAcb | number | strict |
| attributes.assetsFmvAtYearEnd | number | strict |
| attributes.ccaUcc | number | strict |
| attributes.cumulativeEligibleCapital | number | strict |
| attributes.currentYearCapitalGains | number | strict |
| attributes.currentYearCapitalLosses | null \| number | strict |
| attributes.distressPreferredSharePrincipal | number | strict |
| attributes.farmLosses | number | strict |
| attributes.incomeBefore61_3And61_4 | number | strict |
| attributes.netCapitalLosses | number | strict |
| attributes.netCapitalLossesByYear[].amount | number | strict |
| attributes.netCapitalLossesByYear[].applicableFraction | null \| number | strict |
| attributes.netCapitalLossesByYear[].year | integer \| null | strict |
| attributes.netCapitalLossesFraction | null \| number | strict |
| attributes.netCapitalLossesYear | integer \| null | strict |
| attributes.nonArmsLengthDistributions12Months | number | strict |
| attributes.nonCapitalLossesAbilByYear[].amount | number | strict |
| attributes.nonCapitalLossesAbilByYear[].applicableFraction | null \| number | strict |
| attributes.nonCapitalLossesAbilByYear[].year | integer | strict |
| attributes.nonCapitalLossesOrdinary | number | strict |
| attributes.paragraph80_15_a_deductions | number | strict |
| attributes.priorDReductions | number | strict |
| attributes.priorSubsection80_12Gains | number | strict |
| attributes.resourcePools | number | strict |
| attributes.restrictedFarmLosses | number | strict |
| attributes.section56_3InclusionForYear | null \| number | strict |
| attributes.section61_4PriorYearAmountsComplete | boolean \| null | strict |
| attributes.section61_4PriorYearAmounts[].paragraph80_15_aDeductions | number | strict |
| attributes.section61_4PriorYearAmounts[].section61_3Deductions | number | strict |
| attributes.section61_4PriorYearAmounts[].section80_13Inclusions | number | strict |
| attributes.section61_4PriorYearAmounts[].yearsBeforeCurrent | integer | strict |
| attributes.section61_4ReserveClaimed | null \| number | strict |
| attributes.section80_10SpecifiedShareholderPropertyAcb | number | strict |
| attributes.section80_9CapitalPropertyAcb | number | strict |
| attributes.subsection88_1_2Amount | number | strict |
| attributes.taxesPaidForYear | number | strict |
| attributes.totalLiabilitiesAtYearEnd | number | strict |
| attributes.totalSection80_13InclusionsForYear | number | strict |
| attributes.unrecognizedLosses | number | strict |
| designations.applyToPoolsAmount | null \| number | strict |
| designations.residualBalance | null \| number | strict |
| designations.s80_10Amount | null \| number | strict |
| designations.s80_11Amount | null \| number | strict |
| designations.s80_5Amount | null \| number | strict |
| designations.s80_8Amount | null \| number | strict |
| designations.s80_9Amount | null \| number | strict |
| designations.section80_04AgreementAmount | number | strict |
| forgiven_amount | number | strict |
| party.carriedOnBusinessThroughFixedPlaceInCanadaAtYearEnd | boolean \| null | strict |
| party.commencedWindUpInYear | boolean \| null | strict |
| party.isExemptFromTaxUnderPartI | boolean \| null | strict |
| party.isPartnership | boolean | strict |
| party.isResidentInCanadaThroughoutYear | boolean \| null | strict |
| party.subsection61_3_3Applies | boolean \| null | strict |
| party.subsection88_1AppliesToWindUp | boolean \| null | strict |

### Input cell notes

- `attributes.cumulativeEligibleCapital`: ITA 80(7) was repealed by S.C. 2016, c. 12, s. 23; there is no cumulative-eligible-capital designation. Must be 0 — a legacy balance belongs in ccaUcc under 80(5).
- `attributes.nonCapitalLossesOrdinary`: Ordinary non-capital-loss component, excluding the ABIL element in the s.111(8) definition. Applied 1:1 under 80(3)(a); enter 0 only after reviewing the balance as nil.
- `party.isPartnership`: The debtor is a partnership rather than a corporation; omitted, the engine keeps the corporate-debtor posture.

### Strict profile accepted values (47 of 55 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| attributes.abilAndOtherAcb | 0 to 600000000000 |
| attributes.assetsFmvAtYearEnd | 0 to 600000000000 |
| attributes.ccaUcc | 0 to 600000000000 |
| attributes.cumulativeEligibleCapital | 0 to 0 |
| attributes.currentYearCapitalGains | 0 to 600000000000 |
| attributes.currentYearCapitalLosses | 0 to 600000000000 |
| attributes.distressPreferredSharePrincipal | 0 to 600000000000 |
| attributes.farmLosses | 0 to 600000000000 |
| attributes.incomeBefore61_3And61_4 | -600000000000 to 600000000000 |
| attributes.netCapitalLosses | 0 to 600000000000 |
| attributes.netCapitalLossesByYear[].amount | 0 to 600000000000 |
| attributes.netCapitalLossesByYear[].applicableFraction | more than 0; at most 1 |
| attributes.netCapitalLossesByYear[].year | 1972 to 2100 |
| attributes.netCapitalLossesFraction | more than 0; at most 1 |
| attributes.netCapitalLossesYear | 1972 to 2100 |
| attributes.nonArmsLengthDistributions12Months | 0 to 600000000000 |
| attributes.nonCapitalLossesAbilByYear[].amount | 0 to 600000000000 |
| attributes.nonCapitalLossesAbilByYear[].applicableFraction | more than 0; at most 1 |
| attributes.nonCapitalLossesAbilByYear[].year | 1972 to 2100 |
| attributes.nonCapitalLossesOrdinary | 0 to 600000000000 |
| attributes.paragraph80_15_a_deductions | 0 to 600000000000 |
| attributes.priorDReductions | 0 to 600000000000 |
| attributes.priorSubsection80_12Gains | 0 to 600000000000 |
| attributes.resourcePools | 0 to 600000000000 |
| attributes.restrictedFarmLosses | 0 to 600000000000 |
| attributes.section56_3InclusionForYear | 0 to 600000000000 |
| attributes.section61_4PriorYearAmounts[].paragraph80_15_aDeductions | 0 to 600000000000 |
| attributes.section61_4PriorYearAmounts[].section61_3Deductions | 0 to 600000000000 |
| attributes.section61_4PriorYearAmounts[].section80_13Inclusions | 0 to 600000000000 |
| attributes.section61_4PriorYearAmounts[].yearsBeforeCurrent | 1 to 200 |
| attributes.section61_4ReserveClaimed | 0 to 600000000000 |
| attributes.section80_10SpecifiedShareholderPropertyAcb | 0 to 600000000000 |
| attributes.section80_9CapitalPropertyAcb | 0 to 600000000000 |
| attributes.subsection88_1_2Amount | 0 to 600000000000 |
| attributes.taxesPaidForYear | 0 to 600000000000 |
| attributes.totalLiabilitiesAtYearEnd | 0 to 600000000000 |
| attributes.totalSection80_13InclusionsForYear | 0 to 600000000000 |
| attributes.unrecognizedLosses | 0 to 600000000000 |
| designations.applyToPoolsAmount | 0 to 600000000000 |
| designations.residualBalance | 0 to 600000000000 |
| designations.s80_10Amount | 0 to 600000000000 |
| designations.s80_11Amount | 0 to 600000000000 |
| designations.s80_5Amount | 0 to 600000000000 |
| designations.s80_8Amount | 0 to 600000000000 |
| designations.s80_9Amount | 0 to 600000000000 |
| designations.section80_04AgreementAmount | 0 to 600000000000 |
| forgiven_amount | 0 to 600000000000 |

## Output cells (68)

| Cell | Types |
| --- | --- |
| forgivenAmount | number |
| isPartnership | boolean |
| orderedReductions.nonCapitalLosses | number |
| orderedReductions.farmLosses | number |
| orderedReductions.restrictedFarmLosses | number |
| orderedReductions.nonCapitalLossesAbil | number |
| orderedReductions.netCapitalLosses | number |
| orderedReductions.pools | number |
| orderedReductions.acb | number |
| orderedReductions.deemedCapitalGain80_12 | number |
| poolDesignations.ccaUcc | number |
| poolDesignations.resourcePools | number |
| poolDesignations.abilAndOtherAcb | number |
| poolDesignations.subsection80_11 | number |
| poolDesignations.total | number |
| abilNonCapitalLossBalanceReduced | number |
| abilNonCapitalLossDetail[].year | integer |
| abilNonCapitalLossDetail[].applicableFraction | string |
| abilNonCapitalLossDetail[].balanceReduced | number |
| abilNonCapitalLossDetail[].forgivenAmountConsumed | number |
| netCapitalLossBalanceReduced | number |
| netCapitalLossDetail[].year | integer \| null |
| netCapitalLossDetail[].applicableFraction | string |
| netCapitalLossDetail[].balanceReduced | number |
| netCapitalLossDetail[].forgivenAmountConsumed | number |
| undesignatedRoomExplanation[].subsection | string |
| undesignatedRoomExplanation[].pool | string |
| undesignatedRoomExplanation[].balance | number |
| undesignatedRoomExplanation[].designated | number |
| undesignatedRoomExplanation[].roomDeclined | number |
| undesignatedRoomExplanation[].availabilityBasis | string |
| deemedCapitalGainSubsection80_12 | number |
| inclusionFormula.A | number |
| inclusionFormula.B | number |
| inclusionFormula.C | number |
| inclusionFormula.D | number |
| inclusionFormula.E | number |
| inclusionFormula.base | number |
| section61_3Deduction | null \| number |
| section61_4ReserveClaimed | null \| number |
| section61_4ReserveMaximum | null \| number |
| section61_4ReserveDeduction | null \| number |
| section61_4ParagraphACap | null \| number |
| section61_4ParagraphBCap | null \| number |
| section61_4WindUpNilCapApplies | boolean \| null |
| residual | number |
| incomeInclusion | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

# gaar-screen

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 5.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/gaar-screen`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "transaction": {
      "hasTaxBenefit": true,
      "hasTaxBenefitFutureAttribute": false,
      "isAvoidanceTransaction_one_of_main_purposes": true,
      "misuseOrAbuse": true,
      "lacksEconomicSubstance": true,
      "disclosedUnder237_3Or237_4": false,
      "reliedOnPublishedGuidanceOrCaseLaw": false,
      "mdrReportable": true,
      "transactionDateIso": "2025-07-01"
    }
  }
}
```

## Input cells (9)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| transaction.disclosedUnder237_3Or237_4 | boolean \| null | strict |
| transaction.hasTaxBenefit | boolean \| null | strict |
| transaction.hasTaxBenefitFutureAttribute | boolean \| null | strict |
| transaction.isAvoidanceTransaction_one_of_main_purposes | boolean \| null | strict |
| transaction.lacksEconomicSubstance | boolean \| null | strict |
| transaction.mdrReportable | boolean \| null | strict |
| transaction.misuseOrAbuse | boolean \| null | strict |
| transaction.reliedOnPublishedGuidanceOrCaseLaw | boolean \| null | strict |
| transaction.transactionDateIso | string | strict |

### Input cell notes

- `transaction.disclosedUnder237_3Or237_4`: The transaction WAS disclosed to the Minister in accordance with s.237.3 or s.237.4. Non-disclosure is a condition of liability for the s.245(5.1) penalty, so disclosure is a complete bar rather than a reduction. Distinct from mdrReportable, which is reportABILITY.
- `transaction.hasTaxBenefit`: Paragraph (a) or (b) of the s.245(1) 'tax benefit' definition: a reduction, avoidance or deferral of tax or other amount payable, or an increase in a refund of tax or other amount. Limb 1.
- `transaction.hasTaxBenefitFutureAttribute`: Paragraph (c) of the s.245(1) 'tax benefit' definition: a reduction, increase or PRESERVATION of an amount that could at a subsequent time be relevant in computing a paragraph (a) or (b) amount and result in one of those effects. Merely preserving a loss or other attribute is a tax benefit, so this is a separate answer from the 'did tax go down this year?' question above.
- `transaction.isAvoidanceTransaction_one_of_main_purposes`: s.245(3): the transaction (or a series that includes it) results in a tax benefit and it may NOT reasonably be considered that obtaining the tax benefit is not one of the main purposes. Limb 2. For transactions before 2024-01-01 the pre-amendment 'primary purpose' threshold governs and this screen does not model it.
- `transaction.lacksEconomicSubstance`: s.245(4.1): the avoidance transaction or series is significantly lacking in economic substance (the s.245(4.2) factors). An important consideration that TENDS TO INDICATE a misuse under (4)(a) or an abuse under (4)(b); it feeds the s.245(4) test and is not that test. Applies only to transactions on or after 2024-01-01.
- `transaction.mdrReportable`: The transaction is reportable or notifiable under the mandatory disclosure rules (ss.237.3-237.5). Cross-reference only; it does not establish disclosure.
- `transaction.misuseOrAbuse`: s.245(4), the ONLY-IF condition on s.245(2): it may reasonably be considered that the transaction (a) would result directly or indirectly in a misuse of the provisions relied on, or (b) would result directly or indirectly in an abuse having regard to those provisions read as a whole. Limb 3, and the object-spirit-and-purpose legal conclusion itself — NOT the economic-substance answer below, which only tends to indicate it.
- `transaction.reliedOnPublishedGuidanceOrCaseLaw`: The s.245(5.2) exception: at the time the transaction was entered into it was reasonable to conclude that s.245(2) would not apply, in reliance on the transaction or series being identical or almost identical to one that was the subject of (a) published administrative guidance or statements of the Minister or another relevant governmental authority, or (b) one or more court decisions. A complete exception, not a due-diligence defence.
- `transaction.transactionDateIso`: ISO date of the transaction or series. The 2024 amendments (S.C. 2024, c. 15, s. 66) have TWO different commencement dates: the lowered s.245(3) threshold and s.245(4.1)/(4.2) apply to transactions on or after 2024-01-01, while the s.245(5.1) penalty applies from Royal Assent on 2024-06-20. Required so neither gate is assumed.

### Strict profile accepted values (1 of 9 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| transaction.transactionDateIso | date (YYYY-MM-DD); 1 to 2000 characters |

## Output cells (26)

| Cell | Types |
| --- | --- |
| riskLevel | string |
| limbsFlagged[] | string |
| limbsUnanswered[] | string |
| penaltyExposureNote | string |
| mdrReportable | boolean \| null |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

### Output cell notes

- `mdrReportable`: The caller's mandatory-disclosure classification; null means that cross-reference remains unanswered, never reviewed false.

# mdr-screen

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 6.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/mdr-screen`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "transaction": {
      "transactionDateIso": "2026-07-01",
      "becomesBindingDateIso": "2026-06-15",
      "asOfDateIso": "2026-09-27",
      "avoidanceTransactionMainPurposeStatus": "yes"
    },
    "hallmarks": {
      "contingentFee": true,
      "confidentialProtection": false,
      "contractualProtection": false
    },
    "reportable_exclusions": {
      "isTaxShelterAcquisition": false,
      "isFlowThroughShareIssuance": false,
      "isTaxShelterAcquisitionWithRequiredReturnFiled": false,
      "isFlowThroughShareIssuanceWithRequiredReturnFiled": false,
      "exclusionAvoidanceMainReasonStatus": "no"
    },
    "designation": {
      "designationMatchStatus": "no",
      "designationEffectiveDateIso": null
    },
    "fees": {
      "weeksOfFailure": 2,
      "taxBenefit": 100000,
      "feesChargedByPerson": 75000,
      "daysOfFailure": 200,
      "taxShelterOrFlowThroughSharePenalty": null
    },
    "taxpayer": {
      "isCorporation": true,
      "largeCorporationAssets50MOrMoreStatus": "no"
    },
    "filer": {
      "filerCategory": "tax_benefit_person",
      "taxBenefitResultsOrExpectedStatus": "yes",
      "enteredForBenefitOfTaxBenefitPersonStatus": "no",
      "advisorPromoterFeeEntitlementStatus": "yes",
      "nonArmsLengthFeeEntitlementStatus": "no",
      "knewOrShouldKnowNotifiableStatus": "no",
      "employerOrPartnershipFiledUnderS237_4Status": "no",
      "dualCapacityEnteredForBenefitAndFeeRecipientStatus": "no",
      "noOtherPersonEnteredForBenefit": true,
      "otherPersonEnteredTransactionDateIso": null,
      "notifiableDueDiligenceDefenceStatus": "no",
      "reportablePenaltyDueDiligenceDefenceStatus": "no",
      "privilegedInformationStatus": "no"
    },
    "rutt": {
      "hasAuditedRelevantFinancialStatementsStatus": "yes",
      "assetsCarryingValue50MOrMoreAtYearEndStatus": "yes",
      "requiredToFileReturnUnderS150Status": "yes",
      "hasReportableUncertainTaxTreatmentStatus": "yes",
      "dueDiligenceDefenceStatus": "no",
      "filingDueDateIso": "2026-08-31",
      "weeksOfFailure": 3
    }
  }
}
```

## Input cells (41)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| designation.designationEffectiveDateIso | null \| string | strict |
| designation.designationMatchStatus | string | strict |
| fees.daysOfFailure | integer \| null | strict |
| fees.feesChargedByPerson | null \| number | strict |
| fees.taxBenefit | null \| number | strict |
| fees.taxShelterOrFlowThroughSharePenalty | null \| number | strict |
| fees.weeksOfFailure | integer \| null | strict |
| filer.advisorPromoterFeeEntitlementStatus | string | strict |
| filer.dualCapacityEnteredForBenefitAndFeeRecipientStatus | string | strict |
| filer.employerOrPartnershipFiledUnderS237_4Status | string | strict |
| filer.enteredForBenefitOfTaxBenefitPersonStatus | string | strict |
| filer.filerCategory | string | strict |
| filer.knewOrShouldKnowNotifiableStatus | string | strict |
| filer.noOtherPersonEnteredForBenefit | boolean \| null | strict |
| filer.nonArmsLengthFeeEntitlementStatus | string | strict |
| filer.notifiableDueDiligenceDefenceStatus | string | strict |
| filer.otherPersonEnteredTransactionDateIso | null \| string | strict |
| filer.privilegedInformationStatus | string | strict |
| filer.reportablePenaltyDueDiligenceDefenceStatus | string | strict |
| filer.taxBenefitResultsOrExpectedStatus | string | strict |
| hallmarks.confidentialProtection | boolean \| null | strict |
| hallmarks.contingentFee | boolean \| null | strict |
| hallmarks.contractualProtection | boolean \| null | strict |
| reportable_exclusions.exclusionAvoidanceMainReasonStatus | null \| string | strict |
| reportable_exclusions.isFlowThroughShareIssuance | boolean \| null | strict |
| reportable_exclusions.isFlowThroughShareIssuanceWithRequiredReturnFiled | boolean \| null | strict |
| reportable_exclusions.isTaxShelterAcquisition | boolean \| null | strict |
| reportable_exclusions.isTaxShelterAcquisitionWithRequiredReturnFiled | boolean \| null | strict |
| rutt.assetsCarryingValue50MOrMoreAtYearEndStatus | string | strict |
| rutt.dueDiligenceDefenceStatus | string | strict |
| rutt.filingDueDateIso | null \| string | strict |
| rutt.hasAuditedRelevantFinancialStatementsStatus | string | strict |
| rutt.hasReportableUncertainTaxTreatmentStatus | string | strict |
| rutt.requiredToFileReturnUnderS150Status | string | strict |
| rutt.weeksOfFailure | integer \| null | strict |
| taxpayer.isCorporation | boolean | strict |
| taxpayer.largeCorporationAssets50MOrMoreStatus | string | strict |
| transaction.asOfDateIso | string | strict |
| transaction.avoidanceTransactionMainPurposeStatus | string | strict |
| transaction.becomesBindingDateIso | string | strict |
| transaction.transactionDateIso | string | strict |

### Input cell notes

- `designation.designationEffectiveDateIso`: Statutory deadline anchor capped at 9999-10-02, so adding the 90-day reporting window remains within the supported ISO date range.
- `fees.daysOfFailure`: Subparagraph 237.3(8)(b)(iii) / 237.4(12)(b)(iii): the exact statutory number of DAYS during which this advisor's or promoter's filing failure continues, at $1,000 per day up to a maximum of $100,000 on that component. Counted in days, not the weeks of the paragraph (a) branches. Null means no estimate is claimed.
- `fees.feesChargedByPerson`: Subparagraph 237.3(8)(b)(i) / 237.4(12)(b)(i): the amount of the fees charged by THIS person in respect of the reportable or notifiable transaction. Unlike the paragraph (a) branches the (b) total is fee-driven and unbounded — the $100,000 maximum attaches only to the daily component — so null means no estimate is claimed and no component is invented.
- `fees.taxBenefit`: Tax benefit used only for the 25%-of-benefit component of the supported ordinary-branch penalty cap; null means no estimate is claimed.
- `fees.taxShelterOrFlowThroughSharePenalty`: B in subsection 237.3(15): the penalty, if any, that applies on THIS person under subsection 237.1(7.4) for the tax shelter or subsection 66(12.74) for the flow-through-share issuance. Required when either separate transaction-type fact is true and a positive subsection 237.3(8) penalty is otherwise established; enter 0 only when the same-person overlap was reviewed as nil.
- `fees.weeksOfFailure`: Exact statutory number of weeks during which this person's filing failure continues under paragraph 237.3(8)(a) or 237.4(12)(a). When the person deadline and as-of date are known, the count cannot exceed the elapsed-time ceiling; a smaller count can apply if the failure ended earlier. Null means no penalty estimate is claimed.
- `filer.advisorPromoterFeeEntitlementStatus`: Paragraph 237.3(2)(c): whether this advisor or promoter is or was entitled, immediately or in the future and absolutely or contingently, to a fee described in subparagraph (c)(i) or (c)(ii). The transaction classification alone never creates the duty, so an unanswered entitlement leaves the (c) duty non-conclusive. Read only on the ``advisor_or_promoter`` branch.
- `filer.dualCapacityEnteredForBenefitAndFeeRecipientStatus`: Subsections 237.3(8.1) and 237.4(13): whether this person is described in both the entered-for-benefit paragraph ((2)(b)/(4)(b)) and the non-arm's-length fee-recipient paragraph ((2)(d)/(4)(d)). Yes makes the penalty the greater of the paragraph-(a) and paragraph-(b) amounts, so both branches' inputs are required.
- `filer.employerOrPartnershipFiledUnderS237_4Status`: Subsection 237.4(5): whether the screened person is an employee or partner of an employer or partnership that was required to file under paragraph 237.4(4)(c) or (d) and filed the prescribed return for this notifiable transaction. Yes deems the return filed by this person and invokes the subsection 237.4(14) penalty non-application; it does not affect a separate s.237.3 duty.
- `filer.enteredForBenefitOfTaxBenefitPersonStatus`: Paragraph 237.3(2)(b) / 237.4(4)(b): whether THIS person entered into, for the benefit of a paragraph (a) person, an avoidance transaction that is a reportable transaction. Read only on the ``entered_for_benefit_person`` branch, and distinct from ``noOtherPersonEnteredForBenefit`` below, which is a deadline-anchor fact about somebody else.
- `filer.filerCategory`: The statutory filer paragraph this request screens, under s.237.3(2) / s.237.4(4). ``tax_benefit_person`` is paragraph (a), a person for whom a tax benefit results or is expected to result. ``entered_for_benefit_person`` is paragraph (b), who entered into the reportable avoidance transaction for an (a) person's benefit. ``advisor_or_promoter`` is paragraph (c). ``non_arms_length_fee_recipient`` is paragraph (d) — a person not dealing at arm's length with a paragraph (c) advisor or promoter entitled to a fee. The choice also selects the penalty basis: s.237.3(8)(a) for (a)/(b), (b) for (c)/(d).
- `filer.knewOrShouldKnowNotifiableStatus`: The s.237.4(7) knowledge condition, which gates the NOTIFIABLE-transaction duty of a paragraph 237.4(4)(c) or (d) filer: whether the person knew or ought reasonably to have known that the transaction was a notifiable transaction. Paragraph (c) itself carries no fee condition; paragraph (d) needs both this and the non-arm's-length fee entitlement.
- `filer.noOtherPersonEnteredForBenefit`: Whether NO paragraph 237.3(2)(b) or 237.4(4)(b) person entered into the transaction for this person's benefit. true makes the additional deadline date in subparagraph 237.3(5)(a)(iii) / 237.4(9)(a)(iii) inapplicable. false or null leaves date (iii) unresolved unless otherPersonEnteredTransactionDateIso supplies it: the screen refuses to guess a two-date earliest-of, because guessing produces a LATER, compliance-risky deadline. Distinct from enteredForBenefitOfTaxBenefitPersonStatus above, which is a filing-capacity fact about THIS person.
- `filer.nonArmsLengthFeeEntitlementStatus`: Paragraph 237.3(2)(d): whether this person, who does not deal at arm's length with an advisor or promoter, is or was entitled to a fee referred to in paragraph (c). Read only on the ``non_arms_length_fee_recipient`` branch.
- `filer.notifiableDueDiligenceDefenceStatus`: Separate subsection 237.4(6) due-diligence fact; when met, paragraphs 237.4(4)(a) and (b) do not apply to the person.
- `filer.otherPersonEnteredTransactionDateIso`: Subparagraph 237.3(5)(a)(iii) / 237.4(9)(a)(iii): the day on which the reportable transaction was entered into by a paragraph (2)(b) / (4)(b) person for the benefit of this paragraph (2)(a) / (4)(a) person. It joins the statutory earliest-of alongside the contractual-obligation date (i) and this person's own entry date (ii), so a date (iii) earlier than both moves the 90-day deadline earlier. Send it, or send a true noOtherPersonEnteredForBenefit to state that date (iii) is inapplicable; without either the deadline stays non-conclusive rather than overstated.
- `filer.privilegedInformationStatus`: Whether information may be protected by solicitor-client privilege under subsections 237.3(17) or 237.4(18); privilege limits information disclosure and is not encoded as erasing the entire filing duty.
- `filer.reportablePenaltyDueDiligenceDefenceStatus`: Separate subsection 237.3(11) penalty-defence fact; it does not erase a filing obligation under subsection 237.3(2).
- `filer.taxBenefitResultsOrExpectedStatus`: Paragraph 237.3(2)(a) / 237.4(4)(a): whether a tax benefit results, or is expected to result based on this person's tax treatment. Read only on the ``tax_benefit_person`` branch.
- `hallmarks.confidentialProtection`: s.237.3 reportable-transaction hallmark, paragraph (b): confidential protection exists. Null means this hallmark is unanswered and keeps the classification under review.
- `hallmarks.contingentFee`: s.237.3 reportable-transaction hallmark, paragraph (a): a contingent fee arrangement exists. Null means this hallmark is unanswered and keeps the classification under review.
- `hallmarks.contractualProtection`: s.237.3 reportable-transaction hallmark, paragraph (c): contractual protection exists. Null means this hallmark is unanswered and keeps the classification under review.
- `reportable_exclusions.exclusionAvoidanceMainReasonStatus`: Subsection 237.3(16): whether it is reasonable, having regard to all the circumstances, to conclude that one main reason for the tax-shelter acquisition or flow-through-share issuance is avoiding section 237.3. Read only when a subsection (14) filed-return composite is true.
- `reportable_exclusions.isFlowThroughShareIssuance`: Paragraph 237.3(15)(b): this reportable transaction IS the issuance of a flow-through share. This is a transaction-type fact, independent of whether the subsection 66(12.68) information return was filed. Null leaves the A-B cap classification unanswered.
- `reportable_exclusions.isFlowThroughShareIssuanceWithRequiredReturnFiled`: The COMPLETE subsection 237.3(14)(b) exclusion fact: this transaction is, or is part of a series that includes, the issuance of a flow-through share for which an information return was filed under subsection 66(12.68). Because the issuance may be a different transaction in the series, this composite does not answer the subsection 237.3(15) type fact.
- `reportable_exclusions.isTaxShelterAcquisition`: Paragraph 237.3(15)(a): this reportable transaction IS the acquisition of a tax shelter. This is a transaction-type fact, independent of whether the subsection 237.1(7) information return was filed. Null leaves the A-B cap classification unanswered.
- `reportable_exclusions.isTaxShelterAcquisitionWithRequiredReturnFiled`: The COMPLETE subsection 237.3(14)(a) exclusion fact: this transaction is, or is part of a series that includes, the acquisition of a tax shelter for which an information return was filed under subsection 237.1(7). Because the acquisition may be a different transaction in the series, this composite does not answer the separate subsection 237.3(15) type fact.
- `rutt.assetsCarryingValue50MOrMoreAtYearEndStatus`: Paragraph (b) of the same definition: the carrying value of the corporation's assets is greater than or equal to $50 million AT THE END OF THE YEAR, determined under subsection 237.5(9) in accordance with paragraphs 181(3)(a) and (b). This is a different measurement date and test from the large-corporation status in subparagraphs 237.3(8)(a)(i) and 237.4(12)(a)(i), so it is a separate answer.
- `rutt.dueDiligenceDefenceStatus`: The subsection 237.5(6) due-diligence defence: the corporation exercised the degree of care, diligence and skill to prevent the failure to file that a reasonably prudent person would have exercised. It bars the subsection 237.5(5) penalty; it does not erase the subsection 237.5(2) filing requirement. Separate from both the 237.3(11) and 237.4(6) defences above.
- `rutt.filingDueDateIso`: The corporation's filing-due date for the year, which is the subsection 237.5(3) deadline. Null means the deadline is not being resolved and the screen says so instead of assuming one.
- `rutt.hasAuditedRelevantFinancialStatementsStatus`: Paragraph (a) of the subsection 237.5(1) 'reporting corporation' definition: the corporation has 'relevant financial statements' for the year — audited statements prepared under IFRS or other country-specific GAAP relevant for corporations listed on a stock exchange outside Canada, for a period ending in the year.
- `rutt.hasReportableUncertainTaxTreatmentStatus`: Whether the corporation has one or more 'reportable uncertain tax treatments' for the year — a tax treatment in respect of which uncertainty is reflected in its relevant financial statements. Subsection 237.5(2) requires an information return in respect of EACH such treatment.
- `rutt.requiredToFileReturnUnderS150Status`: Paragraph (c) of the same definition: the corporation is required to file a return of income for the year under section 150.
- `rutt.weeksOfFailure`: Exact statutory number of weeks during which the failure to report continues under subsection 237.5(5): $2,000 per week, up to a maximum of $100,000. That maximum is absolute — unlike paragraph 237.3(8)(a) it has no tax-benefit limb — and is never returned as an estimate. Null means no RUTT penalty estimate is claimed.
- `taxpayer.isCorporation`: The taxpayer is a corporation; selects the corporate branch of the s.237.3(8) penalty arithmetic, including the large-corporation asset threshold question.
- `taxpayer.largeCorporationAssets50MOrMoreStatus`: Whether the corporation's carrying-value assets are at least $50 million for its last taxation year ending prior to the day the relevant information return is required to be filed, the measurement date in subparagraphs 237.3(8)(a)(i) and 237.4(12)(a)(i).
- `transaction.becomesBindingDateIso`: Statutory deadline anchor capped at 9999-10-02, so adding the 90-day reporting window remains within the supported ISO date range.
- `transaction.transactionDateIso`: Statutory deadline anchor capped at 9999-10-02, so adding the 90-day reporting window remains within the supported ISO date range.

### Strict profile accepted values (32 of 41 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| designation.designationEffectiveDateIso | date (YYYY-MM-DD); at most 10 characters |
| designation.designationMatchStatus | one of "yes", "no", "review_required" |
| fees.daysOfFailure | 0 to 100000 |
| fees.feesChargedByPerson | 0 to 600000000000 |
| fees.taxBenefit | 0 to 600000000000 |
| fees.taxShelterOrFlowThroughSharePenalty | 0 to 600000000000 |
| fees.weeksOfFailure | 0 to 100000 |
| filer.advisorPromoterFeeEntitlementStatus | one of "yes", "no", "review_required" |
| filer.dualCapacityEnteredForBenefitAndFeeRecipientStatus | one of "yes", "no", "review_required" |
| filer.employerOrPartnershipFiledUnderS237_4Status | one of "yes", "no", "review_required" |
| filer.enteredForBenefitOfTaxBenefitPersonStatus | one of "yes", "no", "review_required" |
| filer.filerCategory | one of "tax_benefit_person", "entered_for_benefit_person", "advisor_or_promoter", "non_arms_length_fee_recipient" |
| filer.knewOrShouldKnowNotifiableStatus | one of "yes", "no", "review_required" |
| filer.nonArmsLengthFeeEntitlementStatus | one of "yes", "no", "review_required" |
| filer.notifiableDueDiligenceDefenceStatus | one of "yes", "no", "review_required" |
| filer.otherPersonEnteredTransactionDateIso | date (YYYY-MM-DD); at most 10 characters |
| filer.privilegedInformationStatus | one of "yes", "no", "review_required" |
| filer.reportablePenaltyDueDiligenceDefenceStatus | one of "yes", "no", "review_required" |
| filer.taxBenefitResultsOrExpectedStatus | one of "yes", "no", "review_required" |
| reportable_exclusions.exclusionAvoidanceMainReasonStatus | one of "yes", "no", "review_required", null |
| rutt.assetsCarryingValue50MOrMoreAtYearEndStatus | one of "yes", "no", "review_required" |
| rutt.dueDiligenceDefenceStatus | one of "yes", "no", "review_required" |
| rutt.filingDueDateIso | date (YYYY-MM-DD); at most 10 characters |
| rutt.hasAuditedRelevantFinancialStatementsStatus | one of "yes", "no", "review_required" |
| rutt.hasReportableUncertainTaxTreatmentStatus | one of "yes", "no", "review_required" |
| rutt.requiredToFileReturnUnderS150Status | one of "yes", "no", "review_required" |
| rutt.weeksOfFailure | 0 to 100000 |
| taxpayer.largeCorporationAssets50MOrMoreStatus | one of "yes", "no", "review_required" |
| transaction.asOfDateIso | date (YYYY-MM-DD); 1 to 2000 characters |
| transaction.avoidanceTransactionMainPurposeStatus | one of "yes", "no", "review_required" |
| transaction.becomesBindingDateIso | date (YYYY-MM-DD); 1 to 2000 characters |
| transaction.transactionDateIso | date (YYYY-MM-DD); 1 to 2000 characters |

## Output cells (47)

| Cell | Types |
| --- | --- |
| enhancedRegimeApplies | boolean \| null |
| reportableDetermination | string |
| notifiableDetermination | string |
| transactionDisclosureFlag | boolean \| null |
| personFilingDetermination | string |
| disclosureReviewRequired | boolean |
| isReportable | boolean \| null |
| isNotifiable | boolean \| null |
| requiresDisclosure | boolean \| null |
| hallmarksTriggered[] | string |
| hallmarksRequiringReview[] | string |
| reportableDeadlineIso | null \| string |
| notifiableDeadlineIso | null \| string |
| reportingDeadlineIso | null \| string |
| daysRemaining | integer \| null |
| personFilingDeadlineIso | null \| string |
| personFilingDaysRemaining | integer \| null |
| penaltyDetermination | string |
| estimatedPenaltyOnFailure | null \| number |
| isRuttReportingCorporation | boolean \| null |
| ruttDetermination | string |
| ruttFilingRequired | boolean \| null |
| ruttDeadlineIso | null \| string |
| ruttDaysRemaining | integer \| null |
| ruttPenaltyDetermination | string |
| estimatedRuttPenaltyOnFailure | null \| number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

### Output cell notes

- `transactionDisclosureFlag`: Transaction-level classification flag only; it does not by itself establish that this person has a filing duty.
- `requiresDisclosure`: Person-specific filing-duty result for the screened filer paragraph after applying the distinct reportable and notifiable rules.
- `reportingDeadlineIso`: Earliest potential deadline among classified transaction regimes; this transaction-level date is not necessarily this person's deadline.
- `daysRemaining`: Days from the supplied as-of date to reportingDeadlineIso.
- `personFilingDeadlineIso`: Earliest filing deadline that actually applies to this person under the supported branch; null when the person-specific statutory date is not established.
- `personFilingDaysRemaining`: Days from the supplied as-of date to personFilingDeadlineIso; negative values mean that person-specific deadline has passed.
- `estimatedPenaltyOnFailure`: Estimated penalty for the ordinary taxpayer branch (s.237.3(8)(a)(ii) / 237.4(12)(a)(ii)) or the advisor-promoter branch (s.237.3(8)(b) / 237.4(12)(b)), after the subsection 237.3(15) A-B cap when its separate acquisition/issuance and same-person B facts engage it; null means the statutory facts or supported penalty regime are non-conclusive, never an invented zero or $25,000 amount.
- `isRuttReportingCorporation`: Whether the corporation meets the s.237.5(1) 'reporting corporation' definition; null when the facts were not supplied or are non-conclusive.
- `ruttFilingRequired`: Person-specific s.237.5(2) filing duty; null whenever the determination is a not-screened or review-required state.
- `ruttDeadlineIso`: Due date of the s.237.5(2) information return. s.237.5(3) is the deadline provision: the return "must be filed with the Minister on or before the corporation's filing-due date for the year". Null when not established.
- `ruttDaysRemaining`: Days from the supplied as-of date to ruttDeadlineIso; negative values mean that deadline has passed.
- `estimatedRuttPenaltyOnFailure`: s.237.5(5) penalty: a corporation that fails to report a reportable uncertain tax treatment as required under subsection (2) on or before the day required under subsection (3) is liable, for each such failure, to "$2,000 multiplied by the number of weeks during which the failure continues, up to a maximum of $100,000". The $100,000 is an absolute maximum, with no tax-benefit limb, unlike s.237.3(8)(a). Null when the filing obligation, the s.237.5(6) due-diligence defence or the timing inputs are non-conclusive, never an invented zero.

# post-mortem

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 5.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/post-mortem`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "estate_shares": {
      "acb": 500000,
      "puc": 100000,
      "redemptionAmount": 500000,
      "estateTotalCapitalLossesForYear": 400000,
      "estateTotalCapitalGainsForYear": 0
    },
    "dividends": {
      "capitalDividends83_2Received": 0,
      "taxableDividendsReceived": 0,
      "designatedTaxableDividends104_19ToIndividualBeneficiary": 0,
      "qualifiedDividends104_19ToCorporatePartnershipTrustBeneficiary": 0,
      "designatedTaxableDividends104_19ToCorporatePartnershipTrustBeneficiary": 0,
      "designatedLifeInsuranceCapitalDividends104_20": 0
    },
    "party": {
      "affiliatedAfterRedemption": false,
      "estateIsGraduatedRateEstate": true,
      "estateTaxationYearNumber": 1,
      "section164_6ElectionFiledOnTime": true,
      "shareAcquiredAsConsequenceOfDeath": true,
      "section164_6ElectedAmount": 400000
    },
    "terminal": {
      "terminalCapitalGain": 400000
    }
  }
}
```

## Input cells (18)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| dividends.capitalDividends83_2Received | number | strict |
| dividends.designatedLifeInsuranceCapitalDividends104_20 | number | strict |
| dividends.designatedTaxableDividends104_19ToCorporatePartnershipTrustBeneficiary | number | strict |
| dividends.designatedTaxableDividends104_19ToIndividualBeneficiary | number | strict |
| dividends.qualifiedDividends104_19ToCorporatePartnershipTrustBeneficiary | number | strict |
| dividends.taxableDividendsReceived | number | strict |
| estate_shares.acb | number | strict |
| estate_shares.estateTotalCapitalGainsForYear | null \| number | strict |
| estate_shares.estateTotalCapitalLossesForYear | null \| number | strict |
| estate_shares.puc | number | strict |
| estate_shares.redemptionAmount | number | strict |
| party.affiliatedAfterRedemption | boolean \| null | strict |
| party.estateIsGraduatedRateEstate | boolean \| null | strict |
| party.estateTaxationYearNumber | integer \| null | strict |
| party.section164_6ElectedAmount | number | strict |
| party.section164_6ElectionFiledOnTime | boolean \| null | strict |
| party.shareAcquiredAsConsequenceOfDeath | boolean \| null | strict |
| terminal.terminalCapitalGain | number | strict |

### Input cell notes

- `party.affiliatedAfterRedemption`: Whether the estate is affiliated with the corporation immediately after the redemption; engages the s.40(3.6) stop-loss on the unelected portion, and an unanswered fact computes in the harshest lane under a blocking trap.
- `party.estateTaxationYearNumber`: A 1-based TAXATION YEAR OF THE ESTATE. Estate taxation years begin at death and need not be calendar years — "the first three taxation years" in s.164(6) is not "three years after death".
- `party.section164_6ElectedAmount`: The loss amount actually elected under s.164(6)(c); required, with an explicit 0 for a reviewed nil.

### Strict profile accepted values (14 of 18 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| dividends.capitalDividends83_2Received | 0 to 600000000000 |
| dividends.designatedLifeInsuranceCapitalDividends104_20 | 0 to 600000000000 |
| dividends.designatedTaxableDividends104_19ToCorporatePartnershipTrustBeneficiary | 0 to 600000000000 |
| dividends.designatedTaxableDividends104_19ToIndividualBeneficiary | 0 to 600000000000 |
| dividends.qualifiedDividends104_19ToCorporatePartnershipTrustBeneficiary | 0 to 600000000000 |
| dividends.taxableDividendsReceived | 0 to 600000000000 |
| estate_shares.acb | 0 to 600000000000 |
| estate_shares.estateTotalCapitalGainsForYear | 0 to 600000000000 |
| estate_shares.estateTotalCapitalLossesForYear | 0 to 600000000000 |
| estate_shares.puc | 0 to 600000000000 |
| estate_shares.redemptionAmount | 0 to 600000000000 |
| party.estateTaxationYearNumber | 1 to 1000 |
| party.section164_6ElectedAmount | 0 to 600000000000 |
| terminal.terminalCapitalGain | 0 to 600000000000 |

## Output cells (53)

| Cell | Types |
| --- | --- |
| estateShares.acb | number |
| estateShares.puc | number |
| estateShares.redemptionAmount | number |
| dividends.capitalDividends83_2Received | number |
| dividends.taxableDividendsReceived | number |
| dividends.designatedTaxableDividends104_19ToIndividualBeneficiary | number |
| dividends.qualifiedDividends104_19ToCorporatePartnershipTrustBeneficiary | number |
| dividends.designatedTaxableDividends104_19ToCorporatePartnershipTrustBeneficiary | number |
| dividends.designatedLifeInsuranceCapitalDividends104_20 | number |
| affiliatedAfterRedemption | boolean |
| terminalCapitalGain | number |
| deemedDividend | number |
| proceedsForLoss | number |
| rawLoss | number |
| lossBeforeStopLoss | number |
| section112_3_2ReductionParagraphA | number |
| section112_3_2ReductionParagraphB | number |
| section112_3_2GreCarveOut | number |
| section112_3_2Reduction | number |
| lossAfterSection112_3_2 | number |
| section164_6YearExcess | null \| number |
| section164_6Available | boolean |
| section164_6MaxElectable | null \| number |
| section164_6ElectedAmount | null \| number |
| section40_3_6DeniedLoss | null \| number |
| lossRetainedByEstate | null \| number |
| stopLossRuleApplied | string |
| stopLossRulesApplied[] | string |
| deniedLoss | null \| number |
| allowableLoss | null \| number |
| s164_6Carryback | null \| number |
| lossPreservedToTerminal | boolean \| null |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

# replacement-property

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 7.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/replacement-property`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "former_property": {
      "proceeds": 500000,
      "proceedsWithoutReferenceTo44_6": 500000,
      "acb": 300000,
      "formerPropertyIsDepreciableOfPrescribedClass": true,
      "costAmountOrUcc": 250000,
      "recapture": 50000,
      "capitalGain": 190000,
      "outlaysAndExpenses": 10000,
      "isFormerBusinessProperty": true,
      "formerPropertyIsShareOfCapitalStock": false,
      "dispositionType": "voluntary",
      "reserveClaim44_1_e_iii": null,
      "proceedsPayableAfterYearEnd": null,
      "taxpayerResidentAndNotTaxExemptAtYearEndAndThroughoutFollowingYear": null,
      "purchaserCorporationHasNoProhibitedControlRelationship": null,
      "purchaserPartnershipHasNoMajorityInterestPartnerRelationship": null
    },
    "replacement": {
      "cost": 450000,
      "acquiredToReplaceFormerProperty": true,
      "sameOrSimilarUse": true,
      "sameOrSimilarBusiness": true,
      "replacementIsTaxableCanadianProperty": true,
      "replacementIsNotTreatyProtected": true,
      "replacementNotDisposedBeforeFormerProperty": true,
      "replacementIsPrescribedClassDepreciable": true,
      "prescribedClass": null,
      "election44_1Filed": true,
      "election13_4Filed": true
    },
    "dates": {
      "dispositionDateIso": "2025-01-15",
      "replacementAcquiredDateIso": "2026-06-30",
      "taxationYearEndsIso": [
        "2025-12-31",
        "2026-12-31",
        "2027-12-31"
      ],
      "fiscalYearEndIso": "2025-12-31"
    }
  }
}
```

## Input cells (31)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| dates.dispositionDateIso | string | strict |
| dates.fiscalYearEndIso | null \| string | strict |
| dates.replacementAcquiredDateIso | string | strict |
| dates.taxationYearEndsIso[] | string | strict |
| former_property.acb | number | strict |
| former_property.capitalGain | number | strict |
| former_property.costAmountOrUcc | null \| number | strict |
| former_property.dispositionType | string | strict |
| former_property.formerPropertyIsDepreciableOfPrescribedClass | boolean \| null | strict |
| former_property.formerPropertyIsShareOfCapitalStock | boolean \| null |  |
| former_property.isFormerBusinessProperty | boolean | strict |
| former_property.outlaysAndExpenses | number | strict |
| former_property.proceeds | number | strict |
| former_property.proceedsPayableAfterYearEnd | null \| number | strict |
| former_property.proceedsWithoutReferenceTo44_6 | null \| number | strict |
| former_property.purchaserCorporationHasNoProhibitedControlRelationship | boolean \| null |  |
| former_property.purchaserPartnershipHasNoMajorityInterestPartnerRelationship | boolean \| null |  |
| former_property.recapture | null \| number | strict |
| former_property.reserveClaim44_1_e_iii | null \| number | strict |
| former_property.taxpayerResidentAndNotTaxExemptAtYearEndAndThroughoutFollowingYear | boolean \| null |  |
| replacement.acquiredToReplaceFormerProperty | boolean \| null | strict |
| replacement.cost | number | strict |
| replacement.election13_4Filed | boolean \| null | strict |
| replacement.election44_1Filed | boolean \| null | strict |
| replacement.prescribedClass | null \| string | strict |
| replacement.replacementIsNotTreatyProtected | boolean \| null | strict |
| replacement.replacementIsPrescribedClassDepreciable | boolean \| null | strict |
| replacement.replacementIsTaxableCanadianProperty | boolean \| null | strict |
| replacement.replacementNotDisposedBeforeFormerProperty | boolean \| null | strict |
| replacement.sameOrSimilarBusiness | boolean \| null | strict |
| replacement.sameOrSimilarUse | boolean \| null | strict |

### Input cell notes

- `former_property.costAmountOrUcc`: The UCC of the prescribed class immediately before the former depreciable property was disposed of, required only when the former-property class fact is true. Null is the truthful inapplicable value for non-depreciable land or other capital property.
- `former_property.formerPropertyIsDepreciableOfPrescribedClass`: Whether the former property was depreciable property of a prescribed class. This selects the s.13(4) recapture leg and the s.44(4) reciprocal-election deeming; false leaves the independent s.44(1) capital-gain leg intact.
- `former_property.formerPropertyIsShareOfCapitalStock`: Whether the former property is a share of the capital stock of a corporation. ITA 44(1)'s opening words exclude every such share; required for the involuntary-disposition stream, where a share can be taken, destroyed, or expropriated.
- `former_property.isFormerBusinessProperty`: s.248(1) former business property status (real or immovable property used in the business, not a rental property); required for the voluntary-disposition stream of the s.44 deferral.
- `former_property.proceedsWithoutReferenceTo44_6`: Proceeds of the former property computed without a subsection 44(6) building-and-land allocation. Required for a depreciable former property; null is accepted only when the former property is non-depreciable.
- `former_property.purchaserCorporationHasNoProhibitedControlRelationship`: True only where a corporate purchaser had none of the three control relationships in ITA 44(7)(b) immediately after the sale.
- `former_property.purchaserPartnershipHasNoMajorityInterestPartnerRelationship`: True only where the taxpayer was not a majority-interest partner of a partnership purchaser immediately after the sale, so ITA 44(7)(c) does not prohibit the reserve.
- `former_property.recapture`: Optional stated s.13(1) recapture cross-check. The engine derives the recapture from element F and class UCC when the former property is depreciable; null supplies no cross-check and is inapplicable when that property is non-depreciable.
- `former_property.taxpayerResidentAndNotTaxExemptAtYearEndAndThroughoutFollowingYear`: True only where the taxpayer was resident in Canada and not exempt from Part I tax at year end and throughout the immediately following taxation year, so ITA 44(7)(a) does not prohibit the reserve.

### Strict profile accepted values (16 of 31 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| dates.dispositionDateIso | date (YYYY-MM-DD); 1 to 2000 characters |
| dates.fiscalYearEndIso | date (YYYY-MM-DD); at most 10 characters |
| dates.replacementAcquiredDateIso | date (YYYY-MM-DD); 1 to 2000 characters |
| dates.taxationYearEndsIso[] | date (YYYY-MM-DD); 1 to 2000 characters |
| former_property.acb | 0 to 600000000000 |
| former_property.capitalGain | 0 to 600000000000 |
| former_property.costAmountOrUcc | 0 to 600000000000 |
| former_property.dispositionType | one of "voluntary", "involuntary" |
| former_property.outlaysAndExpenses | 0 to 600000000000 |
| former_property.proceeds | 0 to 600000000000 |
| former_property.proceedsPayableAfterYearEnd | 0 to 600000000000 |
| former_property.proceedsWithoutReferenceTo44_6 | 0 to 600000000000 |
| former_property.recapture | 0 to 600000000000 |
| former_property.reserveClaim44_1_e_iii | 0 to 600000000000 |
| replacement.cost | 0 to 600000000000 |
| replacement.prescribedClass | 1 to 2000 characters |

## Output cells (49)

| Cell | Types |
| --- | --- |
| deferralAvailable | boolean |
| windowEndIso | null \| string |
| formerProperty.proceeds | number |
| formerProperty.proceedsWithoutReferenceTo44_6 | null \| number |
| formerProperty.acb | number |
| formerProperty.costAmountOrUcc | null \| number |
| formerProperty.recapture | null \| number |
| formerProperty.capitalGain | number |
| formerProperty.outlaysAndExpenses | number |
| formerProperty.isFormerBusinessProperty | boolean |
| formerProperty.dispositionType | string |
| replacementCost | number |
| clauseAGainOtherwiseDetermined | number |
| clauseBProceedsNotReinvested | number |
| proceedsNotReinvested | number |
| recognizedGain | number |
| deferredGain | number |
| election44_1Filed | boolean \| null |
| election13_4Filed | boolean \| null |
| reserveClaimed44_1_e_iii | number |
| recognizedRecapture | number |
| deferredRecapture | number |
| reducedReplacementAcb | number |
| replacementCapitalCost | number |
| deemedSameClassProceeds13_4_d | number |
| deemedSameClassDispositionDateIso | null \| string |
| replacementConditionsUnanswered[] | string |
| replacementConditionsFailed[] | string |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

### Output cell notes

- `formerProperty.costAmountOrUcc`: Authenticated class UCC input; null where the former property is non-depreciable or the required fact is unestablished.
- `formerProperty.recapture`: Optional stated recapture cross-check; null means no cross-check was supplied.

# section-212-1

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 7.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-212-1`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "subject_shares": {
      "acb": 100000,
      "puc": 80000,
      "fmv": 200000,
      "vDayValueBump": 0,
      "cgdClaimedGrossedUp": 0
    },
    "consideration": {
      "bootFmv": 100000,
      "newShareLegalStatedCapital": 100000,
      "newShareFmv": 100000,
      "outlaysAndExpenses": 0,
      "anyConsiderationReceivedAbsent212_1_1_2": true,
      "purchaserShareFmvIncrease": null,
      "purchaserShareClasses": [
        {
          "label": "Cedar Ridge Holdings Class A preferred",
          "pucIncrease": 40000
        },
        {
          "label": "Cedar Ridge Holdings Class B common",
          "pucIncrease": 60000
        }
      ]
    },
    "party": {
      "vendorIsNonResident": true,
      "dealsAtArmsLength": false,
      "purchaserIsCanadianResidentCorp": true,
      "purchaserIsDifferentFromSubjectCorporation": true,
      "treatyWithholdingRate": 0.15,
      "countryOfResidence": "United States",
      "dispositionDateIso": "2025-06-30",
      "treatyArticle": "Article X(2)(b)",
      "treatyEvidenceReference": "NR301-2025-0042",
      "residenceDeclarationConfirmed": true,
      "beneficialOwnerConfirmed": true,
      "limitationOnBenefitsSatisfied": true,
      "effectivelyConnectedToCanadianPermanentEstablishment": false,
      "payeeIsCompany": true,
      "payerVotingStockOwnedPct": 5,
      "treatyRateIsGenuinelyZero": null,
      "greResidentEstateException": false,
      "subjectCorporationResidentInCanada": true,
      "subjectConnectedWithPurchaser186_4": true,
      "nonArmsLengthOtherwiseThan251_5_b": true,
      "deemedNonArmsLength212_1_3_a": false,
      "deemedNonArmsLength212_1_3_c": false,
      "sharesHeldThroughConduit": false,
      "vendorIsNonResidentCorporation": true,
      "purchaserControlledTheNonResidentVendor": false,
      "nonResidentHoldsNonArmsLengthPurchaserShares": true,
      "dispositionIsGiftFor69_1_b_ii": false,
      "proceedsDeemedByRolloverElection": false
    }
  }
}
```

## Input cells (41)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| consideration.anyConsiderationReceivedAbsent212_1_1_2 | boolean \| null | strict |
| consideration.bootFmv | null \| number | strict |
| consideration.newShareFmv | null \| number | strict |
| consideration.newShareLegalStatedCapital | null \| number | strict |
| consideration.outlaysAndExpenses | null \| number | strict |
| consideration.purchaserShareClasses[].label | string | strict |
| consideration.purchaserShareClasses[].pucIncrease | number | strict |
| consideration.purchaserShareFmvIncrease | null \| number | strict |
| party.beneficialOwnerConfirmed | boolean | strict |
| party.countryOfResidence | string | strict |
| party.dealsAtArmsLength | boolean \| null | strict |
| party.deemedNonArmsLength212_1_3_a | boolean \| null | strict |
| party.deemedNonArmsLength212_1_3_c | boolean \| null | strict |
| party.dispositionDateIso | string | strict |
| party.dispositionIsGiftFor69_1_b_ii | boolean \| null | strict |
| party.effectivelyConnectedToCanadianPermanentEstablishment | boolean | strict |
| party.greResidentEstateException | boolean \| null | strict |
| party.limitationOnBenefitsSatisfied | boolean | strict |
| party.nonArmsLengthOtherwiseThan251_5_b | boolean \| null | strict |
| party.nonResidentHoldsNonArmsLengthPurchaserShares | boolean \| null | strict |
| party.payeeIsCompany | boolean | strict |
| party.payerVotingStockOwnedPct | number | strict |
| party.proceedsDeemedByRolloverElection | boolean \| null | strict |
| party.purchaserControlledTheNonResidentVendor | boolean \| null | strict |
| party.purchaserIsCanadianResidentCorp | boolean \| null | strict |
| party.purchaserIsDifferentFromSubjectCorporation | boolean \| null | strict |
| party.residenceDeclarationConfirmed | boolean | strict |
| party.sharesHeldThroughConduit | boolean \| null | strict |
| party.subjectConnectedWithPurchaser186_4 | boolean \| null | strict |
| party.subjectCorporationResidentInCanada | boolean \| null | strict |
| party.treatyArticle | string | strict |
| party.treatyEvidenceReference | string | strict |
| party.treatyRateIsGenuinelyZero | boolean \| null | strict |
| party.treatyWithholdingRate | null \| number | strict |
| party.vendorIsNonResident | boolean \| null | always |
| party.vendorIsNonResidentCorporation | boolean \| null | strict |
| subject_shares.acb | null \| number | strict |
| subject_shares.cgdClaimedGrossedUp | null \| number |  |
| subject_shares.fmv | null \| number | strict |
| subject_shares.puc | null \| number | strict |
| subject_shares.vDayValueBump | null \| number |  |

### Input cell notes

- `consideration.anyConsiderationReceivedAbsent212_1_1_2`: Whether any consideration would be received by the non-resident from the purchaser in the absence of subsection 212.1(1.2). A positive bootFmv or newShareFmv proves yes, but two reviewed-zero FMVs do not prove no: zero-value property or rights may still be consideration. Answer false only when none would be received.
- `consideration.newShareLegalStatedCapital`: Legacy wire name for element A of paragraph 212.1(1.1)(b): the increase, by virtue of the disposition and computed before s.212.1, in tax paid-up capital in respect of ALL issued shares of the purchaser. Enter the tax-PUC increase, not corporate-law legal stated capital.
- `consideration.outlaysAndExpenses`: Disposition outlays and expenses under subsection 40(1). Required when this target reports capitalGain; enter 0 only when reviewed nil. Null holds the gain while preserving independently established s.212.1 amounts and proceeds.
- `consideration.purchaserShareClasses[].label`: Optional display label. A blank is accepted and the engine emits Class 1, Class 2, and so on.
- `consideration.purchaserShareFmvIncrease`: Increase, because of the disposition, in the fair market value of the shares of the purchaser corporation. Subsection 212.1(1.2) uses it to deem non-share consideration when no consideration would otherwise be received; null means the figure was not established, and the engine refuses to report a nil dividend in its place.
- `party.dealsAtArmsLength`: Whether the vendor and purchaser ordinarily deal at arm's length. Separate fields carry the paragraph 212.1(3)(a) and (c) deemings; s.212.1 applies only to a final non-arm's-length disposition.
- `party.deemedNonArmsLength212_1_3_a`: Paragraph 212.1(3)(a): the non-resident belongs to the fewer-than-six-person group controlling the subject immediately before and the purchaser immediately after, and every member of the after-disposition group belonged to the before-disposition group.
- `party.deemedNonArmsLength212_1_3_c`: Paragraph 212.1(3)(c): the vendor and purchaser are a trust and its beneficiary, or the purchaser is related to a beneficiary, so they are deemed not to deal at arm's length for this section.
- `party.dispositionIsGiftFor69_1_b_ii`: Paragraph 69(1)(b)(ii): whether the subject shares are disposed of to any person by way of gift. True independently deems FMV proceeds even where the parties ordinarily deal at arm's length; null blocks only the capital-gain outputs when the answer can change those proceeds.
- `party.greResidentEstateException`: Legacy wire name for the complete paragraph 212.1(6)(b) conclusion: this particular share disposal is by a non-resident trust or by a qualifying Canadian-resident graduated rate estate and is therefore excluded from the subsection (6) look-through, and no other subsection (5)/(6) tier or deemed transaction remains to be computed. True authenticates that complete full-chain conclusion. Null is permitted only when no trust or partnership is in the disposition chain.
- `party.nonArmsLengthOtherwiseThan251_5_b`: Subsection 212.1(1): the non-resident does not deal at arm's length with the purchaser corporation otherwise than because of a right referred to in paragraph 251(5)(b).
- `party.nonResidentHoldsNonArmsLengthPurchaserShares`: Stated POSITIVELY: a non-resident person holds, directly or indirectly, shares of the purchaser corporation and does not deal at arm's length with it at the time of the disposition or as part of a transaction or event or series that includes the disposition. Paragraph 212.1(4)(b) is a double negative, so the carve-out is available only when this is false.
- `party.proceedsDeemedByRolloverElection`: Legacy wire name for whether ANY other Act provision expressly determines proceeds. Paragraph 69(1)(b) opens with "except as expressly otherwise provided in this Act"; this includes an election and the automatic s.85.1 rollover. True or null suppresses the gain because this engine does not hold those proceeds.
- `party.purchaserControlledTheNonResidentVendor`: Whether immediately before the disposition the purchaser controlled the non-resident PERSON. This chooses the subject/purchaser deemed-payer limb in paragraph 212.1(1.1)(a) for any vendor type; for a corporate vendor it also supplies paragraph 212.1(4)(a), which tests control of the vendor rather than the subject corporation.
- `party.purchaserIsCanadianResidentCorp`: s.212.1 requires the purchaser to be a corporation resident in Canada.
- `party.purchaserIsDifferentFromSubjectCorporation`: Subsection 212.1(1) requires the subject shares to be disposed of to another corporation: the purchaser is distinct from the subject corporation.
- `party.sharesHeldThroughConduit`: Whether a trust or partnership is in the chain. Subsections 212.1(5) and 212.1(6) replace a conduit disposition with per-holder class-by-class deemed dispositions, which this engine does not compute. A true greResidentEstateException continues only when it authenticates the complete full-chain conclusion that paragraph (6)(b) excludes this disposal and no other tier remains; null otherwise fails closed.
- `party.subjectConnectedWithPurchaser186_4`: Subsection 212.1(1): the final conclusion that immediately after the disposition the subject corporation is connected with the purchaser within the meaning subsection 186(4) would assign, after applying paragraph 212.1(6)(d) whenever a conduit owns subject shares and reading section 186 without its subsection (6).
- `party.subjectCorporationResidentInCanada`: Subsection 212.1(1): the subject corporation is a corporation resident in Canada.
- `party.treatyRateIsGenuinelyZero`: Confirms that a supplied treaty rate of 0 is a real 0% treaty article rather than a blank field. Without it a zero rate holds Part XIII withholding at the statutory 25% under subsection 212(2).
- `party.vendorIsNonResident`: s.212.1 applies only to a non-resident vendor disposing of the subject shares; false switches the section off.
- `party.vendorIsNonResidentCorporation`: Subsection 212.1(4) is available only on a disposition by a non-resident CORPORATION; a non-resident individual vendor never obtains the carve-out.
- `subject_shares.cgdClaimedGrossedUp`: Optional s.84.1 hard-ACB reference; null or omission does not block s.212.1.
- `subject_shares.vDayValueBump`: Optional s.84.1 hard-ACB reference; null or omission does not block s.212.1.

### Strict profile accepted values (18 of 41 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| consideration.bootFmv | 0 to 600000000000 |
| consideration.newShareFmv | 0 to 600000000000 |
| consideration.newShareLegalStatedCapital | 0 to 600000000000 |
| consideration.outlaysAndExpenses | 0 to 600000000000 |
| consideration.purchaserShareClasses[].label | at most 2000 characters |
| consideration.purchaserShareClasses[].pucIncrease | 0 to 600000000000 |
| consideration.purchaserShareFmvIncrease | 0 to 600000000000 |
| party.countryOfResidence | 1 to 2000 characters |
| party.dispositionDateIso | date (YYYY-MM-DD); 1 to 2000 characters |
| party.payerVotingStockOwnedPct | 0 to 100 |
| party.treatyArticle | one of "Article X(2)(a)", "Article X(2)(b)" |
| party.treatyEvidenceReference | 1 to 2000 characters |
| party.treatyWithholdingRate | 0 to 0.25 |
| subject_shares.acb | 0 to 600000000000 |
| subject_shares.cgdClaimedGrossedUp | 0 to 600000000000 |
| subject_shares.fmv | 0 to 600000000000 |
| subject_shares.puc | 0 to 600000000000 |
| subject_shares.vDayValueBump | 0 to 600000000000 |

## Output cells (45)

| Cell | Types |
| --- | --- |
| applies | boolean \| null |
| subjectShares.acb | null \| number |
| subjectShares.hardAcb | null \| number |
| subjectShares.puc | number |
| subjectShares.fmv | null \| number |
| subjectShares.vDayValueBump | null \| number |
| subjectShares.cgdClaimedGrossedUp | null \| number |
| greaterOfPucHardAcb | null \| number |
| hardAcb | null \| number |
| deemedDividend | null \| number |
| withholdingRate | null \| number |
| withholdingTax | null \| number |
| pucReduction | null \| number |
| pucNewShares | null \| number |
| boot | null \| number |
| newShareLegalStatedCapital | null \| number |
| proceedsForCapitalGain | null \| number |
| outlaysAndExpenses | null \| number |
| capitalGain | null \| number |
| provisional | boolean |
| pucByClass[].label | string |
| pucByClass[].pucIncrease | number |
| pucByClass[].pucReduction | number |
| pucByClass[].pucFinal | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

### Output cell notes

- `pucNewShares`: Legacy key for the net pre-s.212.1 tax-PUC increase remaining after the paragraph 212.1(1.1)(b) deduction; it is not total closing PUC of the purchaser shares.
- `newShareLegalStatedCapital`: Legacy output key for element A of paragraph 212.1(1.1)(b): the pre-s.212.1 tax-PUC increase in respect of all purchaser shares, not corporate-law legal stated capital.
- `outlaysAndExpenses`: Authenticated disposition outlays and expenses subtracted under subsection 40(1).
- `capitalGain`: Gain or loss after ACB and subsection 40(1) disposition outlays, before any paragraph 40(1)(a)(iii) reserve.
- `pucByClass[].pucFinal`: Legacy key for the class's net transaction PUC increase after its allocated deduction; opening class PUC is not an input, so this is not total closing class PUC.

# section-22

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 5.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-22`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "receivables": {
      "faceValue": 100000,
      "electedAmount": 80000,
      "vendorClaimedS20_1_pBefore": 0,
      "fairMarketValue": null,
      "vendorPriorS20_1_pDeductions": null
    },
    "party": {
      "jointElectionFiled": true,
      "soldAllOrSubstantiallyAllBusinessProperty": true,
      "purchaserProposesToContinueBusiness": true,
      "nonArmsLength": false
    }
  }
}
```

## Input cells (9)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| party.jointElectionFiled | boolean | strict |
| party.nonArmsLength | boolean | strict |
| party.purchaserProposesToContinueBusiness | boolean | strict |
| party.soldAllOrSubstantiallyAllBusinessProperty | boolean | strict |
| receivables.electedAmount | number | strict |
| receivables.faceValue | number | strict |
| receivables.fairMarketValue | null \| number | strict |
| receivables.vendorClaimedS20_1_pBefore | number | strict |
| receivables.vendorPriorS20_1_pDeductions | null \| number | strict |

### Input cell notes

- `party.jointElectionFiled`: s.22(1) condition: the vendor and purchaser executed a joint election in prescribed form (Form T2022); unanswered fails closed.
- `party.nonArmsLength`: The sale is non-arm's length; the fair market value of the debts then becomes required so the s.69(1) deeming rules can run.
- `party.purchaserProposesToContinueBusiness`: s.22(1) condition: the sale was to a purchaser who proposes to continue the business; unanswered fails closed.
- `party.soldAllOrSubstantiallyAllBusinessProperty`: s.22(1) condition: the vendor sold all or substantially all the property used in carrying on the business, including the outstanding debts; unanswered fails closed.

### Strict profile accepted values (5 of 9 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| receivables.electedAmount | 0 to 600000000000 |
| receivables.faceValue | 0 to 600000000000 |
| receivables.fairMarketValue | 0 to 600000000000 |
| receivables.vendorClaimedS20_1_pBefore | 0 to 600000000000 |
| receivables.vendorPriorS20_1_pDeductions | 0 to 600000000000 |

## Output cells (38)

| Cell | Types |
| --- | --- |
| available | boolean |
| section22GateStatus | string |
| faceValue | number |
| electedAmount | number |
| fairMarketValue | null \| number |
| discount | number |
| vendorConsideration | number |
| purchaserConsideration | number |
| purchaserDeemedCostOfDebts69_1_a | null \| number |
| section69_1Applied | boolean |
| vendorBusinessLoss | null \| number |
| purchaserInclusion | null \| number |
| purchaserSuccessorAttributes.debtsDeemedIncludedInPurchaserIncome | boolean |
| purchaserSuccessorAttributes.purchaserS20_1_lReserveAvailable | boolean |
| purchaserSuccessorAttributes.purchaserS20_1_pDeductionDenied | boolean |
| purchaserSuccessorAttributes.vendorPriorS20_1_pDeductionsDeemedTakenByPurchaser | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

### Output cell notes

- `purchaserDeemedCostOfDebts69_1_a`: Paragraph 69(1)(a): where the non-arm's-length purchaser acquired the debts at an amount in excess of their fair market value, the purchaser is deemed to have acquired them at that fair market value. This is the purchaser's COST of the debts, not the paragraph 22(1)(a) difference. null where paragraph 69(1)(a) does not apply.

# section-51

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 6.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-51`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "converted_property": {
      "propertyKind": "share",
      "isCapitalProperty": true,
      "termsConferExchangeRight": false,
      "acb": 80000,
      "puc": 50000,
      "fmv": 100000,
      "liabilitiesLessAssetsDecreaseOnConversion": 0,
      "priorS53_2_g1Deductions": false,
      "convertedPropertyIsTaxableCanadianProperty": false
    },
    "new_shares": [
      {
        "label": "Cedar Ridge Holdings preferred",
        "fmv": 60000,
        "pucIncreaseBeforeSection51_3": 60000
      },
      {
        "label": "Cedar Ridge Holdings common",
        "fmv": 40000,
        "pucIncreaseBeforeSection51_3": 40000
      }
    ],
    "consideration": {
      "bootFmv": 0,
      "outlaysAndExpenses": 0
    },
    "party": {
      "benefitDesiredForRelatedPerson": false,
      "newSharesAcquiredFromCorporation": true,
      "convertedPropertyIssuerIsNewShareCorporation": true,
      "giftToRelatedPerson": 0,
      "noOtherCapitalLossLimitationApplies": true,
      "s85Applies": false,
      "s86Applies": false
    }
  }
}
```

## Input cells (22)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| consideration.bootFmv | number | strict |
| consideration.outlaysAndExpenses | number | strict |
| converted_property | object | strict |
| converted_property.acb | number | strict |
| converted_property.convertedPropertyIsTaxableCanadianProperty | boolean \| null | strict |
| converted_property.fmv | number | strict |
| converted_property.isCapitalProperty | boolean | strict |
| converted_property.liabilitiesLessAssetsDecreaseOnConversion | number | strict |
| converted_property.priorS53_2_g1Deductions | boolean | strict |
| converted_property.propertyKind | string | strict |
| converted_property.puc | number | strict |
| converted_property.termsConferExchangeRight | boolean | strict |
| new_shares[].fmv | number | strict |
| new_shares[].label | string | strict |
| new_shares[].pucIncreaseBeforeSection51_3 | number | strict |
| party.benefitDesiredForRelatedPerson | boolean | strict |
| party.convertedPropertyIssuerIsNewShareCorporation | boolean | strict |
| party.giftToRelatedPerson | number | strict |
| party.newSharesAcquiredFromCorporation | boolean | strict |
| party.noOtherCapitalLossLimitationApplies | boolean | strict |
| party.s85Applies | boolean | strict |
| party.s86Applies | boolean | strict |

### Input cell notes

- `consideration.outlaysAndExpenses`: Outlays and expenses made or incurred for the purpose of making the disposition under subparagraphs 40(1)(a)(i) and 40(1)(b)(i). They enter the paragraph 51(2)(e)/(f) counterfactual gain/loss calculation. A positive amount is unsupported on the ordinary paragraph 51(1)(c) no-disposition branch and fails closed rather than being ignored.
- `converted_property`: Exact statutory kind and amounts for the converted property. ITA 51(3) uses old-share PUC only for paragraph 51(1)(a) property; the debt variant therefore requires PUC of zero.
- `converted_property.convertedPropertyIsTaxableCanadianProperty`: Whether the converted share or debt is taxable Canadian property of the taxpayer, the exact paragraph 51(1)(f) condition. null means the fact was not supplied and the new shares' deemed status is reported as null, never as false.
- `converted_property.isCapitalProperty`: Whether the old share is capital property of the taxpayer, as paragraph 51(1)(a) requires.
- `converted_property.liabilitiesLessAssetsDecreaseOnConversion`: Inapplicable to an old-share conversion and fixed to nil: the corporation issues shares in exchange for its own shares and takes in no property, so neither limb of paragraph 84(1)(b) moves.
- `converted_property.priorS53_2_g1Deductions`: This exact cost/PUC profile accepts only converted property with no paragraph 53(2)(g.1) history because it does not emit the per-share history propagated by paragraphs 51(1)(d.1) and (d.2).
- `converted_property.termsConferExchangeRight`: Debt-specific fact fixed to false for an old-share conversion so the exact profile has one canonical encoding of this inapplicable fact.
- `new_shares[].pucIncreaseBeforeSection51_3`: Increase in PUC for this class resulting from the exchange, computed without subsection 51(3): the class-specific C amount in paragraph 51(3)(a). This is not generic accounting or corporate-law stated capital.
- `party.benefitDesiredForRelatedPerson`: Whether it is reasonable to regard a portion of any FMV excess as a benefit the taxpayer desired to have conferred on a person related to the taxpayer, the exact paragraph 51(2)(c) fact.
- `party.convertedPropertyIssuerIsNewShareCorporation`: Whether the old share or debt is of the same corporation that issued the new shares, as paragraph 51(1)(a) or (b) requires.
- `party.giftToRelatedPerson`: Exact paragraph 51(2)(c) gift portion. It must be positive and no greater than the FMV excess when benefitDesiredForRelatedPerson is true, and must be zero when that fact is false; the engine never assumes the whole excess.
- `party.newSharesAcquiredFromCorporation`: Whether the taxpayer acquired the new shares from the corporation, as the opening words of subsection 51(1) require.
- `party.noOtherCapitalLossLimitationApplies`: Required exact-profile scope fact: no provision other than paragraph 51(2)(e) changes the capital-loss characterization or limits, denies, or suspends the loss that would otherwise arise. The engine computes the ordinary subsection 40(1) amount and does not independently determine other s.39/s.40 or share-loss rules; unsupported false is rejected at the strict boundary rather than reported as statutory Section 51 ineligibility.
- `party.s85Applies`: Subsection 85(1) or 85(2) applies to this exchange; s.51(4) then ousts s.51.
- `party.s86Applies`: Section 86 applies to this exchange; s.51(4) then ousts s.51.

### Strict profile accepted values (14 of 22 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| consideration.bootFmv | 0 to 600000000000 |
| consideration.outlaysAndExpenses | 0 to 600000000000 |
| converted_property.acb | 0 to 600000000000 |
| converted_property.fmv | 0 to 600000000000 |
| converted_property.liabilitiesLessAssetsDecreaseOnConversion | exactly 0 |
| converted_property.priorS53_2_g1Deductions | exactly false (pinned) |
| converted_property.propertyKind | one of "share", "convertible_debt" (pinned) |
| converted_property.puc | exactly 0 |
| converted_property.termsConferExchangeRight | exactly false |
| new_shares[].fmv | 0 to 600000000000 |
| new_shares[].label | 1 to 2000 characters |
| new_shares[].pucIncreaseBeforeSection51_3 | 0 to 600000000000 |
| party.giftToRelatedPerson | 0 to 600000000000 |
| party.noOtherCapitalLossLimitationApplies | exactly true (pinned) |

## Output cells (44)

| Cell | Types |
| --- | --- |
| applies | boolean |
| newShares[].label | string |
| newShares[].fmv | number |
| newShares[].pucIncreaseBeforeSection51_3 | number |
| newShares[].costAcb | number |
| newShares[].pucGrind | number |
| newShares[].pucIncreaseAfterSection51_3 | number |
| convertedProperty.propertyKind | string |
| convertedProperty.acb | number |
| convertedProperty.puc | number |
| convertedProperty.fmv | number |
| convertedProperty.proceedsOfDisposition | number |
| convertedProperty.gainTriggered | number |
| convertedProperty.lossDeemedNil | boolean |
| s51_2Applies | boolean |
| giftToRelatedPerson | number |
| totalNewShareCost | null \| number |
| totalPucGrind | null \| number |
| totalProceeds | number |
| rolloverDeferred | boolean |
| deemedTransferForSections74_4And74_5 | boolean |
| newSharesDeemedTaxableCanadianProperty | boolean \| null |
| deemedDividendSubsection84_1 | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

### Output cell notes

- `newShares[].pucIncreaseBeforeSection51_3`: Class-specific PUC increase resulting from the exchange computed without subsection 51(3), the paragraph 51(3)(a) C amount.
- `newShares[].pucIncreaseAfterSection51_3`: Net PUC increase from the exchange after the paragraph 51(3)(a) deduction. This is not the class's total PUC, and no later paragraph 51(3)(b) restoration event is projected.
- `totalPucGrind`: Aggregate paragraph 51(3)(a) deduction at the exchange, applicable only to the subsection 51(1) old-share branch. null on the denied branch, where no s.51 exchange is characterized.
- `deemedTransferForSections74_4And74_5`: Paragraph 51(1)(e) status. It is a deemed transfer for sections 74.4 and 74.5 only; paragraph 51(1)(c) still deems the exchange not to be a disposition.
- `newSharesDeemedTaxableCanadianProperty`: Paragraph 51(1)(f) deeming: where the convertible property was taxable Canadian property, each acquired share is deemed to be taxable Canadian property at any time within 60 months after the exchange. null means the input condition was not supplied.

# section-84-1

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 6.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-84-1`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "subject_shares": {
      "acb": 100,
      "puc": 100,
      "fmv": 1000,
      "vDayValueBump": 0,
      "cgdClaimedGrossedUp": 0
    },
    "consideration": {
      "bootFmv": 100,
      "newShareLegalStatedCapital": 900,
      "newShareFmv": 900,
      "section85ElectedAmount": 100,
      "purchaserShareClasses": null
    },
    "party": {
      "transferorIsIndividualResident": true,
      "dealsAtArmsLength": false,
      "subjectConnectedToPurchaser": true,
      "concurrentSection85Election": true,
      "subjectSharesAreCapitalProperty": true,
      "subjectCorporationResidentInCanada": true,
      "dispositionDate": null,
      "intergenerationalTransfer": "none",
      "intergenerationalTransferConditions": null
    }
  }
}
```

## Input cells (36)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| consideration.bootFmv | number | strict |
| consideration.newShareFmv | number | strict |
| consideration.newShareLegalStatedCapital | number | strict |
| consideration.purchaserShareClasses[].label | string | strict |
| consideration.purchaserShareClasses[].pucIncrease | number | strict |
| consideration.section85ElectedAmount | null \| number | strict |
| party.concurrentSection85Election | boolean \| null | strict |
| party.dealsAtArmsLength | boolean | strict |
| party.dispositionDate | null \| string | strict |
| party.intergenerationalTransfer | string | strict |
| party.intergenerationalTransferConditions.childControlAndEngagementFor36Months | boolean \| null | strict |
| party.intergenerationalTransferConditions.childControlAndEngagementForGreaterOf60MonthsAndFinalSale | boolean \| null | strict |
| party.intergenerationalTransferConditions.jointElectionFiledByFilingDueDate | boolean \| null | strict |
| party.intergenerationalTransferConditions.managementTransferredWithin36Months | boolean \| null | strict |
| party.intergenerationalTransferConditions.managementTransferredWithin60Months | boolean \| null | strict |
| party.intergenerationalTransferConditions.noPriorIntergenerationalExceptionSought | boolean \| null | strict |
| party.intergenerationalTransferConditions.purchaserControlledByAdultChildren | boolean \| null | strict |
| party.intergenerationalTransferConditions.residualInterestBelowThresholdWithin10Years | boolean \| null | strict |
| party.intergenerationalTransferConditions.subjectSharesAreQsbcOrFamilyFarmOrFishing | boolean \| null | strict |
| party.intergenerationalTransferConditions.taxpayerDoesNotControlAfterDisposition | boolean \| null | strict |
| party.intergenerationalTransferConditions.taxpayerEquityWoundDownWithin36Months | boolean \| null | strict |
| party.intergenerationalTransferConditions.taxpayerIsIndividualNotTrust | boolean \| null | strict |
| party.intergenerationalTransferConditions.taxpayerOwnsUnder50PercentAfterDisposition | boolean \| null | strict |
| party.subjectConnectedToPurchaser | boolean | strict |
| party.subjectCorporationResidentInCanada | boolean \| null | strict |
| party.subjectSharesAreCapitalProperty | boolean \| null | strict |
| party.transferorIsIndividualResident | boolean | always |
| subject_shares.acb | number | strict |
| subject_shares.cgdClaimedGrossedUp | number | strict |
| subject_shares.fmv | number | strict |
| subject_shares.lots[].acb | number | strict |
| subject_shares.lots[].cgdClaimedGrossedUp | number | strict |
| subject_shares.lots[].label | string | strict |
| subject_shares.lots[].vDayValueBump | number | strict |
| subject_shares.puc | number | strict |
| subject_shares.vDayValueBump | number | strict |

### Input cell notes

- `party.dealsAtArmsLength`: Whether the transferor and purchaser corporation deal at arm's length; s.84.1 applies only to non-arm's-length dispositions, and only a real boolean counts as an answer.
- `party.dispositionDate`: Date the subject shares were disposed of. Required when an immediate or gradual intergenerational transfer is claimed: S.C. 2024, c.15, s.17(3) makes the current s.84.1(2)(e), (2.31) and (2.32) rules applicable only from 2024-01-01.
- `party.subjectConnectedToPurchaser`: Whether the subject corporation is connected (s.186(4)) with the purchaser corporation immediately after the disposition, as s.84.1(1) requires.
- `party.transferorIsIndividualResident`: s.84.1(1) scope fact: the transferor is a taxpayer resident in Canada other than a corporation; the omitted posture keeps the harsher in-scope branch.

### Strict profile accepted values (17 of 36 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| consideration.bootFmv | 0 to 600000000000 |
| consideration.newShareFmv | 0 to 600000000000 |
| consideration.newShareLegalStatedCapital | 0 to 600000000000 |
| consideration.purchaserShareClasses[].label | 1 to 2000 characters |
| consideration.purchaserShareClasses[].pucIncrease | 0 to 600000000000 |
| consideration.section85ElectedAmount | 0 to 600000000000 |
| party.dispositionDate | date (YYYY-MM-DD); at most 10 characters |
| party.intergenerationalTransfer | one of "none", "immediate", "gradual" |
| subject_shares.acb | 0 to 600000000000 |
| subject_shares.cgdClaimedGrossedUp | 0 to 600000000000 |
| subject_shares.fmv | 0 to 600000000000 |
| subject_shares.lots[].acb | 0 to 600000000000 |
| subject_shares.lots[].cgdClaimedGrossedUp | 0 to 600000000000 |
| subject_shares.lots[].label | 1 to 2000 characters |
| subject_shares.lots[].vDayValueBump | 0 to 600000000000 |
| subject_shares.puc | 0 to 600000000000 |
| subject_shares.vDayValueBump | 0 to 600000000000 |

## Output cells (47)

| Cell | Types |
| --- | --- |
| applies | boolean |
| subjectShares.acb | number |
| subjectShares.hardAcb | number |
| subjectShares.puc | number |
| subjectShares.fmv | number |
| subjectShares.vDayValueBump | number |
| subjectShares.cgdClaimedGrossedUp | number |
| greaterOfPucHardAcb | number |
| deemedDividend | number |
| pucReduction | number |
| pucNewShares | number |
| boot | number |
| newShareLegalStatedCapital | number |
| proceedsForCapitalGain | number |
| capitalGain | number |
| intergenerationalTransfer | string |
| hardAcbByLot[].label | string |
| hardAcbByLot[].acb | number |
| hardAcbByLot[].vDayValueBump | number |
| hardAcbByLot[].cgdClaimedGrossedUp | number |
| hardAcbByLot[].hardAcb | number |
| pucByClass[].label | string |
| pucByClass[].pucIncrease | number |
| pucByClass[].pucReduction | number |
| pucByClass[].pucFinal | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

# section-85

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 4.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-85`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "properties": [
      {
        "rowId": "t2057-1",
        "description": "Cedar Ridge marketable securities",
        "category": "capital_non_depreciable",
        "fmv": 500000,
        "acb": 200000,
        "costAmount": null,
        "uccOfClass": null,
        "agreedAmount": 200000,
        "prescribedClass": null,
        "dispositionOrder": null,
        "classUndisposedCapitalCost": null,
        "isPassengerVehicleNAL": false,
        "isZevPassengerNAL": false,
        "wasDIEP": null,
        "section_84_1Applies": false,
        "section_212_1Applies": false,
        "isTaxableCanadianProperty": false,
        "s85_1_11PurposeToIncreaseS126Deduction": null,
        "c2AmountA": null,
        "c2ValueB": null,
        "c2ValueC": null,
        "c2DesignatedD": null,
        "consideration": {
          "bootFmv": 50000,
          "preferredShareFmv": 0,
          "preferredStatedCapital": 0,
          "commonShareFmv": 450000,
          "commonStatedCapital": 100,
          "giftToRelatedPerson": null
        }
      },
      {
        "rowId": "t2057-2",
        "description": "Cedar Ridge manufacturing equipment",
        "category": "capital_depreciable",
        "fmv": 300000,
        "acb": null,
        "costAmount": 250000,
        "uccOfClass": 150000,
        "agreedAmount": 150000,
        "prescribedClass": "8",
        "dispositionOrder": null,
        "classUndisposedCapitalCost": null,
        "isPassengerVehicleNAL": false,
        "isZevPassengerNAL": false,
        "wasDIEP": null,
        "section_84_1Applies": false,
        "section_212_1Applies": false,
        "isTaxableCanadianProperty": false,
        "s85_1_11PurposeToIncreaseS126Deduction": null,
        "c2AmountA": null,
        "c2ValueB": null,
        "c2ValueC": null,
        "c2DesignatedD": null,
        "consideration": {
          "bootFmv": 0,
          "preferredShareFmv": 0,
          "preferredStatedCapital": 0,
          "commonShareFmv": 300000,
          "commonStatedCapital": 100,
          "giftToRelatedPerson": null
        }
      }
    ],
    "consideration": {
      "bootFmv": null,
      "preferredShareFmv": null,
      "preferredStatedCapital": null,
      "commonShareFmv": null,
      "commonStatedCapital": null,
      "subjectSharesPuc": null,
      "giftToRelatedPerson": null
    },
    "party": {
      "isArmsLength": false,
      "transferorIsCanadianIndividual": false,
      "transferorIsNonResident": false,
      "isRelatedTransferee": true,
      "transfereeHasLossPools": false,
      "electionDueDate": "2026-06-30",
      "electionFilingDate": "2026-06-30",
      "dispositionDate": "2025-12-31",
      "s85_1_2ControlledAfterDisposition": null,
      "s85_1_2AllOrSubstantiallyAllTransferred": null,
      "s85_1_2NoSubsequentControlChangeSeries": null,
      "s85_7PenaltyEstimatePaid": null,
      "s85_7_1MinisterPermissionGranted": null,
      "isAmendedElection": null,
      "subjectSharesPuc": null,
      "s84_1VDayValueBump": null,
      "s84_1CapitalGainsExemptionClaimed": null,
      "s69_11PartOfSeries": null,
      "s69_11SubsequentDispositionWithin3Years": null,
      "s69_11AcquirerNotAffiliatedBeforeSeries": null,
      "s69_11MainPurposeIsBenefit": null,
      "s10_1_1MarkToMarketElectionInEffect": null,
      "benefitDesiredForRelatedPerson": null
    }
  }
}
```

## Input cells (60)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| consideration.bootFmv | null \| number | strict |
| consideration.commonShareFmv | null \| number | strict |
| consideration.commonStatedCapital | null \| number | strict |
| consideration.giftToRelatedPerson | null \| number | strict |
| consideration.preferredShareFmv | null \| number | strict |
| consideration.preferredStatedCapital | null \| number | strict |
| consideration.subjectSharesPuc | null \| number | strict |
| party | any | strict |
| party.benefitDesiredForRelatedPerson | boolean \| null | strict |
| party.dispositionDate | null \| string | strict |
| party.electionDueDate | null \| string | strict |
| party.electionFilingDate | null \| string | strict |
| party.isAmendedElection | boolean \| null | strict |
| party.isArmsLength | boolean | strict |
| party.isRelatedTransferee | boolean \| null | strict |
| party.s10_1_1MarkToMarketElectionInEffect | boolean \| null | strict |
| party.s69_11AcquirerNotAffiliatedBeforeSeries | boolean \| null | strict |
| party.s69_11MainPurposeIsBenefit | boolean \| null | strict |
| party.s69_11PartOfSeries | boolean \| null | strict |
| party.s69_11SubsequentDispositionWithin3Years | boolean \| null | strict |
| party.s84_1CapitalGainsExemptionClaimed | null \| number | strict |
| party.s84_1VDayValueBump | null \| number | strict |
| party.s85_1_2AllOrSubstantiallyAllTransferred | boolean \| null | strict |
| party.s85_1_2ControlledAfterDisposition | boolean \| null | strict |
| party.s85_1_2NoSubsequentControlChangeSeries | boolean \| null | strict |
| party.s85_7ElectionMadeInPrescribedForm | boolean \| null |  |
| party.s85_7PenaltyEstimatePaid | boolean \| null | strict |
| party.s85_7_1MinisterPermissionGranted | boolean \| null | strict |
| party.subjectSharesPuc | null \| number | strict |
| party.transfereeHasLossPools | boolean \| null | strict |
| party.transferorIsCanadianIndividual | boolean \| null | strict |
| party.transferorIsNonResident | boolean \| null | strict |
| properties[].acb | null \| number | strict |
| properties[].agreedAmount | number | strict |
| properties[].c2AmountA | null \| number | strict |
| properties[].c2DesignatedD | null \| number | strict |
| properties[].c2ValueB | null \| number | strict |
| properties[].c2ValueC | null \| number | strict |
| properties[].category | string | strict |
| properties[].classUndisposedCapitalCost | null \| number | strict |
| properties[].consideration.bootFmv | null \| number | strict |
| properties[].consideration.commonShareFmv | null \| number | strict |
| properties[].consideration.commonStatedCapital | null \| number | strict |
| properties[].consideration.giftToRelatedPerson | null \| number | strict |
| properties[].consideration.preferredShareFmv | null \| number | strict |
| properties[].consideration.preferredStatedCapital | null \| number | strict |
| properties[].costAmount | null \| number | strict |
| properties[].description | string | strict |
| properties[].dispositionOrder | integer \| null | strict |
| properties[].fmv | number | strict |
| properties[].isPassengerVehicleNAL | boolean \| null | strict |
| properties[].isTaxableCanadianProperty | boolean \| null | strict |
| properties[].isZevPassengerNAL | boolean \| null | strict |
| properties[].prescribedClass | null \| string | strict |
| properties[].rowId | string | strict |
| properties[].s85_1_11PurposeToIncreaseS126Deduction | boolean \| null | strict |
| properties[].section_212_1Applies | boolean \| null | strict |
| properties[].section_84_1Applies | boolean \| null | strict |
| properties[].uccOfClass | null \| number | strict |
| properties[].wasDIEP | boolean \| null | strict |

### Input cell notes

- `party.isArmsLength`: Whether the taxpayer and the transferee corporation deal at arm's length. It gates the s.85(1)(e.4)/(e.5) vehicle deemings, the s.85(1.11) carve-out and the s.69(1)(b) ordinary-rules proceeds; the strict profile requires an explicit answer.
- `party.isRelatedTransferee`: Whether the taxpayer and transferee corporation are related persons. Under s.251(1)(a), Yes cannot be combined with an arm's-length answer of Yes. This is not the s.85(1)(e.2) beneficiary-relationship test.
- `properties[].category`: s.85(1.1) eligible-property category. It selects the floor rule — s.85(1)(c.1) for cost-amount categories, s.85(1)(e) for depreciable property, the s.85(1)(c.2) deeming for cash-method farm inventory — and the character of any amount triggered.

### Strict profile accepted values (34 of 60 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| consideration.bootFmv | 0 to 600000000000 |
| consideration.commonShareFmv | 0 to 600000000000 |
| consideration.commonStatedCapital | 0 to 600000000000 |
| consideration.giftToRelatedPerson | 0 to 600000000000 |
| consideration.preferredShareFmv | 0 to 600000000000 |
| consideration.preferredStatedCapital | 0 to 600000000000 |
| consideration.subjectSharesPuc | 0 to 600000000000 |
| party.dispositionDate | date (YYYY-MM-DD); at most 10 characters |
| party.electionDueDate | date (YYYY-MM-DD); at most 10 characters |
| party.electionFilingDate | date (YYYY-MM-DD); at most 10 characters |
| party.s84_1CapitalGainsExemptionClaimed | 0 to 600000000000 |
| party.s84_1VDayValueBump | 0 to 600000000000 |
| party.subjectSharesPuc | 0 to 600000000000 |
| properties[].acb | 0 to 600000000000 |
| properties[].agreedAmount | 0 to 600000000000 |
| properties[].c2AmountA | 0 to 600000000000 |
| properties[].c2DesignatedD | 0 to 600000000000 |
| properties[].c2ValueB | 0 to 600000000000 |
| properties[].c2ValueC | 0 to 600000000000 |
| properties[].category | one of "capital_non_depreciable", "capital_depreciable", "inventory_non_real", "inventory_cash_method_farm", "canadian_resource", "foreign_resource", "eligible_derivative", "real_property_inventory", "real_property_capital_nr", "eligible_capital_legacy", "security_or_debt_lender", "nisa_fund_no_2" |
| properties[].classUndisposedCapitalCost | 0 to 600000000000 |
| properties[].consideration.bootFmv | 0 to 600000000000 |
| properties[].consideration.commonShareFmv | 0 to 600000000000 |
| properties[].consideration.commonStatedCapital | 0 to 600000000000 |
| properties[].consideration.giftToRelatedPerson | 0 to 600000000000 |
| properties[].consideration.preferredShareFmv | 0 to 600000000000 |
| properties[].consideration.preferredStatedCapital | 0 to 600000000000 |
| properties[].costAmount | 0 to 600000000000 |
| properties[].description | 1 to 120 characters |
| properties[].dispositionOrder | 1 to 10000 |
| properties[].fmv | 0 to 600000000000 |
| properties[].prescribedClass | 1 to 20 characters |
| properties[].rowId | 1 to 60 characters |
| properties[].uccOfClass | 0 to 600000000000 |

## Output cells (118)

| Cell | Types |
| --- | --- |
| properties[].rowId | string |
| properties[].category | string |
| properties[].character | string |
| properties[].floor | number |
| properties[].floorRule | string |
| properties[].ceiling | number |
| properties[].deemedAgreedAmount | number |
| properties[].wasDeemed | boolean |
| properties[].gainTriggered | number |
| properties[].capitalGainTriggered | number |
| properties[].capitalLossTriggered | number |
| properties[].incomeInclusionTriggered | number |
| properties[].recaptureTriggered | number |
| properties[].realizedLoss | number |
| properties[].giftToRelatedPerson | null \| number |
| properties[].warnings[] | string |
| consideration.bootCost | number |
| consideration.preferredShareCost | number |
| consideration.commonShareCost | number |
| consideration.totalConsiderationCost | number |
| consideration.allocationBasis | string |
| consideration.warnings[] | string |
| consideration.preferredPucGrind | null \| number |
| consideration.commonPucGrind | null \| number |
| consideration.preferredPucFinal | null \| number |
| consideration.commonPucFinal | null \| number |
| consideration.pucGrindGovernedBy | string |
| consideration.pucGrindByProperty[].rowId | string |
| consideration.pucGrindByProperty[].governedBy | string |
| consideration.pucGrindByProperty[].preferredPucGrind | null \| number |
| consideration.pucGrindByProperty[].commonPucGrind | null \| number |
| consideration.pucGrindByProperty[].preferredPucFinal | null \| number |
| consideration.pucGrindByProperty[].commonPucFinal | null \| number |
| alternatePucGrind.section | string |
| alternatePucGrind.increaseInPuc | number |
| alternatePucGrind.hardAcb | null \| number |
| alternatePucGrind.subjectSharesPuc | null \| number |
| alternatePucGrind.totalGrind | null \| number |
| alternatePucGrind.preferredPucFinal | null \| number |
| alternatePucGrind.commonPucFinal | null \| number |
| alternatePucGrind.deemedDividend | null \| number |
| alternatePucGrind.withholdingRate | null \| number |
| alternatePucGrind.withholdingTax | null \| number |
| alternatePucGrind.note | string |
| penalty.monthsLate | integer |
| penalty.optionA | number |
| penalty.optionB | number |
| penalty.penalty | number |
| penalty.isLate | boolean |
| penalty.threeYearWindowCloses | null \| string |
| penalty.beyondThreeYearWindow | boolean |
| classRecapture[].prescribedClass | null \| string |
| classRecapture[].rowIds[] | string |
| classRecapture[].openingUcc | number |
| classRecapture[].uccCredits | number |
| classRecapture[].closingUcc | number |
| classRecapture[].recapture | number |
| classRecapture[].terminalLossIndicated | number |
| taxableCanadianProperty.anyTaxableCanadianProperty | boolean \| null |
| taxableCanadianProperty.rowIds[] | string |
| taxableCanadianProperty.dispositionDate | null \| string |
| taxableCanadianProperty.deemedTcpUntil | null \| string |
| nonElectionOutcome.applies | boolean |
| nonElectionOutcome.reasons[] | string |
| nonElectionOutcome.properties[].rowId | string |
| nonElectionOutcome.properties[].category | string |
| nonElectionOutcome.properties[].character | string |
| nonElectionOutcome.properties[].proceeds | number |
| nonElectionOutcome.properties[].proceedsRule | string |
| nonElectionOutcome.properties[].transfereeCost69_1_a | null \| number |
| nonElectionOutcome.properties[].capitalGain | null \| number |
| nonElectionOutcome.properties[].capitalLoss | null \| number |
| nonElectionOutcome.properties[].incomeInclusion | null \| number |
| nonElectionOutcome.properties[].recapture | null \| number |
| nonElectionOutcome.properties[].closingUcc | null \| number |
| nonElectionOutcome.properties[].notes[] | string |
| nonElectionOutcome.totalCapitalGain | null \| number |
| nonElectionOutcome.totalCapitalLoss | null \| number |
| nonElectionOutcome.totalIncomeInclusion | null \| number |
| nonElectionOutcome.totalRecapture | null \| number |
| nonElectionOutcome.basisIncomplete | boolean |
| benefitDesiredForRelatedPerson | boolean \| null |
| totalElectedAmount | null \| number |
| totalFmv | number |
| totalGainTriggered | null \| number |
| totalCapitalGain | null \| number |
| totalCapitalLoss | null \| number |
| totalIncomeInclusion | null \| number |
| totalIncomeLoss | null \| number |
| totalRecaptureTriggered | null \| number |
| totalRealizedLoss | null \| number |
| ineligible | boolean |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |
| consideration | null \| object |
| alternatePucGrind | null |
| classRecapture | null |
| nonElectionOutcome | null \| object |

### Output cell notes

- `properties[].incomeInclusionTriggered`: Signed s.9(1) business profit on an income-account row (negative = a fully deductible business loss). Nil on a capital, depreciable or resource row.

# section-85-1

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 7.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-85-1`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "exchanged_shares": {
      "acb": 80000,
      "fmv": 150000,
      "isCapitalProperty": true,
      "isTaxableCanadianProperty": false
    },
    "purchaser_shares": {
      "fmv": 150000,
      "pucOfExchangedShares": 100000,
      "purchaserIssuedTreasuryShares": true,
      "issuedToCourtApprovedPlanTrust": false,
      "exchangedSharesTradeOnDesignatedStockExchange": false,
      "purchaserSharesWidelyTradedOnDesignatedStockExchange": false,
      "issuedShareClasses": [
        {
          "label": "Cedar Ridge Holdings common",
          "pucIncrease": 150000
        }
      ]
    },
    "consideration": {
      "bootFmv": 0,
      "sharesOfMoreThanOneClass": false
    },
    "party": {
      "dealsAtArmsLength": true,
      "nonArmsLengthSolelyFromPurchaserRightToAcquireExchangedShares": false,
      "vendorControlsPurchaserAfter": false,
      "vendorOwnsMoreThan50PctFmvOfPurchaserAfter": false,
      "s85ElectionFiled": false,
      "vendorElectsOut": false,
      "purchaserIsCanadianCorporation": true,
      "acquiredCorporationIsTaxableCanadianCorporation": true,
      "vendorIsForeignAffiliateOfCanadianResident": false,
      "gainIncludedInVendorFAPI": null
    }
  }
}
```

## Input cells (24)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| consideration.bootFmv | number | strict |
| consideration.sharesOfMoreThanOneClass | boolean | strict |
| exchanged_shares.acb | number | strict |
| exchanged_shares.fmv | number | strict |
| exchanged_shares.isCapitalProperty | boolean | always |
| exchanged_shares.isTaxableCanadianProperty | boolean \| null | strict |
| party.acquiredCorporationIsTaxableCanadianCorporation | boolean \| null | strict |
| party.dealsAtArmsLength | boolean | strict |
| party.gainIncludedInVendorFAPI | boolean \| null | strict |
| party.nonArmsLengthSolelyFromPurchaserRightToAcquireExchangedShares | boolean | strict |
| party.purchaserIsCanadianCorporation | boolean \| null | strict |
| party.s85ElectionFiled | boolean | strict |
| party.vendorControlsPurchaserAfter | boolean | strict |
| party.vendorElectsOut | boolean | strict |
| party.vendorIsForeignAffiliateOfCanadianResident | boolean \| null | strict |
| party.vendorOwnsMoreThan50PctFmvOfPurchaserAfter | boolean \| null | strict |
| purchaser_shares.exchangedSharesTradeOnDesignatedStockExchange | boolean | strict |
| purchaser_shares.fmv | number | strict |
| purchaser_shares.issuedShareClasses[].label | string | strict |
| purchaser_shares.issuedShareClasses[].pucIncrease | number | strict |
| purchaser_shares.issuedToCourtApprovedPlanTrust | boolean | strict |
| purchaser_shares.pucOfExchangedShares | number | strict |
| purchaser_shares.purchaserIssuedTreasuryShares | boolean \| null | strict |
| purchaser_shares.purchaserSharesWidelyTradedOnDesignatedStockExchange | boolean | strict |

### Input cell notes

- `consideration.sharesOfMoreThanOneClass`: Second s.85.1(2)(d) limb: the vendor received shares of more than one class of the purchaser; unanswered blocks.
- `exchanged_shares.isCapitalProperty`: s.85.1(1) opening words require the exchanged shares to be capital property; inventory shares are on income account under s.9.
- `party.dealsAtArmsLength`: s.85.1(2)(a): the vendor and purchaser dealt at arm's length immediately before the exchange; silence is not an assertion and blocks.
- `party.nonArmsLengthSolelyFromPurchaserRightToAcquireExchangedShares`: The s.85.1(2)(a) parenthetical relief: the only non-arm's-length cause is a s.251(5)(b) right of the purchaser to acquire the exchanged shares; absent means off.
- `party.s85ElectionFiled`: s.85.1(2)(c): the parties filed an s.85(1) or 85(2) election for the exchanged shares, which ousts s.85.1; unanswered blocks.
- `party.vendorControlsPurchaserAfter`: s.85.1(2)(b)(i): the vendor, alone or with non-arm's-length persons, controlled the purchaser immediately after the exchange; unanswered blocks.
- `party.vendorElectsOut`: The vendor reports the gain in its return, failing the s.85.1(1)(a) condition; the exchange then runs without the rollover deeming.
- `purchaser_shares.exchangedSharesTradeOnDesignatedStockExchange`: s.85.1(2.2) condition: the exchanged shares trade on a designated stock exchange; the deeming needs all three of its conditions.
- `purchaser_shares.issuedToCourtApprovedPlanTrust`: s.85.1(2.2) condition: the purchaser shares were issued to a trust under a court-approved plan of arrangement; the deeming needs all three of its conditions.
- `purchaser_shares.purchaserSharesWidelyTradedOnDesignatedStockExchange`: s.85.1(2.2) condition: the purchaser shares are widely traded on a designated stock exchange; the deeming needs all three of its conditions.

### Strict profile accepted values (7 of 24 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| consideration.bootFmv | 0 to 600000000000 |
| exchanged_shares.acb | 0 to 600000000000 |
| exchanged_shares.fmv | 0 to 600000000000 |
| purchaser_shares.fmv | 0 to 600000000000 |
| purchaser_shares.issuedShareClasses[].label | 1 to 2000 characters |
| purchaser_shares.issuedShareClasses[].pucIncrease | 0 to 600000000000 |
| purchaser_shares.pucOfExchangedShares | 0 to 600000000000 |

## Output cells (47)

| Cell | Types |
| --- | --- |
| applies | boolean |
| exchangedShares.acb | number |
| exchangedShares.fmv | number |
| exchangedShares.pucOfExchangedShares | number |
| exchangedShares.proceedsOfDisposition | number |
| vendorNewShareAcb | null \| number |
| purchaserCostOfAcquiredShares | null \| number |
| purchaserCostBasis | null \| string |
| gainIfTainted | null \| number |
| gainRealized | null \| number |
| dispositionCharacter | null \| string |
| incomeAccountProfit | null \| number |
| boot.fmv | number |
| sharesOfMoreThanOneClass | boolean |
| rolloverDeferred | boolean |
| pucReduction.status | string |
| pucReduction.totalIncreaseInPuc | null \| number |
| pucReduction.pucOfExchangedSharesReceived | number |
| pucReduction.totalReduction | null \| number |
| pucReduction.byClass[].label | string |
| pucReduction.byClass[].pucIncrease | number |
| pucReduction.byClass[].pucReduction | number |
| pucReduction.byClass[].pucAfterReduction | number |
| purchaserSharesAreDeemedTcp | boolean \| null |
| purchaserSharesDeemedTcpWindowMonths | integer \| null |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

# section-86

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 5.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-86`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "old_shares": {
      "acb": 100000,
      "puc": 80000,
      "fmv": 150000,
      "isCapitalProperty": true,
      "allSharesOfClassDisposed": true,
      "outlaysAndExpenses": 0,
      "priorS53_2_g1DeductionsAmount": null,
      "priorS53_2_g1Deductions": false
    },
    "new_shares": [
      {
        "label": "Cedar Ridge Holdings preferred",
        "fmv": 90000,
        "legalStatedCapital": 60000
      },
      {
        "label": "Cedar Ridge Holdings common",
        "fmv": 50000,
        "legalStatedCapital": 50000
      }
    ],
    "boot": {
      "fmv": 10000
    },
    "party": {
      "s85ElectionFiled": false,
      "inCourseOfReorganizationOfCapital": true,
      "isRelatedReorganization": false,
      "giftToRelatedPerson": 0
    }
  }
}
```

## Input cells (16)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| boot.fmv | number | strict |
| new_shares[].fmv | number | strict |
| new_shares[].label | string | strict |
| new_shares[].legalStatedCapital | number | strict |
| old_shares.acb | number | strict |
| old_shares.allSharesOfClassDisposed | boolean | strict |
| old_shares.fmv | number | strict |
| old_shares.isCapitalProperty | boolean | strict |
| old_shares.outlaysAndExpenses | number | strict |
| old_shares.priorS53_2_g1Deductions | boolean | strict |
| old_shares.priorS53_2_g1DeductionsAmount | null \| number | strict |
| old_shares.puc | number | strict |
| party.giftToRelatedPerson | number | strict |
| party.inCourseOfReorganizationOfCapital | boolean | strict |
| party.isRelatedReorganization | boolean | strict |
| party.s85ElectionFiled | boolean | strict |

### Input cell notes

- `old_shares.allSharesOfClassDisposed`: s.86(1) per-taxpayer test: the taxpayer disposed of all the shares of the class that the taxpayer owned; unanswered or false blocks.
- `old_shares.isCapitalProperty`: s.86(1) requires the old shares to be capital property; unanswered or false blocks.
- `old_shares.priorS53_2_g1Deductions`: Legacy assertion that s.53(2)(g.1) amounts were deducted on the old shares; true without the amount blocks because the s.86(4) figure would be unknown.
- `party.inCourseOfReorganizationOfCapital`: s.86(1) condition: the disposition occurred in the course of a reorganization of the corporation's capital; unanswered or false blocks.
- `party.isRelatedReorganization`: Whether the other shareholders who gain the FMV excess are persons related to the taxpayer; required once an excess exists, it selects the s.86(2) benefit-conferral treatment.
- `party.s85ElectionFiled`: An s.85 election was filed for this exchange; s.86(3) then ousts s.86.

### Strict profile accepted values (10 of 16 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| boot.fmv | 0 to 600000000000 |
| new_shares[].fmv | 0 to 600000000000 |
| new_shares[].label | 1 to 2000 characters |
| new_shares[].legalStatedCapital | 0 to 600000000000 |
| old_shares.acb | 0 to 600000000000 |
| old_shares.fmv | 0 to 600000000000 |
| old_shares.outlaysAndExpenses | 0 to 600000000000 |
| old_shares.priorS53_2_g1DeductionsAmount | 0 to 600000000000 |
| old_shares.puc | 0 to 600000000000 |
| party.giftToRelatedPerson | 0 to 600000000000 |

## Output cells (49)

| Cell | Types |
| --- | --- |
| newShares[].label | string |
| newShares[].fmv | number |
| newShares[].legalStatedCapital | number |
| newShares[].costAcb | number |
| newShares[].pucGrind | number |
| newShares[].pucFinal | number |
| newShares[].s86_4Adjustment | null \| number |
| oldShares.acb | number |
| oldShares.puc | number |
| oldShares.fmv | number |
| oldShares.outlaysAndExpenses | number |
| oldShares.proceedsOfDisposition | number |
| oldShares.gainTriggered | number |
| oldShares.lossDeemedNil | boolean |
| boot.fmv | number |
| boot.cost | number |
| s86_2Applies | boolean \| null |
| giftToRelatedPerson | null \| number |
| totalNewShareCost | null \| number |
| totalPucGrind | null \| number |
| totalProceeds | null \| number |
| deemedDividend84_3 | null \| number |
| totalS86_4Adjustment | null \| number |
| rolloverDeferred | boolean |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |
| newShares | null |
| oldShares | null |
| boot | null |

# section-87

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 9.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-87`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "predecessor_share_classes": [
      {
        "label": "Cedar Ridge Manufacturing common",
        "aggregateAcb": 100000,
        "aggregatePuc": 80000,
        "heldByAnotherPredecessorCorporation": false,
        "legalStatedCapital": null
      }
    ],
    "amalco_classes": [
      {
        "label": "Cedar Ridge Amalco common",
        "correspondsToPredecessorLabel": "Cedar Ridge Manufacturing common",
        "legalStatedCapital": 100000,
        "fmvImmediatelyAfter": null
      }
    ],
    "flags": {
      "acquisitionOfControl": false,
      "verticalAmalgamation": false,
      "sisterAmalgamation": false,
      "triangularAmalgamation": false,
      "nonShareConsideration": false,
      "allPredecessorsTaxableCanadianCorporations": true,
      "allPredecessorsCanadianCorporations": true,
      "allPropertyBecamePropertyOfNewCorporation": true,
      "allLiabilitiesBecameLiabilitiesOfNewCorporation": true,
      "allShareholdersReceivedNewCorporationShares": true,
      "predecessorSharesNotCancelledOnMerger": null,
      "mergerIsPurchaseOfAssetsOrWindingUpDistribution": false,
      "election87_3_1Filed": false,
      "substitutedClassesIdenticalToExchangedClasses": null,
      "verticalAmalgamationDetails": null,
      "shareholders": null
    }
  }
}
```

## Input cells (41)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| amalco_classes[].correspondsToPredecessorLabel | string | strict |
| amalco_classes[].fmvImmediatelyAfter | null \| number | strict |
| amalco_classes[].label | string | strict |
| amalco_classes[].legalStatedCapital | number | strict |
| flags.acquisitionOfControl | boolean | strict |
| flags.allLiabilitiesBecameLiabilitiesOfNewCorporation | boolean | strict |
| flags.allPredecessorsCanadianCorporations | boolean \| null | strict |
| flags.allPredecessorsTaxableCanadianCorporations | boolean | strict |
| flags.allPropertyBecamePropertyOfNewCorporation | boolean | strict |
| flags.allShareholdersReceivedNewCorporationShares | boolean | strict |
| flags.election87_3_1Filed | boolean | strict |
| flags.mergerIsPurchaseOfAssetsOrWindingUpDistribution | boolean | strict |
| flags.nonShareConsideration | boolean | strict |
| flags.predecessorSharesNotCancelledOnMerger | boolean \| null | strict |
| flags.shareholders[].giftPortionToRelatedPerson | number | strict |
| flags.shareholders[].isPredecessorCorporation | boolean | strict |
| flags.shareholders[].label | string | strict |
| flags.shareholders[].newShares[].fmvAfter | number | strict |
| flags.shareholders[].newShares[].label | string | strict |
| flags.shareholders[].nonShareConsiderationFmv | number | strict |
| flags.shareholders[].oldShareAcb | null \| number | strict |
| flags.shareholders[].oldShareFmvBefore | null \| number | strict |
| flags.shareholders[].oldSharesAreCapitalProperty | boolean \| null | strict |
| flags.shareholders[].oldSharesWereTaxableCanadianProperty | boolean | strict |
| flags.shareholders[].outlaysAndExpenses | null \| number | strict |
| flags.sisterAmalgamation | boolean | strict |
| flags.substitutedClassesIdenticalToExchangedClasses | boolean \| null | strict |
| flags.triangularAmalgamation | boolean | strict |
| flags.verticalAmalgamation | boolean | strict |
| flags.verticalAmalgamationDetails.parentAcbOfSubShares | null \| number | strict |
| flags.verticalAmalgamationDetails.pucOfSubShares | null \| number | strict |
| flags.verticalAmalgamationDetails.subsidiaries[].label | null \| string | strict |
| flags.verticalAmalgamationDetails.subsidiaries[].parentAcbOfSubShares | number | strict |
| flags.verticalAmalgamationDetails.subsidiaries[].pucOfSubShares | number | strict |
| flags.verticalAmalgamationDetails.subsidiaries[].subsidiaryNetInsideAmount | number | strict |
| flags.verticalAmalgamationDetails.subsidiaryNetInsideAmount | null \| number | strict |
| predecessor_share_classes[].aggregateAcb | number | strict |
| predecessor_share_classes[].aggregatePuc | number | strict |
| predecessor_share_classes[].heldByAnotherPredecessorCorporation | boolean | strict |
| predecessor_share_classes[].label | string | strict |
| predecessor_share_classes[].legalStatedCapital | null \| number | strict |

### Input cell notes

- `flags.acquisitionOfControl`: An acquisition of control (s.256(7)) fires on the amalgamation; engages the loss-streaming consequences.
- `flags.allLiabilitiesBecameLiabilitiesOfNewCorporation`: s.87(1)(b): all liabilities of the predecessors immediately before the merger became liabilities of the new corporation by virtue of the merger.
- `flags.allPredecessorsCanadianCorporations`: Independent s.87(3) scope fact: every predecessor was a Canadian corporation. Required when the narrower allPredecessorsTaxableCanadianCorporations answer is false; s.87(3) can require a PUC grind even when s.87(1) fails.
- `flags.allPredecessorsTaxableCanadianCorporations`: s.87(1) definitional condition: each predecessor was, immediately before the merger, a taxable Canadian corporation; unanswered fails closed.
- `flags.allPropertyBecamePropertyOfNewCorporation`: s.87(1)(a): all property of the predecessors immediately before the merger became property of the new corporation by virtue of the merger.
- `flags.allShareholdersReceivedNewCorporationShares`: s.87(1)(c): all shareholders of the predecessors, other than any predecessor corporation, received shares of the new corporation on the merger.
- `flags.election87_3_1Filed`: The new corporation elected under s.87(3.1) in its first s.150 return; each share class then needs its legal stated capital for the identity test.
- `flags.mergerIsPurchaseOfAssetsOrWindingUpDistribution`: s.87(1) closing words: a merger effected by one corporation purchasing another's property or by a winding-up distribution is not an amalgamation; must be false.
- `flags.nonShareConsideration`: A shareholder received consideration other than shares; the s.87(4) rollover is denied for that shareholder, and each affected row must state its boot amount.
- `flags.predecessorSharesNotCancelledOnMerger`: s.87(1.1): the relevant predecessor shares owned by non-predecessor shareholders immediately before a vertical or sister merger were not cancelled on the merger. Required only when literal s.87(1)(c) receipt is false; merger type alone does not prove this condition.
- `flags.shareholders[].isPredecessorCorporation`: This shareholder is itself a predecessor corporation, the s.87(1)(c) exception to the share-receipt condition.
- `flags.shareholders[].oldSharesWereTaxableCanadianProperty`: The shareholder's old shares were taxable Canadian property immediately before the amalgamation; the new shares then keep the TCP character.
- `flags.shareholders[].outlaysAndExpenses`: Outlays and expenses made or incurred for the old-share disposition under s.40(1). Required for a non-predecessor shareholder whose old shares are capital property; enter 0 if none.
- `flags.sisterAmalgamation`: Two or more subsidiary wholly-owned corporations of the same parent amalgamate; engages s.87(1.1)(b).
- `flags.triangularAmalgamation`: The new corporation is controlled immediately after the merger by a taxable Canadian parent whose shares were issued to former predecessor shareholders; engages ITA 87(9).
- `flags.verticalAmalgamation`: Parent and subsidiary wholly-owned amalgamation; engages s.87(1.1), s.87(2.11) and s.87(11).
- `predecessor_share_classes[].heldByAnotherPredecessorCorporation`: s.87(3)(a) exclusion: these predecessor shares are held by another predecessor corporation and stay out of the paid-up capital continuity total.

### Strict profile accepted values (23 of 41 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| amalco_classes[].correspondsToPredecessorLabel | 1 to 2000 characters |
| amalco_classes[].fmvImmediatelyAfter | 0 to 600000000000 |
| amalco_classes[].label | 1 to 2000 characters |
| amalco_classes[].legalStatedCapital | 0 to 600000000000 |
| flags.shareholders[].giftPortionToRelatedPerson | 0 to 600000000000 |
| flags.shareholders[].label | 1 to 2000 characters |
| flags.shareholders[].newShares[].fmvAfter | 0 to 600000000000 |
| flags.shareholders[].newShares[].label | 1 to 2000 characters |
| flags.shareholders[].nonShareConsiderationFmv | 0 to 600000000000 |
| flags.shareholders[].oldShareAcb | 0 to 600000000000 |
| flags.shareholders[].oldShareFmvBefore | 0 to 600000000000 |
| flags.shareholders[].outlaysAndExpenses | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.parentAcbOfSubShares | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.pucOfSubShares | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.subsidiaries[].label | 1 to 2000 characters |
| flags.verticalAmalgamationDetails.subsidiaries[].parentAcbOfSubShares | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.subsidiaries[].pucOfSubShares | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.subsidiaries[].subsidiaryNetInsideAmount | 0 to 600000000000 |
| flags.verticalAmalgamationDetails.subsidiaryNetInsideAmount | 0 to 600000000000 |
| predecessor_share_classes[].aggregateAcb | 0 to 600000000000 |
| predecessor_share_classes[].aggregatePuc | 0 to 600000000000 |
| predecessor_share_classes[].label | 1 to 2000 characters |
| predecessor_share_classes[].legalStatedCapital | 0 to 600000000000 |

## Output cells (60)

| Cell | Types |
| --- | --- |
| applies | boolean \| null |
| amalcoClasses[].label | string |
| amalcoClasses[].correspondsToPredecessorLabel | string |
| amalcoClasses[].fmvImmediatelyAfter | null \| number |
| amalcoClasses[].newShareAcb | null \| number |
| amalcoClasses[].legalStatedCapital | number |
| amalcoClasses[].pucGrind | number |
| amalcoClasses[].pucFinal | number |
| shareholders[].label | string |
| shareholders[].isPredecessorCorporation | boolean |
| shareholders[].oldShareAcb | number |
| shareholders[].oldShareFmvBefore | number |
| shareholders[].nonShareConsiderationFmv | number |
| shareholders[].totalNewShareFmvAfter | number |
| shareholders[].giftPortion | number |
| shareholders[].applies87_4 | boolean |
| shareholders[].exclusionReason | null \| string |
| shareholders[].giftPortionApplied | boolean |
| shareholders[].proceedsOfDisposition | null \| number |
| shareholders[].capitalGain | null \| number |
| shareholders[].suppressedCapitalLoss | null \| number |
| shareholders[].totalNewShareCost | number |
| shareholders[].newShareCosts[].label | string |
| shareholders[].newShareCosts[].fmvAfter | number |
| shareholders[].newShareCosts[].cost | number |
| shareholders[].newSharesDeemedTcpFor60Months | boolean |
| totalPucGrind | number |
| election87_3_1Applied | boolean |
| verticalAmalgamationDisposition.acbOfSubsidiaryShares | number |
| verticalAmalgamationDisposition.pucOfSubsidiaryShares | number |
| verticalAmalgamationDisposition.subsidiaryNetInsideAmount | number |
| verticalAmalgamationDisposition.deemedProceeds | number |
| verticalAmalgamationDisposition.capitalGain | number |
| section87_9Disclosure.parentShareDeemingApplied | boolean |
| section87_9Disclosure.parentCostBumpDesignationModelled | boolean |
| section87_9Disclosure.filingAction | string |
| verticalAmalgamation | boolean |
| acquisitionOfControl | boolean |
| rolloverDeferred | boolean |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

# section-88

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 6.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-88`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "parent": {
      "acbOfSubShares": 500000,
      "pucOfSubShares": 100000
    },
    "subsidiary": {
      "netTaxValueOfAssets": 300000,
      "taxableDividendsDeductibleOnSubShares": 0,
      "capitalAndLifeInsuranceCapitalDividendsOnSubShares": 0
    },
    "bump_properties": [
      {
        "label": "Cedar Ridge manufacturing land",
        "costAmount": 100000,
        "costAmountAtAcquisitionOfControl": 100000,
        "fmvAtAcquisitionOfControl": 300000,
        "isDepreciable": false,
        "isCapitalProperty": true,
        "isResourceProperty": false,
        "ownedContinuouslySinceAcquisitionOfControl": true,
        "isIneligibleProperty": false,
        "prescribedAmountC": null,
        "isForeignAffiliateShare": false,
        "isPartnershipInterest": false,
        "partnershipAccruedGainOnDepreciableProperty": null,
        "partnershipResourcePropertyFmv": null,
        "partnershipAccruedGainOnNonCapitalProperty": null,
        "paragraph88_1_eStuffedPropertyFmv": null,
        "designatedAmount": 200000,
        "dispositionInSeries69_11": false,
        "fmvAtWindUp": null,
        "section80CostAmountReduction": 0
      }
    ],
    "party": {
      "ownsAtLeast90Pct": true,
      "bothTaxableCanadian": true,
      "minorityShareholdersAtArmsLength": true,
      "subsidiaryHasLossCarryforwards": false
    }
  }
}
```

## Input cells (29)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| bump_properties[].costAmount | number | strict |
| bump_properties[].costAmountAtAcquisitionOfControl | number | strict |
| bump_properties[].designatedAmount | null \| number | strict |
| bump_properties[].dispositionInSeries69_11 | boolean | strict |
| bump_properties[].fmvAtAcquisitionOfControl | number | strict |
| bump_properties[].fmvAtWindUp | null \| number | strict |
| bump_properties[].isCapitalProperty | boolean | strict |
| bump_properties[].isDepreciable | boolean | always |
| bump_properties[].isForeignAffiliateShare | boolean | strict |
| bump_properties[].isIneligibleProperty | boolean \| null | strict |
| bump_properties[].isPartnershipInterest | boolean | strict |
| bump_properties[].isResourceProperty | boolean | strict |
| bump_properties[].label | string | strict |
| bump_properties[].ownedContinuouslySinceAcquisitionOfControl | boolean \| null | strict |
| bump_properties[].paragraph88_1_eStuffedPropertyFmv | null \| number | strict |
| bump_properties[].partnershipAccruedGainOnDepreciableProperty | null \| number | strict |
| bump_properties[].partnershipAccruedGainOnNonCapitalProperty | null \| number | strict |
| bump_properties[].partnershipResourcePropertyFmv | null \| number | strict |
| bump_properties[].prescribedAmountC | null \| number | strict |
| bump_properties[].section80CostAmountReduction | number | strict |
| parent.acbOfSubShares | number | strict |
| parent.pucOfSubShares | null \| number | strict |
| party.bothTaxableCanadian | boolean | strict |
| party.minorityShareholdersAtArmsLength | boolean \| null | strict |
| party.ownsAtLeast90Pct | boolean | strict |
| party.subsidiaryHasLossCarryforwards | boolean | strict |
| subsidiary.capitalAndLifeInsuranceCapitalDividendsOnSubShares | null \| number | strict |
| subsidiary.netTaxValueOfAssets | number | strict |
| subsidiary.taxableDividendsDeductibleOnSubShares | null \| number | strict |

### Input cell notes

- `bump_properties[].dispositionInSeries69_11`: Preparer assertion that s.69(11) applies to this property's distribution; the property's FMV at wind-up is then required.
- `bump_properties[].isCapitalProperty`: Whether the distributed property is capital property eligible for an s.88(1)(d) designation.
- `bump_properties[].isDepreciable`: s.88(1)(c)(iii): depreciable property is ineligible property and cannot take the s.88(1)(d) bump.
- `bump_properties[].isForeignAffiliateShare`: The distributed property is a foreign affiliate share; the prescribed amount under Reg 5905(5.4)(a) (tax-free surplus balance times surplus entitlement percentage) becomes mandatory.
- `bump_properties[].isPartnershipInterest`: The distributed property is a partnership interest; engages the s.88(1)(d)(ii.1) look-through and makes the Reg 5905(5.4)(b) prescribed amount mandatory.
- `bump_properties[].isResourceProperty`: Whether the distributed property is resource property or a right to production, for which s.88(1)(a)/(c) prescribe nil proceeds/cost.
- `party.bothTaxableCanadian`: s.88(1) condition: both the parent and the subsidiary are taxable Canadian corporations.
- `party.ownsAtLeast90Pct`: s.88(1) condition: the parent owns at least 90 percent of the shares of each class of the subsidiary.
- `party.subsidiaryHasLossCarryforwards`: Flags the s.88(1.1) and (1.2) loss flow- through: the subsidiary's losses become deductible to the parent starting the taxation year after the wind-up.

### Strict profile accepted values (17 of 29 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| bump_properties[].costAmount | 0 to 600000000000 |
| bump_properties[].costAmountAtAcquisitionOfControl | 0 to 600000000000 |
| bump_properties[].designatedAmount | 0 to 600000000000 |
| bump_properties[].fmvAtAcquisitionOfControl | 0 to 600000000000 |
| bump_properties[].fmvAtWindUp | 0 to 600000000000 |
| bump_properties[].label | 1 to 2000 characters |
| bump_properties[].paragraph88_1_eStuffedPropertyFmv | 0 to 600000000000 |
| bump_properties[].partnershipAccruedGainOnDepreciableProperty | 0 to 600000000000 |
| bump_properties[].partnershipAccruedGainOnNonCapitalProperty | 0 to 600000000000 |
| bump_properties[].partnershipResourcePropertyFmv | 0 to 600000000000 |
| bump_properties[].prescribedAmountC | 0 to 600000000000 |
| bump_properties[].section80CostAmountReduction | 0 to 600000000000 |
| parent.acbOfSubShares | 0 to 600000000000 |
| parent.pucOfSubShares | 0 to 600000000000 |
| subsidiary.capitalAndLifeInsuranceCapitalDividendsOnSubShares | 0 to 600000000000 |
| subsidiary.netTaxValueOfAssets | 0 to 600000000000 |
| subsidiary.taxableDividendsDeductibleOnSubShares | 0 to 600000000000 |

## Output cells (56)

| Cell | Types |
| --- | --- |
| applies | boolean |
| parent.acbOfSubShares | number |
| parent.pucOfSubShares | null \| number |
| parent.deemedProceedsOnSubShares | null \| number |
| parent.capitalGainOnSubShares | null \| number |
| subsidiary.netTaxValueOfAssets | number |
| subsidiary.taxableDividendsDeductibleOnSubShares | null \| number |
| subsidiary.capitalAndLifeInsuranceCapitalDividendsOnSubShares | null \| number |
| subsidiary.dividendsPaidToParentSinceAcquisition | null \| number |
| subsidiary.dividendReduction88_1_d_i_1 | null \| number |
| subsidiary.insideBasisPlusDividends | null \| number |
| subsidiary.deemedGainUnder69_11 | number |
| aggregateBumpLimit | number |
| bumpDesignationBasis | string |
| bumpProperties[].label | string |
| bumpProperties[].costAmount | number |
| bumpProperties[].fmvAtAcquisitionOfControl | number |
| bumpProperties[].deemedFmvAtAcquisitionOfControl | number |
| bumpProperties[].partnershipLookThroughReduction | number |
| bumpProperties[].paragraph88_1_eReduction | number |
| bumpProperties[].prescribedAmountC | number |
| bumpProperties[].isDepreciable | boolean |
| bumpProperties[].isPartnershipInterest | boolean |
| bumpProperties[].isCapitalProperty | boolean |
| bumpProperties[].isResourceProperty | boolean |
| bumpProperties[].bumpEligible | boolean |
| bumpProperties[].ineligibilityReason | null \| string |
| bumpProperties[].perPropertyCeiling | number |
| bumpProperties[].section80CostAmountReduction | number |
| bumpProperties[].bumpAllocated | number |
| bumpProperties[].newAcb | number |
| bumpProperties[].subsidiaryDeemedProceeds | null \| number |
| bumpProperties[].subsidiaryGain | number |
| totalBumpAllocated | number |
| unusedBumpRoom | number |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |

# section-97

Filemark T2 rollover and reorganization preview

- Kind: rollover
- Supported tax years: —
- Strict profile: rollover_preview_exact_v1
- Payload schema version: 8.0.0

## Example request

Send this body to `POST /api/v1/computations/rollovers/section-97`. It satisfies the strict profile, so it works with or without the `payloadContract` selector.

```json
{
  "inputs": {
    "properties": [
      {
        "rowId": "land-1",
        "description": "Cedar Ridge manufacturing land",
        "category": "capital_non_depreciable",
        "fmv": 150000,
        "acb": 100000,
        "costAmount": 100000,
        "capitalCost": null,
        "uccOfClass": 0,
        "agreedAmount": 100000,
        "bootFmv": 0,
        "isTaxableCanadianProperty": false,
        "isEligibleDerivative10_1_6": false,
        "prescribedClass": null,
        "dispositionOrder": null,
        "isEmployeeToolProperty": null,
        "employeeToolOriginalCost": null,
        "partnershipInterestFmvReceived": 150000,
        "benefitToRelatedMemberAmount": null,
        "isPassengerVehicleCostOverPrescribedAmount": null,
        "isZeroEmissionPassengerVehicle13_7_i": null,
        "classUndisposedCapitalCost": null,
        "isPurchasedInventory": null,
        "c2AmountA": null,
        "c2ValueB": null,
        "c2ValueC": null,
        "c2DesignatedD": null
      }
    ],
    "partnership": {
      "priorInterestAcb": 0,
      "memberIsLimitedPartner": null,
      "memberWasSpecifiedMemberSinceJoining": null,
      "interestIsFeb1994ExcludedInterest": null,
      "partnershipHasCeasedToExist": null,
      "fiscalPeriodEnd": null
    },
    "party": {
      "allMembersElect": true,
      "isCanadianPartnership": true,
      "taxpayerIsMemberImmediatelyAfter": true,
      "hasAuthorityToActForPartnership": true,
      "s97_3AcquisitionOfControlSeries": false,
      "s97_3DispositionAfterAcquisitionOfControl": null,
      "s97_3PropertyIsBumpDesignationClass": null,
      "s97_3SubsidiaryIsTaxpayerOrHoldsInterest": null,
      "electionDueDate": "2026-06-30",
      "electionFilingDate": "2026-06-01",
      "dispositionDate": "2025-06-15",
      "penaltyEstimatePaid": null,
      "ministerialRelief96_5_1": null,
      "anyOtherMemberRelatedToTaxpayer": null,
      "relatedMemberIsWhollyOwnedCorporationOfTaxpayer": null,
      "taxpayerNotAtArmsLengthWithOtherMembers": null
    }
  }
}
```

## Input cells (49)

Paths are relative to the request's `inputs` object; `[]` marks an array element.

Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target's `payloadContract` selector needs it. See [Run computations](/run-computations) for the default boundary.

These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.

| Cell | Types | Required |
| --- | --- | --- |
| partnership.fiscalPeriodEnd | null \| string | strict |
| partnership.interestIsFeb1994ExcludedInterest | boolean \| null | strict |
| partnership.memberIsLimitedPartner | boolean \| null | strict |
| partnership.memberWasSpecifiedMemberSinceJoining | boolean \| null | strict |
| partnership.partnershipHasCeasedToExist | boolean \| null | strict |
| partnership.priorInterestAcb | number | strict |
| party.allMembersElect | boolean | strict |
| party.anyOtherMemberRelatedToTaxpayer | boolean \| null | strict |
| party.anyRelatedMemberBenefitedOtherThanWhollyOwnedCorporation | boolean \| null |  |
| party.dispositionDate | null \| string | strict |
| party.electionDueDate | string | strict |
| party.electionFilingDate | string | strict |
| party.hasAuthorityToActForPartnership | boolean | strict |
| party.isCanadianPartnership | boolean | strict |
| party.ministerialRelief96_5_1 | boolean \| null | strict |
| party.penaltyEstimatePaid | boolean \| null | strict |
| party.relatedMemberIsWhollyOwnedCorporationOfTaxpayer | boolean \| null | strict |
| party.s97_3AcquisitionOfControlSeries | boolean | strict |
| party.s97_3DispositionAfterAcquisitionOfControl | boolean \| null | strict |
| party.s97_3PropertyIsBumpDesignationClass | boolean \| null | strict |
| party.s97_3SubsidiaryIsTaxpayerOrHoldsInterest | boolean \| null | strict |
| party.taxpayerIsMemberImmediatelyAfter | boolean | strict |
| party.taxpayerNotAtArmsLengthWithOtherMembers | boolean \| null | strict |
| properties[].acb | number | strict |
| properties[].agreedAmount | number | strict |
| properties[].benefitToRelatedMemberAmount | null \| number | strict |
| properties[].bootFmv | number | strict |
| properties[].c2AmountA | null \| number | strict |
| properties[].c2DesignatedD | null \| number | strict |
| properties[].c2ValueB | null \| number | strict |
| properties[].c2ValueC | null \| number | strict |
| properties[].capitalCost | null \| number | strict |
| properties[].category | string | strict |
| properties[].classUndisposedCapitalCost | null \| number | strict |
| properties[].costAmount | number | strict |
| properties[].description | string | strict |
| properties[].dispositionOrder | integer \| null | strict |
| properties[].employeeToolOriginalCost | null \| number | strict |
| properties[].fmv | number | strict |
| properties[].isEligibleDerivative10_1_6 | boolean | strict |
| properties[].isEmployeeToolProperty | boolean \| null | strict |
| properties[].isPassengerVehicleCostOverPrescribedAmount | boolean \| null | strict |
| properties[].isPurchasedInventory | boolean \| null | strict |
| properties[].isTaxableCanadianProperty | boolean | strict |
| properties[].isZeroEmissionPassengerVehicle13_7_i | boolean \| null | strict |
| properties[].partnershipInterestFmvReceived | null \| number | strict |
| properties[].prescribedClass | null \| string | strict |
| properties[].rowId | string | strict |
| properties[].uccOfClass | number | strict |

### Input cell notes

- `partnership.fiscalPeriodEnd`: Fiscal period end. Subsection 40(3.1) measures the deemed gain at the end of a fiscal period; the date is reported back in the trap and is not otherwise used.
- `partnership.interestIsFeb1994ExcludedInterest`: Subsection 40(3.1) exception: the interest was held on February 22, 1994 and is an excluded interest.
- `partnership.memberIsLimitedPartner`: Subsection 40(3.1) status fact. Required only when the interest ACB after the paragraph 97(2)(b) adjustments is negative; the engine fails closed rather than assuming an answer.
- `partnership.memberWasSpecifiedMemberSinceJoining`: Subsection 40(3.1): the member was a specified member of the partnership at all times since becoming a member.
- `partnership.partnershipHasCeasedToExist`: Subsection 98(1): but for that subsection the partnership would be regarded as having ceased to exist, which engages the paragraph 98(1)(c) deemed gain notwithstanding subsection 40(3).
- `partnership.priorInterestAcb`: Adjusted cost base of the partnership interest immediately before the paragraph 97(2)(b) adjustments. A NEGATIVE balance is a real state of affairs and is what subsection 40(3.1) and paragraph 98(1)(c) address, so it is representable here.
- `party.allMembersElect`: Subsection 97(2) applies only if the taxpayer and ALL the other members of the partnership jointly elect in prescribed form. There is no default; an unanswered election is not a unanimous one.
- `party.anyOtherMemberRelatedToTaxpayer`: Paragraph 85(1)(e.2) as imported by paragraph 97(2)(a), reading "the corporation" as all the other members of the partnership: is any other member of the partnership a person related to the taxpayer? Consulted, and REQUIRED to be answered, only once the (e.2) arithmetic test is met on a row — the property's fair market value immediately before the disposition exceeds the greater of the consideration received (bootFmv plus partnershipInterestFmvReceived) and the elected amount determined without reference to (e.2). Null is UNANSWERED and the election fails closed on it in that case.
- `party.anyRelatedMemberBenefitedOtherThanWhollyOwnedCorporation`: Paragraph 85(1)(e.2) carves out a benefit conferred on "a corporation that was a wholly owned corporation of the taxpayer immediately after the disposition", and the carve-out is scoped to that beneficiary. Subparagraph 97(2)(a)(iii) reads "the corporation" as ALL the other members of the partnership, so one exempt wholly owned corporation cannot exempt the other related members a contribution also benefits. Consulted, and REQUIRED to be answered, only once the (e.2) excess exists on a row, a related member is affirmed AND that member is a wholly owned corporation. Answer false where the wholly owned corporation is the only person benefited; null is UNANSWERED and the election fails closed on it in that case.
- `party.dispositionDate`: Date of the disposition. Required when any row is taxable Canadian property so the paragraph 97(2)(c) 60-month window can be dated.
- `party.electionDueDate`: The subsection 96(4) day — the earliest of the days on or before which any taxpayer making the election must file a return under section 150 for the year of the transaction.
- `party.electionFilingDate`: Day the prescribed form was in fact filed. Compared against the subsection 96(4) day and the subsection 96(5) three-year day.
- `party.hasAuthorityToActForPartnership`: Subparagraph 96(3)(a)(ii): the taxpayer had authority to act for the partnership, without which the election is not valid.
- `party.isCanadianPartnership`: Subsection 102(1): immediately after the disposition the partnership is a Canadian partnership, all of the members of which were resident in Canada.
- `party.ministerialRelief96_5_1`: Subsection 96(5.1) Ministerial relief. Required only when the election is filed beyond the subsection 96(5) three-year day.
- `party.penaltyEstimatePaid`: Paragraph 96(5)(b): an estimate of the subsection 96(6) penalty was paid. Required only when the election was filed late. The penalty AMOUNT is not computed by this engine.
- `party.relatedMemberIsWhollyOwnedCorporationOfTaxpayer`: The closing carve-out of paragraph 85(1)(e.2): a benefit conferred on "a corporation that was a wholly owned corporation of the taxpayer immediately after the disposition" (subsection 85(1.3)) is excluded, so the elected amount is not deemed up. Consulted, and REQUIRED to be answered, only once the (e.2) excess exists on a row AND a related member is affirmed. Null is UNANSWERED and the election fails closed on it in that case.
- `party.s97_3AcquisitionOfControlSeries`: Paragraph 97(3)(a) gateway: as part of a transaction, event or series, control of a taxable Canadian corporation is acquired, the subsidiary is wound up under subsection 88(1) or amalgamated under subsection 87(11), and the parent makes a paragraph 88(1)(d) designation in respect of a partnership interest.
- `party.s97_3DispositionAfterAcquisitionOfControl`: Paragraph 97(3)(b). Required only when the paragraph 97(3)(a) gateway is affirmed; all four conditions are conjunctive.
- `party.s97_3PropertyIsBumpDesignationClass`: Paragraph 97(3)(c): the property is described in clauses (A) to (C) of the description of B in subparagraph 88(1)(d)(ii.1).
- `party.s97_3SubsidiaryIsTaxpayerOrHoldsInterest`: Paragraph 97(3)(d): the subsidiary is the taxpayer or holds, directly or indirectly, an interest in the taxpayer.
- `party.taxpayerIsMemberImmediatelyAfter`: Subsection 97(2) requires a partnership of which the taxpayer is a member immediately after the disposition. Where this is false neither subsection 97(2) nor subsection 97(1) is engaged.
- `party.taxpayerNotAtArmsLengthWithOtherMembers`: Subparagraph 85(1)(e.4)(ii) and paragraph 85(1)(e.5) as applied by subparagraph 97(2)(a)(iv), reading "the corporation" as all the other members of the partnership: do the taxpayer and all the other members not deal at arm's length? REQUIRED once any row asserts the (e.4)(i) passenger-vehicle condition or the (e.5) zero-emission passenger-vehicle condition; the answer decides whether the elected amount is deemed to be the class undepreciated capital cost (e.4) or the subsection 248(1) cost amount of the vehicle (e.5). Null is UNANSWERED and the election fails closed on it in that case.
- `properties[].benefitToRelatedMemberAmount`: Paragraph 85(1)(e.2) as applied by paragraph 97(2)(a): the part of the excess that it is reasonable to regard as a benefit the taxpayer desired to have conferred on a person related to the taxpayer. Required once the (e.2) excess is visible on this row and a related member that is not a subsection 85(1.3) wholly owned corporation is affirmed. It must not exceed the excess, an explicit 0 is a stated position, and null is UNANSWERED — left blank the whole value shift would be reported as a nil gain, so the election fails closed instead.
- `properties[].bootFmv`: Fair market value of the consideration OTHER than an interest in the partnership received for this property. Subparagraph 97(2)(a)(ii) reads the paragraph 85(1)(b) exclusion that way, so the boot floor and the paragraph 97(2)(b) interest-ACB adjustments are per property. Enter 0 for an interest-only rollover; it is not an optional field.
- `properties[].c2AmountA`: Paragraph 85(1)(c.2)(i) element A: the paragraph 28(1)(c) amount for the last taxation year beginning before the disposition, determined as if it ended immediately before the disposition. Required for purchased inventory_cash_method_farm rows.
- `properties[].c2DesignatedD`: Paragraph 85(1)(c.2)(i) element D: the additional amount designated by the taxpayer and the partnership. Null means no additional amount was designated.
- `properties[].c2ValueB`: Paragraph 85(1)(c.2)(i) element B: the subsection 28(1.2) value of the purchased inventory transferred. Required for purchased inventory_cash_method_farm rows.
- `properties[].c2ValueC`: Paragraph 85(1)(c.2)(i) element C: the subsection 28(1.2) value of all purchased inventory owned in connection with the business immediately before the disposition. Required and greater than nil for purchased inventory_cash_method_farm rows.
- `properties[].capitalCost`: Capital cost to the taxpayer of a capital_depreciable property. Required on that category for subsection 13(21) element F, capital-gain basis, subsection 97(4), and the subsection 248(1)(a) numerator used by paragraph 85(1)(e.5); null is unanswered there and blocks. Null on every other category. This is distinct from the paragraph 85(1)(e)(ii) cost carried in costAmount.
- `properties[].classUndisposedCapitalCost`: Subsection 248(1) cost amount, paragraph (a): the capital cost to the taxpayer of ALL property of the class that had not been disposed of before that time — the denominator of the paragraph 85(1)(e.5) proportion. Required once isZeroEmissionPassengerVehicle13_7_i is true; it cannot be inferred from the rows of this election, which do not disclose property retained in the class.
- `properties[].costAmount`: On a capital_depreciable row, the cost to the taxpayer of the property under subparagraph 85(1)(e)(ii), as applied by paragraph 97(2)(a). Despite this legacy wire name, that provision says 'cost' and does not use the defined subsection 248(1) term 'cost amount'. On other rows this is the statutory cost amount used with acb.
- `properties[].dispositionOrder`: Paragraph 85(1)(e.1) order designated by the taxpayer within a prescribed class; all-or-none for the rows of one class. Null leaves the order to the Minister, which changes each row's paragraph 85(1)(e) floor as the class UCC is consumed.
- `properties[].employeeToolOriginalCost`: Cost of the tool to the individual immediately before the transfer, determined as if the Act were read without reference to subsection 8(7). Required when isEmployeeToolProperty is true.
- `properties[].isEligibleDerivative10_1_6`: The opening words of subsection 97(2) exclude an eligible derivative, as defined in subsection 10.1(5), of a taxpayer to whom subsection 10.1(6) applies. No election is available for such property.
- `properties[].isEmployeeToolProperty`: Subsection 97(5): the property was an employee's tool. Required on a capital_depreciable row; the transferee-side comparator then becomes the individual's cost read without subsection 8(7). Null on any other category.
- `properties[].isPassengerVehicleCostOverPrescribedAmount`: Subparagraph 85(1)(e.4)(i): the property is a passenger vehicle the cost of which to the taxpayer was more than the prescribed amount (Regulation 7307(1)). With the party-level arm's-length answer it deems the agreed amount to the undepreciated capital cost of the class. Required on a capital_depreciable row; null on any other category.
- `properties[].isPurchasedInventory`: Paragraph 85(1)(c.2)(i), as applied by paragraph 97(2)(a): whether this cash-method farming-business inventory was purchased by the taxpayer. Required when category is inventory_cash_method_farm; null on other categories. False identifies raised inventory, for which paragraph (c.2) displaces the (c.1) floor but does not apply the (A × B/C) + D deeming.
- `properties[].isTaxableCanadianProperty`: Paragraph 97(2)(c): where the property is taxable Canadian property, the partnership interest received as consideration is deemed to be taxable Canadian property for 60 months.
- `properties[].isZeroEmissionPassengerVehicle13_7_i`: Paragraph 85(1)(e.5): the property is a zero-emission passenger vehicle to which paragraph 13(7)(i) applies. With the party-level arm's-length answer it deems the agreed amount to the subsection 248(1) COST AMOUNT of the vehicle — a proportion of the class undepreciated capital cost, not the whole of it. Mutually exclusive with isPassengerVehicleCostOverPrescribedAmount because the subsection 248(1) definition of passenger vehicle excludes a zero-emission vehicle. Required on a capital_depreciable row; null on any other category.
- `properties[].partnershipInterestFmvReceived`: Paragraph 85(1)(e.2)(i) as applied by paragraph 97(2)(a): the fair market value, immediately after the disposition, of the INTEREST IN THE PARTNERSHIP received for this property. With bootFmv it is the whole consideration received, and paragraph 85(1)(e.2) mandatorily raises the elected amount where the property's fair market value exceeds that consideration and part of the excess is a benefit conferred on a related person. Null is UNANSWERED and the election fails closed on it.
- `properties[].prescribedClass`: Prescribed class of depreciable property. Required on a capital_depreciable row because subsection 13(1) recapture and the paragraph 85(1)(e.1) ordered disposal both operate on the class pool, never on one property. Null on any other category.

### Strict profile accepted values (25 of 49 cells)

These values apply only when the request sends this target's `payloadContract` selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.

| Cell | Accepted values |
| --- | --- |
| partnership.fiscalPeriodEnd | date (YYYY-MM-DD); at most 10 characters |
| partnership.priorInterestAcb | -600000000000 to 600000000000 |
| party.dispositionDate | date (YYYY-MM-DD); at most 10 characters |
| party.electionDueDate | date (YYYY-MM-DD); 1 to 2000 characters |
| party.electionFilingDate | date (YYYY-MM-DD); 1 to 2000 characters |
| properties[].acb | 0 to 600000000000 |
| properties[].agreedAmount | 0 to 600000000000 |
| properties[].benefitToRelatedMemberAmount | 0 to 600000000000 |
| properties[].bootFmv | 0 to 600000000000 |
| properties[].c2AmountA | 0 to 600000000000 |
| properties[].c2DesignatedD | 0 to 600000000000 |
| properties[].c2ValueB | 0 to 600000000000 |
| properties[].c2ValueC | 0 to 600000000000 |
| properties[].capitalCost | 0 to 600000000000 |
| properties[].category | one of "capital_non_depreciable", "capital_depreciable", "inventory_non_real", "inventory_cash_method_farm", "canadian_resource", "foreign_resource" |
| properties[].classUndisposedCapitalCost | 0 to 600000000000 |
| properties[].costAmount | 0 to 600000000000 |
| properties[].description | 1 to 2000 characters |
| properties[].dispositionOrder | 1 to 10000 |
| properties[].employeeToolOriginalCost | 0 to 600000000000 |
| properties[].fmv | 0 to 600000000000 |
| properties[].partnershipInterestFmvReceived | 0 to 600000000000 |
| properties[].prescribedClass | 1 to 2000 characters |
| properties[].rowId | 1 to 2000 characters |
| properties[].uccOfClass | 0 to 600000000000 |

## Output cells (77)

| Cell | Types |
| --- | --- |
| properties[].rowId | string |
| properties[].description | string |
| properties[].category | string |
| properties[].bootFmv | number |
| properties[].floor | number |
| properties[].ceiling | number |
| properties[].deemedAgreedAmount | number |
| properties[].gainTriggered | number |
| properties[].lossTriggered | number |
| properties[].incomeInclusionTriggered | number |
| properties[].recaptureTriggered | null \| number |
| properties[].prescribedClass | null \| string |
| properties[].partnershipDeemedCapitalCost | null \| number |
| properties[].partnershipDeemedPriorCca | null \| number |
| depreciableClasses[].prescribedClass | string |
| depreciableClasses[].openingUcc | number |
| depreciableClasses[].uccCredited | number |
| depreciableClasses[].closingUcc | number |
| depreciableClasses[].recaptureTriggered | number |
| partnershipInterestAcb | null \| number |
| priorInterestAcb | null \| number |
| interestAcbAddition | null \| number |
| interestAcbDeduction | null \| number |
| totalAgreedAmount | null \| number |
| totalGain | null \| number |
| totalCapitalLoss | null \| number |
| totalIncomeInclusion | null \| number |
| totalRecapture | null \| number |
| negativeInterestDeemedGain | null \| number |
| partnershipInterestDeemedTcp | boolean \| null |
| partnershipInterestTcpExpiry | null \| string |
| electionTiming.electionDueDate | string |
| electionTiming.electionFilingDate | string |
| electionTiming.threeYearDay | string |
| electionTiming.isLate | boolean |
| electionTiming.deemedTimelyUnder | null \| string |
| section97_1.reason | string |
| section97_1.properties[].rowId | string |
| section97_1.properties[].description | string |
| section97_1.properties[].category | string |
| section97_1.properties[].deemedProceedsFmv | number |
| section97_1.properties[].costBase | number |
| section97_1.properties[].capitalGain | number |
| section97_1.properties[].capitalLoss | number |
| section97_1.properties[].incomeInclusion | number |
| section97_1.depreciableClasses[].prescribedClass | string |
| section97_1.depreciableClasses[].openingUcc | number |
| section97_1.depreciableClasses[].uccCredited | number |
| section97_1.depreciableClasses[].closingUcc | number |
| section97_1.depreciableClasses[].recaptureTriggered | number |
| section97_1.totalCapitalGain | number |
| section97_1.totalCapitalLoss | number |
| section97_1.totalIncomeInclusion | number |
| section97_1.totalRecapture | number |
| rolloverDeferred | boolean |
| traps[].findingCode | string |
| traps[].filingDisposition | string |
| traps[].citationKey | string |
| traps[].severity | string |
| traps[].title | string |
| traps[].body | string |
| warnings[] | string |
| warnings[].code | string |
| warnings[].findingCode | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severity | string |
| blocking | boolean |
| ready | boolean |
| provisional | boolean |
| citationsApplied[] | string |
| citations[].key | string |
| citations[].section | string |
| citations[].description | string |
| citations[].source_url | string |
| citations[].verified_at | string |
| electionInvalid | boolean |

### Output cell notes

- `properties[].incomeInclusionTriggered`: Signed subsection 9(1) business income on an inventory row. It is not floored at zero: an inventory loss is an ordinary deductible amount, not a denied capital loss.
- `properties[].recaptureTriggered`: Null on a depreciable row. Subsection 13(1) recapture is a CLASS determination reported in depreciableClasses[]; null means "see the class", never nil.
- `properties[].partnershipDeemedCapitalCost`: Paragraph 97(4)(a) or subsection 97(5): capital cost to the partnership deemed equal to the transferor's capital cost. Null where the provision does not arise.
- `properties[].partnershipDeemedPriorCca`: Paragraph 97(4)(b): the excess deemed to have already been allowed to the partnership under regulations made under paragraph 20(1)(a). Null where the provision does not arise.
