# Data files

The data file is the JSON document you Base64-encode into `Payload`. Every one has the same two
top-level properties — `InterfaceCode` and `TransformedItems` — and the interface code decides the
shape of the items.

See [Structure and encoding](/products/class/apis/partner/loaded-files/structure) for the encoding step and the shared rules.

Cash
`StagedGenericCash`

Bank statement lines, expenses and custom-holding transactions. All three use this one interface code — the event type on each transaction, and which holding-account identifiers you supply, decide which is which.

A bank statement line arrives in Browse Bank Statements as unmatched. An expense arrives as a business event, also unmatched. Both count as `Successful` once loaded — matching them is a separate step in Class.

**Event types**

Each transaction records exactly one event type, set on its holding account. A bank statement line and the expense that matches it are two separate transactions, each with its own event type.

| Event type | Records | Example to follow |
|  --- | --- | --- |
| `BankStatementLineItem` | A bank statement line | Bank statement lines, or A custom holding transaction |
| `AccountancyFee` | Accountancy fee | An expense with GST, or An expense without GST |
| `ActuarialFee` | Actuarial fee | An expense with GST, or An expense without GST |
| `AdviserFee` | Adviser fee | An expense with GST, or An expense without GST |
| `AuditorFee` | Auditor fee | An expense with GST, or An expense without GST |
| `BankFee` | Bank fee | An expense with GST, or An expense without GST |
| `BankOverdraftInterest` | Bank interest paid | An expense with GST, or An expense without GST |
| `EstablishmentFee` | Establishment fee | An expense with GST, or An expense without GST |
| `Fine` | Fine | An expense with GST, or An expense without GST |
| `FundAdministrationFee` | Fund administration fee | An expense with GST, or An expense without GST |
| `FundGeneralExpense` | Investment management fee | An expense with GST, or An expense without GST |
| `InvestmentGeneralExpense` | General investment expense | An expense with GST, or An expense without GST |
| `LegalFee` | Legal fee | An expense with GST, or An expense without GST |
| `PenaltyInterestPaid` | Penalty interest paid | An expense with GST, or An expense without GST |
| `RegulatoryFee` | Regulatory fee | An expense with GST, or An expense without GST |
| `TrusteeFee` | Trustee fee | An expense with GST, or An expense without GST |


Use `BankStatementLineItem` for a bank statement line, and one of the expense types for an expense. Expense items also carry `GSTAmount` and `NetAmount`.

Two names read the opposite way round to what you might expect: `FundGeneralExpense` is the **investment management fee**, and `InvestmentGeneralExpense` is the **general investment expense**. `BankOverdraftInterest` covers bank interest paid generally, not only overdraft interest.

**Examples**

Bank statement lines
Two bank statement lines, one naming the holding account by `Code` and one by `BankAccount`.

```json
{
  "InterfaceCode": "StagedGenericCash",
  "TransformedItems": [
    {
      "SourceTransactionId": "850004",
      "HoldingAccount": {
        "Code": "CBA-OPERATING",
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "EventTypes": [
          {
            "EventTypeName": "BankStatementLineItem"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "DebitCreditIndicator": "C",
      "TransactionAmount": 1500.0,
      "Description": "Member contribution"
    },
    {
      "SourceTransactionId": "850005",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "BankAccount": {
          "BSB": "062000",
          "AccountNumber": "12345678"
        },
        "EventTypes": [
          {
            "EventTypeName": "BankStatementLineItem"
          }
        ]
      },
      "TransactionDate": "2026-07-04",
      "DebitCreditIndicator": "D",
      "TransactionAmount": 250.0,
      "Description": "Bank transfer out"
    }
  ]
}
```

An expense with GST
An expense with GST. `TransactionAmount` must equal `NetAmount` plus `GSTAmount`.

```json
{
  "InterfaceCode": "StagedGenericCash",
  "TransformedItems": [
    {
      "SourceTransactionId": "446198004",
      "HoldingAccount": {
        "Code": "WESTPAC1",
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "EventTypes": [
          {
            "EventTypeName": "AccountancyFee"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "DebitCreditIndicator": "D",
      "TransactionAmount": 12432.83,
      "GSTAmount": 1130.26,
      "NetAmount": 11302.57,
      "Description": "Annual accounting fee"
    }
  ]
}
```

An expense without GST
A regulatory fee, which carries no GST. `NetAmount` is the full amount and `GSTAmount` is `0` — you can also leave `GSTAmount` out. `NetAmount` is still required.

```json
{
  "InterfaceCode": "StagedGenericCash",
  "TransformedItems": [
    {
      "SourceTransactionId": "EXP-5102",
      "HoldingAccount": {
        "Code": "CBA-OPERATING",
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "EventTypes": [
          {
            "EventTypeName": "RegulatoryFee"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "DebitCreditIndicator": "D",
      "TransactionAmount": 259.0,
      "GSTAmount": 0,
      "NetAmount": 259.0,
      "Description": "ASIC annual review fee"
    }
  ]
}
```

A custom holding transaction
A transaction against a custom holding account, named by `Code`.

