schedule23
T2 Corporation Income Tax Return
- Kind
- batch
- Supported tax years
- 2019 and later
- Strict profile
- s23_2025_two_code1_cad_v1
- Payload schema version
- 0.6.0
- Dependencies (run automatically)
- schedule28
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": [
"schedule23"
],
"inputs": {
"taxYear": 2025,
"schedule23": {
"calendarYear": 2025,
"isAmendedAgreement": false,
"rows": [
{
"name": "Cedar Ridge Manufacturing Inc.",
"businessNumber": "123456782RC0001",
"associationCode": 1,
"businessLimitBeforeAllocation": 500000,
"percentageOfBusinessLimit": 60,
"businessLimitAllocated": 300000
},
{
"name": "Birchline Tools Ltd.",
"businessNumber": "222222226RC0001",
"associationCode": 1,
"businessLimitBeforeAllocation": 500000,
"percentageOfBusinessLimit": 40,
"businessLimitAllocated": 200000
}
]
}
}
}Input cells (17)
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 |
|---|---|---|
| schedule23.calendarYearBox 050, the calendar year the agreement applies to. The engine's own sanity range; it must also equal the calendar year in which the return's tax year ends, which the engine reconciles rather than the boundary. | null | number | strict |
| schedule23.isAmendedAgreementBox 075. Either answer is admitted. True asserts only the submitted JSON value; it is not evidence that an original agreement exists, was filed, or was accepted. | boolean | null | strict |
| schedule23.rowsRows of associated corporations in the group. Practitioner adds one row per corporation (including the filing corp itself). Empty rows are elided by the backend. | array | |
| schedule23.rows[].associationCodeColumn 3, box 300. Codes 1 (associated for the allocation), 3 (non-CCPC third corporation) and 4 (associated non-CCPC). Codes 2 and 5 are excluded: both are defined by a third corporation having FILED the Schedule 28 election under ITA subparagraph 256(2)(b)(ii), this payload has no field able to evidence that filing, and the engine therefore fails them closed unconditionally. Codes 3 and 4 require column 4 to be 0 and take no percentage. | integer | null | object | strict |
| schedule23.rows[].businessLimitAllocatedColumn 6, box 400. Optional: supply the explicit amount, or omit the key (or send null) to take the engine's computed column 4 x column 5 / 100 substitution, which raises the advisory box_400_blank_uses_computed_value warning on a code-1 row. A supplied value that disagrees with the computation is admitted and answered by box_400_equals_column_4_times_column_5. | null | number | |
| schedule23.rows[].businessLimitBeforeAllocationColumn 4, Filemark-synthetic box 320. Nonnegative amount capped at the ITA s.125(2) federal business-limit baseline. Code 1 must equal that pre-allocation baseline (box_320_code_1_equals_federal_baseline); amounts above it fire box_320_business_limit_at_most_federal_limit. Must be 0 for codes 2, 3, and 4 per the printed column instruction. | null | number | strict |
| schedule23.rows[].businessNumberColumn 2, box 200. Either the CRA 15-character program account (9 digits + 2 uppercase letters + 4 digits) or the 'NR' sentinel for an unregistered corporation. Syntactic only: no checksum, registration, identity, CCPC-status, or association claim. Repeating a registered number across rows is admitted and answered by the engine's duplicate_registered_business_number gate. | null | string | strict |
| schedule23.rows[].nameColumn 1, box 100. Free corporation label; not a legal-name or identity assertion and not verified against any registry. | null | string | strict |
| schedule23.rows[].percentageOfBusinessLimitColumn 5, box 350, in percent units. Only code-1 rows may carry a non-zero percentage, and the column-5 total across rows must not exceed 100; both are engine gates rather than boundary rejections. | null | number | strict |
| schedule23.rows[].thirdCorporationBusinessNumberFilemark evidence for a code-5 row using the automatic s.256(2)(b)(i) branch: the code-3 non-CCPC third corporation that is common to the filer and this row. Not a printed Schedule 23 column. | null | string | |
| schedule23.thirdCorporationSchedule28ElectionsITA 256(2)(b)(ii) evidence for association codes 2/5. OPTIONAL: blobs persisted before this capture surface existed do not carry the key, and an absent key is not an empty answer — the S23 code-2/5 gate keeps blocking until evidence is entered. | array | |
| schedule23.thirdCorporationSchedule28Elections[].businessNumberThe ELECTING third corporation's business number — nine-digit root or the full 15-character program account. "NR" is not accepted: it cannot identify which corporation elected. | null | string | |
| schedule23.thirdCorporationSchedule28Elections[].coveredCorporationBusinessNumbersBusiness numbers of the corporations enumerated on that filed Schedule 28. At least two distinct registered BN roots are required; the electing third corporation itself is not one of them. An empty list is unanswered and contributes no evidence. | array | |
| schedule23.thirdCorporationSchedule28Elections[].electionTaxYearEndThe taxation year end the third corporation's Schedule 28 election was filed for (ISO YYYY-MM-DD). ITA 256(2)(b)(ii) requires the election to be made "in its taxation year that includes the particular time", so this is bound to the filer's period by the backend. | null | string | |
| schedule23.thirdCorporationSchedule28Elections[].electionTaxYearStartStart of the third corporation's election taxation year (ISO YYYY-MM-DD). Together with the end, this proves actual period overlap. | null | string | |
| schedule23.thirdCorporationSchedule28Elections[].filedSchedule28ConfirmedExplicit confirmation that the election was FILED. null = unanswered. Anything other than true contributes no evidence — never a silent affirmative. | boolean | 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 (8 of 17 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 |
|---|---|
| schedule23.calendarYear | 2019 to 2099 |
| schedule23.rows[].associationCode | one of 1, 3, 4 |
| schedule23.rows[].businessLimitAllocated | 0 to 500000 |
| schedule23.rows[].businessLimitBeforeAllocation | 0 to 500000 |
| schedule23.rows[].businessNumber | matches ^(NR|[0-9]{9}[A-Z]{2}[0-9]{4})$; 0 to 20000 characters |
| schedule23.rows[].name | 1 to 2000 characters |
| schedule23.rows[].percentageOfBusinessLimit | 0 to 100 |
| taxYear | matches ^\s*(?:1[0-9]{3}|2(?:0(?:[0-1][0-9]{1}|2[0-7])))\s*$; 1000 to 2027 |
Output cells (32)
Paths are relative to this target’s result object in the response.
| Cell | Types |
|---|---|
| calendar_year | integer | null |
| is_amended_agreement | boolean | null |
| rows[].associationCode | integer | null |
| rows[].businessLimitAllocated | number |
| rows[].businessLimitBeforeAllocation | number |
| rows[].businessNumber | null | string |
| rows[].name | null | string |
| rows[].percentageOfBusinessLimit | number |
| rows[].thirdCorporationBusinessNumber | array | boolean | null | number | object | string |
| total_allocatedLine A, returned as a decimal string. | string |
| total_percentageReturned as a decimal string. | string |
| 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[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].code | string |
| warnings[].notes | string |
| warnings[].section | string |
| warnings[].taxYear | integer |
| fired_gates | object |
| provisional | boolean |
| ready | boolean |
| section125NotAssociatedBnRoots | array |