> ## Documentation Index
> Fetch the complete documentation index at: https://docs.feddi.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Read a single transaction's full detail (receipt / dispute / audit)

> Returns the full detail of a single transaction, suitable for rendering a receipt, handling a dispute, or producing an audit record. The response presents a stable, flattened shape: the related wallet, program, branch, brand, and enterprise are inlined rather than nested. `line_items` are reconstructed from the linked order's line items (or from the session basket when one is present), and `applied_offers` breaks out the incentives and promotional grants that touched this charge.

All monetary values are integer minor units paired with an explicit ISO-4217 `currency`. Metadata is sanitized server-side so redemption secrets are never returned.

The response includes `related_transactions`, which links refunds, the original deposit, and sibling rows that share a `multi_transaction_id`, so you can render the complete money lineage of an order.

Access is scoped to the calling integration. **A transaction owned by another integration resolves to `403` with error code `FORBIDDEN`, never `404`.** Transaction state is returned as-is and is status-discriminated: `PENDING` and `REFUNDED` transactions are returned with their current status rather than omitted or transformed.

This endpoint is read-only.



## OpenAPI

````yaml /api-reference/openapi.yaml get /{integrationId}/transactions/{transactionId}
openapi: 3.1.0
info:
  title: Feddi Partner API
  version: '2026-06-01'
  description: >-
    Operate a Feddi closed-loop wallet and loyalty program at the point of sale:
    identify customers, read balances, accept wallet payments, run top-ups, and
    reconcile transactions.


    All amounts are integer minor units with an explicit ISO-4217 currency.
    Balances are merchant-held and closed-loop.


    Every response uses a typed envelope (`ok` / `data` / `error` / `meta`) with
    string error codes (never a bare HTTP number) and an idempotency-replay
    flag. Authenticate with the `x-api-key` header; exchange it for a
    short-lived POS terminal JWT for hot-path calls.


    Self-validate against this document (`GET /openapi`) and read `GET
    /capabilities` for the credential types, currencies, and features enabled
    for your integration before assuming any enum.


    Operations are tagged `x-feddi-availability: ga` (stable) or `beta`
    (callable, contract may still change additively); confirm what is enabled
    for your credentials via `GET /capabilities`.


    Sandbox access is granted per partner agreement; request credentials from
    your Feddi contact.
servers:
  - url: https://api.feddi.io/v1/partner
    description: production
  - url: https://api.dev.feddi.io/v1/partner
    description: dev
security:
  - ApiKeyAuth: []
tags:
  - name: platform
    description: >-
      Platform cross-cutting: health, capabilities, openapi self-serve, merchant
      provisioning, settlement, reconciliation.
  - name: checkout_session
    description: >-
      Checkout sessions: every interaction opens a session, then identity and
      basket attach to it, and payment, top-up, and offers run against it.
  - name: auth
    description: >-
      Partner authentication + onboarding: API key lifecycle, POS terminal JWT
      exchange, terminal heartbeat.
  - name: customers
    description: >-
      Customer lookup + identification: resolve identity, cashier-panel
      summaries, preferences, GDPR export/erase.
  - name: enrollment
    description: >-
      Enrollment + signup: OTP enroll, cashback claims, identity/consent,
      customer correction + merge.
  - name: payments
    description: >-
      Payments + redemption: debit wallet (promo-first), balance-check, void,
      refund, QR mint.
  - name: topup
    description: >-
      Wallet top-up: 2-step prepare/confirm, reload-bonus grants, SKU top-up,
      settlement + reconciliation.
  - name: incentives
    description: >-
      Incentives + offers: offer feeds, apply/redeem/release locks, proposals,
      budget envelopes, points, grant clawback.
  - name: transactions
    description: >-
      Transactions + receipts: transaction detail, void, receipts, disputes,
      settlements, reconciliation, exports.
  - name: webhooks
    description: >-
      Webhooks + events: subscriptions, delivery history + retry, event catalog,
      polling fallback.