```json
{
  "InterfaceCode": "StagedGenericCash",
  "TransformedItems": [
    {
      "SourceTransactionId": "CU-7001",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "Code": "CUSTOMHOLDING1",
        "EventTypes": [
          {
            "EventTypeName": "BankStatementLineItem"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "DebitCreditIndicator": "D",
      "TransactionAmount": 423.0,
      "Description": "Custom holding transaction"
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/CashPayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "HoldingAccountCode": {
        "type": "string",
        "description": "The code of the holding account in Class.",
        "example": "CBA-OPERATING"
      },
      "FundCodeProperty": {
        "type": "string",
        "description": "The code of the fund the line belongs to. Required when submitting at business scope.\nAt fund scope the fund comes from the route, so this may be omitted; if supplied it must match, or the submission is rejected with `STAGING_FUND_ROUTE_MISMATCH`.",
        "example": "SMF001"
      },
      "BrandCodeProperty": {
        "type": "string",
        "description": "The code of the brand the fund sits under.\nSupply this when submitting at business scope to a business that has more than one brand. Without it, the fund lookup for that line fails during processing rather than at submit — the file is accepted and the line appears as a failure on processed-items.\nBrand is a property of each line rather than of the file, so a single submission may span several brands.",
        "example": "MYBRAND"
      },
      "ExternalIdProperty": {
        "type": "string",
        "description": "The Fund Holding Reference (FHR) account number. For a broker holding this is the broker account number, such as a CommSec account number. It must match the account number recorded in Class exactly — a value that does not match fails the transaction with `REFERENCE_LOCATOR_FUND_NOT_FOUND`.\n\nLike `ClientID`, this takes part in the holding lookup rather than being carried through to the transaction, and either property on its own is enough to fail the line with `REFERENCE_LOCATOR_FUND_NOT_FOUND` if its value does not match. Omit it unless you know it matches.",
        "example": "EXT-4417"
      },
      "CurrencyCodeProperty": {
        "type": "string",
        "description": "An ISO 4217 currency code.",
        "example": "AUD"
      },
      "BankAccount": {
        "type": "object",
        "description": "Identifies a bank account by BSB and account number.",
        "properties": {
          "BSB": {
            "type": "string",
            "description": "The six-digit BSB, with or without a separator.",
            "example": "062000"
          },
          "AccountNumber": {
            "type": "string",
            "example": "12345678"
          }
        }
      },
      "CashEventType": {
        "type": "object",
        "required": [
          "EventTypeName"
        ],
        "properties": {
          "EventTypeName": {
            "type": "string",
            "description": "The event type for a cash, expense or custom line. Use `BankStatementLineItem` for a bank statement line, or one of the expense types for an expense.",
            "enum": [
              "BankStatementLineItem",
              "AccountancyFee",
              "ActuarialFee",
              "AdviserFee",
              "AuditorFee",
              "BankFee",
              "BankOverdraftInterest",
              "EstablishmentFee",
              "Fine",
              "FundAdministrationFee",
              "FundGeneralExpense",
              "InvestmentGeneralExpense",
              "LegalFee",
              "PenaltyInterestPaid",
              "RegulatoryFee",
              "TrusteeFee"
            ],
            "example": "BankStatementLineItem"
          }
        }
      },
      "CashHoldingAccount": {
        "type": "object",
        "description": "Identifies the account the transaction belongs to. Supply `Code` for a named holding account, or `BankAccount` to match on BSB and account number.",
        "required": [
          "EventTypes"
        ],
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ExternalId": {
            "$ref": "#/components/schemas/ExternalIdProperty"
          },
          "CurrencyCode": {
            "$ref": "#/components/schemas/CurrencyCodeProperty"
          },
          "BankAccount": {
            "$ref": "#/components/schemas/BankAccount"
          },
          "EventTypes": {
            "type": "array",
            "minItems": 1,
            "description": "The event type for this line. Supply exactly one entry.",
            "items": {
              "$ref": "#/components/schemas/CashEventType"
            }
          }
        }
      },
      "CashItem": {
        "type": "object",
        "description": "One cash, expense or custom transaction. All three come from the same interface code and are told apart by the event type and by which holding-account identifiers you supply.\n\n| Event type | Represents | Also carries | Identified by |\n| --- | --- | --- | --- |\n| `BankStatementLineItem` | A bank statement line | — | `Code`, or `BankAccount` |\n| Any of the fifteen expense types | An expense | `GSTAmount`, `NetAmount` | `Code`, or `BankAccount` |\n| `BankStatementLineItem` against a custom holding | A custom transaction | — | `Code` of the custom holding account |\n\nA bank statement line is raw feed data — Class does not yet know what it represents, so it arrives uncoded and waits to be coded. It does not post a transaction on load, and a file of them completes with zero counts. An expense line is fully specified and needs no further coding.\n",
        "required": [
          "SourceTransactionId",
          "HoldingAccount",
          "TransactionDate",
          "TransactionAmount"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "HoldingAccount": {
            "$ref": "#/components/schemas/CashHoldingAccount"
          },
          "TransactionDate": {
            "type": "string",
            "format": "date",
            "description": "The date of the transaction. Must fall in a financial year the fund has open — a transaction dated in a closed period is discarded without an error.",
            "example": "2026-07-13"
          },
          "DebitCreditIndicator": {
            "type": "string",
            "enum": [
              "D",
              "C"
            ],
            "description": "Whether money is going out of (`D`) or coming into (`C`) the account, as the bank statement shows it. An expense is always recorded as a debit, whichever value is sent.",
            "example": "C"
          },
          "TransactionAmount": {
            "type": "number",
            "description": "The gross amount of the transaction, always positive — direction comes from `DebitCreditIndicator`.\n\nMust be greater than zero. A zero amount fails during processing with `STAGED_DATA_ITEM_CONSUMER_LOAD_FAILED_ALL_RETRIES`, not at submit.",
            "example": 1500
          },
          "GSTAmount": {
            "type": "number",
            "description": "The GST component of an expense. Send `0`, or leave it out, when the expense carries no GST.",
            "example": 136.36
          },
          "NetAmount": {
            "type": "number",
            "description": "The amount of an expense net of GST. Required on an expense: `TransactionAmount` must equal `NetAmount` plus `GSTAmount`, or the transaction fails with `REFERENCE_LOCATOR_DOES_NOT_BALANCE`. For an expense with no GST, set this to the full amount.",
            "example": 1363.64
          },
          "Description": {
            "type": "string",
            "description": "Free-text narration carried through to the transaction in Class. Optional — when omitted, Class uses the event type's display name instead.",
            "example": "Member contribution"
          }
        }
      },
      "CashPayload": {
        "title": "Cash, expense and custom",
        "type": "object",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericCash"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/CashItem"
            }
          }
        }
      }
    }
  }
}
```

Portfolio
`StagedGenericStockMovement`

Acquisitions, disposals, in-specie transfers, capital calls and capital returns.

Income events do not belong here — submit dividends, distributions and interest as `StagedGenericIncome`.

**Event types**

Each transaction records exactly one event type, set on its holding account.

| Event type | Records | Example to follow |
|  --- | --- | --- |
| `OrdinarySharePurchase` | Acquisition of a listed security | A listed security purchase |
| `OrdinaryShareSale` | Disposal of a listed security | A listed security purchase |
| `ManagedFundPurchase` | Acquisition of an unlisted security | A listed security purchase |
| `ManagedFundSale` | Disposal of an unlisted security | A listed security purchase |
| `InSpeciesTransferIn` | Non-cash acquisition | An in-specie transfer |
| `InSpeciesTransferOut` | Non-cash disposal | An in-specie transfer |
| `CapitalCall` | Capital call | A capital call |
| `CapitalReturn` | Capital return | A capital call |


The first four names are narrower than what they cover. `OrdinarySharePurchase` and `OrdinaryShareSale` apply to **any listed security**, not only ordinary shares. `ManagedFundPurchase` and `ManagedFundSale` apply to **any unlisted security**, not only managed funds.

**Examples**

A listed security purchase
An acquisition with brokerage and GST, matched on `InvestmentAccount`.

```json
{
  "InterfaceCode": "StagedGenericStockMovement",
  "TransformedItems": [
    {
      "SourceTransactionId": "PF-4401",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BHP",
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "OrdinarySharePurchase"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "PaymentDate": "2026-07-04",
      "Units": 500,
      "TotalConsideration": 22519.95,
      "MarketValue": 22500.0,
      "BrokerageAmount": 19.95,
      "GST": 1.99,
      "ContractNumber": "CN-12345",
      "Description": "BHP purchase"
    }
  ]
}
```

A capital call
No units and no brokerage — just the amount called.

```json
{
  "InterfaceCode": "StagedGenericStockMovement",
  "TransformedItems": [
    {
      "SourceTransactionId": "PF-4402",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "Code": "PRIVATE-EQUITY-FUND-A",
        "EventTypes": [
          {
            "EventTypeName": "CapitalCall"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "PaymentDate": "2026-07-04",
      "TotalConsideration": 25000.0,
      "Description": "Capital call #4"
    }
  ]
}
```

An in-specie transfer
`InSpeciesTransferIn` — a non-cash acquisition, so there is no brokerage, but it still needs `Units` and a `TotalConsideration` that balances against `MarketValue`.

