# Request For Payment (RFP)

A Realtime Request For Payment (RFP) is a request sent by an originator to a receiver requesting funds be sent to the originator's account. Currently, permitted uses of Requests For Payment are limited by the FedNow Service and the Real Time Payments Network.

### Request for Payment Workflow

RFPs have a workflow with two distinct steps:

1. An originator will send an RFP to a recipient. This request contains information to help the recipient approve or reject the request, including information about the requester, requested amount, and identifiable request details.
2. An RFP can be approved, rejected, or simply ignored. If an incoming RFP is approved, Column will initiate an outgoing Realtime transfer in accordance with the instructions specified in the incoming request. If ignored or rejected, no transfer will be sent.

### Sending a Request for Payment

You can create an outgoing RFP via API, [Create RFP](/api/realtime-transfer/create-a-realtime-rfp). Outgoing RFPs may be accepted, rejected, or ignored (typically resulting in expiration) by the recipient.

### Responding to a Request for Payment

When Column receives a RFP to a bank account on your platform, we will emit a webhook for `realtime.incoming_request_for_payment.received` which contains the [Realtime RFP object](/api/realtime-transfer/realtime-rfp-object). The object contains all information you need to accept or reject the request.

To accept the RFP, call our API [Accept a Realtime RFP](/api/realtime-transfer/accept-realtime-rfp). Once you accept the RFP request, Column will automatically create an outgoing realtime transfer according to the instructions in the request and provide the `realtime_transfer_id` of the credit transfer to you.

If you do not want to honor the request, call our API [Reject a Realtime RFP](/api/realtime-transfer/reject-realtime-rfp). This allows the ODFI to notify the requester the RFP was rejected by the recipient.

### SLAs Around Responding to a RFP Request

Incoming RFPs will have `expired_at` set to a specific timestamp at which the requester considers the request expired. As such, incoming RFPs should be surfaced to customers immediately. RFPs may have a maximum expiration date of 365 days in the future.

Column sends outgoing RFPs with an expiration date set equal to 1 business day following the request origination date.

### States and Events

When you initiate a Realtime RFP with Column, it goes through multiple state transitions. One of Column's most powerful features lies in our ability to notify you during each transition. This keeps you updated throughout the payment process and allows you to track the outcome of any transfer.

Below are the states and events that an outgoing Realtime RFP may go through.

| Stage ::min | Webhook Event                                     | Description                                                                        |
| ----------- | ------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Initiated   | `realtime.outgoing_request_for_payment.initiated` | Column will submit your realtime RFP to the Federal Reserve or The Clearing House. |
| Received    | `realtime.outgoing_request_for_payment.received`  | The RDFI has received your realtime RFP.                                           |
| Presented   | `realtime.outgoing_request_for_payment.presented` | Your realtime RFP has been presented to the recipient.                             |
| Accepted    | `realtime.outgoing_request_for_payment.accepted`  | The recipient of your realtime RFP has accepted the RFP.                           |
| Completed   | `realtime.outgoing_request_for_payment.completed` | Your realtime RFP has been completed and funds are available to you at Column.     |
| Rejected    | `realtime.outgoing_request_for_payment.rejected`  | Your realtime RFP has been rejected.                                               |
| Expired     | `realtime.outgoing_request_for_payment.expired`   | Your realtime RFP has expired without approval or rejection from the recipient.    |
| Canceled    | `realtime.outgoing_request_for_payment.canceled`  | Your realtime RFP has been canceled.                                               |

Below are the states and events that an incoming Realtime RFP may go through.

| Stage ::min | Webhook Event                                     | Description                                                                                 |
| ----------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| Received    | `realtime.incoming_request_for_payment.received`  | You have received an incoming realtime RFP.                                                 |
| Accepted    | `realtime.incoming_request_for_payment.accepted`  | You have accepted an incoming realtime RFP.                                                 |
| Completed   | `realtime.incoming_request_for_payment.completed` | An incoming realtime RFP has been accepted and funds have been withdrawn from your account. |
| Rejected    | `realtime.incoming_request_for_payment.rejected`  | You have rejected an incoming realtime RFP.                                                 |
| Expired     | `realtime.incoming_request_for_payment.expired`   | An incoming realtime RFP has expired without your explicit acceptance or rejection.         |
| Canceled    | `realtime.incoming_request_for_payment.canceled`  | An incoming realtime RFP has been canceled by the originator.                               |
