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

# Unpost journal

> Removes a posted journal from the ledger so that you can correct or reclassify it.

The transactions of the journal are detached. The accounting period must be open. For a synced journal, the ERP copy must be removed successfully first. Reversed journals cannot be unposted.


## OpenAPI

````yaml openapi-public-preview.json POST /v1/journal-entries/{journal_id}/unpost
openapi: 3.1.0
info:
  title: Entendre API
  version: 1.0.0
  description: Programmatic access to crypto-native accounting and treasury operations.
servers:
  - url: https://api.entendre.finance
    description: Production API.
security:
  - ApiKey: []
tags:
  - name: Organization
    description: Read your organization profile and find members for agent assignments.
  - name: Transactions
    description: Find transactions, inspect their details and create manual records.
  - name: Sources
    description: >-
      Manage wallets, exchange accounts, bank accounts and other transaction
      sources.
  - name: Assets
    description: Inspect asset acquisitions, remaining quantities and cost basis.
  - name: Journals
    description: >-
      Create and post journal entries, correct eligible entries and sync posted
      journals to a connected general ledger.
  - name: Documents
    description: >-
      Upload documents, check processing status and link supporting evidence to
      transactions.
  - name: Legal Entities
    description: Manage the legal entities used in your accounting records.
  - name: Ledger Accounts
    description: Manage your chart of accounts and find accounts for journal entries.
  - name: Tags
    description: Create and manage tags to classify your records.
  - name: Accruals
    description: >-
      Create and post accruals, inspect their status and reverse eligible
      entries.
  - name: Cash Application
    description: Match deposits to invoices and manage the resulting cash applications.
  - name: Classification
    description: >-
      Classify transactions in a batch, post eligible entries and inspect the
      results.
  - name: Revaluation
    description: Run asset revaluations for an accounting period and check their results.
  - name: Accounting Periods
    description: Check whether a period is ready to close, then close or reopen it.
  - name: Income Statement
    description: View revenue, expenses and net income for a reporting period.
  - name: Balance Sheet
    description: View assets, liabilities and equity as of a reporting date.
  - name: Trial Balance
    description: Review ledger account balances and debit and credit totals.
  - name: Closing Positions
    description: View asset positions at the end of a reporting period.
  - name: Treasury Balances
    description: Review treasury balances by asset and source.
  - name: Realized Gains & Losses
    description: Review realized gains and losses from asset dispositions.
  - name: Asset Tax Lots
    description: Inspect asset tax lots, remaining quantities and cost basis.
  - name: Schedule of Dispositions
    description: >-
      Review asset dispositions and their proceeds, cost basis and gains or
      losses.
  - name: Financial Insights
    description: Review financial insights for your selected reporting context.
  - name: Agents
    description: Create agents, schedule their work and inspect their runs.
  - name: Memory
    description: Read, search and maintain the memory files your agents use.
  - name: Connections
    description: Connect providers, manage authorization and disconnect.
  - name: GL Mapping
    description: >-
      Map ledger accounts and legal entities to your ERP. Import legal entities,
      tags and chart of accounts.
  - name: Request
    description: Request information, documents or connections from a client.
  - name: Client
    description: Manage your firm’s client relationships.
  - name: Team
    description: Invite team members and manage their access to your firm.
  - name: Settings
    description: Read and update your firm settings.
