> ## 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.

# Create journal

> Creates a journal from a transaction, or a manual journal with balanced lines.

| Journal            | Send                                                                               | Status                              |
| ------------------ | ---------------------------------------------------------------------------------- | ----------------------------------- |
| From a transaction | The transaction and ledger-account fields                                          | Draft, unless `auto_post` is `true` |
| Manual             | `lines`, the accounting date and the legal entity. Optional: one `transaction_id`. | `status: draft` or `status: posted` |

The journal uses the currency of its legal entity. Entendre checks the amounts, line balance, accounting period, posting eligibility and general-ledger sync state.


## OpenAPI

````yaml openapi-public-preview.json POST /v1/journal-entries
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:
    post:
      tags:
        - Journals
      summary: Create journal
      description: >-
        Creates a journal from a transaction and its ledger account, or from
        balanced lines. Transaction-based creation resolves the amounts and
        offsetting account. It creates a draft unless auto_post=true.
        Closed-period and posting checks still apply.
      operationId: create_journal
      parameters:
        - 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: true
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  required:
                    - transaction_id
                    - ledger_account_id
                  description: >-
                    Send exactly one of `transaction_type` or `classification`
                    (its older name).
                  oneOf:
                    - required:
                        - transaction_type
                      not:
                        required:
                          - classification
                    - required:
                        - classification
                      not:
                        required:
                          - transaction_type
                  properties:
                    transaction_id:
                      type: string
                      description: >-
                        The transaction to record. Entendre uses its fiat value,
                        direction, source type and asset type to build the
                        journal lines.
                    transaction_type:
                      allOf:
                        - $ref: '#/components/schemas/TransactionCategory'
                      description: >-
                        Economic transaction type (for example `WITHDRAWAL`).
                        This is not the accounting classification;
                        `ledger_account_id` selects that treatment.
                    classification:
                      allOf:
                        - $ref: '#/components/schemas/TransactionCategory'
                      deprecated: true
                      description: >-
                        Older name for `transaction_type`. Send only one type
                        field.
                    ledger_account_id:
                      type: string
                      description: >-
                        Postable ledger account for the entry. Entendre selects
                        the offsetting account.
                    accounting_date:
                      type: string
                      format: date-time
                      description: ISO-8601 date override. Defaults to transaction date.
                    memo:
                      type: string
                      description: Memo.
                    tag_ids:
                      type: array
                      items:
                        type: string
                      description: Tag IDs for reporting segmentation.
                    auto_post:
                      type: boolean
                      description: >-
                        Set to `true` to post the journal in the same request.
                        Defaults to `false`, which saves a draft.
                    payment_account_id:
                      type: string
                      description: >-
                        Offsetting ledger account (`lac_…`). Defaults to the
                        ledger account of the transaction source.
                    vendor_name:
                      type: string
                      description: >-
                        Vendor name. Entendre finds or creates a Supplier tag
                        for it and attaches the tag to the entry.
                - type: object
                  required:
                    - lines
                  properties:
                    lines:
                      type: array
                      minItems: 2
                      maxItems: 500
                      description: >-
                        Explicit journal entry lines. Total debits must equal
                        total credits exactly.
                      items:
                        type: object
                        required:
                          - ledger_account_id
                          - amount
                          - credit_or_debit
                        properties:
                          ledger_account_id:
                            type: string
                            description: >-
                              Postable (leaf, non-archived) ledger account
                              (`lac_` prefix).
                          amount:
                            oneOf:
                              - type: string
                              - type: number
                            description: >-
                              Positive line amount. Decimal string (`"125.50"`)
                              recommended for exactness; JSON numbers are
                              accepted but subject to float representation.
                          credit_or_debit:
                            type: string
                            enum:
                              - debit
                              - credit
                            description: Line direction. Case-insensitive.
                          memo:
                            type: string
                            description: >-
                              Line memo. A memo of 10 characters or more meets
                              the memo requirement for the line.
                          tag_ids:
                            type: array
                            items:
                              type: string
                            description: >-
                              Tag IDs for this line (`tag_` prefix). Max one tag
                              per key type per line.
                    status:
                      type: string
                      enum:
                        - draft
                        - posted
                      default: draft
                      description: >-
                        `posted` creates and posts in one call (same side
                        effects as posting a draft: balances, assets, GL sync).
                    transaction_id:
                      type: string
                      description: >-
                        Optional transaction link (`txn_` prefix). The
                        transaction must not already have accounting (409
                        otherwise). Supplies default `accounting_date` and legal
                        entity.
                    legal_entity_id:
                      type: string
                      description: >-
                        Legal entity for the entry (`le_` prefix). Required when
                        the organization has more than one active legal entity
                        and no `transaction_id` is linked.
                    accounting_date:
                      type: string
                      format: date-time
                      description: >-
                        ISO-8601 accounting date. Required when no
                        `transaction_id` is linked; otherwise defaults to the
                        transaction date. Must fall in an open accounting
                        period.
                    memo:
                      type: string
                      description: >-
                        Entry memo. A memo of 10 characters or more meets the
                        memo requirement for all lines.
            examples:
              Transaction:
                summary: From a transaction
                value:
                  transaction_id: txn_507f1f77bcf86cd799439011
                  transaction_type: DEPOSIT
                  ledger_account_id: lac_507f1f77bcf86cd799439012
                  auto_post: false
              Journal lines:
                summary: From journal lines
                value:
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  accounting_date: '2026-08-31T12:00:00Z'
                  currency: USD
                  memo: September software expense
                  lines:
                    - ledger_account_id: lac_507f1f77bcf86cd799439011
                      amount: '100.00'
                      credit_or_debit: debit
                      memo: September software expense
                      tag_ids:
                        - tag_507f1f77bcf86cd799439011
                    - ledger_account_id: lac_507f1f77bcf86cd799439012
                      amount: '100.00'
                      credit_or_debit: credit
                      memo: September software expense
                      tag_ids:
                        - tag_507f1f77bcf86cd799439011
      responses:
        '201':
          description: Created.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/JournalEntry'
                  read_back_failed:
                    type: boolean
                    description: >-
                      Present and `true` only when the entry was saved but could
                      not be read back. `data` then contains only `id`; use List
                      journals to read the entry.
                  warning:
                    type: string
                    description: Present only when `read_back_failed` is `true`.
                required:
                  - data
                additionalProperties: false
              example:
                data:
                  id: je_507f1f77bcf86cd799439011
                  organization_id: org_507f1f77bcf86cd799439011
                  sequence_number: JE-42
                  status: draft
                  originated_by: user
                  accounting_date: '2026-08-31T12:00:00Z'
                  posted_at: null
                  memo: Customer payment
                  sync_date: null
                  last_synced_at: null
                  last_unsynced_at: null
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  transaction_id: txn_507f1f77bcf86cd799439011
                  transaction_sequence_number: OT-42
                  accounting_period_id: null
                  classification: DEPOSIT
                  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 current state of the resource or an accounting rule prevents
            this operation. Read the resource again before you choose another
            action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: CONFLICT
                  message: The resource state does not allow this operation.
                  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
        '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:
    TransactionCategory:
      type: string
      description: >-
        Economic transaction type. Some values contain spaces, such as `INTERNAL
        TRANSFER`.
      enum:
        - DEPOSIT
        - WITHDRAWAL
        - SWAP
        - NON_TAXABLE_CONVERSION
        - BRIDGE
        - INTERCOMPANY TRANSFER
        - INTERNAL TRANSFER
        - FEE
        - MINTING
        - STAKING_REWARD
        - VALIDATOR_REWARD
        - INVOICE
        - BILL
        - CLAIM REWARD
        - BORROW
        - REPAYMENT
        - RESERVES CHANGE
        - REALIZED_PNL
        - INCOME
        - EXPENSE
        - REFUND
        - CHARGEBACK
        - NFT
        - SPAM
        - UNKNOWN
    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.

````