Ledge Transactions API

Transactions, their matches, and their reconciliation status.

OpenAPI Specification

ledge-transactions-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Ledge Sources Transactions API
  version: '1.0'
  x-generated: '2026-07-19'
  x-method: generated
  x-source: Generated faithfully from the published Ledge API reference at https://docs.ledge.co/api-reference/ (Getting Started, Fundamentals, Authentication, Fine-Grained Permissions, Pagination, Status Codes, Error Handling, Sources, Transactions, Querying). Ledge does not publish an OpenAPI description; every path, parameter, schema field, enum value and status code below is transcribed from those pages. The server host was verified by probing the documented path (GET /v1/api/{orgId}/sources on https://api.goledge.io returns HTTP 401 with the documented JSON error envelope). No operation, field or value was invented.
  description: The Ledge REST API provides direct access to Transaction data, including transactions, matching and reconciliation status. It also provides Sources information, such as fetching times, files fetched, and any issues with fetching or parsing the data. Ledge is an AI-powered close management, reconciliation and payment-operations platform for finance teams.
  contact:
    name: Ledge
    url: https://www.ledge.co/contact-us
  termsOfService: https://www.ledge.co/terms-of-service
servers:
- url: https://api.goledge.io
  description: Production API host
security:
- oauth2ClientCredentials: []
tags:
- name: Transactions
  description: Transactions, their matches, and their reconciliation status.
