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.
{
"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 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.schedule1RelevantMarks the account's concept as one to review for Schedule 1. It does not decide the posting; the classification's line and treatment do. | 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 |
| businessCarriedOnThroughoutByBusinessITA 111(5)(a)(i) conclusion for each named pre-event business. False is a completed No answer; omit an unanswered business. | object | |
| claimMaximumLossesITA 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. | boolean | strict |
| daysInYearInclusive day count for the canonical fiscalStart/fiscalEnd period required by the settled Part I dependency closure. | integer | strict |
| fiscalEnd | string | strict |
| fiscalStart | string | strict |
| incomeStatementFlags.acct-revenue-targetTrue 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. | boolean | strict |
| incomeStatementFlags.acct-tax-penalty-targetTrue 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. | boolean | strict |
| isCCPCThe corporation was a Canadian-controlled private corporation (ITA s.125(7) definition) throughout the taxation year. | boolean | |
| limitedPartnershipClaimDeniedUnder18_2_2Portion 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). | number | |
| lossElections[].requestedAmountThe 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. | integer | strict |
| lossElections[].typeLoss pool class the claim is made against. It must match a pyLossPools row: the election names the pool s.111(1) deducts from. | string | strict |
| lossElections[].yearOfOriginTaxation year the loss arose in, identifying the pool the claim consumes for the s.111(3) continuity. | integer | strict |
| pyLossPools[].applied | object | strict |
| pyLossPools[].originalAmount | integer | strict |
| pyLossPools[].remainingBalance | integer | strict |
| pyLossPools[].type | string | strict |
| pyLossPools[].yearOfOrigin | integer | strict |
| sameOrSimilarBusinessIncomeByBusinessITA 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. | object | |
| schedule4.currentYearNonCapitalLossCurrent-year non-capital loss created per s.111(8) (also present as a current-year pool in newPools / poolContinuity). | number | |
| schedule4.expiredPools | array | |
| schedule4.formPresent when the engine attached the form projection (the batch path). | 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[].yearYear of origin (column 1) — a string identifier, never thousands-separated. | 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[].lossYearStartThe 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. | string | |
| schedule4.poolContinuity[].originalAmount | number | |
| schedule4.poolContinuity[].originalInclusionRateScale: 0–1 fraction. Same scale as Schedule6Data.inclusionRate. | number | |
| schedule4.poolContinuity[].partIVAppliedSeparate s.186(1)(c)/(d) debit ledger; never merged into the Part I `applied` amounts that print on Schedule 4 lines 130/330. | object | |
| schedule4.poolContinuity[].preAoC | boolean | |
| schedule4.poolContinuity[].remainingBalance | number | |
| schedule4.poolContinuity[].taxationYearsElapsedHow 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. | number | |
| schedule4.poolContinuity[].type | string | |
| schedule4.poolContinuity[].yearOfOrigin | number | |
| schedule4.provisional | boolean | |
| schedule4.warnings | array | |
| 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 |
| workpapers | array | strict |
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)
Paths are relative to this target’s result object in the response.
| 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[]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. | 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_335Part 7 limited-partnership deduction included in lossesApplied (T2 line 335). | number |
| restrictedInterestApplied_line_336Part 8 RIFE deduction included in lossesApplied (T2 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 |