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.

Input cells for schedule91
CellTypesRequired
schedule91.countryTaxpayerIdBox 105 — Taxpayer identification number in country of residence.null | stringstrict
schedule91.countryYearEndBox 110 — Tax year-end in country of residence (YYYY-MM-DD).null | stringstrict
schedule91.part1Part 1 — Treaty-protected business in Canada (null when no Part 1 content).null | object
schedule91.part1.activityCodenull | 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.customersarray
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.employeesobject
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.otherActivitySpecnull | string
schedule91.part1.physicalFacilitiesnull | 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.provincenull | string
schedule91.part1.reg105WaiverAppliednull | string
schedule91.part1.reg105WaiverGrantednull | string
schedule91.part1.revenueFinancingnull | number
schedule91.part1.revenueGoodsSoldnull | number
schedule91.part1.revenueOthernull | number
schedule91.part1.revenueServicesProvidednull | number
schedule91.part1.revenueTotalnull | number
schedule91.part1.subcontractorsobject
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.treatyArticlenull | string
schedule91.part2Part 2 — Disposing of TCP/TPP (null when no Part 2 content).null | object
schedule91.part2.tcpRowsarray
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 | numberstrict
schedule91.part2.tcpRows[].descriptionBox 201 — Description of TCP disposed of.null | stringstrict
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 | numberstrict
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 | stringstrict
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.treatyArticlenull | stringstrict
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 | stringalways
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.

Strict profile accepted values for schedule91
CellAccepted values
schedule91.countryTaxpayerId0 to 20000 characters
schedule91.countryYearEnd0 to 20000 characters
schedule91.part1.activityCodeone of "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11"
schedule91.part1.customerRowsSupplementaryListAttachedone of "Y", "N"
schedule91.part1.physicalFacilitiesone of "Y", "N"
schedule91.part1.provinceone of "AB", "BC", "MB", "NB", "NL", "NT", "NS", "NU", "ON", "PE", "QC", "SK", "YT", "MJ"
schedule91.part1.reg105WaiverAppliedone of "Y", "N"
schedule91.part1.reg105WaiverGrantedone of "Y", "N"
schedule91.part1.t4aNrSlipAttestationone of "ATTACHED", "NOT_REQUIRED"
schedule91.part2.tcpRowsSupplementaryListAttachedone of "Y", "N"
schedule91.part2.tcpRows[].cost-1000000000000000 to 1000000000000000
schedule91.part2.tcpRows[].description0 to 20000 characters
schedule91.part2.tcpRows[].incomeGainLoss-1000000000000000 to 1000000000000000
schedule91.part2.tcpRows[].proceeds-1000000000000000 to 1000000000000000; 0 to 20000 characters
schedule91.part2.tcpRows[].s116ClearanceStatusone of "T2064_CERTIFICATE_ATTACHED", "T2068_CERTIFICATE_ATTACHED", "T2062C_TREATY_EXEMPT_NOTIFICATION_FILED", "NOT_REQUIRED"
schedule91.part2.treatyArticle0 to 20000 characters
taxYearmatches ^\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.

Output cells for schedule91
CellTypes
header.countryTaxpayerIdnull | string
header.countryYearEndnull | string
part1array | boolean | null | number | object | string
part2.tcpRows[].descriptionnull | string
part2.tcpRows[].proceedsnull | number
part2.tcpRows[].costnull | number
part2.tcpRows[].incomeGainLossnull | number
part2.tcpRows[].outlaysAndExpensesarray | boolean | null | number | object | string
part2.tcpRows[].s116ClearanceReasonarray | boolean | null | number | object | string
part2.tcpRows[].s116ClearanceStatusarray | boolean | null | number | object | string
part2.treatyArticlenull | string
part2.tcpRowsSupplementaryListAttachedarray | boolean | null | number | object | string
computed_revenue_totalarray | boolean | null | number | object | string
tcp_computed_gains[]string
warnings[].boxstring
warnings[].citation.applies_to_boxes[]string
warnings[].citation.cra_text_verbatimstring
warnings[].citation.form_idstring
warnings[].citation.form_revisionstring
warnings[].citation.gate_idstring
warnings[].citation.rulestring
warnings[].citation.sourcestring
warnings[].citation.source_urlstring
warnings[].citation.verified_atstring
warnings[].gate_idstring
warnings[].messagestring
warnings[].severitystring
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_gatesobject
provisionalboolean
readyboolean
Filemark | schedule91 cells