paths:
  /{integrationId}/transactions/{transactionId}:
    get:
      tags:
        - transactions
      summary: Read a single transaction's full detail (receipt / dispute / audit)
      description: >-
        Returns the full detail of a single transaction, suitable for rendering
        a receipt, handling a dispute, or producing an audit record. The
        response presents a stable, flattened shape: the related wallet,
        program, branch, brand, and enterprise are inlined rather than nested.
        `line_items` are reconstructed from the linked order's line items (or
        from the session basket when one is present), and `applied_offers`
        breaks out the incentives and promotional grants that touched this
        charge.


        All monetary values are integer minor units paired with an explicit
        ISO-4217 `currency`. Metadata is sanitized server-side so redemption
        secrets are never returned.


        The response includes `related_transactions`, which links refunds, the
        original deposit, and sibling rows that share a `multi_transaction_id`,
        so you can render the complete money lineage of an order.


        Access is scoped to the calling integration. **A transaction owned by
        another integration resolves to `403` with error code `FORBIDDEN`, never
        `404`.** Transaction state is returned as-is and is
        status-discriminated: `PENDING` and `REFUNDED` transactions are returned
        with their current status rather than omitted or transformed.


        This endpoint is read-only.
      operationId: transactionGet
      parameters:
        - name: integrationId
          in: path
          required: true
          description: The calling integration's id. MUST match the key's integration.
          schema:
            type: string
            format: uuid
        - name: transactionId
          in: path
          required: true
          description: The transaction id.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Transaction detail.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ResponseEnvelope'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/TransactionDetail'
              example:
                ok: true
                data:
                  transaction_id: tx_77c1
                  receipt_number: RCT-2026-000812
                  transaction_type: PAYMENT
                  transaction_subtype: BALANCE
                  status: completed
                  amount_minor: 4500
                  currency: QAR
                  applied_discount_minor: 500
                  customer:
                    wallet_user_id: wu_5512
                    phone: '+97433001122'
                    name: Layla A.
                    identified_method: qr
                    customer_state: verified
                  wallet_id: wal_5512
                  wallet_program_id: wp_77
                  wallet_program_name: VIP Rewards
                  branch:
                    id: 22222222-2222-2222-2222-222222222222
                    name: City Center
                    status: ACTIVE
                  brand:
                    id: br_01
                    name: Acme Coffee
                    status: ACTIVE
                  enterprise:
                    id: 11111111-1111-1111-1111-111111111111
                    name: Acme Corp
                  partner_session_id: ord-99812
                  feddi_session_id: 33333333-3333-3333-3333-333333333333
                  line_items:
                    - sku: LATTE-L
                      name: Large Latte
                      quantity: 2
                      unit_price_minor: 2000
                      extended_price_minor: 4000
                      discount_minor: 0
                      tax_minor: 200
                      category: beverages
                    - sku: CROISSANT
                      name: Butter Croissant
                      quantity: 1
                      unit_price_minor: 1000
                      extended_price_minor: 1000
                      discount_minor: 500
                      tax_minor: 25
                      category: bakery
                  applied_offers:
                    - offer_id: off_22
                      name: Croissant 50% off
                      discount_minor: 500
                      source: rule
                  related_transactions:
                    - transaction_id: tx_dep_44
                      transaction_type: DEPOSIT
                      amount_minor: 10000
                      status: completed
                      created_at: '2026-06-04T18:00:00Z'
                  created_at: '2026-06-05T09:14:00Z'
                  updated_at: '2026-06-05T09:14:00Z'
                error: null
                meta:
                  request_id: req_td1
                  idempotency_replayed: false
                  api_version: '2026-06-01'
                  data_completeness_score: 92
        '401':
          description: '`INVALID_API_KEY` (HTTP 401), missing/invalid `x-api-key`.'
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ResponseEnvelope'
                  - type: object
                    properties:
                      error:
                        $ref: '#/components/schemas/Error'
        '403':
          description: >-
            `FORBIDDEN` (HTTP 403), the transaction belongs to another
            integration, or the path `{integrationId}` does not match the key.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ResponseEnvelope'
                  - type: object
                    properties:
                      error:
                        $ref: '#/components/schemas/Error'
        '404':
          description: >-
            `NOT_FOUND`, no transaction with this id EXISTS (a genuinely unknown
            id). A transaction that exists but belongs to another integration is
            `403` `FORBIDDEN`, never `404`, branch your error handling on
            exactly that boundary: `404` = retry/lookup bug on your side, `403`
            = scoping/credentials bug.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ResponseEnvelope'
                  - type: object
                    properties:
                      error:
                        $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ResponseEnvelope:
      type: object
      description: >-
        The standard response envelope that every enveloped endpoint serializes
        through. `ok` is a boolean discriminator: when `ok` is `true`, the typed
        result is carried in `data`; when `ok` is `false`, a typed error object
        is returned instead. The `meta` object is uniform across the entire API
        surface.
      required:
        - ok
        - meta
      properties:
        ok:
          type: boolean
        data:
          type:
            - object
            - 'null'
        error:
          oneOf:
            - $ref: '#/components/schemas/Error'
            - type: 'null'
        meta:
          $ref: '#/components/schemas/Meta'
    TransactionDetail:
      type: object
      description: >-
        Full detail for a single transaction. Returns a flattened representation
        of the transaction and its related objects: `line_items` (the order's
        line items), `applied_offers`, and `related_transactions`. All monetary
        amounts are integers in the smallest currency unit (minor units) and are
        accompanied by an explicit ISO-4217 `currency`. The `metadata` object is
        sanitized server-side before it is returned.
      required:
        - transaction_id
        - transaction_type
        - status
        - amount_minor
        - currency
        - created_at
      properties:
        transaction_id:
          type: string
        metadata:
          type:
            - object
            - 'null'
          additionalProperties: true
          description: >-
            Sanitized transaction metadata (server-side strips redemption
            secrets and internal keys before returning). Null when the
            transaction carries none.
        receipt_number:
          type:
            - string
            - 'null'
        transaction_type:
          type: string
          enum:
            - PAYMENT
            - DEPOSIT
            - WITHDRAW
            - TRANSFER
            - REWARD
            - BONUS_CREDIT
        transaction_subtype:
          type:
            - string
            - 'null'
          enum:
            - BANK_TRANSFER
            - CASH
            - BALANCE
            - CRYPTO
            - POINTS
            - CARD
            - CASHBACK
            - BONUS_CREDIT
            - INCENTIVE_CLAWBACK
            - null
          description: >-
            Matches `Transaction.transactionSubType`, same value set as
            `TransactionSummary.transaction_subtype`.
        status:
          type: string
          enum:
            - pending
            - completed
            - failed
            - partially_refunded
            - refunded
        amount_minor:
          type: integer
        currency:
          type: string
        applied_discount_minor:
          type:
            - integer
            - 'null'
        customer:
          $ref: '#/components/schemas/TransactionCustomer'
        wallet_id:
          type:
            - string
            - 'null'
          description: The receiver/sender wallet id depending on transaction direction.
        wallet_program_id:
          type:
            - string
            - 'null'
        wallet_program_name:
          type:
            - string
            - 'null'
        branch:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            name:
              type: string
            status:
              type: string
        brand:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            name:
              type: string
            status:
              type: string
        enterprise:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
            name:
              type: string
        partner_session_id:
          type:
            - string
            - 'null'
        feddi_session_id:
          type:
            - string
            - 'null'
          format: uuid
        line_items:
          type: array
          description: Reconstructed order lines (empty for thin/amount-only settlements).
          items:
            $ref: '#/components/schemas/TransactionLineItem'
        applied_offers:
          type: array
          items:
            $ref: '#/components/schemas/ReceiptAppliedOffer'
        related_transactions:
          type: array
          items:
            $ref: '#/components/schemas/RelatedTransaction'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
    Error:
      type: object
      description: >-
        The typed error object returned with every non-2xx response. `code` is a
        string enum (for example `WALLET_PROGRAM_AMBIGUOUS`,
        `CREDENTIAL_TYPE_UNSUPPORTED`, `INSUFFICIENT_FUNDS`,
        `IDEMPOTENCY_KEY_REUSED`, `CURRENCY_NOT_SUPPORTED`), **never a bare HTTP
        status number**. Inspect `code` for programmatic branching, not the HTTP
        status. Some codes echo the valid set in `details` so clients can
        present or reconcile the accepted values: for example
        `CREDENTIAL_TYPE_UNSUPPORTED` lists the supported credential types,
        `CURRENCY_NOT_SUPPORTED` lists the supported ISO-4217 currencies, and
        `WALLET_PROGRAM_AMBIGUOUS` lists the candidate `wallet_program_id`
        values that matched the request.
      required:
        - code
        - message
      properties:
        code:
          type: string
          enum:
            - INSUFFICIENT_FUNDS
            - INVALID_API_KEY
            - CREDENTIAL_TYPE_UNSUPPORTED
            - CURRENCY_NOT_SUPPORTED
            - IDEMPOTENCY_KEY_REUSED
            - WALLET_PROGRAM_AMBIGUOUS
            - REQUIRES_DYNAMIC_CREDENTIAL
            - NOT_FOUND
            - FORBIDDEN
            - VALIDATION_ERROR
            - RATE_LIMITED
            - CONFLICT
            - INTERNAL_SERVER_ERROR
        message:
          type: string
        details:
          type: object
          additionalProperties: true
    Meta:
      type: object
      description: >-
        The uniform response metadata block returned on every response.
        `data_completeness_score` is computed per call and reports the
        completeness of the returned data. `decision_trace_id` is present on
        responses that carry decision or insight output and can be used to
        correlate the response with its reasoning. `capabilities` is an
        additive, response-level array of hints advertising features the caller
        may use, and may be extended over time without notice.
      required:
        - request_id
        - api_version
      properties:
        request_id:
          type: string
          description: Feddi-issued correlation id for this response.
        idempotency_replayed:
          type: boolean
          description: True when this response was replayed from the idempotency store.
        api_version:
          type: string
          description: The single API version field.
          example: '2026-06-01'
        data_completeness_score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            0-100, computed per call (basket/identity/tax/category/consent
            presence).
        decision_trace_id:
          type:
            - string
            - 'null'
          description: Opaque trace id on intelligence-bearing responses; one per response.
        capabilities:
          type: object
          additionalProperties: true
          description: Additive response-level capability hints.
    TransactionCustomer:
      type: object
      description: >-
        The identified customer on a transaction, flattened for the cashier
        read. PII is the resolved customer's, returned only to the owning
        tenant.
      properties:
        wallet_user_id:
          type:
            - string
            - 'null'
          description: The POS-facing wallet identity id.
        phone:
          type:
            - string
            - 'null'
          description: E.164 phone of the identified customer.
        name:
          type:
            - string
            - 'null'
        identified_method:
          type:
            - string
            - 'null'
          enum:
            - phone
            - qr
            - short_code
            - card_fingerprint
            - provider_customer_id
            - unidentified
            - null
          description: How this customer was resolved on this transaction.
        customer_state:
          type:
            - string
            - 'null'
          enum:
            - verified
            - pending_proof
            - null
          description: Identity state at transaction time.
    TransactionLineItem:
      type: object
      description: >-
        A single line item from the order associated with a transaction.
        Returned as part of the order's resolved line items, derived from the
        linked order or the QR session basket. All monetary fields are integers
        in the currency's minor units (for example, fils or cents), paired with
        an explicit ISO-4217 currency.
      required:
        - quantity
        - extended_price_minor
      properties:
        sku:
          type:
            - string
            - 'null'
          description: The partner's SKU for this line.
        name:
          type:
            - string
            - 'null'
          description: Human-readable item name.
        quantity:
          type: integer
          minimum: 1
        unit_price_minor:
          type:
            - integer
            - 'null'
          description: Per-unit price, minor units.
        extended_price_minor:
          type: integer
          description: quantity × unit_price, minor units.
        discount_minor:
          type:
            - integer
            - 'null'
          description: Line-level discount, minor units.
        tax_minor:
          type:
            - integer
            - 'null'
          description: Line-level tax, minor units.
        category:
          type:
            - string
            - 'null'
          description: >-
            Item category (drives offer eligibility + the
            data_completeness_score).
    ReceiptAppliedOffer:
      type: object
      description: An incentive/offer that touched this transaction.
      required:
        - offer_id
        - discount_minor
      properties:
        offer_id:
          type: string
        name:
          type:
            - string
            - 'null'
        discount_minor:
          type: integer
          description: Value this offer applied, minor units.
        source:
          type:
            - string
            - 'null'
          enum:
            - rule
            - engine
            - merchant_note
            - null
          description: Where the offer came from.
    RelatedTransaction:
      type: object
      description: >-
        A sibling transaction in the same money lineage (refund, original
        deposit, multi-transaction sibling).
      required:
        - transaction_id
        - transaction_type
        - amount_minor
        - status
      properties:
        transaction_id:
          type: string
        transaction_type:
          type: string
          enum:
            - PAYMENT
            - DEPOSIT
            - WITHDRAW
            - TRANSFER
            - REWARD
            - BONUS_CREDIT
          description: Same value set as `TransactionSummary.transaction_type`.
        amount_minor:
          type: integer
        status:
          type: string
          enum:
            - pending
            - completed
            - failed
            - partially_refunded
            - refunded
          description: Same value set as `TransactionSummary.status`.
        created_at:
          type:
            - string
            - 'null'
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Partner API key (platform- or merchant-scoped). Contract key-enforces
        context.merchant_id.

````