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

> Creates a source: a wallet, a connected provider account, a manual bank account or card, or a statement import.

| Source                                   | Send                                                                                                | Result                                                                                                                   |
| ---------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Wallet                                   | `type: wallet` and the wallet fields                                                                | Creates the wallet source.                                                                                               |
| Connected exchange, bank account or card | `type` and `connection_id`. If the connection has more than one account, add `external_account_id`. | Returns the existing source with HTTP 200 and `reused: true`. It does not create a duplicate or change the legal entity. |
| Manual bank account or card              | `type`, `name`, `legal_entity_id`, `bank_name` and `account_number_last_four`                       | Finds the matching account, or creates it.                                                                               |
| Statement                                | `document_id` and the matching `type`. Optional: `legal_entity_id` and `statement_line_ids`.        | Starts a statement import. Usually returns HTTP 202 with a job ID.                                                       |

Before you add a connected source, complete the authorization with [Connect provider](/docs/api-reference/integrations/connections/connect-provider). A name alone does not identify a manual account.

For a statement, upload and process the document first. Get the line IDs from [List documents](/docs/api-reference/core/documents/list-documents) with `expand=statement.lines`. Without `statement_line_ids`, the import takes all eligible pending lines.

A statement import reuses a linked or matched source, such as a Plaid account, or creates a manual source. The source can appear after the response returns. To add a manual exchange account, import a statement.


## OpenAPI

````yaml openapi-public-preview.json POST /v1/sources
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/sources:
    post:
      tags:
        - Sources
      summary: Create source
      description: >-
        Create a wallet, connected account or manual source. With a statement,
        reuse its existing source or create a manual source, then start
        importing transactions.
      operationId: create_source
      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:
                    - source_type
                    - name
                    - chain
                    - address
                  additionalProperties: false
                  properties:
                    source_type:
                      type: string
                      enum:
                        - wallet
                      description: The kind of source to create.
                    name:
                      type: string
                      description: Display name for the source.
                    chain:
                      type: string
                      description: On-chain network for a wallet source (such as `eth`).
                    address:
                      type: string
                      description: On-chain address for a wallet source.
                    wallet_type:
                      type: string
                      enum:
                        - internal
                        - external
                      default: external
                      description: Internal wallets require a legal entity.
                    legal_entity_id:
                      type: string
                      description: >-
                        Legal entity (`le_` prefix). Required for internal
                        wallets.
                    tag_ids:
                      type: array
                      items:
                        type: string
                      description: Tag IDs (`tag_…`).
                    allow_nft_import:
                      type: boolean
                      description: Wallet only; every other type ignores it.
                - type: object
                  required:
                    - name
                    - chain
                    - address
                    - type
                  additionalProperties: false
                  properties:
                    name:
                      type: string
                      description: Display name for the source.
                    chain:
                      type: string
                      description: On-chain network for a wallet source (such as `eth`).
                    address:
                      type: string
                      description: On-chain address for a wallet source.
                    wallet_type:
                      type: string
                      enum:
                        - internal
                        - external
                      default: external
                      description: Internal wallets require a legal entity.
                    legal_entity_id:
                      type: string
                      description: >-
                        Legal entity (`le_` prefix). Required for internal
                        wallets.
                    tag_ids:
                      type: array
                      items:
                        type: string
                      description: Tag IDs (`tag_…`).
                    allow_nft_import:
                      type: boolean
                      description: Wallet only; every other type ignores it.
                    type:
                      type: string
                      enum:
                        - wallet
                      description: Always `wallet`.
                - type: object
                  description: >-
                    A Niural supplier source. Chain and address are optional;
                    tags are plain labels, not tag ids.
                  required:
                    - type
                    - name
                  additionalProperties: false
                  properties:
                    type:
                      type: string
                      enum:
                        - niural
                      description: The kind of source to create.
                    name:
                      type: string
                      description: Supplier or vendor name.
                      minLength: 1
                      maxLength: 500
                    legal_entity_id:
                      type: string
                      description: >-
                        Legal entity ID (`le_…`). Optional; the supplier can
                        stay unassigned.
                      example: le_507f1f77bcf86cd799439011
                    wallet_type:
                      type: string
                      enum:
                        - internal
                        - external
                      default: external
                      description: >-
                        `internal` for a wallet that you own, `external` for a
                        wallet of a third party.
                    chain:
                      type: string
                      description: On-chain network, when the supplier is paid on-chain.
                    address:
                      type: string
                      description: Payout address, when known.
                      minLength: 1
                      maxLength: 256
                    tags:
                      type: array
                      description: Plain labels stored on the row.
                      items:
                        type: string
                        minLength: 1
                        maxLength: 100
                      maxItems: 50
                    group_id:
                      type: string
                      description: Source group (`sgp_` prefix).
                      example: sgp_507f1f77bcf86cd799439011
                - type: object
                  additionalProperties: false
                  required:
                    - type
                    - connection_id
                  properties:
                    type:
                      type: string
                      enum:
                        - exchange
                        - bank_account
                        - card
                      description: >-
                        Category of the selected source: `exchange` selects an
                        exchange source, `bank_account` a Plaid or Ramp bank
                        account, `card` a Rain or Ramp card. The selected source
                        must match.
                    connection_id:
                      type: string
                      description: Connection ID from List connections.
                    external_account_id:
                      type: string
                      description: >-
                        Select a returned source ID or provider account ID; may
                        be omitted only when the active connection has exactly
                        one source of the requested type.
                    legal_entity_id:
                      type: string
                      description: >-
                        Optional. Selecting a source never changes its legal
                        entity.
                - type: object
                  additionalProperties: false
                  required:
                    - type
                    - document_id
                  properties:
                    type:
                      type: string
                      enum:
                        - exchange
                        - bank_account
                        - card
                      description: Source type.
                    document_id:
                      type: string
                      description: Statement document ID (`doc_…`).
                    legal_entity_id:
                      type: string
                      description: Legal entity ID (`le_…`).
                    statement_line_ids:
                      type: array
                      items:
                        type: string
                        pattern: ^bkl_[A-Za-z0-9-]+$
                      minItems: 1
                      maxItems: 5000
                      description: >-
                        Statement lines to import. Omit to import all eligible
                        pending lines.
                  dependentRequired:
                    statement_line_ids:
                      - document_id
            examples:
              Wallet:
                value:
                  name: Treasury wallet
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  address: '0x0000000000000000000000000000000000000001'
                  chain: eth
                  type: wallet
              Source from statement:
                value:
                  type: bank_account
                  name: Operating account
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  document_id: doc_507f1f77bcf86cd799439011
              Manual account:
                value:
                  type: bank_account
                  name: Operating account
                  legal_entity_id: le_507f1f77bcf86cd799439011
      responses:
        '200':
          description: >-
            Existing connected source, resolved manual account, or synchronous
            statement-import result.
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        $ref: '#/components/schemas/Source'
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        type: object
                        properties:
                          imported:
                            type: integer
                            description: Transactions imported.
                          duplicates:
                            type: integer
                            description: Rows skipped as duplicates.
                          errors:
                            type: array
                            items:
                              type: object
                            description: Rows that could not be imported.
                        description: The created source.
              example:
                data:
                  id: src_507f1f77bcf86cd799439011
                  source_type: manual_bank
                  organization_id: org_507f1f77bcf86cd799439011
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  name: Operating account
                  status: active
                  created_at: '2026-08-31T12:00:00Z'
                  updated_at: '2026-08-31T12:00:00Z'
                  detail:
                    account_name: Operating account
                    has_credentials: false
                    ledger_account_id: null
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
        '201':
          description: Source created. Includes an import when a statement was supplied.
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Source'
                  import:
                    anyOf:
                      - $ref: '#/components/schemas/SourceImport'
                      - type: 'null'
                    description: >-
                      Accepted statement import when document_id was supplied;
                      null for source creation without a statement.
                required:
                  - data
                  - import
                additionalProperties: false
              example:
                data:
                  id: src_507f1f77bcf86cd799439011
                  source_type: manual_bank
                  organization_id: org_507f1f77bcf86cd799439011
                  legal_entity_id: le_507f1f77bcf86cd799439011
                  name: Operating account
                  status: active
                  created_at: '2026-08-31T12:00:00Z'
                  updated_at: '2026-08-31T12:00:00Z'
                  detail:
                    account_name: Operating account
                    has_credentials: false
                    ledger_account_id: null
        '202':
          description: Import job queued (asynchronous).
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    type: object
                    properties:
                      job_id:
                        type:
                          - string
                          - 'null'
                        description: Import job ID, or `null` for a synchronous import.
                      message:
                        type: string
                        description: Summary message.
                    description: The created source.
              example:
                data:
                  job_id: job_wallet-sync:realtime:507f1f77bcf86cd799439011
                  message: Import queued
          headers:
            X-Request-Id:
              description: Support correlation ID.
              schema:
                type: string
        '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:
    Source:
      type: object
      required:
        - id
        - source_type
        - organization_id
        - legal_entity_id
        - name
        - status
        - created_at
        - updated_at
        - detail
      properties:
        id:
          type: string
          description: Source ID.
          example: src_507f1f77bcf86cd799439011
        source_type:
          type: string
          description: Source type. It determines the fields in `detail`.
          enum:
            - exchange
            - staking
            - niural
            - raincard
            - ramp_card
            - ramp_bank_account
            - manual_bank
            - wallet
            - plaid_account
        organization_id:
          type:
            - string
            - 'null'
          description: Organization ID (`org_…`).
        legal_entity_id:
          type:
            - string
            - 'null'
          description: Legal entity of the source (`le_…`), or `null`.
        name:
          type:
            - string
            - 'null'
          description: >-
            Display name, such as the card nickname or the bank name and last
            four digits.
        status:
          type: string
          description: Source status.
          enum:
            - active
            - archived
        created_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Time the source was created (ISO 8601).
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Time the source was last updated (ISO 8601).
        detail:
          $ref: '#/components/schemas/SourceDetail'
        group_id:
          type:
            - string
            - 'null'
          description: >-
            Prefixed `sgp_` id of the source group this source belongs to, or
            null when it is not in one. Always null for `staking`, which cannot
            be grouped.
        group:
          description: >-
            The full source group, present only when the request passed
            `expand=group`. Null when the source is ungrouped.
          oneOf:
            - $ref: '#/components/schemas/V1SourceGroup'
            - type: 'null'
    SourceImport:
      type: object
      description: >-
        Confirms that a transaction import is queued for one source. `status` is
        `queued`; it does not show completion. No operation reports the import
        progress.
      properties:
        id:
          type: string
          nullable: true
          description: Import job ID (`job_…`).
          example: job_wallet-sync:realtime:507f1f77bcf86cd799439011
        source_id:
          type: string
          nullable: true
          description: Prefixed id of the source this import runs against.
        status:
          type: string
          enum:
            - queued
          description: Always `queued`.
      required:
        - id
        - source_id
        - status
      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.
    SourceDetail:
      type: object
      properties:
        address:
          type:
            - string
            - 'null'
          description: Wallet address where relevant.
        chain:
          type:
            - string
            - 'null'
          description: Network identifier.
        bank_name:
          type:
            - string
            - 'null'
          description: Bank institution.
        account_name:
          type:
            - string
            - 'null'
          description: Account label.
        account_number_last_four:
          type:
            - string
            - 'null'
          description: Masked last four only.
        card_last4:
          type:
            - string
            - 'null'
          description: Masked card last four.
        exchange_source_type:
          type:
            - string
            - 'null'
          description: Exchange provider.
        has_credentials:
          type: boolean
          description: Whether credentials are stored. The credential is never returned.
        credential_status:
          type:
            - string
            - 'null'
          description: Provider authorization state.
        ledger_account_id:
          type:
            - string
            - 'null'
          description: >-
            The single ledger account assigned to this source. Null when no
            account is assigned.
          example: lac_507f1f77bcf86cd799439011
      additionalProperties: false
      description: Details for the source type.
    V1SourceGroup:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: string
          description: Prefixed `sgp_` id.
        organization_id:
          type:
            - string
            - 'null'
          description: Prefixed `org_` id.
        name:
          type:
            - string
            - 'null'
          description: Group name.
        icon:
          type:
            - string
            - 'null'
          description: Group icon.
        emoji:
          type:
            - string
            - 'null'
          description: Group emoji.
        reference_wallet_id:
          type:
            - string
            - 'null'
          description: Wallet (`wal_…`) linked to the group, if any.
        created_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Time the source group was created (ISO 8601).
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Time the source group was last updated (ISO 8601).
  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.

````