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

# Approve incoming transaction.

> Approve a pending incoming transaction after it enters receiver review. Provide `receiverCustomerInfo` only when the pending incoming transaction explicitly requested additional receiver fields during review. For the Step 4 sandbox scenarios, `sanctions_hit` and `sender_kyc_not_approved` are hard reject-only cases and return `409` on this route. `counterparty_info_incomplete` stays on this same review lane and remains technically approvable after manual review is completed in the demo flow.



## OpenAPI

````yaml /openapi/blips-public-reference.yaml post /transactions/{transactionId}/approve
openapi: 3.1.0
info:
  title: BLIPS Public Reference API
  version: '2026-04-08'
  description: >-
    Public OpenAPI 3.1 subset for the first BLIPS Mintlify API Reference and
    Playground release. This document is bound to the confirmed Public Test
    Backend at https://public-test.blips.network, includes only the approved
    first-release public endpoints, uses only internal `$ref` values, and
    excludes callback-only webhook documentation and operator-only surfaces.
servers:
  - url: https://public-test.blips.network
    description: >-
      Confirmed Public Test Backend ingress target for public BLIPS API
      Reference, Playground, and internet-testable Try It flows.
security:
  - BasicAuth: []
tags:
  - name: Platform Setup
    description: >-
      Bootstrap and platform configuration surfaces for establishing the public
      BLIPS integration context.
  - name: Sandbox API
    description: >-
      Sandbox-only externally displayed helper surfaces. These routes either
      adjust quote inputs or create incoming-payment review cases, but they
      always feed the existing quote or transaction families and never become
      second outward API families.
  - name: Tokens
    description: >-
      Platform-scoped API credential create, list, detail, and revoke
      operations.
  - name: Customers
    description: >-
      Customer onboarding, profile lifecycle, and PPV payment-address issuance
      surfaces.
  - name: Accounts
    description: >-
      Customer-bound internal-account and external-account surfaces kept in the
      first-layer public contract.
  - name: Same-Currency Transfers
    description: >-
      Same-currency receiver lookup plus incoming and outgoing transfer
      primitives.
  - name: Cross-Currency Transfers
    description: >-
      PPV-first receiver lookup, quote creation/readback, and quote execution
      for cross-currency flows.
  - name: Transactions
    description: Transaction readback plus bounded incoming-review decision operations.
  - name: Webhooks
    description: >-
      Webhook connectivity verification surface for the public BLIPS
      integration.
paths:
  /transactions/{transactionId}/approve:
    post:
      tags:
        - Transactions
      summary: Approve incoming transaction.
      description: >-
        Approve a pending incoming transaction after it enters receiver review.
        Provide `receiverCustomerInfo` only when the pending incoming
        transaction explicitly requested additional receiver fields during
        review. For the Step 4 sandbox scenarios, `sanctions_hit` and
        `sender_kyc_not_approved` are hard reject-only cases and return `409` on
        this route. `counterparty_info_incomplete` stays on this same review
        lane and remains technically approvable after manual review is completed
        in the demo flow.
      operationId: approveIncomingTransaction
      parameters:
        - $ref: '#/components/parameters/TransactionId'
      requestBody:
        required: false
        description: >-
          Provide `receiverCustomerInfo` only when the pending incoming
          transaction explicitly requested additional receiver fields during
          review.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveIncomingPaymentRequest'
            examples:
              approveIncomingPayment:
                value:
                  receiverCustomerInfo:
                    FULL_NAME: Receiver Demo
      responses:
        '200':
          description: Incoming transaction approved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveIncomingReviewResponse'
              examples:
                approved:
                  value:
                    transactionId: txn_incoming_approve_001
                    type: INCOMING
                    status: COMPLETED
                    customerId: 00000000-0000-4000-8000-000000000001
                    platformCustomerId: partner_cust_001
                    createdAt: '2026-04-05T12:00:00Z'
                    updatedAt: '2026-04-05T12:02:00Z'
                    settledAt: '2026-04-05T12:02:00Z'
                    source:
                      accountId: InternalAccount:sender_sgd_001
                      sourceType: INTERNAL_ACCOUNT
                    destination:
                      destinationType: PPV_ADDRESS
                      ppvAddress: demo-customer@pay.example.blips
                    receivedAmount:
                      currencyCode: SGD
                      amountMinor: '5000'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveBadRequestResponse'
              examples:
                invalidTransactionId:
                  value:
                    status: 400
                    code: INVALID_REQUEST
                    message: Invalid transactionId path value
                    details:
                      transactionId: must be a non-empty transaction identifier
                invalidRequestBody:
                  value:
                    status: 400
                    code: INVALID_REQUEST
                    message: Invalid request body
                    details:
                      receiverCustomerInfo: must be an object of string values when provided
        '401':
          description: Invalid or missing API credentials.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveUnauthorizedResponse'
              examples:
                unauthorized:
                  value:
                    status: 401
                    code: UNAUTHORIZED
                    message: Invalid or missing API credentials
                    details: {}
        '404':
          description: Transaction not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveNotFoundResponse'
              examples:
                transactionNotFound:
                  value:
                    status: 404
                    code: TRANSACTION_NOT_FOUND
                    message: Transaction not found
                    details: {}
        '409':
          description: Incoming transaction not currently approvable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveConflictResponse'
              examples:
                additionalInformationRequired:
                  value:
                    status: 409
                    code: ADDITIONAL_INFORMATION_REQUIRED
                    message: Additional receiver information required
                    details:
                      requiredFields:
                        - profile: FULL_NAME
                          mandatory: true
                approvalBlockedRejectOnlySanctionsHit:
                  value:
                    status: 409
                    code: APPROVAL_BLOCKED_REJECT_ONLY_SANCTIONS_HIT
                    message: >-
                      Approval blocked. This Step 4 review case is sanctions_hit
                      and must be rejected.
                    details: {}
                approvalBlockedRejectOnlySenderKycNotApproved:
                  value:
                    status: 409
                    code: APPROVAL_BLOCKED_REJECT_ONLY_SENDER_KYC_NOT_APPROVED
                    message: >-
                      Approval blocked. This Step 4 review case is
                      sender_kyc_not_approved and must be rejected.
                    details: {}
                approvalBlockedKycNotApproved:
                  value:
                    status: 409
                    code: APPROVAL_BLOCKED_KYC_NOT_APPROVED
                    message: >-
                      Approval blocked. Reject this incoming transaction because
                      the selected customer is not KYC approved.
                    details: {}
        '500':
          description: Internal service error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionApproveInternalErrorResponse'
              examples:
                internalError:
                  value:
                    status: 500
                    code: INTERNAL_ERROR
                    message: Internal service error
                    details: {}
      security:
        - BasicAuth: []
components:
  parameters:
    TransactionId:
      name: transactionId
      in: path
      required: true
      schema:
        type: string
      description: >-
        Canonical public transaction identifier for transaction-family readback
        and actions.
  schemas:
    ApproveIncomingPaymentRequest:
      type: object
      description: Receiver-review approval payload for a pending incoming transaction.
      properties:
        receiverCustomerInfo:
          type: object
          description: >-
            Receiver/customer fields provided to satisfy the current review
            requirements when additional information is requested.
          additionalProperties:
            type: string
      additionalProperties: false
    TransactionApproveIncomingReviewResponse:
      type: object
      description: >-
        Bounded public incoming-review approval result. The response is
        transaction-first and intentionally smaller than full transaction
        detail.
      properties:
        transactionId:
          type: string
          description: >-
            Canonical public transaction identifier for the approved incoming
            transaction.
        type:
          type: string
          enum:
            - INCOMING
          description: Direction of this approved transaction.
        status:
          type: string
          enum:
            - CREATED
            - PENDING
            - PROCESSING
            - COMPLETED
            - REJECTED
            - FAILED
            - REFUNDED
            - EXPIRED
          description: >-
            Current transaction lifecycle status after the approval decision was
            recorded.
        customerId:
          type:
            - string
            - 'null'
          description: >-
            System-generated BLIPS customer identifier associated with this
            incoming transaction when available.
        platformCustomerId:
          type:
            - string
            - 'null'
          description: >-
            Platform-side customer identifier associated with this incoming
            transaction when available.
        createdAt:
          type: string
          format: date-time
          description: Transaction creation timestamp.
        updatedAt:
          type: string
          format: date-time
          description: Last update timestamp after the approval decision was recorded.
        settledAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Settlement timestamp when the approved incoming transaction has
            completed settlement.
        source:
          $ref: '#/components/schemas/TransactionApproveIncomingReviewSource'
          description: Bounded source detail for the approved incoming transaction.
        destination:
          $ref: '#/components/schemas/TransactionApproveIncomingReviewDestination'
          description: Bounded destination detail for the approved incoming transaction.
        receivedAmount:
          $ref: '#/components/schemas/MoneyAmount'
          description: Main received amount for the approved incoming transaction.
      required:
        - transactionId
        - type
        - status
        - customerId
        - platformCustomerId
        - createdAt
        - updatedAt
        - settledAt
        - source
        - destination
        - receivedAmount
      additionalProperties: false
    TransactionApproveBadRequestResponse:
      type: object
      description: >-
        Dedicated bad-request response contract for the incoming-review approval
        route.
      properties:
        status:
          type: integer
          description: HTTP status code for this error response.
        code:
          type: string
          enum:
            - INVALID_REQUEST
          description: Stable public error code for this invalid incoming-review request.
        message:
          type: string
          description: Human-readable invalid-request summary.
        details:
          type: object
          additionalProperties: true
          description: Optional structured invalid-request details.
      required:
        - status
        - code
        - message
        - details
      additionalProperties: false
    TransactionApproveUnauthorizedResponse:
      type: object
      description: >-
        Dedicated unauthorized response contract for the incoming-review
        approval route.
      properties:
        status:
          type: integer
          description: HTTP status code for this error response.
        code:
          type: string
          enum:
            - UNAUTHORIZED
          description: Stable public error code for missing or invalid API credentials.
        message:
          type: string
          description: Human-readable authorization failure summary.
        details:
          type: object
          additionalProperties: true
          description: Optional structured authorization details.
      required:
        - status
        - code
        - message
        - details
      additionalProperties: false
    TransactionApproveNotFoundResponse:
      type: object
      description: >-
        Dedicated not-found response contract for the incoming-review approval
        route.
      properties:
        status:
          type: integer
          description: HTTP status code for this error response.
        code:
          type: string
          enum:
            - TRANSACTION_NOT_FOUND
          description: >-
            Stable public error code when the supplied transaction identifier
            does not resolve.
        message:
          type: string
          description: Human-readable not-found summary.
        details:
          type: object
          additionalProperties: true
          description: Optional structured not-found details.
      required:
        - status
        - code
        - message
        - details
      additionalProperties: false
    TransactionApproveConflictResponse:
      type: object
      description: Conflict response for the incoming-review approval route.
      properties:
        status:
          type: integer
          description: HTTP status code for this error response.
        code:
          type: string
          enum:
            - APPROVAL_BLOCKED_REJECT_ONLY_SANCTIONS_HIT
            - APPROVAL_BLOCKED_REJECT_ONLY_SENDER_KYC_NOT_APPROVED
            - APPROVAL_BLOCKED_REJECT_ONLY
            - APPROVAL_BLOCKED_KYC_NOT_APPROVED
            - ADDITIONAL_INFORMATION_REQUIRED
          description: Conflict code for the incoming-review approval route.
        message:
          type: string
          description: Human-readable conflict summary.
        details:
          $ref: '#/components/schemas/TransactionApproveConflictDetails'
      required:
        - status
        - code
        - message
        - details
      additionalProperties: false
    TransactionApproveInternalErrorResponse:
      type: object
      description: >-
        Dedicated internal-error response contract for the incoming-review
        approval route.
      properties:
        status:
          type: integer
          description: HTTP status code for this error response.
        code:
          type: string
          enum:
            - INTERNAL_ERROR
          description: Stable public error code for unexpected service failures.
        message:
          type: string
          description: Human-readable internal-error summary.
        details:
          type: object
          additionalProperties: true
          description: Optional structured internal-error details.
      required:
        - status
        - code
        - message
        - details
      additionalProperties: false
    TransactionApproveIncomingReviewSource:
      type: object
      description: Bounded public source detail for the approved incoming transaction.
      properties:
        accountId:
          type: string
          description: >-
            Internal account identifier that sourced the approved incoming
            transaction.
        sourceType:
          type: string
          enum:
            - INTERNAL_ACCOUNT
          description: Public source type for this incoming-review action.
      required:
        - accountId
        - sourceType
      additionalProperties: false
    TransactionApproveIncomingReviewDestination:
      type: object
      description: Bounded public destination detail for the approved incoming transaction.
      properties:
        destinationType:
          type: string
          enum:
            - PPV_ADDRESS
            - EXTERNAL_ACCOUNT
          description: Approved incoming transaction destination type.
        accountId:
          type: string
          description: >-
            Bound external account identifier when the incoming transaction
            settles to an external-account destination.
        ppvAddress:
          type: string
          description: Public PPV address in plain `localPart@ppvDomain` format.
      required:
        - destinationType
      additionalProperties: false
    MoneyAmount:
      type: object
      properties:
        currencyCode:
          type: string
          description: ISO 4217 currency code.
        amountMinor:
          type: string
          description: Amount in minor units for that currency.
      required:
        - currencyCode
        - amountMinor
      additionalProperties: false
    TransactionApproveConflictDetails:
      type: object
      description: >-
        Optional structured conflict details for the incoming-review approval
        route.
      properties:
        requiredFields:
          type: array
          description: >-
            Counterparty fields still required before approval can complete,
            using the same `profile` + `mandatory` vocabulary as `/config`.
          items:
            $ref: '#/components/schemas/TransactionApproveRequiredField'
      additionalProperties: false
    TransactionApproveRequiredField:
      type: object
      description: >-
        Counterparty field that is still required before the pending incoming
        transaction can be approved.
      properties:
        profile:
          type: string
          enum:
            - FULL_NAME
            - BIRTH_DATE
            - NATIONALITY
            - EMAIL
            - PHONE_NUMBER
            - POSTAL_ADDRESS
            - TAX_ID
          description: >-
            Counterparty profile field required for supported flows in this
            configuration.
        mandatory:
          type: boolean
          description: >-
            Whether this counterparty profile field must be supplied before
            execution can proceed. `false` means the field is optional metadata
            in the frozen MVP contract.
      required:
        - profile
        - mandatory
      additionalProperties: false
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: >-
        Integration-key Basic Auth (`clientId:clientSecret`) as documented in
        docs/public/AUTHENTICATION.md.

````