paths:
  /v1/api/{orgId}/transactions:
    post:
      operationId: queryTransactions
      summary: Query transactions
      description: Retrieve the list of Transactions, their matches, and their reconciliation status. Filters are expressed as an array of composable typed SearchQuery objects combined with an AND operator.
      tags:
      - Transactions
      parameters:
      - $ref: '#/components/parameters/orgId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransactionQuery'
            examples:
              filterByDescription:
                summary: Filter transactions by description within a date range
                value:
                  datasetId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  limit: 100
                  offset: 0
                  from: 1704067200000
                  to: 1706745600
                  search:
                  - path: Description
                    search:
                      type: string
                      value: INV-340174
      responses:
        '200':
          description: The request was successful
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Transaction'
              examples:
                unmatchedAchCredit:
                  value:
                  - id: bb3e52d3-ce21-44be-b16c-e28f7d3d44da
                    datasetId: 8872aec1-6a21-423b-a7ad-e813f4419f75
                    reconciliationStatus: none
                    incomingMatches: []
                    outgoingMatches: []
                    description: Transfer to Vendor A/INV-12345/Jan-2024 PYMT
                    type: ACH Credit
                    timestamp: 1704067200000
        '204':
          description: The request was successful, and no content is returned
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
components:
  parameters:
    orgId:
      name: orgId
      in: path
      required: true
      description: Organization ID, can be found on the Developers page (https://app.goledge.io/developers).
      schema:
        type: string
        format: uuid
  schemas:
    DateFilter:
      type: object
      properties:
        type:
          type: string
          const: date
        value:
          allOf:
          - $ref: '#/components/schemas/NumberRange'
          description: A NumberRange filter. All numbers in milliseconds.
    NumberExpression:
      type: object
      properties:
        operator:
          type: string
          enum:
          - ne
          - ge
          - gt
          - le
          - lt
        value:
          type: number
          description: The filter value to apply.
    SearchQuery:
      type: object
      description: Ledge uses a simple composable typed filter.
      properties:
        path:
          type: string
          description: Name of transaction field to apply the query to
        search:
          $ref: '#/components/schemas/SearchFilter'
    TextFilter:
      type: object
      properties:
        type:
          type: string
          const: string
        value:
          description: The text or texts to search for.
          oneOf:
          - type: string
          - type: array
            items:
              type: string
        exact:
          type: boolean
    SearchFilter:
      description: The search filter to apply. Can be any one of the following filter types.
      oneOf:
      - $ref: '#/components/schemas/TextFilter'
      - $ref: '#/components/schemas/BooleanFilter'
      - $ref: '#/components/schemas/DateFilter'
      - $ref: '#/components/schemas/NumberFilter'
      - $ref: '#/components/schemas/MoneyFilter'
    NumberRange:
      type: object
      properties:
        start:
          type: number
          description: The minimum value in the range.
        end:
          type: number
          description: The maximum value in the range.
        includeStart:
          type: boolean
          description: Is inclusive on the lower bound.
        includeEnd:
          type: boolean
          description: Is inclusive on the upper bound.
    BooleanFilter:
      type: object
      properties:
        type:
          type: string
          const: boolean
        value:
          type: boolean
          description: The filter value to apply.
    NumberFilter:
      type: object
      properties:
        type:
          type: string
          const: number
        value:
          description: The filter value to apply, which can be a single value, multiple values, or more specific filters.
          oneOf:
          - type: number
          - type: array
            items:
              type: number
          - $ref: '#/components/schemas/NumberExpression'
          - $ref: '#/components/schemas/NumberRange'
    Error:
      type: object
      description: Errors are returned as JSON objects with an `error` envelope. The documented shape carries `code` and `message`; live responses observed on api.goledge.io additionally carry `status` and a `request` correlation id.
      properties:
        error:
          type: object
          properties:
            code:
              description: Error code (the HTTP status code in observed responses).
              oneOf:
              - type: string
              - type: integer
            status:
              type: string
              description: Reason phrase for the error.
            request:
              type: string
              format: uuid
              description: Correlation id for the request, quote it when contacting Ledge support.
            message:
              type: string
              description: Human-readable description of the error.
      required:
      - error
    Match:
      type: object
      description: A reconciliation match between two transactions. The Ledge API reference names the Match[] type on incomingMatches/outgoingMatches but does not publish its field-level schema, so no properties are asserted here.
    Transaction:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Ledge ID for the line
        datasetId:
          type: string
          format: uuid
          description: Source ID, see Sources for more details.
        reconciliationStatus:
          type: string
          description: The reconciliation status of the transaction.
          enum:
          - none
          - partial
          - full
          - informative
          - out of scope
        incomingMatches:
          type: array
          description: List of matches in which the listed transaction is the origin.
          items:
            $ref: '#/components/schemas/Match'
        outgoingMatches:
          type: array
          description: List of matches in which the listed transaction is the target.
          items:
            $ref: '#/components/schemas/Match'
        description:
          type: string
          description: The value of the description field of the transaction.
        type:
          type: string
          description: The value of the type field of the transaction.
        timestamp:
          type: integer
          description: Epoch timestamp in milliseconds.
    TransactionQuery:
      type: object
      properties:
        datasetId:
          type: string
          format: uuid
          description: Source ID, see Sources for more details.
        limit:
          type: integer
          description: Number of records to fetch.
        offset:
          type: integer
          description: Offset into the result set. The maximum offset value is 500.
          maximum: 500
        from:
          type: integer
          description: Transaction epoch timestamp in milliseconds from which to fetch.
        to:
          type: integer
          description: Transaction epoch timestamp in milliseconds to which to fetch.
        integrationId:
          type: string
          format: uuid
          description: Integration identifier, shown in the documented pagination examples.
        search:
          type: array
          description: An array of filters, with an AND operator between criteria.
          items:
            $ref: '#/components/schemas/SearchQuery'
        columns:
          type: array
          description: List of columns to include in the response.
          items:
            $ref: '#/components/schemas/SearchQuery'
    MoneyFilter:
      type: object
      properties:
        type:
          type: string
          const: money
        currencies:
          type: array
          description: A collection of ISO 4217 currency codes.
          items:
            type: string
        value:
          description: The filter value to apply, which can be a single value, multiple values, or more specific filters.
          oneOf:
          - type: number
          - type: array
            items:
              type: number
          - $ref: '#/components/schemas/NumberExpression'
          - $ref: '#/components/schemas/NumberRange'
  responses:
    BadRequest:
      description: The input data was malformed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServiceUnavailable:
      description: An error occurred on the Ledge side, and is closely monitored. Contact Ledge for more details and remediation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: The request was unauthorized, please check your API key and contact Ledge for assistance
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: 401
              status: Unauthorized
              request: c1eb84b6-74e8-493d-9dfc-69f2f1f99e52
              message: The request could not be authorized
    GatewayTimeout:
      description: The request exceeded the timeout. Try a smaller limit query parameter or contact Ledge for assistance.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The request was rejected for security reasons, contact Ledge for assistance
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalServerError:
      description: An error occurred on the Ledge side, and is closely monitored. Contact Ledge for more details and remediation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    oauth2ClientCredentials:
      type: oauth2
      description: Obtain a client ID and generate a client secret on the Ledge Developers page (https://app.goledge.io/developers), then request an access token from the Ledge Auth0 tenant using the client_credentials grant. The response carries access_token, token_type (Bearer) and expires_in (10800 seconds observed in the documented example). Ledge does not document named OAuth scopes; authorization is enforced by Ledge's role-based fine-grained permissions model (https://docs.ledge.co/api-reference/fundamentals/fine-grained-permissions).
      flows:
        clientCredentials:
          tokenUrl: https://goledge.us.auth0.com/oauth/token
          scopes: {}
externalDocs:
  description: Ledge API reference
  url: https://docs.ledge.co/api-reference/getting-started