paths:
  /v1/journal-entries/{journal_id}/unpost:
    post:
      tags:
        - Journals
      summary: Unpost journal
      description: >-
        Removes a posted journal from the ledger and detaches its transactions
        for correction or reclassification. The accounting period must be open.
        If the journal is synced, its ERP copy must be removed successfully
        first. Reversed journals cannot be unposted through this operation.
      operationId: unpost_journal
      parameters:
        - name: journal_id
          in: path
          required: true
          description: ID of the journal.
          schema:
            type: string
            minLength: 1
          example: je_507f1f77bcf86cd799439011
        - name: Idempotency-Key
          in: header
          required: true
          description: >-
            Unique key for this operation. Retry with the same key and request
            body after a timeout. Keys are retained for at least 24 hours.
          schema:
            type: string
            minLength: 1
            maxLength: 255
          example: example-operation-2026-08-31-001
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties: {}
              additionalProperties: false
            example: {}
      responses:
        '200':
          description: The request succeeded.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/JournalEntry'
                required:
                  - data
                additionalProperties: false
              example:
                data:
                  id: je_507f1f77bcf86cd799439011
                  organization_id: org_507f1f77bcf86cd799439011
                  sequence_number: JE-42
                  status: unposted
                  originated_by: user
                  accounting_date: '2026-08-31T12:00:00Z'
                  posted_at: null
                  memo: Record August opening balance
                  source_type: MANUAL
                  sync_date: null
                  last_synced_at: null
                  last_unsynced_at: null
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  transaction_id: null
                  transaction_sequence_number: null
                  accounting_period_id: null
                  classification: null
                  tag_ids: []
                  reversal_chain:
                    previous_entry_id: null
                    next_entry_id: null
                  period_auto_reassigned: false
                  intended_accounting_date: null
                  legal_entity_auto_assigned: false
                  lines:
                    - id: jel_507f1f77bcf86cd799439011
                      ledger_account_id: lac_507f1f77bcf86cd799439011
                      legal_entity_id: le_507f1f77bcf86cd799439011
                      credit_or_debit: DEBIT
                      amount: '100.00'
                      currency: USD
                      memo: null
                      tag_ids: []
                    - id: jel_507f1f77bcf86cd799439012
                      ledger_account_id: lac_507f1f77bcf86cd799439012
                      legal_entity_id: le_507f1f77bcf86cd799439011
                      credit_or_debit: CREDIT
                      amount: '100.00'
                      currency: USD
                      memo: null
                      tag_ids: []
                  is_sync: false
                  latest_gl_sync_attempt: null
                  created_at: '2026-08-31T12:00:00Z'
                  updated_at: '2026-08-31T12:00:00Z'
        '400':
          description: >-
            The request is invalid. `error.fields` lists the fields to correct.
            Nothing was changed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: Invalid path, query or request body.
                  request_id: req_example
        '401':
          description: The API key is missing, invalid or expired.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication is required.
                  request_id: req_example
        '403':
          description: >-
            The API key does not have the required scope or is not associated
            with a user, or the action needs a review in the dashboard.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: Insufficient access to organization
                  request_id: req_example
        '404':
          description: The resource does not exist, or your organization cannot access it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RESOURCE_NOT_FOUND
                  message: Resource not found
                  request_id: req_example
        '409':
          description: >-
            The journal is not posted, or its accounting period is closed. No
            unpost is performed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: CONFLICT
                  message: >-
                    The journal is not posted, or its accounting period is
                    closed. No unpost is performed.
                  request_id: req_example
        '429':
          description: >-
            Too many requests. If the response has a `Retry-After` header, wait
            that many seconds before you retry. Otherwise, read `error.message`.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded. Retry after 30s.
                  request_id: req_example
        '500':
          description: >-
            An unexpected error occurred. A write can still have taken effect;
            check the resource before you retry. Give the `request_id` to
            support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: INTERNAL_ERROR
                  message: Internal server error
                  request_id: req_example
        '502':
          description: >-
            The ERP copy could not be removed. The journal remains posted; check
            its sync state before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: EXTERNAL_SERVICE_ERROR
                  message: >-
                    The ERP copy could not be removed. The journal remains
                    posted; check its sync state before retrying.
                  request_id: req_example
        '503':
          description: >-
            A service that this operation needs is unavailable. If the response
            has a `Retry-After` header, wait that many seconds. Check for
            earlier accepted work before you send the request again.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: SERVICE_UNAVAILABLE
                  message: Service unavailable.
                  request_id: req_example
