This guide will help you understand how to enable manual transaction review for withdrawals to support your organization’s compliance workflows. As a prerequisite, it is assumed that you have completed an integration in sandbox and are ready to make updates to support manual review.

Overview

In order to enable manual review for withdrawals, you will need to:

  1. Disable automatic approvals
  2. Review payment details
  3. Approve or reject the payment

Disable automatic approvals

By default, payment intents are automatically approved and posted to the network for processing during the payment session. You can disable automatic approvals by setting the approval_mode to manual when creating the payment intent.

Automatic approvals can only be disabled for cash_out intents - all cash_in intents are immediately posted to the network upon approval.

example create-intent request body

{
    "amount": 1000,
    "currency": "USD",
    "direction": "cash_out",
    "approval_mode": "manual",
    ... // other fields omitted for brevity
}

When Push approves a payment with approval_mode set to manual, the status of the payment intent at the conclusion of the payment session will be pending instead of approved. Your backend will receive the intent.approved webhook, but the payment will not be posted to the network until you manually approve it.

example webhook payload

{
    "type": "intent.approved",
    "data": {
        "id": "intent_5Jun2aRUEs7xGddsARCowB",
        "status": "pending", // status is set to pending
        "direction": "cash_out",
        ... // other fields omitted for brevity
    },
    "timestamp": "2024-01-14T22:31:02.756096Z"
}

Review payment details

Retrieve information about the payment using the get-intent endpoint to support your review process.

Details about the account receiving the payment are stored on the payment_credential field.

example intent response body

{
    "id": "intent_5Jun2aRUEs7xGddsARCowB",
    "created_at": "2024-01-14T22:29:51.555555Z",
    "direction": "cash_out",
    "amount": 1000,
    "currency": "USD",
    "status": "pending",
    "payment_credential": {
        "bank_name": "Space Coast Credit Union",
        "account": {
            "number_mask": "5978",
            "routing": "263177903"
        },
        "card": {
            "primary_account_number_mask": "6018",
            "expiration": "2024-05-01"
        }
    },
    "rail": "card"
    ... // other fields omitted for brevity
}

Approve or reject the payment

Call the API to effect your team’s decision on the payment.

  • To approve the payment, make a request to the approve-intent endpoint
  • To reject the payment, make a request to the cancel-intent endpoint