> ## Documentation Index
> Fetch the complete documentation index at: https://developer.tyms.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Void income

> Void a posted income record. Unmatch a bank transaction linked to a payment on this income before you void it.

Void a record that is already on the books. Tyms keeps the record and posts the reverse of its ledger lines. Send an empty body to void it today.

`date` cannot be in the future, inside a closed period, or before the record and any activity already posted. `reason` is optional and is stored up to 500 characters. It is required when the record was approved and the void must be approved again. In that case the record stays as it is until someone approves the void, and the response includes `void_pending: true`.

A record that is not on the books yet can be deleted instead. A record that is already voided cannot be voided again. Opening balances cannot be voided.



## OpenAPI

````yaml /openapi/adam-v1.json post /income/{uuid}/void
openapi: 3.0.3
info:
  title: Tyms Developer API
  version: 1.0.0
  description: >-
    REST API for Tyms — the AI-Native Accounting Platform for small and
    medium-sized businesses across service, consulting, retail, and
    manufacturing. Paths are appended to the server URL.


    **Business key** (`tyms_sk_...`): all routes except partner distributor
    routes and OAuth authorization steps that document their own auth. **Partner
    key** (`adam_partner_sk_...` or equivalent): `POST /register-business`, `GET
    /referred-businesses`, billing status, and seat/credit grants on referred
    businesses. **OAuth**: integration apps use `tyms_pk_...` / `tyms_sk_...`
    plus user Bearer tokens — see the OAuth guide.


    Financial reports match what you see in the Tyms app. On invoices, bills,
    expenses, income, journals, quotes, and purchase orders you can attach a
    file by URL (`attachments`, `file_url`, `file_urls`, or `evidence`). A bank
    transaction accepts one URL on `attachment`. A body that includes `prompt`
    is an AI create and does not also save that file as a receipt. See the
    Attachments page.


    Validation failures return HTTP 400 with a readable `message`, an `errors`
    list, and the field map in `data`.
servers:
  - url: https://staging-api.tyms.io/v1/adam
    description: Sandbox (pre-production). Request credentials at developer@tyms.io.
  - url: https://api.tyms.io/v1/adam
    description: Production
security:
  - apiKey: []
tags:
  - name: Partners
    description: >-
      Referral partner (distributor) flows — partner API key only. Register
      businesses, list referrals, read billing, and grant Plus seats or AI
      credits from partner holding.
  - name: Authentication
    description: Validate a business Developer API key.
  - name: OAuth
    description: >-
      Third-party integration authorization — connect Tyms users to your app
      without sharing their business secret keys.
  - name: Chart of accounts
    description: COA and bank-linked accounts.
  - name: Taxes
    description: Sales tax and withholding tax rates for line items and dropdowns.
  - name: Invoices
    description: Invoice CRUD, payments, and void.
  - name: Bills
    description: Bill CRUD, payments, and void.
  - name: Expenses
    description: Expense CRUD and void.
  - name: Income
    description: Income record CRUD and void.
  - name: Journals
    description: Journal entry CRUD and void.
  - name: Contacts
    description: Contact CRUD.
  - name: Banks
    description: >-
      Bank accounts. Optional chart_of_account_uuid groups a new bank under an
      existing bank asset account.
  - name: Bank transactions
    description: Statement lines, categorization, AI-assisted upload, and void.
  - name: Reports
    description: Financial statements (aligned with in-app reports).
  - name: Inventory
    description: >-
      Product and service catalog; stock tracking, sell, restock, and void of
      adjustments, production orders, and opening stock.
  - name: Fixed Assets
    description: Capital asset acquisition, tracking, and void.
  - name: Quotes
    description: >-
      Sales proposals that can be converted to invoices, income, or prepaid
      income.
  - name: Purchase Orders
    description: Vendor buying commitments that convert to inventory restocks.
  - name: Departments
    description: Reporting dimension for cost/profit allocation within a branch.
  - name: Projects
    description: Job costing and project tracking dimension attached to transactions.
  - name: Branches
    description: Multi-location dimension; reports and lists can filter by branch.
