Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developer.uphold.com/llms.txt

Use this file to discover all available pages before exploring further.

This guide walks you through the steps to support FedNow / RTP withdrawals using the REST API — from verifying the destination bank supports FedNow / RTP to monitoring for settlement.

Prerequisites

FedNow withdrawals incur an additional fee. Make sure to present the quote to the user for confirmation before creating the transaction.

Walkthrough


Check available rails

Call List Rails to confirm the FedNow rail has the withdraw feature enabled.
GET /core/rails?type=bank&network=fednow&asset=USD
{
  "rails": [
    {
      "type": "bank",
      "network": "fednow",
      "method": "bank-transfer",
      "asset": "USD",
      "decimals": 2,
      "features": [
        "deposit",
        "withdraw"
      ]
    }
  ]
}

Select source account

FedNow withdrawals can be sourced from any account. If the selected account is not in USD, the balance will be converted at the time of the transaction using Uphold’s prevailing rate. Make sure the origin asset has the necessary features enabled. Call List accounts to retrieve the user’s accounts and let them pick the one to withdraw from.
GET /core/accounts
{
  "accounts": [
    {
      "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
      "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
      "label": "My USD account",
      "asset": "USD",
      "balance": {
        "total": "500.00",
        "available": "500.00"
      }
    }
  ]
}

Select a bank account

The destination bank account must support FedNow or RTP, indicated by "fednow" in secondaryNetworks. Select an existing eligible account or add a new one.

Find an existing bank account

Call List external accounts and filter for accounts with type: "bank". If no eligible account exists, proceed to link one.
GET /core/external-accounts
Make sure the selected account has status: "ok", "withdraw" in features, and "fednow" in secondaryNetworks.
{
  "externalAccounts": [
    {
      "id": "bb7f7fab-9e84-5a8e-9389-1458f56ac79",
      "type": "bank",
      "status": "ok",
      "network": "ach",
      "label": "My USD Checking Account",
      "features": [
        "withdraw"
      ],
      "secondaryNetworks": ["fednow"]
    }
  ]
}
If no eligible account exists, add one by calling Create external account with the user’s bank details. The secondaryNetworks field in the response will confirm whether the bank supports FedNow or RTP.
POST /core/external-accounts
{
  "type": "bank",
  "asset": "USD",
  "network": "ach",
  "label": "My USD Checking Account",
  "details": {
    "routingNumber": "121000248",
    "accountNumber": "9876543210",
    "accountType": "checking",
    "address": {
      "country": "US",
      "subdivision": "US-CA",
      "city": "San Francisco",
      "line1": "123 Main Street",
      "postalCode": "94102"
    }
  }
}
{
  "externalAccount": {
    "id": "bb7f7fab-9e84-5a8e-9389-1458f56ac79",
    "type": "bank",
    "status": "ok",
    "network": "ach",
    "label": "My USD Checking Account",
    "features": [
      "withdraw"
    ],
    "secondaryNetworks": ["fednow"]
  }
}
If secondaryNetworks does not include "fednow", the destination bank does not support FedNow or RTP. Use ACH instead.

Create a quote

Create a quote with Create quote. Pass network: "fednow" on the destination node to route the transfer via FedNow.
POST /core/transactions/quote
{
  "origin": {
    "type": "account",
    "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8"
  },
  "destination": {
    "type": "external-account",
    "id": "bb7f7fab-9e84-5a8e-9389-1458f56ac79",
    "network": "fednow"
  },
  "denomination": {
    "asset": "USD",
    "amount": "500.00",
    "target": "origin"
  }
}
The response includes the fees for the FedNow transfer. Present the full quote to the user before proceeding.
{
  "quote": {
    "id": "734111d9-ace0-5b3c-bb4e-7b7b55b8a7b1",
    "origin": {
      "amount": "500.00",
      "asset": "USD",
      "node": {
        "type": "account",
        "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
      },
      "rate": "1"
    },
    "destination": {
      "amount": "500.00",
      "asset": "USD",
      "node": {
        "type": "external-account",
        "id": "bb7f7fab-9e84-5a8e-9389-1458f56ac79",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
        "network": "fednow"
      },
      "rate": "1"
    },
    "denomination": {
      "asset": "USD",
      "amount": "500.00",
      "target": "origin",
      "rate": "1"
    },
    "fees": [],
    "expiresAt": "2024-07-24T15:22:39Z"
  }
}
Quotes typically expire quickly. Prompt for user confirmation within the expiry window and requote if needed.

Confirm and create transaction

After the user confirms the withdrawal, call Create transaction with the quote ID to execute the transfer.
POST /core/transactions
{
  "quoteId": "734111d9-ace0-5b3c-bb4e-7b7b55b8a7b1"
}
In a successful FedNow / RTP withdrawal, the origin is the user’s account and the destination is the external-account representing the user’s bank. The transaction status is initially processing and updates to completed once the transfer settles.
{
  "transaction": {
    "id": "e4f5a6b7-2c3d-4e6f-a09b-8c7d6e5f4a3c",
    "origin": {
      "asset": "USD",
      "amount": "500.00",
      "node": {
        "type": "account",
        "id": "a00507fe-628c-4f27-ae81-e1c40b2a8fb8",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a"
      }
    },
    "destination": {
      "asset": "USD",
      "amount": "500.00",
      "node": {
        "type": "external-account",
        "id": "bb7f7fab-9e84-5a8e-9389-1458f56ac79",
        "ownerId": "e4ce04dc-67b7-4e9f-af91-482cb6f9fc4a",
        "network": "fednow"
      }
    },
    "status": "processing",
    "quotedAt": "2025-01-10T14:22:15Z",
    "createdAt": "2025-01-10T14:22:45Z",
    "updatedAt": "2025-01-10T14:22:45Z",
    "denomination": {
      "asset": "USD",
      "amount": "500.00",
      "target": "origin"
    }
  }
}

Monitor for settlement

Prefer webhooks for real-time updates, or fall back to polling if webhooks are not feasible.

Notify the user

Display an in-app confirmation when the transaction is completed, and send an email if applicable.
You now support FedNow / RTP withdrawals via the REST API.