components:
  schemas:
    JournalEntry:
      type: object
      required:
        - id
        - status
        - legal_entity_id
        - lines
        - created_at
      properties:
        id:
          type: string
          examples:
            - je_abc123
          description: Journal ID (`je_…`).
        organization_id:
          type:
            - string
            - 'null'
          description: Prefixed organization ID (`org_` prefix).
          examples:
            - org_abc123
        sequence_number:
          type: string
          description: Human-readable sequence (such as `JE-42`).
        status:
          type: string
          enum:
            - draft
            - posted
            - reversed
            - unposted
            - in_progress
            - error
          description: Journal status.
        originated_by:
          type: string
          enum:
            - system
            - user
          description: >-
            `system` for a journal that Entendre created, `user` for a manual
            journal.
        accounting_date:
          type: string
          format: date-time
          description: Accounting date (ISO 8601).
        posted_at:
          type:
            - string
            - 'null'
          format: date-time
          description: '`null` for DRAFT entries.'
        memo:
          type:
            - string
            - 'null'
          description: Memo.
        source_type:
          type:
            - string
            - 'null'
          enum:
            - TRANSACTION
            - ASSETS
            - REVALUATION
            - REVERSE_REVALUATION
            - NIURAL_INVOICE
            - ACCRUAL
            - MANUAL
            - BILL_EXPENSE
            - QUICKBOOKS
            - STRIPE_INVOICE
            - STRIPE_PAYMENT
            - STRIPE_FEE
            - STRIPE_DISPUTE
            - CASH_APPLICATION
            - null
          description: What created this entry. `null` if not set.
        sync_date:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When this entry was last synced to its external GL; `null` if never
            synced. Set on list responses; `null` in the response of an
            operation that changes one entry.
        last_synced_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When this entry was last sent to the external GL. Unlike
            `sync_date`, it stays after an unsync and changes only on the next
            sync. `null` if never synced.
        last_unsynced_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When this entry was last removed (unsynced) from the external GL. It
            is never cleared. `last_unsynced_at > last_synced_at` means the
            entry is currently out of the GL.
        legal_entity_id:
          type: string
          description: Legal entity ID (`le_…`).
        transaction_id:
          type:
            - string
            - 'null'
          description: Linked transaction (`txn_…`), or `null`.
        transaction_sequence_number:
          type:
            - string
            - 'null'
          description: >-
            Sequence number (such as `OT-1234`) of the source transaction, when
            populated. `null` on responses that don't expand the transaction.
        template_id:
          type:
            - string
            - 'null'
          description: >-
            Template used to generate this entry, if applicable (`tpl_` prefix).
            `null` for manual or classification-based entries.
        accounting_period_id:
          type:
            - string
            - 'null'
          description: >-
            Accounting period this entry falls in (`ap_` prefix). `null` if not
            assigned to a period.
        classification:
          type:
            - string
            - 'null'
          description: Transaction type used to derive the journal lines.
        tag_ids:
          type: array
          items:
            type: string
          description: Tag IDs (`tag_…`).
        reversal_chain:
          type: object
          properties:
            previous_entry_id:
              type:
                - string
                - 'null'
              description: Journal that this journal reverses, or `null`.
            next_entry_id:
              type:
                - string
                - 'null'
              description: Journal that reverses this journal, or `null`.
          description: Links to the journals before and after this one in a reversal chain.
        period_auto_reassigned:
          type: boolean
          description: >-
            `true` when the accounting date was in a closed period, so the
            journal moved to the current open period.
        intended_accounting_date:
          type:
            - string
            - 'null'
          description: >-
            When period_auto_reassigned is true, the entry's own accounting date
            (whose true period is closed); null otherwise.
        legal_entity_auto_assigned:
          type: boolean
          description: >-
            `true` when the journal had no legal entity, so Entendre assigned
            the only active legal entity.
        lines:
          type: array
          items:
            $ref: '#/components/schemas/JournalEntryLine'
          description: Journal lines.
        is_sync:
          type: boolean
          description: >-
            Whether this entry has been synced to an external GL (QuickBooks,
            Xero, NetSuite, DualEntry, Campfire).
        latest_gl_sync_attempt:
          type:
            - object
            - 'null'
          description: >-
            Most recent GL sync attempt for this entry; `null` if a sync has
            never been attempted.
          properties:
            id:
              type:
                - string
                - 'null'
              description: Sync attempt ID (`jesa_…`), or `null` for older attempts.
              examples:
                - jesa_abc123
            gl_type:
              type:
                - string
                - 'null'
              enum:
                - QUICKBOOKS
                - XERO
                - NETSUITE
                - DUALENTRY
                - CAMPFIRE
                - null
              description: Target GL the sync attempt was made against.
            external_type:
              type:
                - string
                - 'null'
              description: >-
                Provider-specific transaction type used (such as QBO Purchase,
                Deposit, BillPayment).
            external_id:
              type:
                - string
                - 'null'
              description: >-
                ID of the posted entry in the GL; `null` for failed or pending
                attempts.
            error_type:
              type:
                - string
                - 'null'
              enum:
                - AUTHENTICATION
                - MAPPING_MISSING
                - VALIDATION
                - UNKNOWN
                - DUPLICATE_DETECTED
                - DOC_NUMBER_COLLISION
                - null
              description: >-
                Category of the failure, if the latest attempt errored; `null`
                when the attempt did not error.
            error_details:
              type:
                - string
                - 'null'
              description: Human-readable detail for the failure, if any.
        created_at:
          type: string
          format: date-time
          description: Time the journal was created (ISO 8601).
        updated_at:
          type: string
          format: date-time
          description: Time the journal was last updated (ISO 8601).
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - request_id
          properties:
            code:
              type: string
              description: Machine-readable error code.
            message:
              type: string
              description: Technical description for developers.
            fields:
              type: object
              additionalProperties:
                type: string
              description: >-
                Present only on VALIDATION_ERROR. Maps failing field paths to
                reason strings.
            details:
              type: object
              additionalProperties: true
              description: >-
                Optional redacted diagnostic details. Request validation uses
                fields or field_errors.
            suggested_action:
              type: string
              description: A suggested next step.
            documentation_url:
              type: string
              format: uri
              description: Link to documentation about this error.
            request_id:
              type: string
              description: Unique request ID for support escalation.
          description: Error details.
    JournalEntryLine:
      type: object
      required:
        - id
        - ledger_account_id
        - legal_entity_id
        - credit_or_debit
        - amount
        - currency
      properties:
        id:
          type: string
          examples:
            - jel_def456
          description: Journal line ID.
        ledger_account_id:
          type: string
          description: Ledger account ID (`lac_…`).
        legal_entity_id:
          type: string
          description: >-
            Legal entity this line belongs to. Typically inherited from the
            parent journal entry or derived from the transaction's source, but
            can differ in multi-entity scenarios.
        credit_or_debit:
          type: string
          enum:
            - DEBIT
            - CREDIT
          description: '`DEBIT` or `CREDIT`.'
        amount:
          type: string
          description: Decimal string.
        currency:
          type: string
          description: Currency of the line amount.
        memo:
          type:
            - string
            - 'null'
          description: Memo.
        tag_ids:
          type: array
          items:
            type: string
          description: Tag IDs (`tag_…`).
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Your organization API key. Some operations also need a key that is
        associated with a user; their pages say so.

````