Make a Payment Request

Pre-requisites: Programme

Before initiating a Payment Request, you must have one or more Programmes that define key parameters such as branding, supported payout methods, support contact details, and legal content. Each Programme also determines whether your application or the Vitesse system will send emails to the payee.

Contact the Vitesse Solutions team to create your programmes.

📘

We recommend implementing a dynamic connection to Programmes, as their number and parameters may change over time. Your application should begin by retrieving the necessary details for the Programme you intend to use when creating a Payment Request. See Get programme details.


Payment Request flow

StagesApplicationVitesseWebhooks EventsComments
Create Payment RequestX
Response - SuccessfulX
Payment Requests InitiatedX
Recipient Capture InitiatedXRecipientCaptureInitiated
Email notification to Recipient[X][X]Client application or Vitesse platform, as defined in the programme
Reminder Email notification to Recipient[X][X]RecipientCaptureReminderTriggered (if emails managed by Vitesse)As many time as defined in the programme
Recipient Capture CompletedXRecipientCaptureCompleted
Transaction createdXPaymentRequestTransactionCreatedIf funds available in selected account
Transaction processingX
Transaction succeededXPaymentRequestSucceeded
Transaction failedXPaymentRequestFailed
Inform payeeXConfirmation or next steps for failed transactions

You can find the full list of webhooks events and examples on Webhooks Event Reference.


Create a sample Payment Request

  1. In Postman, set the request type to POST.

  2. As URL, enter https://api.staging.vitesse.io/v1/payment-initiation/paymentRequests
    This is the endpoint for validating transaction requests. After the parameters are validated, we'll replace it with the endpoint for making payment requests.

  3. Select Headers, and provide the following header parameters:

    KeyValueNotes
    AuthorizationBearer [TOKEN]Replace [TOKEN] with your token.
    Content-Typeapplication/json

  4. Select Body.

  5. In curly brackets, provide the body parameters. Parameters with an * (asterisk) are mandatory.

    ParameterTypeDescription
    SendAccountId*NumberThe ID of the Vitesse account from which funds will be drawn. It has to be allowed in the programme.
    SendValueDoubleThe amount you want to send in the currency defined in SendCurrency.
    SendCurrencyStringUse an ISO 4217 currency code, for example, GBP. See the full list of codes.
    ReceiveValueDoubleThe amount you want to send in the currency defined in ReceiveCurrency.
    ReceiveCurrencyStringThe currency in which you want to make the payment.
    RecipientObjectThis object contains the data of the recipient.
    Recipient.Type*StringPerson or Business
    Recipient.Name*String
    Recipient.PhoneNumberString
    Recipient.Email*String
    Recipient.CountryStringUse an ISO 3166-1 alpha-2 country code, for example, US. See the full list of codes
    Recipient.CaptureObjectThis object contains the parameters of the capture.
    Capture.ProgrammeId*Stringcf. Get programme details
    Capture.TrustMethodsObject
    TrustMethods.TrustMethodId*Stringpolicy-number or ...
    TrustMethods.Value*StringThe value that the payee needs to enter.
    Capture.VerificationMethodsObject
    VerificationMethods.VerificationMethodId*Stringcode-Sms or ...
    VerificationMethods.VerificationMethodType*StringCode
    VerificationMethods.CodeObject
    VerificationMethods.Code.ChannelsStringSms
    Capture.AllowedPaymentMethods*StringBankAccount, Echeck, PostalCheque
    PaymentDescription*StringThe description that the payee will see...
    RecipientReference*StringThe description that the payee will see on their bank/card statement or check memo.
    ExternalReference1StringInternal field for reconciliation
    ExternalReference2StringInternal field for reconciliation
    ExternalReference3StringInternal field for reconciliation

Request example

{
  "SendAccountId": 1234,
  "SendCurrency": "USD",
  "ReceiveValue": 10,
  "ReceiveCurrency": "USD",
  "Recipient": {
      "Type": "Person",
      "Name": "Example Recipient",
      "PhoneNumber": "+1408XXXXXXX",
      "Email": "[email protected]",
      "Country": "US",
      "Capture": {
          "ProgrammeId": "ce0872ee-75a5-4a38-8f65-b5074eac7401",
          "TrustMethods": [
              {
                  "TrustMethodId": "policy-number",
                  "Value": "ABC1234"
              }
          ],
          "VerificationMethods": [
              {
                  "VerificationMethodId": "code-Sms",
                  "VerificationMethodType": "Code",
                  "Code": {
                      "Channels": ["Sms"]
                  }
              }
          ],
          "AllowedPaymentMethods": ["BankAccount", "Echeck", "PostalCheque"]
      }
  },
  "PaymentDescription": "payment description",
  "RecipientReference": "recipient reference",
  "ExternalReference1": "external reference 1",
  "ExternalReference2": "external reference 2",
  "ExternalReference3": "external reference 3",
  "Extra": {
     // Set of extra fields here  
  },
  "Originator": {
    "Name": "Originator Name",
    "Address": "Originator Address",
    "Identifier": " Originator Identifier"
  }
}

