Outbound Payments

Overview

Payments can be made on behalf of customers via the Main Account by depositing funds into the corresponding Sub-account or User-Account first, and creating a beneficiary - if it hasn't already been created. To make payments, it's imperative that the country the payment is being made to is on Caxton's approved countries list.

In the following excerpts we provide some more context, and instructions on how to make a payment to Individuals and/or businesses.

Lookup Supported Countries List

To see which countries payments can be made to, call GET - List of countries and their respective bank requirements. endpoint. This endpoint shows all the countries supported and unsupported for payments by Caxton.

RESPONSE

The following shows the first result on the list:

{
    "Content": {
        "Model": {
            "Countries": {
                "Result": [
                    {
                        "ShortName": "UK",
                        "FullName": "United Kingdom",
                        "Alpha2Code": "GB",
                        "Alpha3Code": "GBR",
                        "NumericCode": "826",
                        "ForApplications": true,
                        "ForBeneficiaries": true,
                        "ForOthers": false,
                        "ForMonitor": false,
                        "ForPlaceOfBirth": false,
                        "DefaultCurrencyCode": "GBP",
                        "ISDCode": "+44",
                        "ApiStatusCode": 100,
                        "ApiStatus": "IsValid",
                        "ApiStatusDescription": "Valid Operation"
                    },
       }
}

If ForBeneficiaries is set to true, then that country is enabled to receive payments. Conversely, if set to false, payments to that country are not supported by Caxton:

{
    "Content": {
                        "ForBeneficiaries": true,
                    },

Lookup Supported Countries by Country Code

Alternatively, a specific country can be looked up to check if it is enabled for payments via the GET - Country by Country Codeendpoint. The following response is shown for 'UK', with the ForBeneficiaries value on line 11 showing as true, thereby confirming the country is enabled for payments.

RESPONSE

{
    "Content": {
        "Model": {
            "Country": {
                "ShortName": "UK",
                "FullName": "United Kingdom",
                "Alpha2Code": "GB",
                "Alpha3Code": "GBR",
                "NumericCode": "826",
                "ForApplications": true,
                "ForBeneficiaries": true,
                "ForOthers": false,
                "ForMonitor": false,
                "ForPlaceOfBirth": false,
                "DefaultCurrencyCode": "GBP",
                "ISDCode": "+44",
                "ApiStatusCode": 100,
                "ApiStatus": "IsValid",
                "ApiStatusDescription": "Valid Operation"
            },
        },
    },
}

Lookup Purpose Codes

Depending on the country, payments to specific beneficiaries may need a purpose code. The following is a list of countries where they are required. If the beneficiary you are sending a payment to is not in any of the countries below, the purpose code is not needed.

Purpose codes are needed to explain the reason for the transfer, without them, transfers may not be accepted by the beneficiary bank.

Country CodeCountry
AEArab Emirates
BHBahrain
INIndia
JOJordan
MAMorocco

To see a list of purpose codes for a specific country:

  1. Call GET - Gets country purpose codes.
  2. Enter the corresponding ccyCode as shown above.

Alternatively, to see information regarding a specific purpose code within that country:

  1. Call GET - Gets country purpose code information.
  2. Enter the corresponding ccyCode as shown above.
  3. Enter the purpose code you wish to query.

Schedule a Payment to a Beneficiary

To schedule a payment to an existing beneficiary:

  1. Call POST - Create a Payment.
  2. Fill out the request body values.
  3. A successful response is shown below. The Value created on line 5 as a result, is the Pending Transfer Id, which can be used in searches to retrieve details pertaining to the specific transfer. However, a TransferId value is not created until the transfer is validated by Caxton:

REQUEST

curl --location 'https://caxapi-test.azurewebsites.net/api/transfers/pending' \
--header 'Content-Type: application/json' \
--header 'authorization: Bearer <access_token>' \
--header 'userapitoken: <userapitoken>' \
--data '{
  "BeneficiaryId": 40081,
  "BuyCurrency": "EUR",
  "BuyAmount": 10,
  "PayAwayDate": "2024-01-17",
  "PayAwayReference": "Holiday",
  "FeeCurrency": "GBP",
  "Fee": 0,
  "TransferReason":4
}'

RESPONSE

{
    "MainAccountHolderName": "<MainAccountHolderName>",
    "Content": {
        "Model": {
            "Value": 79056,
            "ApiStatusCode": 100,
            "ApiStatus": "IsValid",
            "ApiStatusDescription": "Valid Operation"
        },
        "ExpectedResponses": [
            "IsValid"
        ]
    },
    "AuthorisedClientModel": {
        "ClientId": "<ClientId>",
        "ClientRef": "<ClientRef>",
        "UserId": "<UserId>",
        "TokenStartDate": "2023-11-06T10:06:28.1175216",
        "TokenEndDate": "2024-02-15T12:17:37.4982696",
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    },
    "AuthorisedUserModel": {
        "UserId": "<UserId>",
        "AppVersion": null,
        "TokenStartDate": "2024-01-10T00:00:00",
        "TokenEndDate": "2024-02-09T00:00:00",
        "LoginTimestamp": "2024-01-11T17:52:09.8217665",
        "ApiLoginType": 0,
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    }
}

Search for a Pending Transfer

To list all pending transfers:

  1. Call GET - View Pending Transfer detail by ID. This endpoint shows the transfers that are awaiting processing. Pending transfers can be cancelled before they are processed.
  2. Enter the Pending TransferId generated when the Transfer is first created.
  3. A successful response returns the Pending TransferId as shown on line 6 and the TransferId as shown on line 11 of the response body. The difference between the two values is that a Pending TransferId is generated when the transfer is initiated and a TransferId is generated when the transfer is validated by Caxton.

REQUEST

curl --location 'https://caxapi-test.azurewebsites.net/api/transfers/pending/79056' \
--header 'Content-Type: application/json' \
--header 'authorization: Bearer <access_token>' \
--header 'userapitoken: <userapitoken>' \
--data ''

RESPONSE

{
    "MainAccountHolderName": "<MainAccountHolderName>",
    "Content": {
        "Model": {
            "PendingTransfer": {
                "Id": 79056,
                "BeneficiaryId": 40081,
     				    "UserId": "<UserId>",
                "BuyCurrency": null,
                "BuyAmount": 10.00,
                "TransferId": 163253,
                "PayAwayDate": "2024-01-17T00:00:00",
                "PayAwayReference": null,
                "FeeCurrency": "GBP",
                "Fee": 0.00,
                "UserIdentities": [],
                "OpenBankingAuthId": null,
                "IsValidated": false,
                "TransferReason": "Moving money between own accounts for general expenditure",
                "AuthorisedClientId": 0,
                "TransferType": 0,
                "PurposeCode": null,
                "ApiStatusCode": 100,
                "ApiStatus": "IsValid",
                "ApiStatusDescription": "Valid Operation"
            },
            "ApiStatusCode": 100,
            "ApiStatus": "IsValid",
            "ApiStatusDescription": "Valid Operation"
        },
        "ExpectedResponses": [
            "IsValid"
        ]
    },
    "AuthorisedClientModel": {
        "ClientId": "<ClientId>",
        "ClientRef": "<ClientRef>",
        "UserId": "<UserId>",
        "TokenStartDate": "2023-11-06T10:06:28.1175216",
        "TokenEndDate": "2024-02-15T12:17:37.4982696",
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    },
    "AuthorisedUserModel": {
        "UserId": "<UserId>",
        "AppVersion": null,
        "TokenStartDate": "2024-01-10T00:00:00",
        "TokenEndDate": "2024-02-09T00:00:00",
        "LoginTimestamp": "2024-01-11T17:52:09.8217665",
        "ApiLoginType": 0,
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    }
}

Search for a Specific Processed Transfer

  1. Call GET - View Transfer detail by ID. Lists completed transfers by Id.
  2. Enter the PendingTransferId.
  3. A successful response returns a TransferId as shown on line 6 of the response body.

REQUEST

curl --location 'https://caxapi-test.azurewebsites.net/api/transfers/163253' \
--header 'Content-Type: application/json' \
--header 'authorization: Bearer <access_token>' \
--header 'userapitoken: <userapitoken>' \
--data ''

RESPONSE

{
    "MainAccountHolderName": "<MainAccountHolderName>",
    "Content": {
        "Model": {
            "MoneyTransfer": {
                "Id": 163253,
                "BeneficiaryId": 40081,
                "UserId": "<UserId>",
                "BuyCcyCode": "EUR",
                "BuyAmount": 10.00,
                "Complete": true,
                "Automatic": true,
                "ExecutedDate": "2024-01-17T14:23:30.4431297",
                "PayAwayDate": "2024-01-17T00:00:00",
                "PayStatus": "Processing",
                "AccountTransactionId": 656790,
                "Cashavailable": null,
                "Authorisation": null,
                "AuthorisationStatus": null,
                "FileAccepted": null,
                "PaymentFile": null,
                "FileSent": null,
                "PaymentAccepted": null,
                "RejectionReason": null,
                "PaymentReference": "GBPGBPGBPGBPGBPGBP",
                "IsPending": false,
                "CreatedDate": "2024-01-17T14:23:30.1575654",
                "PaymentProvider": "<PaymentProvider>",
                "ComplianceStatus": 0,
                "EyeCheckStatus": 0,
                "ComplianceStatusDesc": "Awaiting",
                "IsHighRiskTransfer": false,
                "FeeCurrency": "GBP",
                "Fee": 0.00,
                "ExternalSourceId": null,
                "BeneficiaryName": "John Doe",
                "ApiStatusCode": 100,
                "ApiStatus": "IsValid",
                "ApiStatusDescription": "Valid Operation"
            },
            "ApiStatusCode": 100,
            "ApiStatus": "IsValid",
            "ApiStatusDescription": "Valid Operation"
        },
        "ExpectedResponses": [
            "IsValid"
        ]
    },
    "AuthorisedClientModel": {
        "ClientId": "<ClientId>",
        "ClientRef": "<ClientRef>",
        "UserId": "<UserId>",
        "TokenStartDate": "2023-11-06T10:06:28.1175216",
        "TokenEndDate": "2024-02-15T12:17:37.4982696",
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    },
    "AuthorisedUserModel": {
        "UserId": "<UserId>",
        "AppVersion": null,
        "TokenStartDate": "2024-01-10T00:00:00",
        "TokenEndDate": "2024-02-09T00:00:00",
        "LoginTimestamp": "2024-01-11T17:52:09.8217665",
        "ApiLoginType": 0,
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    }
}

Approve Payments - Sandbox Only

While using the Sandbox, payments can be manually approved to test transactions.

Change the status of a transfer

To change the status of a transfer while using the Sandbox:

  1. Lookup the corresponding TransferId for the transaction to update by calling POST - List all Transfers and filter by "Pending".
  2. Call {{server}}sandbox/payments-out
  3. Enter the TransferId.
  4. Update the TransferStatus to "Approved".

REQUEST

curl --location 'https://caxapi-integration.azurewebsites.net/api/sandbox/payments-out' \
--header 'Content-Type: application/json' \
--header 'authorization: Bearer <access_token>' \
--data '{
  "TransferId": 164165,
  "TransferStatus": "Approved"
}'

RESPONSE

{
    "MainAccountHolderName": "<MainAccountHolderName>",
    "Content": {
        "Model": {
            "ApiStatusCode": 100,
            "ApiStatus": "IsValid",
            "ApiStatusDescription": "Valid Operation"
        },
        "ExpectedResponses": [
            "IsValid"
        ]
    },
    "AuthorisedClientModel": {
        "ClientId": "<ClientId>",
        "ClientRef": "<ClientRef>",
        "UserId": "<UserId>",
        "TokenStartDate": "2023-11-06T10:06:28.1175216",
        "TokenEndDate": "2024-04-24T10:33:04.4417713",
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    },
    "AuthorisedUserModel": {
        "UserId": "<UserId>",
        "AppVersion": "20240322.1",
        "TokenStartDate": "2024-03-25T00:00:00",
        "TokenEndDate": "2024-04-24T00:00:00",
        "LoginTimestamp": "2024-03-25T10:33:04.410525",
        "ApiLoginType": 1,
        "ApiStatusCode": 100,
        "ApiStatus": "IsValid",
        "ApiStatusDescription": "Valid Operation"
    }
}

Search all Transfers

  1. POST - List all Transfers This endpoint shows all transfers, including those that are Cancelled, Processing, Completed, etc.

Transfer Status

Transfer statuses are used to define the stages for any given transfer. The following is a list of possible values:

ValueDescription
Transfer StartedTransfer initiated via Caxton.
Transfer PendingAccount may not have enough funds to complete the transfer.
ProcessingTransfer under review by Caxton.
Not AuthorisedTransfer unauthorised by Caxton.
CancelledTransfers are cancelled when requested by the User.
CompletedDisplayed when the funds reach the Beneficiary, and the transaction is considered as settled.