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.
| Cell | Types | Required |
|---|---|---|
| fiscalEndExact taxation-year end used to test the EPSP payment window. | string | strict |
| fiscalStartExact taxation-year start used to test the EPSP payment window. | string | strict |
| schedule15.amountBThe financial-statement deduction, pinned to one exact value by this profile. | null | number | strict |
| 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 | null | strict |
| schedule15.dpspNonComplianceConcernLegacy compatibility field; ignored by the current Schedule 15 validator. | boolean | null | |
| schedule15.planRows | array | |
| 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 | string | strict |
| 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 | string | strict |
| 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 | string | strict |
| 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 | string | strict |
| schedule15.planRows[].planTypeExact printed code 4 for EPSP. | null | number | strict |
| 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 | string | always |
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.
| Cell | Accepted values |
|---|---|
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule15.amountB | -1000000000000000 to 1000000000000000 |
| schedule15.planRows[].contributionAmount | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule15.planRows[].epspPaymentDate | 0 to 20000 characters |
| schedule15.planRows[].epspTrustAddress | matches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule15.planRows[].epspTrustName | matches ^\S(?:[^\r\n\u000B\u000C\u0085\u2028\u2029]*\S)?$; 1 to 10000 characters |
| schedule15.planRows[].planType | -1000000000000000 to 1000000000000000 |
| taxYear | matches ^\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.
| Cell | Types |
|---|---|
| line_100 | integer |
| line_200 | number |
| line_300 | null |
| 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[].planType | integer |
| planRows[].planTypeLabel | string |
| planRows[].contributionAmount | number |
| planRows[].registrationNumber | null |
| 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[].t4psFiledBy | null |
| 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_count | integer |
| counts_by_plan_type | object |
| contributions_by_plan_type | object |
| amount_a | number |
| amount_b | number |
| amount_c | number |
| line_on_s1 | integer |
| 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[].severity | string |
| warnings[].message | string |
| warnings[].gate_id | string |
| warnings[].citation | object |
| 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 |
| provisional | boolean |
| 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_required | array |
| coverageStatus | string |
| coverageReason | string |
| formId | string |
| formRevision | string |
| taxYear | integer |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |