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

# Connect provider

> Connects an exchange, Plaid, Ramp or general-ledger provider.

| Provider                   | Send                                                        | Next step                                                                                                                                                 |
| -------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Exchange                   | `api_key`, `api_secret` and, where required, a passphrase   | None.                                                                                                                                                     |
| Plaid                      | A `public_token` from Plaid Link, or start the hosted setup | Finish the setup before you select a bank source.                                                                                                         |
| Ramp                       | The supported credentials, or start the hosted setup        | None.                                                                                                                                                     |
| QuickBooks, Xero, NetSuite | `redirect_url` or `subdomain`                               | Open the returned `data.redirect_url` to give consent. Set up NetSuite for your organization first.                                                       |
| Campfire, DualEntry        | `api_key`                                                   | Entendre checks the credentials and starts the accounting import. Campfire needs a USD legal entity and can return `warning` fields for a partial import. |

Do not send `auth_method`. Credentials are never returned. For a hosted setup, complete the returned authorization attempt before it expires. Then use [List connections](/docs/api-reference/integrations/connections/list-connections) to confirm the connection and get its `connection_ids` and `source_ids`.

To reauthorize a general-ledger connection, call this operation again.


## OpenAPI

````yaml openapi-public-preview.json POST /v1/connections
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/connections:
    post:
      tags:
        - Connections
      summary: Connect provider
      description: >-
        Connects an exchange, Plaid, Ramp or general-ledger provider. The body
        depends on the provider.
      operationId: connect_provider
      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:
                - title: Exchange
                  type: object
                  description: >-
                    An exchange venue. Credentials are supplied inline; there is
                    no hosted setup for an exchange.
                  required:
                    - provider
                    - name
                    - legal_entity_ids
                    - api_key
                    - api_secret
                  additionalProperties: false
                  properties:
                    provider:
                      type: string
                      description: >-
                        The exchange venue in lower case, such as kraken or
                        binance. For QuickBooks, Xero, NetSuite, Campfire and
                        DualEntry, use the general-ledger request body.
                      example: kraken
                    name:
                      type: string
                      description: Display name. Required for an exchange connection.
                      minLength: 1
                      maxLength: 500
                    legal_entity_ids:
                      type: array
                      description: >-
                        Exactly one legal entity. An exchange connection scopes
                        to a single entity.
                      items:
                        type: string
                        description: Legal entity ID (`le_…`).
                        example: le_507f1f77bcf86cd799439011
                      minItems: 1
                      maxItems: 1
                      uniqueItems: true
                    api_key:
                      type: string
                      description: Venue API key.
                      minLength: 1
                    api_secret:
                      type: string
                      description: Venue API secret.
                      minLength: 1
                    api_passphrase:
                      type: string
                      description: >-
                        Venue API passphrase. Required for coinbase,
                        coinbase_exchange, coinbase_prime,
                        coinbase_international and kucoin; omitting it there
                        fails with 400.
                      minLength: 1
                    return_url:
                      type: string
                      description: >-
                        Registered HTTPS dashboard URL to return to after hosted
                        setup.
                      format: uri
                      example: https://app.entendre.finance/settings/integrations
                - title: Bank
                  type: object
                  description: >-
                    A Plaid bank account. Omit public_token to receive a hosted
                    setup URL, or supply one to finish a link the client already
                    completed.
                  required:
                    - provider
                  additionalProperties: false
                  properties:
                    provider:
                      type: string
                      enum:
                        - plaid
                      description: Always plaid.
                    name:
                      type: string
                      description: Display name.
                      minLength: 1
                      maxLength: 500
                    legal_entity_ids:
                      type: array
                      description: At most one legal entity.
                      items:
                        type: string
                        description: Legal entity ID (`le_…`).
                        example: le_507f1f77bcf86cd799439011
                      minItems: 1
                      maxItems: 1
                      uniqueItems: true
                    public_token:
                      type: string
                      description: >-
                        Plaid public token from a completed Link session. Omit
                        it to use hosted setup instead.
                      minLength: 1
                    return_url:
                      type: string
                      description: >-
                        Registered HTTPS dashboard URL to return to after hosted
                        setup.
                      format: uri
                      example: https://app.entendre.finance/settings/integrations
                - title: Card
                  type: object
                  description: >-
                    A Ramp card program. Omit credentials to receive a hosted
                    setup URL, or supply the app credentials inline.
                  required:
                    - provider
                  additionalProperties: false
                  properties:
                    provider:
                      type: string
                      enum:
                        - ramp
                      description: Always ramp.
                    name:
                      type: string
                      description: Display name.
                      minLength: 1
                      maxLength: 500
                    legal_entity_ids:
                      type: array
                      description: At most one legal entity.
                      items:
                        type: string
                        description: Legal entity ID (`le_…`).
                        example: le_507f1f77bcf86cd799439011
                      minItems: 1
                      maxItems: 1
                      uniqueItems: true
                    credentials:
                      type: object
                      description: >-
                        Ramp application credentials. Omit them to use hosted
                        setup instead.
                      required:
                        - client_id
                        - client_secret
                      additionalProperties: false
                      properties:
                        client_id:
                          type: string
                          minLength: 1
                          description: Ramp client ID.
                        client_secret:
                          type: string
                          minLength: 1
                          description: Ramp client secret.
                    return_url:
                      type: string
                      description: >-
                        Registered HTTPS dashboard URL to return to after hosted
                        setup.
                      format: uri
                      example: https://app.entendre.finance/settings/integrations
                - title: Rain
                  type: object
                  description: >-
                    A Rain card program for one legal entity. Cards are imported
                    on a schedule. A duplicate key for the same legal entity
                    returns HTTP 409.
                  required:
                    - provider
                    - legal_entity_ids
                    - api_key
                  additionalProperties: false
                  properties:
                    provider:
                      type: string
                      enum:
                        - rain
                      description: Always rain.
                    name:
                      type: string
                      description: Display name.
                      minLength: 1
                      maxLength: 500
                    legal_entity_ids:
                      type: array
                      description: Exactly one legal entity.
                      items:
                        type: string
                        description: Legal entity ID (`le_…`).
                        example: le_507f1f77bcf86cd799439011
                      minItems: 1
                      maxItems: 1
                      uniqueItems: true
                    api_key:
                      type: string
                      description: Rain API key.
                      minLength: 1
                - oneOf:
                    - $ref: '#/components/schemas/V1GLConnectQuickBooks'
                    - $ref: '#/components/schemas/V1GLConnectXero'
                    - $ref: '#/components/schemas/V1GLConnectNetSuite'
                    - $ref: '#/components/schemas/V1GLConnectDualEntry'
                    - $ref: '#/components/schemas/V1GLConnectCampfire'
                  discriminator:
                    propertyName: provider
                    mapping:
                      quickbooks:
                        $ref: '#/components/schemas/V1GLConnectQuickBooks'
                      xero:
                        $ref: '#/components/schemas/V1GLConnectXero'
                      netsuite:
                        $ref: '#/components/schemas/V1GLConnectNetSuite'
                      dualentry:
                        $ref: '#/components/schemas/V1GLConnectDualEntry'
                      campfire:
                        $ref: '#/components/schemas/V1GLConnectCampfire'
            example:
              provider: kraken
              name: Kraken main
              legal_entity_ids:
                - le_507f1f77bcf86cd799439011
              api_key: ek_live_...
              api_secret: ...
      responses:
        '200':
          description: OAuth consent URL for a hosted GL provider (data.redirect_url).
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        type: object
                        required:
                          - redirect_url
                        properties:
                          redirect_url:
                            type: string
                            description: >-
                              Provider consent URL. Open it to authorize the
                              connection.
                        description: The connection.
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        $ref: '#/components/schemas/Connection'
                      warning:
                        type: object
                        additionalProperties:
                          type: string
                        description: >-
                          Warning about the connection, such as a partial
                          import.
              example:
                data:
                  id: con_507f1f77bcf86cd799439011
                  organization_id: org_507f1f77bcf86cd799439011
                  provider: quickbooks
                  auth_method: oauth
                  name: QuickBooks accounting
                  status: pending_setup
                  external_account_id: null
                  legal_entity_ids:
                    - le_507f1f77bcf86cd799439011
                  source_ids: []
                  capabilities:
                    - import_transactions
                  authorization_attempt:
                    id: auth_507f1f77bcf86cd799439011
                    status: pending
                    setup_url: https://app.entendre.finance/settings/integrations
                    expires_at: '2026-08-31T12:10:00Z'
                    error: null
                  created_at: '2026-08-31T12:00:00Z'
                  guidance:
                    allowed_actions: []
                    warnings: []
                    version: v_example
                  revocation_error: null
                  retained_resources:
                    - transactions
                  etag: '"v_example"'
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
        '201':
          description: Created.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
            ETag:
              description: Version tag of the returned resource.
              schema:
                type: string
              example: '"v_example"'
            Location:
              description: URL to retrieve the returned resource through its list endpoint.
              schema:
                type: string
              example: /v1/connections?connection_ids=con_507f1f77bcf86cd799439011
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Connection'
                required:
                  - data
                additionalProperties: false
              example:
                data:
                  id: con_507f1f77bcf86cd799439011
                  organization_id: org_507f1f77bcf86cd799439011
                  provider: quickbooks
                  auth_method: oauth
                  name: QuickBooks accounting
                  status: pending_setup
                  external_account_id: null
                  legal_entity_ids:
                    - le_507f1f77bcf86cd799439011
                  source_ids: []
                  capabilities:
                    - import_transactions
                  authorization_attempt:
                    id: auth_507f1f77bcf86cd799439011
                    status: pending
                    setup_url: https://app.entendre.finance/settings/integrations
                    expires_at: '2026-08-31T12:10:00Z'
                    error: null
                  created_at: '2026-08-31T12:00:00Z'
                  guidance:
                    allowed_actions: []
                    warnings: []
                    version: v_example
                  revocation_error: null
                  retained_resources:
                    - transactions
                  etag: '"v_example"'
        '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:
    V1GLConnectQuickBooks:
      type: object
      title: QuickBooks (OAuth)
      required:
        - provider
      properties:
        provider:
          type: string
          enum:
            - quickbooks
          description: Always `quickbooks`.
        redirect_url:
          type: string
          format: uri
          description: >-
            Where the OAuth flow should return after consent. Either
            redirect_url or subdomain is required.
        subdomain:
          type: string
          description: >-
            Your Entendre subdomain. Either redirect_url or subdomain is
            required.
        legal_entity_id:
          type: string
          nullable: true
          description: Legal entity to connect (`le_…`).
    V1GLConnectXero:
      type: object
      title: Xero (OAuth)
      required:
        - provider
      properties:
        provider:
          type: string
          enum:
            - xero
          description: Always `xero`.
        redirect_url:
          type: string
          format: uri
          description: >-
            Where the OAuth flow should return after consent. Either
            redirect_url or subdomain is required.
        subdomain:
          type: string
          description: >-
            Your Entendre subdomain. Either redirect_url or subdomain is
            required.
        legal_entity_id:
          type: string
          nullable: true
          description: Legal entity to connect (`le_…`).
    V1GLConnectNetSuite:
      type: object
      title: NetSuite (OAuth)
      required:
        - provider
      properties:
        provider:
          type: string
          enum:
            - netsuite
          description: Always `netsuite`.
        redirect_url:
          type: string
          format: uri
          description: >-
            Where the OAuth flow should return after consent. Either
            redirect_url or subdomain is required.
        subdomain:
          type: string
          description: >-
            Your Entendre subdomain. Either redirect_url or subdomain is
            required.
        legal_entity_id:
          type: string
          nullable: true
          description: Legal entity to connect (`le_…`).
        account_id:
          type: string
          description: >-
            Ignored. NetSuite authorization applies to the whole organization,
            and NetSuite must be set up for your organization first.
    V1GLConnectDualEntry:
      type: object
      title: DualEntry (API key)
      required:
        - provider
        - api_key
      properties:
        provider:
          type: string
          enum:
            - dualentry
          description: Always `dualentry`.
        api_key:
          type: string
          description: >-
            Provider API key. Validated against the provider, then encrypted at
            rest.
    V1GLConnectCampfire:
      type: object
      title: Campfire (API key)
      required:
        - provider
        - api_key
      properties:
        provider:
          type: string
          enum:
            - campfire
          description: Always `campfire`.
        api_key:
          type: string
          description: >-
            Provider API key. Validated against the provider, then encrypted at
            rest.
    Connection:
      type: object
      properties:
        id:
          type: string
          description: Connection ID (`con_…`).
          example: con_507f1f77bcf86cd799439011
        organization_id:
          type: string
          description: Organization ID (`org_…`).
          example: org_507f1f77bcf86cd799439011
        provider:
          type: string
          description: Provider identifier.
          example: quickbooks
        auth_method:
          type: string
          description: Setup method.
          enum:
            - oauth
            - api_key
        name:
          type: string
          description: Connection display name.
        status:
          type: string
          description: Connection status.
          enum:
            - pending_setup
            - active
            - expired
            - disconnecting
            - disconnected
            - failed
        external_account_id:
          type:
            - string
            - 'null'
          description: Account ID at the provider.
        legal_entity_ids:
          type: array
          items:
            type: string
            description: Legal entity ID (`le_…`).
            example: le_507f1f77bcf86cd799439011
          description: Legal entities of the connection (`le_…`).
        source_ids:
          type: array
          items:
            type: string
            description: Source ID (`src_…`).
            example: src_507f1f77bcf86cd799439011
          description: Sources created from the connection.
        capabilities:
          type: array
          items:
            type: string
            description: Supported action.
          description: Actions that the connection supports.
        authorization_attempt:
          type: object
          properties:
            id:
              type: string
              description: Authorization attempt ID (`auth_…`).
              example: auth_507f1f77bcf86cd799439011
            status:
              type: string
              description: Status of the setup attempt.
              enum:
                - pending
                - succeeded
                - expired
                - failed
            setup_url:
              type:
                - string
                - 'null'
              description: Setup URL for the user. It expires and is not a credential.
            expires_at:
              type:
                - string
                - 'null'
              description: Expiry time (ISO 8601).
            error:
              type:
                - string
                - 'null'
              description: Why the setup failed.
          required:
            - id
            - status
          additionalProperties: false
          description: The latest setup attempt.
        created_at:
          type: string
          description: ISO 8601 UTC timestamp.
          format: date-time
          example: '2026-08-31T12:00:00Z'
        guidance:
          $ref: '#/components/schemas/Guidance'
        revocation_error:
          type:
            - string
            - 'null'
          description: >-
            Why the provider did not revoke access. A disabled connection in
            Entendre does not prove that the provider revoked access.
        retained_resources:
          type: array
          items:
            type: string
            description: Resource types retained after disconnect.
          description: Resource types that stay after a disconnect.
        etag:
          type: string
          readOnly: true
          pattern: ^"[^"\r\n]+"$
          description: >-
            Strong version of this resource. Send this value, including its
            quotes, in If-Match when updating it.
          examples:
            - '"v_example"'
        cleanup:
          type: object
          description: >-
            Present after bank disconnect. Counts rows removed by this call.
            Zero is valid for empty or already-cleaned connections.
          properties:
            accounts_deleted:
              type: integer
              minimum: 0
              description: Bank accounts deleted.
            transactions_deleted:
              type: integer
              minimum: 0
              description: Transactions deleted.
          required:
            - accounts_deleted
            - transactions_deleted
        importable_resources:
          type: array
          items:
            type: string
          description: >-
            General-ledger connections only: the resource types that the
            connection can import.
      required:
        - id
        - organization_id
        - provider
        - auth_method
        - name
        - status
        - external_account_id
        - legal_entity_ids
        - source_ids
        - capabilities
        - created_at
        - guidance
        - etag
      additionalProperties: false
    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.
    Guidance:
      type: object
      properties:
        allowed_actions:
          type: array
          items:
            $ref: '#/components/schemas/ActionHint'
          description: Actions that you can take now.
        warnings:
          type: array
          items:
            $ref: '#/components/schemas/Warning'
          description: Warnings about the resource.
        version:
          type: string
          description: >-
            Version of the resource. Use it only when an operation asks for
            `expected_version`.
      required:
        - allowed_actions
        - warnings
        - version
      additionalProperties: false
    ActionHint:
      type: object
      properties:
        action:
          type: string
          description: Stable operation name.
        available:
          type: boolean
          description: Whether the action is currently available.
        reason:
          type:
            - string
            - 'null'
          description: Why unavailable, or null.
        url:
          type:
            - string
            - 'null'
          description: Authorized relative API or dashboard URL, or null.
      required:
        - action
        - available
        - reason
        - url
      additionalProperties: false
    Warning:
      type: object
      properties:
        code:
          type: string
          description: Stable warning code.
        message:
          type: string
          description: Actionable explanation.
        field:
          type:
            - string
            - 'null'
          description: Affected field, if known.
      required:
        - code
        - message
      additionalProperties: false
  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.

````