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.
{
"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 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.countryTaxpayerIdBox 105 — Taxpayer identification number in country of residence. | null | string | strict |
| schedule91.countryYearEndBox 110 — Tax year-end in country of residence (YYYY-MM-DD). | null | string | strict |
| schedule91.part1Part 1 — Treaty-protected business in Canada (null when no Part 1 content). | null | object | |
| schedule91.part1.activityCode | null | string | |
| schedule91.part1.customerRowsSupplementaryListAttached155 — 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. | null | string | |
| schedule91.part1.customers | array | |
| schedule91.part1.customers[].endDateBox 159 — Contract/project completed (YYYY-MM-DD). | null | string | |
| schedule91.part1.customers[].nameBox 155 — Customer corporation's name. | null | string | |
| schedule91.part1.customers[].startDateBox 158 — Contract/project started (YYYY-MM-DD). | null | string | |
| schedule91.part1.employees | object | |
| schedule91.part1.employees.canadianResidentAmountBox 161 — Salary/wages paid to Canadian-resident employees. | null | number | |
| schedule91.part1.employees.canadianResidentCountBox 160 — Number of Canadian-resident employees. | null | number | |
| schedule91.part1.employees.nonResidentAmountBox 166 — Salary/wages paid to non-resident employees. | null | number | |
| schedule91.part1.employees.nonResidentCountBox 165 — Number of non-resident employees. | null | number | |
| schedule91.part1.employees.nonResidentDaysInCanadaBox 175 — Days non-resident employee physically present in Canada (services-PE trigger). | null | number | |
| schedule91.part1.employees.periodEndBox 171 — Employment period completed (YYYY-MM-DD). | null | string | |
| schedule91.part1.employees.periodStartBox 170 — Employment period started (YYYY-MM-DD). | null | string | |
| schedule91.part1.otherActivitySpec | null | string | |
| schedule91.part1.physicalFacilities | null | string | |
| schedule91.part1.physicalFacilitiesDetail135 detail — nature + address of each facility. Required (non-empty, every row complete) whenever box 135 = "Y"; must be empty otherwise. | array | |
| schedule91.part1.physicalFacilitiesDetail[].addressAddress of the facility in Canada. | null | string | |
| schedule91.part1.physicalFacilitiesDetail[].natureNature of the facility (office, warehouse, workshop, site …). | 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.canadianResidentAmountBox 181 — Fees paid to Canadian-resident subcontractors. | null | number | |
| schedule91.part1.subcontractors.canadianResidentCountBox 180 — Number of Canadian-resident subcontractors. | null | number | |
| schedule91.part1.subcontractors.nonResidentAmountBox 186 — Fees paid to non-resident subcontractors. | null | number | |
| schedule91.part1.subcontractors.nonResidentCountBox 185 — Number of non-resident subcontractors. | null | number | |
| schedule91.part1.subcontractors.nonResidentDaysInCanadaBox 192 — Days non-resident subcontractor physically present in Canada. | null | number | |
| schedule91.part1.subcontractors.periodEndBox 191 — Employment period completed (YYYY-MM-DD). | null | string | |
| schedule91.part1.subcontractors.periodStartBox 190 — Employment period started (YYYY-MM-DD). | null | string | |
| schedule91.part1.t4aNrSlipAttestation155 — "attach copies of all T4A-NR slips". Required once the customer table is populated; null = unanswered and the engine fails closed. | null | string | |
| schedule91.part1.t4aNrSlipAttestationReason155 — reason no T4A-NR slip was required. Mandatory when the attestation is "NOT_REQUIRED". | null | string | |
| schedule91.part1.treatyArticle | null | string | |
| schedule91.part2Part 2 — Disposing of TCP/TPP (null when no Part 2 content). | null | object | |
| schedule91.part2.tcpRows | array | |
| schedule91.part2.tcpRowsSupplementaryListAttachedThe 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. | null | string | |
| schedule91.part2.tcpRows[].costBox 203 — Cost or adjusted cost base. | null | number | strict |
| schedule91.part2.tcpRows[].descriptionBox 201 — Description of TCP disposed of. | null | string | strict |
| schedule91.part2.tcpRows[].incomeGainLossBox 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. | null | number | strict |
| schedule91.part2.tcpRows[].outlaysAndExpensesOutlays 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. | null | number | |
| schedule91.part2.tcpRows[].proceedsBox 202 — Proceeds of disposition. | null | number | string | strict |
| schedule91.part2.tcpRows[].s116ClearanceReasonBox 201 — written reason, mandatory when the status is "T2062C_TREATY_EXEMPT_NOTIFICATION_FILED" or "NOT_REQUIRED". | null | string | |
| schedule91.part2.tcpRows[].s116ClearanceStatusBox 201 — which s.116 clearance applies to this disposition. null = unanswered and the engine fails closed. | null | string | |
| schedule91.part2.treatyArticle | null | string | strict |
| taxYearFour-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. | integer | string | always |
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)
Paths are relative to this target’s result object in the response.
| 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[].codeStable machine identity of the disclosure, independent of its prose. | string |
| warnings[].notesWhat the rate manifest records against the year, including what is still outstanding before the year can be verified. | string |
| warnings[].sectionThe module that emitted the disclosure. | string |
| warnings[].sources[] | string |
| warnings[].taxYearThe taxation year whose rate tables are unverified. | integer |
| warnings[].taxYears[] | integer |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |