tZERO Investments API

Investments and assets (create, update, submit, cancel, agreements).

Operations 8

GET /pi/v1/assets Get assets #
POST /pi/v1/assets/{assetId}/investments Create investment #
PUT /pi/v1/assets/{assetId}/investments Update investment #
PUT /pi/v1/assets/{assetId}/investments/{investmentId}/payment Add Payment details to the investment on file #
GET /pi/v1/investments/accounts/{accountId} Get all investments for account #
POST /pi/v1/investments/{investmentId}/submit Submit investment #
DELETE /pi/v1/investments/{investmentId} Cancel investment #
POST /pi/v1/assets/{assetId}/investments/{investmentId}/agreement Sign MSA for investment #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/tzero-investments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

tzero-investments-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Issuance & Secondary Markets Investments API
  description: APIs to Create Individual broker dealer accounts, Trigger KYC on the investors in the account, Review account information and KYC results, View Primary offering that are available to invest and manage investments in the assets.
servers:
- url: https://gateway-web-api.tzero.com/app
tags:
- name: Investments
  description: Investments and assets (create, update, submit, cancel, agreements).
paths:
  /pi/v1/assets:
    get:
      tags:
      - Investments
      summary: Get assets
      description: Returns list of available assets.
      security:
      - x-api-key: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetsResponse'
              examples:
                success:
                  summary: Example response
                  value:
                    assets:
                    - assetId: '39737'
                      symbol: AF
                      assetName: Abstract Face
                      assetDescription: ''
                      assetType:
                        code: COMMON_STOCK
                        label: Common Stock
                        description: Common Stock.
                      requiresAccreditation: false
                      pricePerShare: 10
                      minimumInvestment: 50
                      maximumInvestment: 100000
                      status: OPEN
                      offeringCloseDate: '2026-06-30T23:59:59-04:00'
                      offering:
                        code: REG_D_506C
                        label: Reg D 506 (c)
                        description: Reg D 506 (c) offering.
                      countries:
                      - US
                      paymentTypes:
                      - code: WIRE
                        label: WIRE
                        description: Wire Transfer.
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
      operationId: getPiV1Assets
      x-operation-id-source: derived
  /pi/v1/assets/{assetId}/investments:
    post:
      tags:
      - Investments
      summary: Create investment
      description: 'Create a new investment for an asset.


        `numberOfShares` is optional; when it is not provided investment `amount`

        is used to compute the `numberOfShares`. If the shares cannot be computed or If fractional shares is not supported , the request gets rejected with `INVALID_AMOUNT_AND_SHARES`.


        For Reg CF assets, regCFInvestmentTermsAccepted must be true.

        Annual income and net worth are required for Reg A and Reg CF.'
      operationId: createInvestment
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: assetId
        in: path
        required: true
        description: Asset identifier
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateInvestmentRequest'
            examples:
              withInvestmentAmount:
                summary: Investment amount provided — numberOfShares computed automatically
                value:
                  accountId: 1234-5678
                  transactionId: a0000000-0000-0000-0000-000000000001
                  amount: 499.51
              withInvestmentAmountAndShares:
                summary: Investment amount and numberOfShares provided
                value:
                  accountId: 1234-5678
                  transactionId: a0000000-0000-0000-0000-000000000002
                  amount: 499.51
                  numberOfShares: 239
              withInvesmentAmountAndRegCF:
                summary: Reg CF asset (terms acceptance required)
                value:
                  accountId: 1234-5678
                  transactionId: a0000000-0000-0000-0000-000000000003
                  amount: 499.51
                  regCFInvestmentTermsAccepted: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestmentDetails'
              example:
                investmentId: inv-123
                amount: 1000
                numberOfShares: 1000
                fundedAmount: 0
                status: CREATED
                assetId: '39737'
                transactionId: txn-001
                paymentType: WIRE
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T11:30:42.534426Z'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Create investment — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | AMOUNT_REQUIRED | Amount is required. |

            | AMOUNT_INVALID | Amount must be positive. |

            | NUMBER_OF_SHARES_INVALID | Number of shares must be positive when provided. |

            | ASSET_NOT_OPEN | Asset is not open for investment. |

            | INVALID_AMOUNT_AND_SHARES | `amount` is not a valid investment in the asset. If `details` object is available it may contain following fields `recommendedAmount`, `recommendedNumberOfShares`, and `pricePerShare`. |

            | REG_CF_TERMS_NOT_ACCEPTED | Reg CF investment terms must be accepted (Reg CF assets). |

            | REG_CF_TERMS_ONLY_APPLICABLE_TO_REG_CF | Reg CF terms acceptance is only applicable to Reg CF assets. |

            | ANNUAL_INCOME_REQUIRED | Annual income is required for Reg A and Reg CF investments. |

            | NET_WORTH_REQUIRED | Net worth is required for Reg A and Reg CF investments. |

            | INVESTMENT_CREATE_ERROR | Investment could not be created. |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                amountRequired:
                  summary: Amount required
                  value:
                    errors:
                    - code: AMOUNT_REQUIRED
                      message: Amount is required
                      field: amount
                assetNotOpen:
                  summary: Asset not open
                  value:
                    errors:
                    - code: ASSET_NOT_OPEN
                      message: Cannot create investment; asset is not open for investment.
                amountAndSharesMismatch:
                  summary: Amount and Number of Shars mismatch — recommended amounts in `details` object.
                  value:
                    errors:
                    - code: INVALID_AMOUNT_AND_SHARES
                      message: Investment amount must be adjusted to match Asset's price per share.
                      field: amount
                      details:
                        recommendedAmount: 499.51
                        recommendedNumberOfShares: 239
                        pricePerShare: 2.09
                amountBelowMin:
                  summary: Investment Amount below requested minimum amount for the asset
                  value:
                    errors:
                    - code: INVALID_AMOUNT_AND_SHARES
                      message: Investment amount {2} is below the minimum required to purchase one share of the Asset.
                      field: amount
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account or primary user)
        '500':
          description: Internal Server Error
    put:
      tags:
      - Investments
      summary: Update investment
      description: 'Update an existing investment (amount, payment details, etc.).

        Investment must belong to the account and match the asset in the path.

        Payment details can also be configured via the dedicated PUT `.../payment` endpoint.

        When `amount` is provided without `numberOfShares`, the amount is validated against the asset. On mismatch, a `INVALID_AMOUNT_AND_SHARES` error is returned.'
      operationId: updateInvestment
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: assetId
        in: path
        required: true
        description: Asset identifier.
        schema:
          type: string
        example: '39737'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateInvestmentRequest'
            example:
              accountId: PR-1234-5678
              investmentId: U7F7D95Y
              transactionId: a0000000-0000-0000-0000-000000000002
              amount: 1500
              paymentType: ACH
              bankAccountId: fia-abc-123
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestmentDetails'
              example:
                investmentId: U7F7D95Y
                amount: 1500
                fundedAmount: 0
                status: CREATED
                assetId: '39737'
                transactionId: a0000000-0000-0000-0000-000000000002
                paymentType: ACH
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T12:00:00.000000Z'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Update investment — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | AMOUNT_INVALID | Amount must be positive when provided. |

            | NUMBER_OF_SHARES_INVALID | Number of shares must be positive when provided. |

            | INVESTMENT_UPDATE_NOT_ALLOWED | Investment update not allowed. |

            | INVESTMENT_STATUS_NOT_ALLOWED_TO_UPDATE | Investment not allowed to be updated in current status. |

            | ASSET_NOT_RELATED_TO_INVESTMENT | Asset is not related to the investment (path assetId mismatch). |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account, primary user, or investment)
        '500':
          description: Internal Server Error
  /pi/v1/assets/{assetId}/investments/{investmentId}/payment:
    put:
      tags:
      - Investments
      summary: Add Payment details to the investment on file
      description: 'Add payment details to an existing investment. This is a separate step from

        updating investment amount/shares. Only WIRE and ACH payment types are supported.

        For ACH, a `bankAccountId` (linked bank account) must be provided.'
      operationId: addInvestmentPayment
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: assetId
        in: path
        required: true
        description: Asset identifier.
        schema:
          type: string
        example: '39737'
      - name: investmentId
        in: path
        required: true
        description: Investment identifier.
        schema:
          type: string
        example: U7F7D95Y
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePaymentRequest'
            example:
              accountId: PR-1234-5678
              paymentType: ACH
              bankAccountId: bank-account-uuid
              transactionId: a0000000-0000-0000-0000-000000000003
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestmentDetails'
              example:
                investmentId: U7F7D95Y
                amount: 1500
                fundedAmount: 0
                status: CREATED
                assetId: '39737'
                transactionId: a0000000-0000-0000-0000-000000000003
                paymentType: ACH
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T12:15:00.000000Z'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Update payment — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | PAYMENT_TYPE_REQUIRED | Payment type is required. |

            | BANK_ACCOUNT_ID_REQUIRED | Bank account ID is required when payment type is ACH. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | PAYMENT_TYPE_NOT_SUPPORTED | Payment type is not supported. Only WIRE and ACH are allowed. |

            | INVESTMENT_STATUS_NOT_ALLOWED_TO_UPDATE | Investment cannot be updated in its current status (e.g. SUBMITTED). |

            | PAYMENT_UPDATE_NOT_ALLOWED | Payment update not allowed (fallback code). |

            | ASSET_NOT_RELATED_TO_INVESTMENT | Asset is not related to the investment (path assetId mismatch). |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                paymentTypeNotSupported:
                  summary: Unsupported payment type
                  value:
                    errors:
                    - code: PAYMENT_TYPE_NOT_SUPPORTED
                      message: Payment type STRIPE is not supported for external API.
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account, investment, or primary user)
        '500':
          description: Internal Server Error (INTERNAL_ERROR — unexpected error)
  /pi/v1/investments/accounts/{accountId}:
    get:
      tags:
      - Investments
      summary: Get all investments for account
      description: Returns all investments for the given account.
      operationId: getInvestmentsByAccount
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: accountId
        in: path
        required: true
        description: Account identifier.
        schema:
          type: string
        example: PR-1234-5678
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/InvestmentDTO'
              example:
              - investmentId: U7F7D95Y
                amount: 1000
                numberOfShares: 100
                costBasis: 1000
                fundedAmount: 0
                status: CREATED
                assetId: '39737'
                transactionId: a0000000-0000-0000-0000-000000000001
                paymentType: WIRE
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T11:30:42.534426Z'
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found
        '500':
          description: Internal Server Error
  /pi/v1/investments/{investmentId}/submit:
    post:
      tags:
      - Investments
      summary: Submit investment
      description: 'Submit the investment.

        Payment is processed first; on success the investment is submitted.'
      operationId: submitInvestment
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: investmentId
        in: path
        required: true
        description: Investment identifier.
        schema:
          type: string
        example: U7F7D95Y
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitInvestmentRequest'
            example:
              accountId: PR-1234-5678
              transactionId: a0000000-0000-0000-0000-000000000003
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestmentDetails'
              example:
                investmentId: U7F7D95Y
                amount: 1000
                fundedAmount: 1000
                status: SUBMITTED
                assetId: '39737'
                transactionId: a0000000-0000-0000-0000-000000000003
                paymentType: WIRE
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T12:15:00.000000Z'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Submit investment — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | COUNTRY_MISMATCH | Jurisdiction is not supported; cannot proceed with payment or submission. |

            | PAYMENT_SUBMISSION_FAILED | Payment could not be submitted. |

            | PAYMENT_SUBMIT_ERROR | Payment submission error. |

            | INVESTMENT_NOT_FOUND | Investment not found or can no longer be submitted. |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account or primary user)
        '500':
          description: Internal Server Error
  /pi/v1/investments/{investmentId}:
    delete:
      tags:
      - Investments
      summary: Cancel investment
      description: Cancel an investment.
      operationId: cancelInvestment
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: investmentId
        in: path
        required: true
        description: Investment identifier.
        schema:
          type: string
        example: U7F7D95Y
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelInvestmentRequest'
            example:
              accountId: PR-1234-5678
              transactionId: a0000000-0000-0000-0000-000000000004
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InvestmentDetails'
              example:
                investmentId: U7F7D95Y
                amount: 1000
                fundedAmount: 0
                status: CANCELLED
                assetId: '39737'
                transactionId: a0000000-0000-0000-0000-000000000004
                paymentType: WIRE
                createdTs: '2025-12-11T11:30:42.534426Z'
                modifiedTs: '2025-12-11T12:30:00.000000Z'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Cancel investment — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | INVESTMENT_CANNOT_BE_CANCELLED | This investment can no longer be canceled. |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account, primary user, or investment)
        '500':
          description: Internal Server Error
  /pi/v1/assets/{assetId}/investments/{investmentId}/agreement:
    post:
      tags:
      - Investments
      summary: Sign MSA for investment
      description: 'Sign the Master Subscription Agreement for an investment.

        Signature name must match the account holder''s full name.'
      operationId: signInvestmentAgreement
      security:
      - x-api-key: []
        bearerAuth: []
      parameters:
      - name: assetId
        in: path
        required: true
        description: Asset identifier.
        schema:
          type: string
        example: '39737'
      - name: investmentId
        in: path
        required: true
        description: Investment identifier.
        schema:
          type: string
        example: U7F7D95Y
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InvestmentSignatureRequest'
            example:
              accountId: PR-1234-5678
              transactionId: a0000000-0000-0000-0000-000000000005
              userSignature: John Doe
              version: '1.0'
      responses:
        '200':
          description: OK (investment status becomes SIGNED)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgreementDTO'
              example:
                id: 770e8400-e29b-41d4-a716-446655440002
                userId: 43XSYHc0h4aU5cxMkqhIQn
                assetId: '39737'
                signedTs: '2025-12-11T12:20:00.000000Z'
                documentId: 660e8400-e29b-41d4-a716-446655440001
                status: SIGNED
                expired: false
                createdTs: '2025-12-11T12:20:00.000000Z'
                createdBy: 43XSYHc0h4aU5cxMkqhIQn
                modifiedTs: '2025-12-11T12:20:00.000000Z'
                modifiedBy: 43XSYHc0h4aU5cxMkqhIQn
                userSignature: John Doe
                subscriptionType: STANDARD_MSA
                documentVersion: '1.0'
        '400':
          description: 'Bad Request (validation failed or invalid payload). Body: `errors` array; each item has `code`, `message`, optional `field`.


            **Sign agreement — error codes:**


            | Code | Meaning |

            |------|---------|

            | ACCOUNT_ID_REQUIRED | Account identifier is required. |

            | TRANSACTION_ID_REQUIRED | Transaction ID is required. |

            | USER_SIGNATURE_REQUIRED | User signature (full name) is required. |

            | USER_SIGNATURE_CANNOT_BE_BLANK | User signature cannot be blank. |

            | VERSION_REQUIRED | MSA version is required. |

            | VERSION_CANNOT_BE_BLANK | MSA version cannot be blank. |

            | ASSET_NOT_RELATED_TO_INVESTMENT | Asset is not related to the investment (path assetId mismatch). |

            | SIGNATURE_NAME_MISMATCH | Signature name must match the account holder''s name. |

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                signatureMismatch:
                  summary: Signature name mismatch
                  value:
                    errors:
                    - code: SIGNATURE_NAME_MISMATCH
                      message: Signature name must match the account holder's name.
                      field: userSignature
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found (account or primary user)
        '500':
          description: Internal Server Error
components:
  schemas:
    Asset:
      type: object
      description: Asset details.
      properties:
        assetId:
          type: string
          description: Asset identifier (can be numeric or alphanumeric).
          example: '39737'
        symbol:
          type:
          - string
          - 'null'
          example: AF
        assetName:
          type:
          - string
          - 'null'
          example: Abstract Face
        assetDescription:
          type:
          - string
          - 'null'
          example: ''
        assetType:
          $ref: '#/components/schemas/CodeLabelDescription'
        requiresAccreditation:
          type:
          - boolean
          - 'null'
        pricePerShare:
          type:
          - number
          - 'null'
          format: double
        minimumInvestment:
          type:
          - number
          - 'null'
          format: double
        maximumInvestment:
          type:
          - number
          - 'null'
          format: double
        status:
          type:
          - string
          - 'null'
          example: OPEN
        offeringCloseDate:
          type:
          - string
          - 'null'
          format: date-time
        offering:
          $ref: '#/components/schemas/CodeLabelDescription'
        countries:
          type: array
          items:
            type: string
        paymentTypes:
          type: array
          items:
            $ref: '#/components/schemas/CodeLabelDescription'
    InvestmentSignatureRequest:
      type: object
      required:
      - accountId
      - transactionId
      - userSignature
      - version
      properties:
        accountId:
          type: string
        transactionId:
          type: string
          description: Client-provided id for auditing (required, non-blank).
          example: a0000000-0000-0000-0000-000000000001
        userSignature:
          type: string
          description: Full name of signer (must match account holder).
        version:
          type: string
          description: MSA document version.
    InvestmentDetails:
      type: object
      properties:
        investmentId:
          type: string
        amount:
          type: number
          format: double
        numberOfShares:
          type:
          - number
          - 'null'
          format: double
        costBasis:
          type:
          - number
          - 'null'
          format: double
        fundedAmount:
          type:
          - number
          - 'null'
          format: double
        status:
          $ref: '#/components/schemas/InvestmentStatusEnum'
        assetId:
          type: string
        transactionId:
          type:
          - string
          - 'null'
        paymentType:
          allOf:
          - $ref: '#/components/schemas/PaymentTypeEnum'
        createdTs:
          type:
          - string
          - 'null'
          format: date-time
        modifiedTs:
          type:
          - string
          - 'null'
          format: date-time
    InvestmentDTO:
      description: Investment object returned in list; same shape as InvestmentDetails.
      allOf:
      - $ref: '#/components/schemas/InvestmentDetails'
    InvestmentStatusEnum:
      type: string
      enum:
      - CREATED
      - SIGNED
      - SUBMITTED
      - COMPLETED
      - CANCELLED
      - COUNTRY_MISMATCH
      - APPROVED
    CreatePaymentRequest:
      type: object
      description: Request body for updating payment details on an investment. Only WIRE and ACH payment types are supported.
      required:
      - accountId
      - paymentType
      - transactionId
      properties:
        accountId:
          type: string
          description: Account identifier.
        paymentType:
          $ref: '#/components/schemas/PaymentTypeEnum'
        bankAccountId:
          type:
          - string
          - 'null'
          description: Linked bank account identifier. Required when paymentType is ACH.
        transactionId:
          type: string
          description: Client-provided id for auditing (required, non-blank).
          example: a0000000-0000-0000-0000-000000000001
    AssetsResponse:
      type: object
      required:
      - assets
      properties:
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
    UpdateInvestmentRequest:
      type: object
      description: Request body for updating an investment (amount, payment details).
      required:
      - accountId
      - investmentId
      - transactionId
      properties:
        accountId:
          type: string
          description: Account identifier.
        investmentId:
          type: string
          description: Investment identifier to update.
        amount:
          type:
          - number
          - 'null'
          format: double
          description: Investment amount (positive if provided)
        numberOfShares:
          type:
          - number
          - 'null'
          format: double
          description: Number of shares (positive if provided). Can be computed from `amount` when ignored.
        paymentType:
          type:
          - string
          - 'null'
          enum:
          - WIRE
          - ACH
          description: Payment type. Only WIRE and ACH are supported.
        bankAccountId:
          type:
          - string
          - 'null'
          description: Bank account ID for ACH payments. Required when paymentType is ACH. Also accepts `achAccountId`.
        paymentId:
          type:
          - string
          - 'null'
          description: Payment identifier.
        transactionId:
          type: string
          description: Client-provided id for auditing (required, non-blank).
          example: a0000000-0000-0000-0000-000000000001
        selfAttestedAccreditationAnswer:
          type:
          - boolean
          - 'null'
          description: Self-attested accreditation answer.
    PaymentTypeEnum:
      type: string
      description: Supported payment types. Only WIRE and ACH are allowed.
      enum:
      - WIRE
      - ACH
    ErrorItem:
      type: object
      properties:
        code:
          type: string
          description: Error/validation code (e.g. DATE_OF_BIRTH_IN_FUTURE, JURISDICTION_COUNTRY_NOT_ALLOWED). See x-businessValidationErrorCodes for business logic codes.
        message:
          type: string
          description: Human-readable message.
        field:
          type:
          - string
          - 'null'
          description: Request field path when applicable (e.g. investor.dateOfBirth, investor.physicalAddress.country).
        details:
          type:
          - object
          - 'null'
          additionalProperties: true
          description: 'Optional object that will be sent for certain error `code` and documented in the endpoint''s error table.

            '
    CancelInvestmentRequest:
      type: object
      required:
      - accountId
      - transactionId
      properties:
        accountId:
          type: string
        transactionId:
          type: string
          description: Client-provided id for auditing (required, non-blank).
          example: a0000000-0000-0000-0000-000000000001
    CodeLabelDescription:
      type: object
      properties:
        code:
          type: string
          example: COMMON_STOCK
        label:
          type: string
          example: Common Stock
        description:
          type:
          - string
          - 'null'
          example: Common Stock.
    SubmitInvestmentRequest:
      type: object
      required:
      - accountId
      - transactionId
      properties:
        accountId:
          type: string
        transactionId:
          type: string
          description: Client-provided id for auditing (required, non-blank).
          example: a0000000-0000-0000-0000-000000000001
    AgreementDTO:
      type: object
      properties:
        id:
          type: string
    

# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tzero/refs/heads/main/openapi/tzero-investments-api-openapi.yml