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

# Sync journals

> Sends selected posted journals to the connected general ledger.

Entendre groups the journals by legal entity and accounting period, and queues one provider job for each group. One request can return several jobs. The destination comes from the legal entity of each journal; there is no `connection_id` parameter. Read the results with [List journal sync jobs](/docs/api-reference/core/journals/list-journal-sync-jobs).

## Preview a sync

Set `dry_run=true` to check which journals can be assigned to sync jobs. Nothing is sent to the provider. Journals without a general-ledger configuration or provider company mapping are listed in `failed`.

To sync, send the same `journal_entry_ids` and the `confirm_count` of the preview. `confirm_count` checks only the number of distinct IDs. It does not check which journals they are, or whether they changed after the preview. A preview does not guarantee that the provider accepts the journals.

## Sync

A sync that queues work returns HTTP 202. If the general ledger rejects the credentials, the request returns HTTP 409 and sends no journal.


## OpenAPI

````yaml openapi-public-preview.json POST /v1/journal-entries/syncs
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/syncs:
    post:
      tags:
        - Journals
      summary: Sync journals
      description: >-
        Sends selected posted journals to the connected general ledger. Entendre
        groups the selection by legal entity and accounting period and queues
        one provider job per group, so one request can return several jobs. Read
        the run outcome with List journal sync jobs. Set `dry_run=true` to check
        which journals can be assigned to sync jobs without sending them. The
        preview returns HTTP 200 and lists assigned journals and missing
        configuration. A queued sync returns HTTP 202. Keep the same
        `journal_entry_ids` for the real request and send the returned
        `confirm_count`. This checks the distinct ID count, not the identity of
        those IDs or later changes to the journals. The preview does not
        guarantee provider acceptance; check the sync results after submission.
      operationId: sync_journals
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          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:
              type: object
              properties:
                journal_entry_ids:
                  type: array
                  items:
                    type: string
                    description: Journal ID (`je_…`).
                    example: je_507f1f77bcf86cd799439011
                  minItems: 1
                  maxItems: 5000
                  description: >-
                    Journals to sync. Duplicates are accepted and collapsed. The
                    destination is resolved per journal from its legal entity;
                    there is no connection parameter.
                confirm_count:
                  type: integer
                  minimum: 0
                  description: >-
                    Safety check. When supplied it must equal the number of
                    distinct IDs in journal_entry_ids, otherwise the request is
                    rejected before any journal is sent.
                dry_run:
                  type: boolean
                  description: >-
                    Preview only. Runs the same validation and routing and
                    reports which journals would be queued, without sending
                    anything. Returns 200, not 202.
                agent_instance_id:
                  type: string
                  minLength: 1
                  description: >-
                    Attributes the sync to an agent instead of the API-key user.
                    Must be sent together with agent_name.
                agent_name:
                  type: string
                  minLength: 1
                  description: >-
                    Display name of the initiating agent. Must be sent together
                    with agent_instance_id.
              required:
                - journal_entry_ids
              additionalProperties: false
            example:
              journal_entry_ids:
                - je_507f1f77bcf86cd799439011
              confirm_count: 1
      responses:
        '200':
          description: Dry-run preview. Nothing was sent to the provider.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      dry_run:
                        type: boolean
                        const: true
                        description: '`true` for a preview.'
                      confirm_count:
                        type: integer
                        description: Value to send as confirm_count on the real call.
                      summary:
                        type: object
                        properties:
                          requested:
                            type: integer
                            description: Distinct journals submitted.
                          journal_entries:
                            type: integer
                            description: Journals that would be queued.
                          failed:
                            type: integer
                            description: Journals that would not be routed.
                        required:
                          - requested
                          - journal_entries
                          - failed
                        additionalProperties: false
                        description: Counts for the preview.
                      eligible:
                        type: array
                        items:
                          type: string
                        description: Journals that would be queued.
                      failed:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Journal ID.
                            reason:
                              type: string
                              description: Why the journal would not be synced.
                          required:
                            - id
                            - reason
                          additionalProperties: false
                        description: >-
                          Journals that no provider job would cover, each with
                          the reason. A journal lands here when its legal entity
                          has no general-ledger configuration.
                    required:
                      - dry_run
                      - confirm_count
                      - summary
                      - eligible
                      - failed
                    additionalProperties: false
                    description: The sync result.
                required:
                  - data
                additionalProperties: false
              example:
                data:
                  dry_run: true
                  confirm_count: 1
                  summary:
                    requested: 1
                    journal_entries: 1
                    failed: 0
                  eligible:
                    - je_507f1f77bcf86cd799439011
                  failed: []
        '202':
          description: >-
            Accepted. One job per (legal entity, accounting period) group in the
            selection. An empty jobs array means no journal was routed to a
            provider.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      jobs:
                        type: array
                        items:
                          type: object
                          properties:
                            job_id:
                              type:
                                - string
                                - 'null'
                              description: >-
                                Job ID. Check the result with List journal sync
                                jobs.
                            display_name:
                              type:
                                - string
                                - 'null'
                              description: Human-readable job label.
                          required:
                            - job_id
                            - display_name
                          additionalProperties: false
                        description: Queued provider jobs.
                      jobs_count:
                        type: integer
                        minimum: 0
                        description: Number of queued jobs.
                    required:
                      - jobs
                      - jobs_count
                    additionalProperties: false
                    description: The sync result.
                  message:
                    type: string
                    description: Summary message.
                required:
                  - data
                  - message
                additionalProperties: false
              example:
                data:
                  jobs:
                    - job_id: apid:jeid
                      display_name: Syncing March 2026 to QuickBooks
                  jobs_count: 1
                message: >-
                  1 sync job(s) queued; subscribe to SSE on each job_id for
                  progress
        '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: >-
            One or more journals do not exist, or your organization cannot
            access them. No journal is sent.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RESOURCE_NOT_FOUND
                  message: >-
                    One or more journal IDs are absent or not visible to the
                    authenticated tenant.
                  request_id: req_example
        '409':
          description: >-
            The destination general ledger refused the credentials. Reconnect
            the connection, then retry. No journal is sent.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: CONFLICT
                  message: >-
                    QuickBooks authorization expired. Reconnect the
                    general-ledger connection and retry.
                  details:
                    auth_error: true
        '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:
    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.
  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.

````