```json
{
  "InterfaceCode": "StagedGenericStockMovement",
  "TransformedItems": [
    {
      "SourceTransactionId": "PF-4403",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BHP"
        },
        "EventTypes": [
          {
            "EventTypeName": "InSpeciesTransferIn"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "Units": 250,
      "MarketValue": 71297.5,
      "TotalConsideration": 71297.5,
      "Description": "In-specie transfer in from member"
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/StockMovementPayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "HoldingAccountCode": {
        "type": "string",
        "description": "The code of the holding account in Class.",
        "example": "CBA-OPERATING"
      },
      "FundCodeProperty": {
        "type": "string",
        "description": "The code of the fund the line belongs to. Required when submitting at business scope.\nAt fund scope the fund comes from the route, so this may be omitted; if supplied it must match, or the submission is rejected with `STAGING_FUND_ROUTE_MISMATCH`.",
        "example": "SMF001"
      },
      "BrandCodeProperty": {
        "type": "string",
        "description": "The code of the brand the fund sits under.\nSupply this when submitting at business scope to a business that has more than one brand. Without it, the fund lookup for that line fails during processing rather than at submit — the file is accepted and the line appears as a failure on processed-items.\nBrand is a property of each line rather than of the file, so a single submission may span several brands.",
        "example": "MYBRAND"
      },
      "ExternalIdProperty": {
        "type": "string",
        "description": "The Fund Holding Reference (FHR) account number. For a broker holding this is the broker account number, such as a CommSec account number. It must match the account number recorded in Class exactly — a value that does not match fails the transaction with `REFERENCE_LOCATOR_FUND_NOT_FOUND`.\n\nLike `ClientID`, this takes part in the holding lookup rather than being carried through to the transaction, and either property on its own is enough to fail the line with `REFERENCE_LOCATOR_FUND_NOT_FOUND` if its value does not match. Omit it unless you know it matches.",
        "example": "EXT-4417"
      },
      "CurrencyCodeProperty": {
        "type": "string",
        "description": "An ISO 4217 currency code.",
        "example": "AUD"
      },
      "InvestmentAccount": {
        "type": "object",
        "description": "Identifies an investment holding.\n\n`SecurityCode`, `HIN` and `SRN` are alternative ways of locating the holding, not\ncomplementary details about it. Supplying a `HIN` or `SRN` makes that the value the\nlookup runs on, and one that does not match a holding in the fund fails even when\n`SecurityCode` and `FundCode` are both correct.\n\nSupply `SecurityCode` on its own unless the fund holds the same security through more\nthan one broker, in which case the holder number is what tells them apart.\n\n`SecurityTypeCode` is not part of this object and is rejected with\n`STAGING_INVALID_FIELD` if supplied.\n",
        "required": [
          "SecurityCode"
        ],
        "properties": {
          "SecurityCode": {
            "type": "string",
            "description": "The security or issue code, for example an ASX ticker.",
            "example": "BHP"
          },
          "HIN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Holder Identification Number, for CHESS-sponsored holdings. Supplying this makes it the value the holding lookup runs on. Omit it unless you need it to disambiguate.",
            "example": "X0001234567"
          },
          "SRN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Securityholder Reference Number, for issuer-sponsored holdings. Supplying this makes it the value the holding lookup runs on.",
            "example": "I0001234567"
          }
        }
      },
      "StockMovementEventType": {
        "type": "object",
        "required": [
          "EventTypeName"
        ],
        "properties": {
          "EventTypeName": {
            "type": "string",
            "description": "The portfolio movement type.",
            "enum": [
              "OrdinarySharePurchase",
              "OrdinaryShareSale",
              "ManagedFundPurchase",
              "ManagedFundSale",
              "InSpeciesTransferIn",
              "InSpeciesTransferOut",
              "CapitalCall",
              "CapitalReturn"
            ],
            "example": "OrdinarySharePurchase"
          }
        }
      },
      "StockMovementHoldingAccount": {
        "type": "object",
        "description": "Identifies the investment holding the movement applies to.",
        "required": [
          "EventTypes"
        ],
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ExternalId": {
            "$ref": "#/components/schemas/ExternalIdProperty"
          },
          "CurrencyCode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CurrencyCodeProperty"
              }
            ],
            "description": "The currency of the holding, for foreign-currency investments.\nKnown issue: supplying `CurrencyCode` and `Exchange` together on the same holding account currently causes the file to fail schema validation downstream. Supply one or the other until this is resolved."
          },
          "Exchange": {
            "type": "string",
            "description": "The exchange the security trades on. See the note on `CurrencyCode` before using this property.",
            "example": "ASX"
          },
          "BrokerageCurrency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CurrencyCodeProperty"
              }
            ],
            "description": "The currency brokerage was charged in, where it differs from the holding currency."
          },
          "InvestmentAccount": {
            "$ref": "#/components/schemas/InvestmentAccount"
          },
          "EventTypes": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/StockMovementEventType"
            }
          }
        }
      },
      "StockMovementItem": {
        "type": "object",
        "description": "One portfolio movement — an acquisition, disposal, in-specie transfer, capital call or\ncapital return.\n\n**An acquisition or disposal has to balance.** `TotalConsideration` must equal\n`MarketValue` plus `BrokerageAmount`, and `Units` must be present. A line that does not\nbalance fails with `REFERENCE_LOCATOR_DOES_NOT_BALANCE`, which names the symptom rather\nthan the missing field — a bare `TotalConsideration` with no market value is the usual\ncause.\n\nEvents that move no units, such as a capital call or capital return, are not subject to\nthis.\n",
        "required": [
          "SourceTransactionId",
          "HoldingAccount"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "HoldingAccount": {
            "$ref": "#/components/schemas/StockMovementHoldingAccount"
          },
          "RecordedDate": {
            "type": "string",
            "format": "date",
            "description": "The trade or contract date.",
            "example": "2026-07-13"
          },
          "PaymentDate": {
            "type": "string",
            "format": "date",
            "description": "The settlement date.",
            "example": "2026-07-16"
          },
          "CGTDate": {
            "type": "string",
            "format": "date",
            "description": "The date used for capital gains purposes, where it differs from the trade date.",
            "example": "2026-07-13"
          },
          "Units": {
            "type": "number",
            "description": "The number of units or shares moved.\n\nAn acquisition or disposal needs both `Units` and `TotalConsideration`: supplying a consideration with no units fails with `REFERENCE_LOCATOR_DOES_NOT_BALANCE`. Events that move no units, such as a capital call, do not need it.",
            "example": 500
          },
          "TotalConsideration": {
            "type": "number",
            "description": "The total value of the movement, including brokerage.",
            "example": 22500
          },
          "MarketValue": {
            "type": "number",
            "description": "The market value at the date of the movement.",
            "example": 22350
          },
          "BrokerageAmount": {
            "type": "number",
            "example": 19.95
          },
          "GST": {
            "type": "number",
            "description": "The GST on brokerage. Must not exceed `BrokerageAmount`, or the line fails with `GST_EXCEEDS_BROKERAGE_RULE`.",
            "example": 1.99
          },
          "AccountNumber": {
            "type": "string",
            "description": "The broker account the movement was executed through. Optional; an omitted, null or whitespace-only value is accepted.",
            "example": "10045566"
          },
          "ContractNumber": {
            "type": "string",
            "description": "The broker contract note number. Optional on the same terms as `AccountNumber`. Supply it as a string even when the source system holds it as a number.",
            "example": "CN-12345"
          },
          "Description": {
            "type": "string",
            "example": "BHP purchase"
          }
        }
      },
      "StockMovementPayload": {
        "title": "Portfolio",
        "type": "object",
        "description": "The decoded `Payload` for `StagedGenericStockMovement`.\nOnly movement events belong here. Income events — dividends, distributions, interest — belong in a `StagedGenericIncome` file.",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericStockMovement"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/StockMovementItem"
            }
          }
        }
      }
    }
  }
}
```

Income
`StagedGenericIncome`

Dividends, distributions, interest receipts and rebates.

Most properties on an income item are tax-statement components. A tax-statement distribution uses many of them; a cash dividend or an interest receipt uses very few.

**Event types**

Each transaction records exactly one event type, set on its holding account.

| Event type | Records | Example to follow |
|  --- | --- | --- |
| `OrdinaryShareDividend` | Dividend paid in cash | A dividend and an interest receipt |
| `DividendReinvestmentPlan` | Dividend taken as reinvestment | A dividend and an interest receipt |
| `ForeignIncome` | Foreign dividend | A dividend and an interest receipt |
| `InitialManagedFundDistribution` | Distribution paid in cash | A dividend and an interest receipt |
| `ManagedFundDistributionReinvestment` | Distribution taken as reinvestment | A dividend and an interest receipt |
| `FinalManagedFundDistribution` | Distribution with a tax statement | A tax-statement distribution |
| `BankInterest` | Interest received, from any source | A dividend and an interest receipt |
| `InvestmentFeeRebateCash` | Investment fee rebate paid in cash | A dividend and an interest receipt |
| `Rebate` | Investment fee rebate taken as reinvestment | A dividend and an interest receipt |
| `PlatformRealisedGainLoss` | Realised accounting gain or loss | A realised gain |


Three of these are easy to misread:

- `FinalManagedFundDistribution` is the distribution carrying a **tax statement**, not the last distribution of a period. It is the event that uses the capital gains, foreign income and AMIT properties.
- `Rebate` is the **reinvested** fee rebate — it posts as Investment Fee Rebate - Reinvestment. For one paid in cash use `InvestmentFeeRebateCash`.
- `BankInterest` covers interest from a bank account, a term deposit or any other source.


**Examples**

A dividend and an interest receipt
The shape most income events use — dates, gross and net, and whichever components the event carries. A franked dividend matched on `InvestmentAccount`, and bank interest matched on its holding code.

```json
{
  "InterfaceCode": "StagedGenericIncome",
  "TransformedItems": [
    {
      "SourceTransactionId": "IN-9001",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BHP",
          "HIN": null,
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "OrdinaryShareDividend"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "PaymentDate": "2026-07-04",
      "GrossPayment": 1250.0,
      "NetPayment": 1250.0,
      "FrankedAmount": 1250.0,
      "FrankingCredit": 535.71,
      "ParticipatingQuantity": 1000,
      "Description": "BHP final dividend"
    },
    {
      "SourceTransactionId": "IN-9002",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "EventTypes": [
          {
            "EventTypeName": "BankInterest"
          }
        ],
        "Code": "CBA-OPERATING"
      },
      "RecordedDate": "2026-07-01",
      "ReceiptDate": "2026-07-01",
      "GrossPayment": 84.22,
      "NetPayment": 84.22,
      "Interest": 84.22,
      "Description": "Interest to 30 June"
    }
  ]
}
```

A tax-statement distribution
`FinalManagedFundDistribution` — the event that uses the capital gains, foreign income and AMIT properties.

```json
{
  "InterfaceCode": "StagedGenericIncome",
  "TransformedItems": [
    {
      "SourceTransactionId": "IN-9003",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "VAS",
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "FinalManagedFundDistribution"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "PaymentDate": "2026-07-04",
      "GrossPayment": 4820.55,
      "NetPayment": 4820.55,
      "FrankedAmount": 1210.0,
      "FrankingCredit": 518.57,
      "UnfrankedAmount": 640.2,
      "Interest": 88.1,
      "OtherIncome": 215.0,
      "TaxDeferredAmounts": 310.25,
      "TaxFreeAmounts": 42.0,
      "CapitalGainsDiscountMethod": 980.0,
      "DiscountedCapitalGainDomestic": 490.0,
      "CGTConcessionAmount": 490.0,
      "ForeignTaxCredits": 31.4,
      "AmitCostbaseNetAmount": -268.25,
      "ParticipatingQuantity": 2400,
      "Description": "VAS annual tax statement"
    }
  ]
}
```

A realised gain
`PlatformRealisedGainLoss` — uses the gain and loss properties, which no other income event touches.

