schedule15

T2 Corporation Income Tax Return

Kind
batch
Supported tax years
2013 and later
Strict profile
s15_versioned_profile_target_value_v1
Payload schema version
0.8.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": [
    "schedule15"
  ],
  "inputs": {
    "taxYear": 2025,
    "fiscalStart": "2025-01-01",
    "fiscalEnd": "2025-12-31",
    "schedule15": {
      "corpDeductedPlanContributions": true,
      "planRows": [
        {
          "planType": 4,
          "contributionAmount": 1000,
          "epspTrustName": "Employee Profit Sharing Trust",
          "epspTrustAddress": "100 Main Street, Toronto ON",
          "epspTrustIsResident": true,
          "epspPaymentDate": "2025-06-30"
        }
      ],
      "amountB": 250
    }
  }
}

Input cells (20)

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 schedule15
CellTypesRequired
fiscalEndExact taxation-year end used to test the EPSP payment window.stringstrict
fiscalStartExact taxation-year start used to test the EPSP payment window.stringstrict
schedule15.amountBThe financial-statement deduction, pinned to one exact value by this profile.null | numberstrict
schedule15.borrowedToFundContributionsLegacy compatibility field; ignored by the current Schedule 15 validator.boolean | null
schedule15.corpDeductedPlanContributionsSubmitted true form-applicability assertion only; it does not independently prove statutory deduction eligibility.boolean | nullstrict
schedule15.dpspNonComplianceConcernLegacy compatibility field; ignored by the current Schedule 15 validator.boolean | null
schedule15.planRowsarray
schedule15.planRows[].contributionAmountThe column 200 amount, pinned to one exact value by this profile. Sending it does not establish that every condition in ITA 144(5) and paragraph 20(1)(w) is met.null | number | stringstrict
schedule15.planRows[].dpspPaymentDateDPSP rows (code 3) — ITA 147(8) via 20(1)(y): "an amount paid by the employer in the year or within 120 days after the end of the year to a trustee under a deferred profit sharing plan".null | string
schedule15.planRows[].epspPaymentDateExact in-period EPSP payment date used with fiscalStart and fiscalEnd to test ITA 144(5).null | stringstrict
schedule15.planRows[].epspTrustAddressA single line of text with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a trust-residence determination, or a legal-identity check.null | stringstrict
schedule15.planRows[].epspTrustIsResidentWhether the trust that governs this EPSP is resident in Canada. Strict tri-state, and all three answers are admitted here. true leaves line 600 correctly blank, because the T2 SCH 15 E (13) column-600 instruction asks for the T4PS filer code only where the trust is not resident. false meets that condition, so a missing filer code then blocks at error severity. null is unanswered and also blocks at error severity: the residence answer is what decides whether box 600 is prescribed information for the row, so a blank box 600 cannot be read as complete while it is undetermined. A trust address does not establish residence, and an answer here does not establish T4PS compliance.boolean | null
schedule15.planRows[].epspTrustNameA single line of text with at least one character and no leading or trailing whitespace. The 10,000-character ceiling is a Filemark limit, not a CRA field limit, a trust-residence determination, or a legal-identity check.null | stringstrict
schedule15.planRows[].planTypeExact printed code 4 for EPSP.null | numberstrict
schedule15.planRows[].prppPaymentDatePRPP rows (code 5) — ITA 147.5(10) via 20(1)(q): "a contribution made by the taxpayer in the year or within 120 days after the end of the year to a PRPP".null | string
schedule15.planRows[].registrationNumberColumn 300. Used for codes 1/2/3/5; not used for code 4 (EPSP).null | string
schedule15.planRows[].rppPaymentDateRPP rows (code 1) — ITA 147.2(1) via 20(1)(q): "a contribution made by the employer after 1990 and either in the taxation year or within 120 days after the end of the taxation year to a registered pension plan".null | string
schedule15.planRows[].rsubpPaymentDateRSUBP rows (code 2) — ITA 145(5): "An amount paid by an employer to a trustee under a registered supplementary unemployment benefit plan during a taxation year or within 30 days thereafter may be deducted".null | string
schedule15.planRows[].t4psFiledByColumn 600. For a non-resident EPSP trust, last-calendar-year T4PS filer: 1=Trustee, 2=Employer.integer | null
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 (9 of 20 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 schedule15
CellAccepted values
fiscalEnddate (YYYY-MM-DD); 10 to 10 characters
fiscalStartdate (YYYY-MM-DD); 10 to 10 characters
schedule15.amountB-1000000000000000 to 1000000000000000
schedule15.planRows[].contributionAmount-1000000000000000 to 1000000000000000; 0 to 20000 characters
schedule15.planRows[].epspPaymentDate0 to 20000 characters
schedule15.planRows[].epspTrustAddressmatches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters
schedule15.planRows[].epspTrustNamematches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters
schedule15.planRows[].planType-1000000000000000 to 1000000000000000
taxYearmatches ^\s*(?:1[0-9]{3}|2(?:0(?:[0-1][0-9]{1}|2[0-7])))\s*$; 1000 to 2027

Output cells (46)

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

Output cells for schedule15
CellTypes
line_100integer
line_200number
line_300null
line_400The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.string
line_500The single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.string
line_600Null is the exact observed current engine output for this branch. With the residence fact unanswered, the input does not establish whether the form's non-resident-trust condition applies, so null is not proof of correctness, completeness, or T4PS compliance.null
planRows[].planTypeinteger
planRows[].planTypeLabelstring
planRows[].contributionAmountnumber
planRows[].registrationNumbernull
planRows[].rsubpPaymentDateNull is the exact observed current engine output for this EPSP branch. The RSUBP payment-date field is only carried for plan code 2.null
planRows[].epspTrustNameThe single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.string
planRows[].epspTrustAddressThe single-line text you submitted, echoed back. It is not a legal-identity check or proof of trust residence.string
planRows[].epspTrustIsResidentTri-state Filemark practitioner fact (not a CRA box). Null on this branch: the residence conclusion is UNANSWERED, which is not proof of trust residence either way. The answered states are their own result branches — epspRowResidentTrust and epspRowNonResidentTrust.boolean | null
planRows[].t4psFiledBynull
planRows[].planPaymentDateThe admitted EPSP payment date used to test the ITA 144(5) timing limb.string
planRows[].paymentWindowBreachedWhether the row's payment date fell outside its own statutory window, in which case its column-200 amount is excluded from amount A. False here because 2025-06-30 is inside the admitted 2025 taxation year.boolean
plan_row_countinteger
counts_by_plan_typeobject
contributions_by_plan_typeobject
amount_anumber
amount_bnumber
amount_cnumber
line_on_s1integer
warnings[].boxNull is exact current engine output: the demand is row-scoped, not box-scoped, because box 600 is not yet known to apply.null | string
warnings[].severitystring
warnings[].messagestring
warnings[].gate_idstring
warnings[].citationobject
fired_gatesExact current metadata for the ten gates an EPSP row reaches once the box-600 question is live. Both residence states that leave a blank box 600 unexplained reach it: an answered NON-RESIDENT trust, and an UNANSWERED fact, which consults the gate in order to raise its error-severity demand.object
provisionalboolean
readyMechanical engine readiness only; it is not proof of trust residence, legal eligibility, filing completeness, or T4PS compliance.boolean
missing_required[]string
amount_a_excluded_out_of_windowColumn-200 amounts kept OUT of amount A because their statutory payment window was breached. Amount A plus this equals the roster total in contributions_by_plan_type. 0 here because the admitted payment date is inside the supplied taxation year.number
amountBEcho of the consumed s15:amountB preparer input (equals amount_b; F-B2 close-out: published so the form's schedule-input reference-integrity check resolves).number
warningsNo findings are emitted: trust residence is answered and the admitted payment date is inside the supplied taxation year.array
missing_requiredarray
coverageStatusstring
coverageReasonstring
formIdstring
formRevisionstring
taxYearinteger
warnings[].codestring
warnings[].notesstring
warnings[].sectionstring
warnings[].taxYearinteger
Filemark | schedule15 cells