Corgi BankDocumentation
OpenAPI

Instant payments overview

FedNow and RTP payments share one resource, the Realtime Transfer. This page covers how to send one, how the answer comes back, and the limits the bank enforces.

One resource, two rails

A Realtime Transfer is a credit transfer on the rail named in rail: fednow or rtp. Both send a pacs.008 and read a pacs.002. FedNow messages travel in the FedNow envelope under a head.001.001.02 header. RTP exchanges the same ISO 20022 documents without the envelope until The Clearing House's message specifications are loaded. Both operators are simulators today. kind is customer, liquidity or return, and direction is outbound or inbound.

Send a payment

POST /transfers/realtime requires an Idempotency-Key. A customer's token also needs a step-up within the last five minutes.

railstringRequired

fednow or rtp.

account_idstringRequired

The account that pays. It must be open and free of debit restrictions.

amountintegerRequired

Minor units. Positive, and no more than the network limit.

currency_codestringRequired

ISO 4217. It must be the account's currency.

counterpartyobjectRequired

routing_number (nine digits with a valid check digit), account_number, name and account_type (checking or savings).

remittancestringOptional

Text for the receiver.

request_idstringOptional

The request for payment this payment settles. Its id becomes the end-to-end id.

Before anything leaves, the bank checks the approval policy and payment limits, places a pending_debit hold, screens the counterparty's name and runs the outbound fraud rules. Instant payments are irrevocable, so a payment that screening or the fraud rules stop is stored as held_for_review and leaves the bank only when a reviewer releases it.

The answer

The service answers within the request, and the response carries the result.

AnswerStatusMeaning
ACSC, ACTC, ACCCacceptedSettled. The account is debited and the hold released.
ACWPaccepted_without_postingSettled and debited the same way. The receiver is investigating before it posts. A later ACCC makes the payment posted, BLCK makes it blocked, and RJCT makes it rejected, with a return to follow.
RJCTrejected_by_railNot settled. reason_code and reason_info say why, and the hold is released.
admi.002rejected_by_railThe service rejected the message itself.
nonesentThe payment may have settled. The hold stays.

The reason on a rejection is an ISO 20022 code: AC03 for an invalid creditor account number, AC04 for a closed account, AC06 for a blocked one, AG01 for a transaction that is not allowed, AM02 for an amount over a limit, AM11 for a currency the receiver does not take.

FedNow's payment timeout clock is 20 seconds. A payment left sent is never sent again. After 25 seconds a scheduler routine asks the service what became of it with a pacs.028 and applies the answer; POST /transfers/realtime/{id}/status-request asks at once.

Limits

  • The network limit is $10,000,000 per payment on both rails. Above it the answer is payments.limit_exceeded. GET /rails reports it as transaction_limit_amount, with each rail's cycle date. Both rails are always_on.
  • The account's payment limits (per payment, per user per day, per account per day) answer the same code.
  • An account's approval policy refuses a direct payment at or above its threshold with payments.approval_required. A token issued for a customer API key is always refused that way: those payments go through a scheduled transfer and its approvers.

Liquidity and the RTP joint account

The bank moves its own position with a liquidity management transfer, a pacs.009 over FedNow: POST /rails/realtime/liquidity-transfers, open to operations staff and the operations service only. It debits a GL account and is recorded as a Realtime Transfer with kind liquidity. With purpose rtp_funding and an rtp_participant_id, the receiver is the RTP joint account (routing 021053968) and the GL defaults to 1100, the bank's prefunded RTP position. These transfers are accepted from 7 p.m. to 7 a.m. ET on weekdays and all day on weekends and holidays; outside that the answer is payments.cutoff_passed. The limit is $10,000,000 per transfer and per cycle day.

Testing

The simulated operators settle at once. They reject a payment whose creditor account number ends in 0000 with AC03 and one ending in 9999 with AC04, answer ACWP when the creditor's name contains ACWP, and give no answer when it contains TIMEOUT. Incoming payments and returns covers the other direction.

to move to open esc to close