```json
{
  "InterfaceCode": "StagedGenericIncome",
  "TransformedItems": [
    {
      "SourceTransactionId": "IN-9004",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "PLATINUM-ASIA"
        },
        "EventTypes": [
          {
            "EventTypeName": "PlatformRealisedGainLoss"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "PaymentDate": "2026-07-04",
      "GrossPayment": 1840.0,
      "NetPayment": 1840.0,
      "GainLossAmount": 1840.0,
      "DiscountableGain": 1200.0,
      "OtherGain": 640.0,
      "IndexedGain": 0,
      "CapitalLoss": 0,
      "Description": "Realised gain on partial redemption"
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/IncomePayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "HoldingAccountCode": {
        "type": "string",
        "description": "The code of the holding account in Class.",
        "example": "CBA-OPERATING"
      },
      "FundCodeProperty": {
        "type": "string",
        "description": "The code of the fund the line belongs to. Required when submitting at business scope.\nAt fund scope the fund comes from the route, so this may be omitted; if supplied it must match, or the submission is rejected with `STAGING_FUND_ROUTE_MISMATCH`.",
        "example": "SMF001"
      },
      "BrandCodeProperty": {
        "type": "string",
        "description": "The code of the brand the fund sits under.\nSupply this when submitting at business scope to a business that has more than one brand. Without it, the fund lookup for that line fails during processing rather than at submit — the file is accepted and the line appears as a failure on processed-items.\nBrand is a property of each line rather than of the file, so a single submission may span several brands.",
        "example": "MYBRAND"
      },
      "ExternalIdProperty": {
        "type": "string",
        "description": "The Fund Holding Reference (FHR) account number. For a broker holding this is the broker account number, such as a CommSec account number. It must match the account number recorded in Class exactly — a value that does not match fails the transaction with `REFERENCE_LOCATOR_FUND_NOT_FOUND`.\n\nLike `ClientID`, this takes part in the holding lookup rather than being carried through to the transaction, and either property on its own is enough to fail the line with `REFERENCE_LOCATOR_FUND_NOT_FOUND` if its value does not match. Omit it unless you know it matches.",
        "example": "EXT-4417"
      },
      "InvestmentAccount": {
        "type": "object",
        "description": "Identifies an investment holding.\n\n`SecurityCode`, `HIN` and `SRN` are alternative ways of locating the holding, not\ncomplementary details about it. Supplying a `HIN` or `SRN` makes that the value the\nlookup runs on, and one that does not match a holding in the fund fails even when\n`SecurityCode` and `FundCode` are both correct.\n\nSupply `SecurityCode` on its own unless the fund holds the same security through more\nthan one broker, in which case the holder number is what tells them apart.\n\n`SecurityTypeCode` is not part of this object and is rejected with\n`STAGING_INVALID_FIELD` if supplied.\n",
        "required": [
          "SecurityCode"
        ],
        "properties": {
          "SecurityCode": {
            "type": "string",
            "description": "The security or issue code, for example an ASX ticker.",
            "example": "BHP"
          },
          "HIN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Holder Identification Number, for CHESS-sponsored holdings. Supplying this makes it the value the holding lookup runs on. Omit it unless you need it to disambiguate.",
            "example": "X0001234567"
          },
          "SRN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Securityholder Reference Number, for issuer-sponsored holdings. Supplying this makes it the value the holding lookup runs on.",
            "example": "I0001234567"
          }
        }
      },
      "NamedTermDepositAccount": {
        "type": "object",
        "description": "Identifies a term deposit account by name, for income events.",
        "properties": {
          "AccountName": {
            "type": "string",
            "example": "12 month TD - Westpac"
          }
        }
      },
      "IncomeEventType": {
        "type": "object",
        "required": [
          "EventTypeName"
        ],
        "properties": {
          "EventTypeName": {
            "type": "string",
            "description": "The income event type.",
            "enum": [
              "InitialManagedFundDistribution",
              "ManagedFundDistributionReinvestment",
              "FinalManagedFundDistribution",
              "OrdinaryShareDividend",
              "DividendReinvestmentPlan",
              "ForeignIncome",
              "BankInterest",
              "InvestmentFeeRebateCash",
              "Rebate",
              "PlatformRealisedGainLoss"
            ],
            "example": "OrdinaryShareDividend"
          }
        }
      },
      "IncomeHoldingAccount": {
        "type": "object",
        "description": "Identifies the holding the income was received on. Supply whichever identifier suits the holding — a named account `Code`, a `BankAccount`, an `InvestmentAccount`, or a `TermDepositAccount`.",
        "required": [
          "EventTypes"
        ],
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ExternalId": {
            "$ref": "#/components/schemas/ExternalIdProperty"
          },
          "InvestmentAccount": {
            "$ref": "#/components/schemas/InvestmentAccount"
          },
          "TermDepositAccount": {
            "$ref": "#/components/schemas/NamedTermDepositAccount"
          },
          "EventTypes": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/IncomeEventType"
            }
          }
        }
      },
      "IncomeItem": {
        "type": "object",
        "description": "One income event — a dividend, distribution, interest receipt or rebate.\nMost of the properties are tax-statement components and apply only to distribution events with a tax statement. Supply the ones your event type carries; the remainder may be omitted.",
        "required": [
          "SourceTransactionId",
          "HoldingAccount"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "HoldingAccount": {
            "$ref": "#/components/schemas/IncomeHoldingAccount"
          },
          "RecordedDate": {
            "type": "string",
            "format": "date",
            "description": "The date the income was declared or recorded.",
            "example": "2026-07-19"
          },
          "PaymentDate": {
            "type": "string",
            "format": "date",
            "description": "The date the income was paid.",
            "example": "2026-07-15"
          },
          "ReceiptDate": {
            "type": "string",
            "format": "date",
            "description": "The date the income was received by the fund.",
            "example": "2026-07-15"
          },
          "GrossPayment": {
            "type": "number",
            "description": "The gross amount of the income event.",
            "example": 1250
          },
          "NetPayment": {
            "type": "number",
            "description": "The amount actually received, after withholding.",
            "example": 1100
          },
          "FrankedAmount": {
            "type": "number",
            "example": 700
          },
          "UnfrankedAmount": {
            "type": "number",
            "example": 300
          },
          "FrankingCredit": {
            "type": "number",
            "example": 300
          },
          "ForeignWithholdingTax": {
            "type": "number",
            "example": 0
          },
          "TFNWithheldAmount": {
            "type": "number",
            "description": "Tax withheld because no tax file number was quoted.",
            "example": 0
          },
          "Interest": {
            "type": "number",
            "description": "The interest component of the payment.",
            "example": 0
          },
          "OtherIncome": {
            "type": "number",
            "example": 0
          },
          "OtherAssessableForeignIncome": {
            "type": "number",
            "example": 0
          },
          "ForeignInterestIncome": {
            "type": "number",
            "example": 0
          },
          "ForeignModifiedPassiveIncome": {
            "type": "number",
            "example": 0
          },
          "ForeignTaxCredits": {
            "type": "number",
            "example": 0
          },
          "CapitalGainsDiscountMethod": {
            "type": "number",
            "description": "Capital gains calculated under the discount method.",
            "example": 0
          },
          "CapitalGainsIndexationMethodDomestic": {
            "type": "number",
            "example": 0
          },
          "CapitalGainsIndexationMethodForeign": {
            "type": "number",
            "example": 0
          },
          "CapitalGainsOtherMethodDomestic": {
            "type": "number",
            "example": 0
          },
          "CapitalGainsOtherMethodForeign": {
            "type": "number",
            "example": 0
          },
          "DiscountedCapitalGainDomestic": {
            "type": "number",
            "example": 0
          },
          "DiscountedCapitalGainForeign": {
            "type": "number",
            "example": 0
          },
          "CGTConcessionAmount": {
            "type": "number",
            "example": 0
          },
          "GainLossAmount": {
            "type": "number",
            "example": 0
          },
          "OtherGain": {
            "type": "number",
            "example": 0
          },
          "DiscountableGain": {
            "type": "number",
            "example": 0
          },
          "IndexedGain": {
            "type": "number",
            "example": 0
          },
          "CapitalLoss": {
            "type": "number",
            "example": 0
          },
          "TaxDeferredAmounts": {
            "type": "number",
            "example": 0
          },
          "TaxExemptedAmounts": {
            "type": "number",
            "example": 0
          },
          "TaxFreeAmounts": {
            "type": "number",
            "example": 0
          },
          "ReturnOfCapitalAmount": {
            "type": "number",
            "example": 0
          },
          "AmitCostbaseNetAmount": {
            "type": "number",
            "description": "The net AMIT cost base adjustment for the period.",
            "example": 0
          },
          "ParticipatingQuantity": {
            "type": "number",
            "description": "The number of units or shares participating in the event.",
            "example": 1000
          },
          "ParticipatingAmount": {
            "type": "number",
            "description": "The amount reinvested, on a reinvestment event.",
            "example": 480
          },
          "Description": {
            "type": "string",
            "example": "BHP final dividend"
          }
        }
      },
      "IncomePayload": {
        "title": "Income",
        "type": "object",
        "description": "The decoded `Payload` for `StagedGenericIncome`.",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericIncome"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/IncomeItem"
            }
          }
        }
      }
    }
  }
}
```

Corporate action
`StagedGenericCorporateAction`

Buybacks, spin-offs, splits, consolidations, takeovers and mergers.

**Event types**

Each transaction records exactly one event type, set on its holding account. For corporate actions the event type also decides which of the transaction's properties apply.

| Event type | Records | Properties it uses | Example to follow |
|  --- | --- | --- | --- |
| `BuyBack` | Share buyback | `RecordedDate`, `SettlementDate`, `ParticipatingQuantity`, `CapitalComponentAmount`, `FrankedAmount`, `UnfrankedAmount`, `FrankingCredit`, `TaxableMarketValueExcessAmount` | Buyback and spin-off |
| `SpinOff_Demerger` | Spin-off or demerger | `TargetHoldingAccount`, `TransactionDate`, `SettlementDate`, `ParticipatingQuantity`, `TargetQuantity`, `DeemedValue`, `SourceCostBaseTransferAmount` | Buyback and spin-off |
| `Split_Consolidation` | Share split or consolidation | `TransactionDate`, `OriginalQuantity`, `NewQuantity` | Split and takeover |
| `TakeOver_Merger` | Takeover or merger | `TargetHoldingAccount`, `TransactionDate`, `SettlementDate`, `CGTDate`, `ParticipatingQuantity`, `TargetQuantity`, `CashOfferAmount`, `TargetMarketValue` | Split and takeover |


`Description` applies to all four. A buyback and a split take no target holding.

**Examples**

Buyback and spin-off
A buyback using `RecordedDate` and no target holding, and a spin-off with a target holding and a cost base transfer.

```json
{
  "InterfaceCode": "StagedGenericCorporateAction",
  "TransformedItems": [
    {
      "SourceTransactionId": "CA-1001",
      "SourceHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "ANZ",
          "HIN": null,
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "BuyBack"
          }
        ]
      },
      "RecordedDate": "2026-07-01",
      "SettlementDate": "2026-07-04",
      "ParticipatingQuantity": 1000,
      "CapitalComponentAmount": 500,
      "FrankedAmount": 700,
      "UnfrankedAmount": 500,
      "FrankingCredit": 300,
      "TaxableMarketValueExcessAmount": 700,
      "Description": "ANZ buyback"
    },
    {
      "SourceTransactionId": "CA-1002",
      "SourceHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "ABC",
          "HIN": null,
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "SpinOff_Demerger"
          }
        ]
      },
      "TargetHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "AGK",
          "HIN": null,
          "SRN": null
        }
      },
      "TransactionDate": "2026-07-07",
      "SettlementDate": "2026-07-10",
      "ParticipatingQuantity": 1000,
      "TargetQuantity": 500,
      "DeemedValue": 8000,
      "SourceCostBaseTransferAmount": 5000,
      "Description": "ABC spin-off"
    }
  ]
}
```

Split and takeover
A consolidation using only two quantities, and a takeover with three dates and a cash offer.

```json
{
  "InterfaceCode": "StagedGenericCorporateAction",
  "TransformedItems": [
    {
      "SourceTransactionId": "CA-1003",
      "SourceHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BEN",
          "HIN": null,
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "Split_Consolidation"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "OriginalQuantity": 1000,
      "NewQuantity": 500,
      "Description": "BEN 2:1 consolidation"
    },
    {
      "SourceTransactionId": "CA-1004",
      "SourceHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BOQ",
          "HIN": null,
          "SRN": null
        },
        "EventTypes": [
          {
            "EventTypeName": "TakeOver_Merger"
          }
        ]
      },
      "TargetHoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "InvestmentAccount": {
          "SecurityCode": "BXB",
          "HIN": null,
          "SRN": null
        }
      },
      "TransactionDate": "2026-07-04",
      "SettlementDate": "2026-07-10",
      "CGTDate": "2026-07-07",
      "ParticipatingQuantity": 1000,
      "TargetQuantity": 800,
      "CashOfferAmount": 25000,
      "TargetMarketValue": 16000,
      "Description": "BOQ takeover by BXB"
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/CorporateActionPayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "HoldingAccountCode": {
        "type": "string",
        "description": "The code of the holding account in Class.",
        "example": "CBA-OPERATING"
      },
      "FundCodeProperty": {
        "type": "string",
        "description": "The code of the fund the line belongs to. Required when submitting at business scope.\nAt fund scope the fund comes from the route, so this may be omitted; if supplied it must match, or the submission is rejected with `STAGING_FUND_ROUTE_MISMATCH`.",
        "example": "SMF001"
      },
      "BrandCodeProperty": {
        "type": "string",
        "description": "The code of the brand the fund sits under.\nSupply this when submitting at business scope to a business that has more than one brand. Without it, the fund lookup for that line fails during processing rather than at submit — the file is accepted and the line appears as a failure on processed-items.\nBrand is a property of each line rather than of the file, so a single submission may span several brands.",
        "example": "MYBRAND"
      },
      "ExternalIdProperty": {
        "type": "string",
        "description": "The Fund Holding Reference (FHR) account number. For a broker holding this is the broker account number, such as a CommSec account number. It must match the account number recorded in Class exactly — a value that does not match fails the transaction with `REFERENCE_LOCATOR_FUND_NOT_FOUND`.\n\nLike `ClientID`, this takes part in the holding lookup rather than being carried through to the transaction, and either property on its own is enough to fail the line with `REFERENCE_LOCATOR_FUND_NOT_FOUND` if its value does not match. Omit it unless you know it matches.",
        "example": "EXT-4417"
      },
      "InvestmentAccount": {
        "type": "object",
        "description": "Identifies an investment holding.\n\n`SecurityCode`, `HIN` and `SRN` are alternative ways of locating the holding, not\ncomplementary details about it. Supplying a `HIN` or `SRN` makes that the value the\nlookup runs on, and one that does not match a holding in the fund fails even when\n`SecurityCode` and `FundCode` are both correct.\n\nSupply `SecurityCode` on its own unless the fund holds the same security through more\nthan one broker, in which case the holder number is what tells them apart.\n\n`SecurityTypeCode` is not part of this object and is rejected with\n`STAGING_INVALID_FIELD` if supplied.\n",
        "required": [
          "SecurityCode"
        ],
        "properties": {
          "SecurityCode": {
            "type": "string",
            "description": "The security or issue code, for example an ASX ticker.",
            "example": "BHP"
          },
          "HIN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Holder Identification Number, for CHESS-sponsored holdings. Supplying this makes it the value the holding lookup runs on. Omit it unless you need it to disambiguate.",
            "example": "X0001234567"
          },
          "SRN": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Securityholder Reference Number, for issuer-sponsored holdings. Supplying this makes it the value the holding lookup runs on.",
            "example": "I0001234567"
          }
        }
      },
      "CorporateActionEventType": {
        "type": "object",
        "required": [
          "EventTypeName"
        ],
        "properties": {
          "EventTypeName": {
            "type": "string",
            "description": "The corporate action type. This determines which properties on the item apply.",
            "enum": [
              "BuyBack",
              "SpinOff_Demerger",
              "Split_Consolidation",
              "TakeOver_Merger"
            ],
            "example": "BuyBack"
          }
        }
      },
      "CorporateActionHoldingAccount": {
        "type": "object",
        "description": "The holding the corporate action applies to, and the event type that drives it.",
        "required": [
          "EventTypes"
        ],
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ExternalId": {
            "$ref": "#/components/schemas/ExternalIdProperty"
          },
          "InvestmentAccount": {
            "$ref": "#/components/schemas/InvestmentAccount"
          },
          "EventTypes": {
            "type": "array",
            "minItems": 1,
            "description": "The corporate action event type. This determines which of the item's properties apply — see the table on CorporateActionItem.",
            "items": {
              "$ref": "#/components/schemas/CorporateActionEventType"
            }
          }
        }
      },
      "CorporateActionTargetHoldingAccount": {
        "type": "object",
        "description": "The holding the action moves into. It carries no event type — the event is declared once, on the source holding.",
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ExternalId": {
            "$ref": "#/components/schemas/ExternalIdProperty"
          },
          "InvestmentAccount": {
            "$ref": "#/components/schemas/InvestmentAccount"
          }
        }
      },
      "CorporateActionItem": {
        "type": "object",
        "description": "One corporate action. Which properties apply depends entirely on the event type on `SourceHoldingAccount.EventTypes`.\n\n| Event type |\n| --- |\n| `BuyBack` |\n| `SpinOff_Demerger` |\n| `Split_Consolidation` |\n| `TakeOver_Merger` |\n\n`Description` applies to all four.\n",
        "required": [
          "SourceTransactionId",
          "SourceHoldingAccount"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "SourceHoldingAccount": {
            "$ref": "#/components/schemas/CorporateActionHoldingAccount"
          },
          "TargetHoldingAccount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CorporateActionTargetHoldingAccount"
              }
            ],
            "description": "The holding the action moves into. Required for `SpinOff_Demerger` and `TakeOver_Merger`; omit it for `BuyBack` and `Split_Consolidation`."
          },
          "TransactionDate": {
            "type": "string",
            "format": "date",
            "description": "The effective date of the action. Used by all events except `BuyBack`.",
            "example": "2026-07-07"
          },
          "RecordedDate": {
            "type": "string",
            "format": "date",
            "description": "The record date. Used by `BuyBack`.",
            "example": "2026-07-01"
          },
          "SettlementDate": {
            "type": "string",
            "format": "date",
            "example": "2026-07-10"
          },
          "CGTDate": {
            "type": "string",
            "format": "date",
            "description": "The capital gains date. Used by `TakeOver_Merger`.",
            "example": "2026-07-04"
          },
          "ParticipatingQuantity": {
            "type": "number",
            "description": "The quantity of the source holding taking part in the action.",
            "example": 1000
          },
          "TargetQuantity": {
            "type": "number",
            "description": "The quantity received in the target holding.",
            "example": 500
          },
          "OriginalQuantity": {
            "type": "number",
            "description": "The quantity held before a split or consolidation.",
            "example": 1000
          },
          "NewQuantity": {
            "type": "number",
            "description": "The quantity held after a split or consolidation.",
            "example": 2000
          },
          "CapitalComponentAmount": {
            "type": "number",
            "example": 500
          },
          "FrankedAmount": {
            "type": "number",
            "example": 700
          },
          "UnfrankedAmount": {
            "type": "number",
            "example": 500
          },
          "FrankingCredit": {
            "type": "number",
            "example": 300
          },
          "TaxableMarketValueExcessAmount": {
            "type": "number",
            "example": 700
          },
          "DeemedValue": {
            "type": "number",
            "description": "The deemed market value of the target holding at the date of the action.",
            "example": 8000
          },
          "SourceCostBaseTransferAmount": {
            "type": "number",
            "description": "The cost base transferred from the source holding to the target holding.",
            "example": 5000
          },
          "CashOfferAmount": {
            "type": "number",
            "description": "The cash component of a takeover offer.",
            "example": 25000
          },
          "TargetMarketValue": {
            "type": "number",
            "example": 16000
          },
          "Description": {
            "type": "string",
            "example": "ANZ Buyback"
          }
        }
      },
      "CorporateActionPayload": {
        "title": "Corporate action",
        "type": "object",
        "description": "The decoded `Payload` for `StagedGenericCorporateAction`.",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericCorporateAction"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/CorporateActionItem"
            }
          }
        }
      }
    }
  }
}
```