Response example

You will get payment request with details and identifier PaymentRequestId when created succesfully.

{
    "Recipient": {
        "Capture": {
            "VerificationMethods": [
                {
                    "VerificationMethodId": "code-Sms",
                    "VerificationMethodType": "Code",
                    "Code": {
                        "Channels": [
                            "Sms"
                        ]
                    }
                }
            ],
            "ProgrammeId": "ce0872ee-75a5-4a38-8f65-b5074eac7401",
            "TrustMethods": [
                {
                    "TrustMethodId": "policy-number",
                    "Value": "ABC1234"
                }
            ],
            "AllowedPaymentMethods": [
                "BankAccount",
                "ECheck",
                "PostalCheque"
            ]
        },
        "Type": "Person",
        "Name": "Example Recipient",
        "PhoneNumber": "+1408XXXXXXX",
        "Email": "[email protected]",
        "Country": "US"
    },
    "PaymentRequestId": "2b179cb7-2534-4782-b76c-78b978d04147",
    "Status": "Initiated",
    "CreatedAt": "2025-09-23T06:25:00.5899676Z",
    "SendAccountId": 1234,
    "ReceiveValue": 10,
    "SendCurrency": "USD",
    "ReceiveCurrency": "USD",
    "PaymentDescription": "payment description",
    "RecipientReference": "recipient reference"
}

Monitor the 'Payment Request' status

You can monitor the Payment Request states via two methods:

  1. Polling the Retrieve payment request endpoint
  2. Using Webhooks to receive real-time updates

Webhook events are triggered throughout the payment request and payee selection process to keep your systems updated in real time. These events cover changes to the payment request, payee journey, and transaction status.

This allows your systems to track progress, respond to errors, and maintain end-to-end visibility. Subscribing to these events ensures a transparent and controlled payment process, supporting operational efficiency and reliability.

Possible states are listed on Payee Choice States.

Collecting Payee payment details

After a payment request is initiated, the payee receives an email with a secure link to submit their payment details. Depending on the programme setup, this email is sent either by your application or by Vitesse, with an expiry period and reminders.

When the payee has provided the payment details, Vitesse system sends the payment (i.e. creates the Transaction).

Success

If you've subscribed to webhooks, your system will receive the following payload after the transaction has been successful.

{
  "EventId": "00000000-0000-0000-0000-000000000001",
  "EventType": "PaymentRequestSucceeded",
  "TimestampUTC": "2025-30-07T00:00:123456Z",
  "Data": {
    "PaymentRequestId": "2b179cb7-2534-4782-b76c-78b978d04147",
    "ExternalReference1": "external reference 1",
    "ExternalReference2": "external reference 2",
    "ExternalReference3": "external reference 3"
    "Extra": {
      // some key-values here
    },
    "TransactionRequestId": "cbf775cb-7d3c-4bfc-88db-da97ef129f96",
    "RoutingDetails": {
      "SendCurrency": "USD",
      "SendValue": 10,
      "ReceiveCurrency": "USD",
      "ReceiveValue": 10,
      "Rate": 1
    }
  }
}

Your application can send a confirmation to the payee (optional).

Failure

If you've subscribed to webhooks, your system will receive the following payload after the transaction has failed.

{
  "EventId": "00000000-0000-0000-0000-000000000001",
  "EventType": "PaymentRequestFailed",
  "TimestampUTC": "2025-30-07T00:00:123456Z",
  "Data": {
    "PaymentRequestId": "2b179cb7-2534-4782-b76c-78b978d04147",
    "FailedAt": "2024-02-20T10:00:11.753463Z",
    "FailureReason": "TransactionFailed",
    "TransactionFailureType": "AmountAboveAccountLimit",
    "TransactionFailureReason": "The transaction amount of 205.00 GBP is above the account limit of 100.00 USD.",
  }
}

Your application must explain the next steps to the payee.