paths:
  /income/{uuid}/void:
    post:
      tags:
        - Income
      summary: Void income
      description: >-
        Void a posted income record. Unmatch a bank transaction linked to a
        payment on this income before you void it.


        Void a record that is already on the books. Tyms keeps the record and
        posts the reverse of its ledger lines. Send an empty body to void it
        today.


        `date` cannot be in the future, inside a closed period, or before the
        record and any activity already posted. `reason` is optional and is
        stored up to 500 characters. It is required when the record was approved
        and the void must be approved again. In that case the record stays as it
        is until someone approves the void, and the response includes
        `void_pending: true`.


        A record that is not on the books yet can be deleted instead. A record
        that is already voided cannot be voided again. Opening balances cannot
        be voided.
      operationId: voidIncome
      parameters:
        - name: uuid
          in: path
          required: true
          schema:
            type: string
          description: Record id.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoidPostedRecordRequest'
            examples:
              today:
                summary: Void today
                value: {}
              dated:
                summary: Choose a date and a reason
                value:
                  date: '2026-11-03'
                  reason: Entered on the wrong customer.
      responses:
        '200':
          description: The record was voided, or the void was sent for approval.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdamSuccessResponse'
              examples:
                voided:
                  summary: Voided
                  value:
                    status: success
                    message: This record has been voided.
                    data:
                      uuid: cc0e8400-e29b-41d4-a716-446655440008
                      void_date: '2026-11-03'
                      void_journal_no: 1042
                pending_approval:
                  summary: Sent for approval
                  value:
                    status: success
                    message: >-
                      This void has been sent for approval. The record stays as
                      it is until someone approves it.
                    data:
                      uuid: cc0e8400-e29b-41d4-a716-446655440008
                      void_pending: true
                      void_date: '2026-11-03'
        '400':
          description: >-
            The record cannot be voided, the date is not allowed, or a reason is
            required for approval.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                not_posted:
                  summary: Not on the books
                  value:
                    status: failed
                    message: >-
                      This record is not on the books yet. You can delete it
                      instead.
                date:
                  summary: Date not allowed
                  value:
                    status: failed
                    message: >-
                      This record already has activity after that date. The
                      earliest date you can use is 2026-11-01.
        '404':
          description: The record was not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                status: failed
                message: We could not find that record.
components:
  schemas:
    VoidPostedRecordRequest:
      type: object
      description: Optional. An empty body voids the record today.
      properties:
        date:
          type: string
          format: date
          description: >-
            Void date. Defaults to today in the business timezone. It cannot be
            in the future, on or before a closed period, or before the record
            date and any activity already posted. Stock records can only be
            voided today.
        reason:
          type: string
          maxLength: 500
          description: >-
            Note stored on the void. Required when the record was approved and
            this void must be approved again.
    AdamSuccessResponse:
      type: object
      required:
        - status
        - message
      properties:
        status:
          type: string
          example: success
        message:
          type: string
        data:
          description: >-
            Single resource, array of resources, statement sections, or async
            job metadata — see each operation's example.
        meta:
          type: object
          additionalProperties: true
          description: >-
            Pagination (`page`, `limit`, `total`) and/or report range (`from`,
            `to`). Cash flow may include `previous_period_end`.
    ErrorResponse:
      type: object
      description: >-
        Failed calls. On validation errors, `message` is the field messages
        joined into sentences so an automation can show it directly.
      properties:
        status:
          type: string
          example: failed
        message:
          type: string
          description: >-
            Human-readable error. For validation, field messages joined with a
            space.
        errors:
          type: array
          description: Present on validation failures. One entry per field message.
          items:
            type: object
            required:
              - field
              - message
            properties:
              field:
                type: string
                example: date
              message:
                type: string
                example: The date field is required.
        data:
          description: >-
            On validation failures, a map of field name to a list of messages.
            Other failures may omit `data` or use a different shape.
          oneOf:
            - type: object
              additionalProperties:
                type: array
                items:
                  type: string
            - type: array
            - type: object
      example:
        status: failed
        message: The date field is required. The currency field is required.
        errors:
          - field: date
            message: The date field is required.
          - field: currency
            message: The currency field is required.
        data:
          date:
            - The date field is required.
          currency:
            - The currency field is required.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Business secret `tyms_sk_...` for business-scoped routes. Partner secret
        for register-business and referred-business distributor routes.
      x-default: your_tyms_sk_or_partner_key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.