Term deposit
`StagedGenericTermDeposit`

Term deposit acquisitions, redemptions and bank fees.

`InterestRate` is a string, not a number. `Description` is required on every term deposit movement.

**Event types**

Each transaction records exactly one event type, set on its holding account.

| Event type | Records | Example to follow |
|  --- | --- | --- |
| `InitialDeposit` | Opening a term deposit | Opening a term deposit |
| `TermDepositRedemption` | Redeeming a term deposit | Redeeming a term deposit |
| `BankFee` | A bank fee on the deposit | A bank fee on the deposit |


`BankFee` also exists as a cash expense type. Use the term deposit one for a fee charged against the deposit itself.

**Examples**

Opening a term deposit
`InitialDeposit`, with the account identified by BSB and account number.

```json
{
  "InterfaceCode": "StagedGenericTermDeposit",
  "TransformedItems": [
    {
      "SourceTransactionId": "850003",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "TermDepositAccount": {
          "BSB": "062000",
          "AccountNumber": "99887766",
          "MaturityDate": "2026-12-31",
          "InterestRate": "4.25",
          "Term": "12",
          "TermType": "Months"
        },
        "EventTypes": [
          {
            "EventTypeName": "InitialDeposit"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "TransactionAmount": 50000.0,
      "Description": "12 month term deposit"
    }
  ]
}
```

Redeeming a term deposit
`TermDepositRedemption` against the same account.

```json
{
  "InterfaceCode": "StagedGenericTermDeposit",
  "TransformedItems": [
    {
      "SourceTransactionId": "TD-2201",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "TermDepositAccount": {
          "BSB": "062000",
          "AccountNumber": "99887766"
        },
        "EventTypes": [
          {
            "EventTypeName": "TermDepositRedemption"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "TransactionAmount": 52125.0,
      "Description": "TD matured and redeemed"
    }
  ]
}
```

A bank fee on the deposit
`BankFee` — no maturity date or interest rate, just the amount charged.

