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.

Input cells for schedule54
CellTypesRequired
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.integerstrict
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.stringstrict
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.stringstrict
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 | numberstrict
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 | numberstrict
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 | stringstrict
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 | nullstrict
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 | numberstrict
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 | numberstrict
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 | nullstrict
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 | nullstrict
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 | nullstrict
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 | nullstrict
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.booleanstrict
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.booleanstrict
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.booleanstrict
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.booleanstrict
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.booleanstrict
t2Jacket.filingStatus.firstYearAfterAmalgamationbooleanstrict
t2Jacket.filingStatus.subsidiaryWindupS88booleanstrict
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.booleanstrict
t2Jacket.identification.typeOfCorporationstringstrict
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 (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.

Strict profile accepted values for schedule54
CellAccepted values
daysInYear1 to 1000000000000000
fiscalEnddate (YYYY-MM-DD); 10 to 10 characters
fiscalStartdate (YYYY-MM-DD); 10 to 10 characters
schedule54.line100OpeningLrip-1000000000000000 to 1000000000000000
schedule54.line160PriorYearIcDeduction-1000000000000000 to 1000000000000000
schedule54.part2Rows[].adjustmentEventTypeone of "cease_ccpc", "amalgamation", "windup"
schedule54.part2Rows[].date0 to 20000 characters
schedule54.part2Rows[].eligDivsPaidOnDate-1000000000000000 to 1000000000000000
schedule54.priorYearS125Deduction-1000000000000000 to 1000000000000000
t2Jacket.identification.typeOfCorporation0 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 (123)

Paths are relative to this target’s result object in the response.

Output cells for schedule54
CellTypes
amountAnumber
amountAParaBOnlynumber
amountBnumber
amountCnumber
amountDnumber
amountEnumber
amountFnumber
amount_anumber
amount_a_para_b_onlynumber
election89_11Statusarray | boolean | null | number | object | string
eligibleDividendsPaidPart2number
eligibleDividendsPaidSchedule3null | number
fired_gatesobject
form.amountAnumber
form.amountBnumber
form.amountCnumber
form.amountDnumber
form.amountEnumber
form.amountFnumber
form.formWarningsarray
form.line_100number
form.line_140number
form.line_150number
form.line_160_rawnumber
form.line_160_x4number
form.line_190number
form.line_510number
form.line_520number
form.line_540number
form.line_590array | boolean | null | number | object | string
form.part2Table[].c1string
form.part2Table[].c2number
form.part2Table[].c3number
form.part2Table[].c4number
form.part2Table[].c5number
form.part2Table[].c6number
form.part2Table[].c7number
form.part2Table[].c8number
form.part2Table[].c9number
isCreditUnionboolean
line_100number
line_140number
line_150number
line_160number
line_190number
line_200string
line_210number
line_220number
line_230number
line_240number
line_250number
line_260number
line_270number
line_280number
line_510number
line_520number
line_540number
line_540_current_year_componentnumber
line_540_late_designation_reclassifiednumber
line_540_prior_year_tailbacknumber
line_590array | boolean | null | number | object | string
missing_required[]string
paragraphCAmountnumber
paragraph_c_amountnumber
part2Rows[].adjustmentEventTypearray | boolean | null | number | object | string
part2Rows[].designatedInWritingAtPaymentTimeboolean
part2Rows[].designationDatearray | boolean | null | number | object | string
part2Rows[].lateDesignationErdtohTransitionalboolean
part2Rows[].lateDesignationReclassifiedOrdinaryboolean
part2Rows[].line_200string
part2Rows[].line_210number
part2Rows[].line_220number
part2Rows[].line_230number
part2Rows[].line_240number
part2Rows[].line_250number
part2Rows[].line_260number
part2Rows[].line_270number
part2Rows[].line_280number
part2Rows[].paragraphCAntiAvoidanceAppliesboolean
part2Rows[].s89_14_1ReliefGrantedarray | boolean | null | number | object | string
part2Rows[].subsidiaryLastTaxYearEndarray | boolean | null | number | object | string
part2Rows[].paymentTimeGroupIdarray | boolean | null | number | object | string
part2Rows[].paymentTimeCalculationGroupIdstring
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
poolBalanceChangedboolean
priorYearS125Deductionnumber
provisionalboolean
readyboolean
s89_10TransitionAdjustmentarray | boolean | null | number | object | string
s89_11ElectionInPriorYearboolean
s89_8TransitionAdjustmentarray | boolean | null | number | object | string
s89_9TransitionAdjustmentarray | boolean | null | number | object | string
variableEAdjustmentnumber
variableEAppliesboolean
variableERateDatearray | boolean | null | number | object | string
variableESbdRatearray | boolean | null | number | object | string
variable_e_adjustmentnumber
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[].codeWhich continuity obligation this row is about.string
warnings[].gate_idstring
warnings[].filingDispositionstring
warnings[].messagestring
warnings[].severityAlways an error: a divergent or unprovable opening blocks the return.string
warnings[].anchor_fieldstring
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
wasCCPCInPriorYearboolean
wasSubstantiveCCPCInPriorYearboolean
line_590_withheldboolean
Filemark | schedule54 cells