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

# Batch Update Transactions API

> Update Breezing transactions in bulk with one API request to apply accounting field changes across unlocked crypto accounting records.



## OpenAPI

````yaml PATCH /transactions
openapi: 3.1.0
info:
  title: Breezing Public API
  version: 1.0.0
  description: >-
    Crypto accounting API for programmatic access and AI agents. Authenticate
    with an API key using the Authorization header: `Bearer brz_...`
servers:
  - url: https://api.breezing.io/v1
security:
  - BearerAuth: []
paths:
  /transactions:
    patch:
      tags:
        - Transactions
      summary: Batch update transactions
      description: >-
        Batch update accounting fields on up to 500 unlocked transactions. Same
        fields and rules as transactions_update, applied uniformly to all IDs.
        Returns 409 if any transaction is locked or processing.


        This is the API equivalent of applying a Rule in the Breezing UI. Use it
        when you identify a pattern across transactions (same wallet, same
        token, same counterparty) that should all get the same account. Skip
        transactions where isInternal=true or exchangeId is a non-null number;
        those should use Auto Apply Account instead.


        When setting accounts, first call company_get and use numeric account
        codes.
      parameters:
        - schema:
            type: string
            description: >-
              Organization ID. Use GET /v1/companies to discover available
              org/company pairs.
            example: '1'
          required: true
          description: >-
            Organization ID. Use GET /v1/companies to discover available
            org/company pairs.
          name: orgId
          in: query
        - schema:
            type: string
            description: >-
              Company ID. Use GET /v1/companies to discover available companies
              and their access levels.
            example: '1'
          required: true
          description: >-
            Company ID. Use GET /v1/companies to discover available companies
            and their access levels.
          name: companyId
          in: query
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchPatchTransactionsBody'
      responses:
        '200':
          description: Transactions updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    type: object
                    properties:
                      updated:
                        type: integer
                      dedupedFrom:
                        type: integer
                        description: >-
                          Original input length when duplicate IDs were deduped
                          server-side. Omitted when the input had no duplicates.
                    required:
                      - updated
                required:
                  - success
                  - data
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
        '401':
          description: Invalid or missing API key
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
        '403':
          description: >-
            API key has no access to this company, has read-only access where
            write was required, or the company subscription is inactive
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
        '404':
          description: One or more transactions were not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
        '409':
          description: One or more transactions are locked or currently processing
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - success
                  - error
      security:
        - BearerAuth: []
components:
  schemas:
    BatchPatchTransactionsBody:
      type: object
      properties:
        ids:
          type: array
          items:
            type: integer
          minItems: 1
          maxItems: 500
          description: Transaction IDs to update (max 500)
        updates:
          allOf:
            - $ref: '#/components/schemas/PatchTransactionBody'
            - description: Fields to update
      required:
        - ids
        - updates
    PatchTransactionBody:
      type: object
      properties:
        account:
          type: string
          nullable: true
          description: >-
            Account code (numeric string). The contra (income/expense) account:
            what was this transaction for? (e.g. Sales, Legal Expense,
            Consulting Revenue). IMPORTANT: Always call company_get first to
            retrieve the chart of accounts, find the account by name, and use
            its "code" field. Never pass a free-text name like "sales".
        assetAccount:
          type: string
          nullable: true
          description: >-
            Asset account code (numeric string). The balance-sheet account for
            the token in this transaction. Required in ALL balance sheet modes.
            If the current value is "(auto)", Breezing resolves it at sync time
            from token-level or rule-based mappings. You can leave it or
            override with a specific code. IMPORTANT: Always call company_get
            first to retrieve the chart of accounts and use the numeric code.
        feeAssetAccount:
          type: string
          nullable: true
          description: >-
            Fee asset account code (numeric string). The balance-sheet account
            for the fee portion. Same rules as assetAccount: required in ALL
            balance sheet modes. If "(auto)", Breezing resolves it at sync time.
            IMPORTANT: Always call company_get first to retrieve the chart of
            accounts and use the numeric code.
        status:
          type: string
          enum:
            - notStarted
            - reviewRequired
            - reconciled
            - manuallyReconciled
            - paid
            - synced
          description: >-
            Transaction status lifecycle: notStarted (new/uncategorized) →
            reviewRequired (flagged for client review; client sees these in the
            Client Review workflow) → reconciled (categorized and verified) →
            manuallyReconciled (manually confirmed) → paid (synced to accounting
            software). Set to reviewRequired when the accountant needs the
            client to clarify a transaction.
        type:
          type: string
          nullable: true
          description: >-
            Transaction type as a freeform label, safe to overwrite. System may
            set values like "transaction" or "internal" during import, but these
            are just labels, not business logic. The isInternal boolean controls
            actual internal transfer logic. Set to any descriptive value:
            "Opening Balance", "Staking Reward", "Payment", etc.
        note:
          type: string
          nullable: true
          description: >-
            User note. Internal only, not synced to accounting software. Use
            accountingDescription for text that should appear in journal
            entries.
        accountingDescription:
          type: string
          nullable: true
          description: >-
            Description that syncs as the journal entry description in
            Xero/QuickBooks/Bexio. Use for invoice references, vendor names, or
            transaction context that should appear in the accounting software.
            Distinct from "note" which is internal only.
        vat:
          type: string
          nullable: true
          description: >-
            VAT or sales tax code as a freeform string that syncs to journal
            entries. Must match a tax rate name configured in the user's
            Xero/QuickBooks/Bexio account (e.g. "Output 8.1% VAT", "Tax
            Exempt"). Default is "no-vat". No validation, so invalid codes may
            cause sync errors.
        isSpam:
          type: boolean
          description: >-
            Spam flag. Set true to hide airdrop/scam tokens from the main view
            and prevent syncing to accounting software. Breezing auto-detects
            many spam tokens; use this for any it missed.
        extraLabel:
          type: string
          nullable: true
          description: >-
            Extra label: freeform text for custom tagging or grouping, visible
            in Breezing reports.
        skipNgl:
          type: boolean
          description: >-
            Skip net gain/loss. When true, realized gain/loss is zeroed for this
            transaction (excluded from NGL and tax calculations). Use for
            non-taxable movements like wrapping, staking, or bridging. Requires
            skipNglReason when set to true. Cannot be set on internal transfers
            (isInternal=true). Setting this does NOT recalculate NGL
            automatically; run POST /ngl/calculate afterward to recompute net.
        skipNglReason:
          type: string
          nullable: true
          description: >-
            Reason net gain/loss is skipped (e.g. "Wrapping", "Staking", "Bridge
            transfer"). Required when skipNgl is set to true.
        qboClass:
          type: string
          nullable: true
          description: >-
            QuickBooks Online class ID. Syncs as the class on the journal entry
            in QuickBooks. Use the "id" returned by the QuickBooks classes
            refresh endpoint (call it first to retrieve valid class IDs). Only
            relevant when QuickBooks is linked.
        xeroTrackingCategory:
          type: string
          nullable: true
          description: >-
            Xero tracking category option ID. Syncs as the tracking category on
            the journal entry in Xero. Use the "id" returned by the Xero
            categories refresh endpoint (call it first to retrieve valid option
            IDs). Only relevant when Xero is linked.

````