```json
{
  "InterfaceCode": "StagedGenericTermDeposit",
  "TransformedItems": [
    {
      "SourceTransactionId": "TD-2202",
      "HoldingAccount": {
        "FundCode": "SMF001",
        "BrandCode": "MYBRAND",
        "Code": "TD-WBC-12M",
        "EventTypes": [
          {
            "EventTypeName": "BankFee"
          }
        ]
      },
      "TransactionDate": "2026-07-01",
      "TransactionAmount": 5.0,
      "Description": "Account keeping fee"
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/TermDepositPayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "HoldingAccountCode": {
        "type": "string",
        "description": "The code of the holding account in Class.",
        "example": "CBA-OPERATING"
      },
      "FundCodeProperty": {
        "type": "string",
        "description": "The code of the fund the line belongs to. Required when submitting at business scope.\nAt fund scope the fund comes from the route, so this may be omitted; if supplied it must match, or the submission is rejected with `STAGING_FUND_ROUTE_MISMATCH`.",
        "example": "SMF001"
      },
      "BrandCodeProperty": {
        "type": "string",
        "description": "The code of the brand the fund sits under.\nSupply this when submitting at business scope to a business that has more than one brand. Without it, the fund lookup for that line fails during processing rather than at submit — the file is accepted and the line appears as a failure on processed-items.\nBrand is a property of each line rather than of the file, so a single submission may span several brands.",
        "example": "MYBRAND"
      },
      "ClientIDProperty": {
        "type": "string",
        "description": "An account number or HIN/SRN used to identify a term deposit holding. Class uses it to find the fund and the holding, so it must match what is recorded in Class exactly — a value that does not match fails the line with `REFERENCE_LOCATOR_FUND_NOT_FOUND`.\n\nThis takes part in the holding lookup — it is not metadata carried through to the transaction. Supplying a value that does not match what Class holds causes the line to fail with `REFERENCE_LOCATOR_FUND_NOT_FOUND`, even when every other identifier is correct. Omit it unless you know it matches.",
        "example": "CL-00912"
      },
      "SecurityIssueReference": {
        "type": "object",
        "description": "The security issue the term deposit holding is recorded against. Optional — a term deposit movement loads without it.",
        "required": [
          "Code",
          "Currency",
          "SecurityIssueTypeCode"
        ],
        "properties": {
          "Code": {
            "type": "string",
            "example": "TD-WBC-12M"
          },
          "Currency": {
            "type": "string",
            "example": "AUD"
          },
          "SecurityIssueTypeCode": {
            "type": "string",
            "example": "TermDepositSecurityIssueType"
          }
        }
      },
      "TermDepositAccount": {
        "type": "object",
        "description": "Identifies a term deposit account and its terms.",
        "properties": {
          "BSB": {
            "type": "string",
            "example": "062000"
          },
          "AccountNumber": {
            "type": "string",
            "example": "87654321"
          },
          "InterestRate": {
            "type": "string",
            "description": "The interest rate on the deposit. Supplied as a string, not a number.",
            "example": "4.25"
          },
          "MaturityDate": {
            "type": "string",
            "format": "date",
            "example": "2027-06-01"
          },
          "Term": {
            "type": "string",
            "description": "The length of the term, expressed in the unit given by `TermType`.",
            "example": "12"
          },
          "TermType": {
            "type": "string",
            "enum": [
              "Days",
              "Weeks",
              "Months",
              "Years"
            ],
            "example": "Months"
          }
        }
      },
      "TermDepositEventType": {
        "type": "object",
        "required": [
          "EventTypeName"
        ],
        "properties": {
          "EventTypeName": {
            "type": "string",
            "description": "The term deposit movement type.",
            "enum": [
              "InitialDeposit",
              "TermDepositRedemption",
              "BankFee"
            ],
            "example": "InitialDeposit"
          }
        }
      },
      "TermDepositHoldingAccount": {
        "type": "object",
        "description": "The term deposit holding the movement applies to.",
        "required": [
          "EventTypes"
        ],
        "properties": {
          "Code": {
            "$ref": "#/components/schemas/HoldingAccountCode"
          },
          "FundCode": {
            "$ref": "#/components/schemas/FundCodeProperty"
          },
          "BrandCode": {
            "$ref": "#/components/schemas/BrandCodeProperty"
          },
          "ClientID": {
            "$ref": "#/components/schemas/ClientIDProperty"
          },
          "SecurityIssue": {
            "$ref": "#/components/schemas/SecurityIssueReference"
          },
          "TermDepositAccount": {
            "$ref": "#/components/schemas/TermDepositAccount"
          },
          "EventTypes": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/TermDepositEventType"
            }
          }
        }
      },
      "TermDepositItem": {
        "type": "object",
        "description": "One term deposit movement — an acquisition, redemption or bank fee.",
        "required": [
          "SourceTransactionId",
          "HoldingAccount",
          "TransactionDate",
          "TransactionAmount",
          "Description"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "HoldingAccount": {
            "$ref": "#/components/schemas/TermDepositHoldingAccount"
          },
          "TransactionDate": {
            "description": "The date of the transaction.",
            "type": "string",
            "format": "date",
            "example": "2026-07-13"
          },
          "TransactionAmount": {
            "type": "number",
            "example": 50000
          },
          "Description": {
            "type": "string",
            "description": "Required on term deposit movements.",
            "example": "12 month term deposit"
          }
        }
      },
      "TermDepositPayload": {
        "title": "Term deposit",
        "type": "object",
        "description": "The decoded `Payload` for `StagedGenericTermDeposit`.",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericTermDeposit"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/TermDepositItem"
            }
          }
        }
      }
    }
  }
}
```

Market price
`StagedGenericSecurityIssue`

Unit and security prices. Unlike every other interface, a market price item has no holding account and no event type — prices attach to the security itself.

Market price files may only be submitted at business scope, and no item may carry `BrandCode`. The security must already exist in Class at business level — a brand-level security cannot be updated through this API. Send only the code, currency and prices; other security details would change the security itself.

**Event types**

Market price items carry no event type and no holding account — prices attach directly to the security.

**Examples**

A unit price
One security with a single price.

```json
{
  "InterfaceCode": "StagedGenericSecurityIssue",
  "TransformedItems": [
    {
      "SourceTransactionId": "MP-20260601",
      "Code": "MYFUND",
      "Currency": "AUD",
      "Prices": [
        {
          "Date": "2026-07-01",
          "Price": 1.0523,
          "BuyPrice": 1.0523,
          "PriceType": "NAV"
        }
      ]
    }
  ]
}
```

**Fields**

```json
{
  "$ref": "#/components/schemas/SecurityIssuePayload",
  "components": {
    "schemas": {
      "SourceTransactionId": {
        "type": "string",
        "minLength": 1,
        "description": "A caller-supplied identifier for this line, unique within the payload after trimming. Required on every item of every interface.\nIt is used for validation only. It is not stored against the resulting transaction and cannot be used afterwards to correlate a line with its outcome — use the 1-based `Index` on the processed-items response for that.",
        "example": "850004"
      },
      "Price": {
        "type": "object",
        "description": "A price for a security on a given date.",
        "required": [
          "Date",
          "Price"
        ],
        "properties": {
          "Date": {
            "type": "string",
            "format": "date",
            "description": "The date the price applies to.",
            "example": "2026-07-13"
          },
          "Price": {
            "type": "number",
            "description": "The price, in the currency declared on the item.",
            "example": 1.0523
          },
          "BuyPrice": {
            "type": "number",
            "description": "The buy price, where the security is quoted with a buy/sell spread.",
            "example": 1.0523
          },
          "PriceType": {
            "type": "string",
            "enum": [
              "Sell",
              "NAV",
              "ExDiv"
            ],
            "description": "The price type.",
            "example": "Sell"
          },
          "IsPersisted": {
            "type": "boolean",
            "description": "Whether the price is a terminating price (`false`) or a continuing price (`true`). Defaults to terminating when omitted.",
            "example": false
          }
        }
      },
      "SecurityIssueItem": {
        "type": "object",
        "description": "One security and the prices being loaded against it. Unlike every other interface, a market\nprice item has no holding account — prices attach to the security itself.\n\nThe security must already exist in Class, scoped at business level. A security scoped at\nbrand level cannot be updated through this API.\n\nSend only the code, currency and prices. Supplying other security details changes the\nsecurity itself rather than just recording a price.\n",
        "required": [
          "SourceTransactionId",
          "Code",
          "Currency",
          "Prices"
        ],
        "properties": {
          "SourceTransactionId": {
            "$ref": "#/components/schemas/SourceTransactionId"
          },
          "Code": {
            "type": "string",
            "description": "The security issue code the prices apply to.",
            "example": "MYFUND"
          },
          "Currency": {
            "type": "string",
            "description": "The currency the prices are expressed in, as an ISO 4217 code.",
            "example": "AUD"
          },
          "Prices": {
            "type": "array",
            "minItems": 1,
            "description": "One entry per price date.",
            "items": {
              "$ref": "#/components/schemas/Price"
            }
          }
        }
      },
      "SecurityIssuePayload": {
        "title": "Market price",
        "type": "object",
        "description": "The decoded `Payload` for `StagedGenericSecurityIssue`.\nMarket price files are accepted only at business scope and must not carry `BrandCode` on any item.",
        "required": [
          "InterfaceCode",
          "TransformedItems"
        ],
        "properties": {
          "InterfaceCode": {
            "type": "string",
            "enum": [
              "StagedGenericSecurityIssue"
            ]
          },
          "TransformedItems": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5000,
            "items": {
              "$ref": "#/components/schemas/SecurityIssueItem"
            }
          }
        }
      }
    }
  }
}
```