Future-dated Payments
Future dating is the scheduling of a banking transaction to occur at a later date. An authorized future-dated payment (FDP) is an agreement stipulating that funds will not be transferred and made available to the recipient until a specified point in the future.
Individual consumers and companies use future dating to control cash flow by scheduling payments to occur when sufficient funds are present in the paying account. Future dating a payment involves giving the bank instructions to send the payment on a specific date in the future, either the next day or beyond. In most cases, one-time future-dated and future recurring transfers scheduled for a weekend or a non-business day are processed on the next business day. All other future-dated transfers are processed at the end of the business day requested. The cut-off time and delivery date of external transfers are subject to
TPP-initiated FDP (2-step)
The sequence diagram pictured next shows the communication flow for a future-dated payment.
Guidance for making the appropriate POST and GET calls, as well as handling the bank's responses to these requests is covered next.
Base URLs
See Base URLs.
Headers
Making the Token Request
To initiate a payment request with the bank, you'll need to be able to identify yourself as the calling TPP using your Member ID and your Alias, defined as follows:
- Member ID – unique value generated by the Dashboard when you signed up.
- Alias – unique email or domain you proveided when you signed up.
A transfer request must include both parameters.
You can obtain the values from the dashboard by following these steps:
-
If the dashboard isn't already open in a browser tab, sign in.
-
Click Member Information in the navigation panel on the left.
-
Click the "eye" icon to the right of each value to reveal it.
-
Copy the value you need.
If the selected bank imposes this initial credentials check requirement, you'll need to capture the credentialFields
specified by the bank (e.g., the user's ) in its response to your GET /banks
call (see Bank Selection) and include this information in your payment request.
In addition, when initial credentials are required by the user-selected bank, the redirect URL in the sandbox will be:
https://tpp-integration.sandbox.token.io/initiatePayment/callback?redirect-url={{your-redirect-url}}
For production, the redirect URL changes to:
https://tpp-integration.token.io/initiatePayment/callback?redirect-url={{your-redirect-url}}
Here, {{your-redirect-url}} is your standard TPP redirect URL.
The exchange iterations necessary to provide initial credential information to the bank take place in the background.
If you are not connecting to a bank in Germany, Austria or Hungary, the requirement for an initial credentials check using the redirect URL format above does not apply and you should instead use the standard format outlined below.
Once the user gives consent for you to initiate PIS on the user's behalf, here's the call for POSTing /token-requests with a requestPayload:
{
"requestPayload"
: {
"refId"
: "xyz"
, // must be unique
"to"
: {
"id"
: "m:nP4w3u5y8ddrxDJkjimgSX9e4fZ:5zKtXEAq"
// required
member ID; mandatory
},
"transferBody"
: {
"currency"
: "EUR",
"lifetimeAmount"
: "1.00"
,
"instructions"
: {
"transferDestinations"
: [
{
"sepa"
: {
"iban"
: "FR7630004001160000784013521"
},
"customerData"
: {
"legalNames"
: [
"Test"
// populating creditor name is mandatory
]
}
}
]
},
"executionDate"
: "2021-10-14T07:22Z"
}
},
"description"
: "your description"
,
"redirectUrl"
: "https://sample-merchant-domain.com/transfer"
}
}
The most important request fields and their corresponding descriptions are listed in the following table.
Field | Description/Subfields | Required/Optional | |||||
---|---|---|---|---|---|---|---|
refId | Warning: If the description in subsequent token lookups/changes/updates (retrieve, redeem, or cancel) doesn't match the description in the originating token request, an exception will be thrown. |
Required | |||||
to | Identifies the member initiating the request | Required | |||||
id | Member ID of the |
Required | |||||
alias |
A human-readable proxy for your member identifier that contains your realmId or alias type (DOMAIN, EMAIL, other) and a value string.
A realmId identifies a member created under the realm of a specific bank. See Member Information in Understanding Dashboard Settings to find your member id and alias. |
Optional; soon to be deprecated | |||||
transferBody | Specifies the critical details of the transfer: currency, lifetimeAmount, and transferDestinations |
Required | |||||
currency | Currency for the transaction | Required | |||||
lifetimeAmount |
Amount of the payment/transfer valued in currency.
Precision: Recommended precision is rounding to 4 decimal places (HALF-EVEN), although the TPP can set it's own desired precision. However, be aware that certain banks may handle rounding differently — some with greater precision (i.e., more decimal places), others with reduced rounding precision (fewer decimal places). The Token Platform strictly serves as the pipeline between the TPP and the bank, imposing no precision restrictions. |
Required | |||||
instructions | Specifies beneficiary account information and any additional transfer instructions. | Required | |||||
|
|||||||
callbackState |
Developer-specified string allowing state to be persisted between the request and callback phases of the flow; used for the signature in a GET /token-requests/{tokenRequestId}/token-request-result call, in which the signing payload for the signature is a combination of state and tokenId and validates the tokenId against the callbackstate originally sent by the TPP in the request. Note: The value of callbackState is added to the redirect URL and appended to the hash of the CSRF token specified by the bank; e.g.: https://{callback-url}?signature=%7B%22memberId%22%3A%22m%3A3rKtsoKaE1QUti3KCWPrcSQYvJj9% |
Optional | |||||
description |
Description of the payment with the following qualifiers:
This description field maps to description in the bank's consentRequest presented to the user. Warning: If description in a subsequent token request for lookups/changes/updates (retrieve, redeem, or cancel) doesn't match the description in the originating token request, an exception will be thrown. |
Optional, with the caveats described in the previous column | |||||
redirectUrl |
Defines the |
Required | |||||
remittanceReference | Augmenting refId and description, this is TPP-defined additional information pertinent to TPP's payments policies; for instance, could contain a full or partial credit card number when payment is being initiated for a credit card payment. Securely hashed to safeguard its transmission throughout the communication flow, this field should be considered by TPPs wishing to augment their transaction reference data for tracking and audit control. | Optional | |||||
requestOptions |
|
Optional | |||||
source | Account number from which the amount is being debited; set using the AccountIdentifier object, which allows four types of account identifiers:
Although setting source with the BankAccount object has been deprecated, it is still supported |
|
|||||
traceID | TPP-provided unique value captured by Token and sent across to the bank to be stored with the request throughout its lifecycle as an audit-trail aid. | Optional | |||||
*Inclusion of some elements may be optional or bank-dependent |
Cited in the table within transferInstructions
and nested in source
is the accountIdentifier
object (required):
"source": {
"
": { "gb_domestic
": {
"account_number
": "70000005",
"sort_code
": "700001"
}
}
}
Remember, whatever you specify as the source
and transferDestinations
in the request will be reflected in the response.
A PAN is disallowed in the token request payload within the refId
and description
fields. In accordance with the PA-DSS security standard, Regex is used for pattern matching of numeric strings that intentionally or inadvertently reveal or resemble a PAN in the refId
or description
of a token request. Potential PAN patterns found will now throw an exception.
Payee Information
customerData
within providerTransactionDetails
for single transactions.
-
STET requires creditor account information.
-
CMA9, NextGenPSD2, and PolishAPI have the creditor name and account identifiers, as well as the creditor agent BIC. However, these are optional fields, so the presence of creditor account information is bank-dependent.
-
CMA9 needs the creditor agent address, whilst PolishAPI requires the creditor's address.
If you are initiating a payment to Barclays Bank UK or HSBC, the creditor name (creditorAcount.name
) can be no more than 18 characters. If this limit is exceeded, the bank will reject the payment.
Otherwise, when providing creditor name and address for CMA9 international payments, bear in mind that certain banks, such as HSBC, require creditor information to process international payments, despite its designation as "optional" in the OBIE specification. To be safe with respect to CMA9 international payments, provide this information in the customerData
fields of the transferDestination
object. The OBIE information maps to its Token.io counterpart as follows:
Token.io | OBIE |
---|---|
flats
|
SubDepartment
|
house_name
|
Department
|
house_number
|
BuildingNumber
|
street
|
StreetName
|
post_code
|
PostCode
|
city
|
TownName
|
district
|
CountrySubDivision
|
country
|
Country
|
Processing the Response
Here's an example of the response you'll receive:
"tokenRequest"
: {
"id"
: "rq:3g5RVV7Z4oU9P5rtzX2YhnssuPC5:5zKtXEAq"
, // request-id; add to BASE_URL for consent
"requestPayload"
: {
"to"
: {
"alias"
: {
"type"
: "EMAIL"
,
"value"
: noverify@token.io"
}
"id"
: "m:nP4w3u5y8ddrxDJkjimgSX9e4fZ:5zKtXEAq"
//
member ID
},
"transferBody"
: {
"currency"
: "EUR",
"lifetimeAmount"
: "1.00",
"transferInstructions"
: {
"transferDestinations"
: {
"fasterPayments"
: {
"accountNumber
": "70000005",
"sortCode
": "700001"
}
}
"executionDate"
: "2021-10-14T07:22Z"
}
},
"description"
: "your description",
"redirectUrl"
: "https://sample-merchant-domain.com"
/transfer
}
}
Create the redirect URL by appending the request id in the response (shown above in red) to the redirect base URL, then send it to the user to provide explicit consent to bank.
https://{{BASE_URL}}/app/request-token
/{{Insert request-id here
}}
// example = https://web-app.sandbox.token.io/app/request-token/rq:3RKfCA7KQEEZERLoFsAt3MoAnoP5:5zKtXEAq
You can specify a particular language by passing its language code (lang=country-code
) as a query parameter, appended to the URL above, which the user can override in the Web App according to personal preference. Here's an example for passing the desired ISO 639-1 language code for German (de
):
https://web-app.token.io/app/request-token/rq:o9adbFqJXcaDGNDaykPvpSZFZDW:5zKtXEAq?
Upon user consent, the bank will redirect the user back to the TPP with a tokenId as a query parameter.
"redirectUrl": "https://sample-merchant-domain.com"
/pis?tokenId=sample_token_id
To derive the complete redirect URL, you'll need to URL decode the value provided.
Using the tokenId sent by the bank (also known as the consent-id on the bank side), which confirms user consent, you can now initiate payment.
need to redeem the transfer token with a POST /transfers request containing the the bank-provided tokenId. Here's an example:
{
"payload"
: {
"tokenId"
: "{{TOKEN_ID}}"
, // tokenId in redirectUrl
}
}
The request field and its corresponding description are listed in the following table.
Field | Description/Subfields | Required/Optional | ||
---|---|---|---|---|
payload
|
tokenId
|
Bank-generated identifier returned in the response to the original payment request | Required |
You'll receive the transferStatus in a callback, which you can then display to the customer/user. See Payment Status: Value an Meaning for the list of possible status codes.
POST
and GET
calls must pass in an appropriate authorization header containing your authentication key (see Common Request Headers).
Please refer to the API reference for additional details on all of the above.