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.
{
"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 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 |
|---|---|---|
| daysInYearInclusive 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. | integer | strict |
| fiscalEndLast 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. | string | strict |
| fiscalStartFirst 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. | string | strict |
| schedule54Schedule 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. | object | |
| schedule54.amalgamationOccurredInYearLegacy 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. | boolean | null | |
| schedule54.election89_11Null until any field is answered; the tab collapses an all-null object back to null so an untouched return sends no election blob. | null | object | |
| schedule54.election89_11.electionFiledDateDate (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. | null | string | |
| schedule54.election89_11.ministerialConditionsComplieds.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. | boolean | null | |
| schedule54.election89_11.revocationFiledDateDate (yyyy-mm-dd) the s.89(12) revocation notice was filed; the identical filing-due-date validity test applies. | null | string | |
| schedule54.isCreditUnionWhether 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. | boolean | null | |
| schedule54.line100OpeningLripLine 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. | null | number | strict |
| schedule54.line140PriorYearAiiLine 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. | null | number | |
| schedule54.line160PriorYearIcDeductionLine 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. | null | number | strict |
| schedule54.line510NonEligDivsReceivedLine 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. | null | number | |
| schedule54.line520AdjustmentsLine 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. | null | number | |
| schedule54.line540NonEligDivsPaidLine 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. | null | number | |
| schedule54.line540PriorYearTailbackLine 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. | null | number | |
| schedule54.mic130_1_1DeductibleDividendsPaidLine 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. | null | number | |
| schedule54.part2RowsOrdered list of per-event rows. Engine sorts by date ascending before computing cumulative col 2/5/6 values. | array | |
| schedule54.part2Rows[].adjustmentEventTypeWhich 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. | null | string | |
| schedule54.part2Rows[].adjustmentOnDatePer-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. | null | number | |
| schedule54.part2Rows[].dateColumn 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. | null | string | strict |
| schedule54.part2Rows[].designatedInWritingAtPaymentTimes.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. | boolean | null | strict |
| schedule54.part2Rows[].designationDateDate the s.89(14) written designation was made (yyyy-mm-dd), when it was not made at the payment time. | null | string | |
| schedule54.part2Rows[].eligDivsPaidOnDatePer-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). | null | number | strict |
| schedule54.part2Rows[].lateDesignationErdtohTransitionals.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. | boolean | null | |
| schedule54.part2Rows[].nonEligDivsPaidOnDatePer-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. | null | number | |
| schedule54.part2Rows[].paragraphCAntiAvoidanceAppliesPara (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. | boolean | null | |
| schedule54.part2Rows[].paymentTimeGroupIdStable 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. | null | string | |
| schedule54.part2Rows[].s112DivsBecameReceivableOnDatePer-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. | null | number | |
| schedule54.part2Rows[].s89_14_1ReliefGranteds.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. | boolean | null | |
| schedule54.part2Rows[].subsidiaryLastTaxYearEnds.89(10) wind-ups only: the wound-up subsidiary's last taxation year end (yyyy-mm-dd). The inclusion cannot occur before this date. | null | string | |
| schedule54.priorYearS125DeductionFederal 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. | null | number | strict |
| schedule54.s89_10DissolutionOrWindupOccurredInYearReviewed answer to the broader paragraph 89(10) dissolution-or-winding-up question; box 072 and Schedule 24 cover only the section 88 subset. | boolean | null | strict |
| schedule54.s89_10TransitionAdjustmentSame 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. | null | number | |
| schedule54.s89_11ElectionInPriorYearPrior-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. | boolean | null | strict |
| schedule54.s89_8TransitionAdjustmentExplicit 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. | null | number | |
| schedule54.s89_9TransitionAdjustmentSame 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. | null | number | |
| schedule54.subsidiaryWindupOccurredInYearLegacy 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. | boolean | null | |
| schedule54.wasCCPCInPriorYearDirect 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). | boolean | null | strict |
| schedule54.wasSubstantiveCCPCInPriorYearPrior-year status fact for the s.89(1) LRIP continuity: the corporation was a substantive CCPC (s.248(1)) in the preceding taxation year. | boolean | null | strict |
| t2Jacket.additionalInfo.isCreditUnionThe corporation is a credit union; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code. | boolean | strict |
| t2Jacket.additionalInfo.isDepositInsuranceCorporationThe corporation is a deposit insurance corporation; a legal-status fact the GRIP and LRIP dividend-pool resolution requires beyond the T2 corporation-type code. | boolean | strict |
| t2Jacket.additionalInfo.section89_11ElectionInForceForTaxYearAn 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. | boolean | strict |
| t2Jacket.additionalInfo.substantiveCCPCAnytimeT2 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. | boolean | strict |
| t2Jacket.applicability.lripChangeOrEligDivT2 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. | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| t2Jacket.identification.isResidentOfCanadaT2 box 080: the corporation was resident in Canada in the taxation year. A no answer requires the box 081 country of residence. | boolean | strict |
| t2Jacket.identification.typeOfCorporation | 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 (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)
Paths are relative to this target’s result object in the response.
| 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[].paymentTimeGroupStateThe 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. | 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[].codeWhich continuity obligation this row is about. | string |
| warnings[].gate_id | string |
| warnings[].filingDisposition | string |
| warnings[].message | string |
| warnings[].severityAlways an error: a divergent or unprovable opening blocks the return. | string |
| warnings[].anchor_field | string |
| warnings[].actualThe opening amount this return states. | number |
| warnings[].citation.formThe pinned CRA form revision identifier. | string |
| warnings[].citation.referenceThe lines on that face the opening and closing balances are read from. | string |
| warnings[].expectedThe closing amount the authenticated prior filed return proves, or null when no filed projection exists to reconcile against. | null | number |
| warnings[].keyThe reconciled balance, named for a preparer. | string |
| warnings[].kindAlways the validation family. | string |
| warnings[].reasonWhat broke and what to do about it. | string |
| wasCCPCInPriorYear | boolean |
| wasSubstantiveCCPCInPriorYear | boolean |
| line_590_withheld | boolean |