Skip to content
Last updated

Migrating from Payments v1 to Payments v2

Migrating from Payments v1 to Payments v2 has the following benefits:

  • a single endpoint, /payments, instead of separate /token-requests and /transfers endpoints

  • more granular status information

  • credentials fields are sent upfront for embedded SCA flow

  • enhanced filters for GET v2/payments calls compared with GET /transfers

  • support for sending a customer-generated state parameter to the bank

When migrating from Payments v1 to Payments v2 , you should consider the following :

Who can migrate?

The following table indicates whether you can migrate to Payments v2 based on your current integration.

What are you currently using?

API-onlyHosted Pages v1Hosted Pages v1 for embedded authentication handling onlySettlement accountsCan you use Payments v2?
Yes
No
No
No
Yes
Yes
No
No
Yes
Yes
Yes
No
Yes
No
No
Yes
No
No
Yes
No
No
Yes
Yes
No
No
Yes
Yes
NA
No
No
Yes
Yes
NA
Yes
No

ID format

The format for ids in Payments v1 changes from:

  • tokenIde.g., tt:BzFCFwVt5zrt6rdcHJK5imf2HXbGdVdyHKpWQZbgzL5s:qXTkpBAZVbXMxk9vi

  • transferIde.g., t:2UhwCZ3BMaEcAUK8bZdukor7NL4tH6TBuu6aJMp5KKfX:5zKcENpV

  • transfer id - e.g., tt: 83KiRJuXmEDV5m2b8ZvLGE91ELf7PPw5BaDab98kMguu:3VMczyq7r7b6HwC

  • requestIde.g., rq:ej5ACWNwi1EcqBeuDPc4Z8C4Bgc:5zKtXEAq

to a generic prefix of pm2 for Payments v2:

  • all ids – e.g., pm2:ej5ACWNwi1EcqBeuDPc4Z8C4Bgc:5zKtXEAq

Payment statuses

The statuses for Payments v2 differ from the statuses for Payments v1.

Some of these statuses are for information only, whereas others need to be considered triggers for TPP actions.

The following table contains the mappings for converting Payment v1 statuses to Payment v2 statuses.

Payments v1 statusPayments v2 status
PENDINGINITIATION_PENDING
PENDING_EXTERNAL_AUTHORIZATIONINITIATION_PENDING_REDIRECT_AUTH
PROCESSINGINITIATION_PROCESSING
SUCCESSINITIATION_COMPLETED
INITIATEDINITIATION_NO_FINAL_STATUS_AVAILABLE
FAILURE_GENERICINITIATION_REJECTED or INITIATION_FAILED
FAILURE_PERMISSION_DENIEDINITIATION_REJECTED
FAILURE_CANCELEDINITIATION_DECLINED
FAILURE_EXPIREDINITIATION_EXPIRED
FAILURE_INSUFFICIENT_FUNDSINITIATION_REJECTED_INSUFFICIENT_FUNDS
FAILURE_DECLINEDINITIATION_DECLINED
SETTLEMENT_IN_PROGRESSSETTLEMENT_IN_PROGRESS
SETTLEMENT_INCOMPLETESETTLEMENT_INCOMPLETE
SETTLEMENT_COMPLETEDSETTLEMENT_COMPLETED

Webhooks

In Payments v2 you'll receive webhook notifications for status at an earlier stage in the user journey, not just for the transfer object.

For example, if you've configured webhooks, you'll receive a webhook when the payment is first initiated using the POST /v2/payments call and when the GET /v2/payments/{paymentId} request is used to check whether the payment has completed.

See API-only integration in Payments v2 for more information.

Dashboard

If you're using the dashboard to view transactions, Token.io must turn on the dashboard tabs for Payments v2.

Auto redeem

In Payments v2 it's not possible to manually redeem a token; you must have auto redeem turned on. Note that auto redeem is turned on by default for all new TPPs since 22nd February 2023.

Mapping Payments v1 initiation fields to Payments v2 initiation fields

The following table contains the mappings for converting Payments v1 initiation fields to corresponding Payments v2 initiation fields.

Payments v1 initiation fieldPayments v2 initiation field
POST /token-requests requestPOST /v2/payments request
requestOptions.bankIdinitiation.bankId
requestPayload.toinitiation.refId
requestPayload.actingAsinitiation.onBehalfOf
requestPayload.descriptioninitiation.remittanceInformationSecondary
requestPayload.redirectUrlinitiation.callbackUrl
requestPayload.refIdinitiation.refId
requestPayload.transferbody.amountinitiation.amount.value
requestPayload.transferbody.confirmFundsinitiation.confirmFunds
requestPayload.transferbody.currencyinitiation.amount.currency
requestPayload.transferbody.executionDateinitiation.executionDate
requestPayload.transferbody.instructions.metadata.chargeBearerinitiation.chargeBearer
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.cma9TransferMetadata.endToEndIdentificationinitiation.refId
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.cma9TransferMetadata.remittanceInformationinitiation.remittanceInformationPrimary
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.cma9TransferMetadata.riskinitiation.risk
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.endToEndIdentificationinitiation.refId
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.remittanceInformationStructuredinitiation.remittanceInformationPrimary
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.beneficiaryinitiation.creditor
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.endtoendIdinitiation.refId
requestPayload.transferbody.instructions.metadata.purposeCodeinitiation.risk.paymentPurposeCode
requestPayload.transferbody.instructions.metadata.ultimateCreditorinitiation.creditor.ultimateCreditorName
requestPayload.transferbody.instructions.metadata.ultimateDebtorinitiation.debtor.ultimateDebtorName
requestPayload.transferbody.instructions.source.accountIdentifierinitiation.debtor
requestPayload.transferbody.instructions.source.bicinitiation.debtor
requestPayload.transferbody.instructions.source.customerDatainitiation.debtor
requestPayload.transferbody.instructions.transferDestinationsinitiation.localInstrument
transferbodty.remittanceReference*initiation.remittanceInformationPrimary
POST /transfers responsePOST /v2/payments response
transfer.createdAtMspayment.createdDateTime
transfer.executionDatepayment.initiation.executionDate
transfer.idpayment.initiation.amount.value
transfer.payload.amountpayment.id
transfer.payload.confirmFundspayment.initiation.confirmFunds
transfer.payload.descriptionpayment.initiation.remittanceInformationSecondary
transfer.payload.metadata.chargeBearerpayment.initiation.chargeBearer
transfer.payload.metadata.providerTransferMetadata.cma9TransferMetadata.endToEndIdentificationpayment.initiation.refId
transfer.payload.metadata.providerTransferMetadata.cma9TransferMetadata.remittanceInformation*payment.initiation.remittanceInformationPrimary
transfer.payload.metadata.providerTransferMetadata.cma9TransferMetadata.riskpayment.initiation.risk
transfer.payload.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.endToEndIdentificationpayment.initiation.refId
transfer.payload.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.remittanceInformationStructured*payment.initiation.remittanceInformationPrimary
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.beneficiarypayment.initiation.creditor
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.endtoendIdpayment.initiation.refId
transfer.payload.metadata.purposeCodepayment.initiation.risk.paymentPurposeCode
transfer.payload.metadata.ultimateCreditorpayment.initiation.creditor.ultimateCreditorName
transfer.payload.metadata.ultimateDebtorpayment.initiation.debtor.ultimateDebtorName
requestPayload.transferbody.instructions.transferDestinationspayment.initiation.localInstrument
transfer.payload.refIdpayment.initiation.refId
transfer.payload.tokenIdpayment.id
transfer.providerDetails.idpayment.bankPaymentId
transfer.provideDetails.statuspayment.bankPaymentStatus
transfer.sourcepayment.initiation.debtor
transfer.statuspayment.status
transfer.statusInformationReasonpayment.statusInformationReason
transfer.transactionidpayment.bankTransactionId

Payments v1 fields not present in Payments v2

The following Payments v1 fields do not have a corresponding field in Payments v2 and cannot be mapped to a Payments v2 field.

Payments v1 fields not present in Payments v2
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.cma9TransferMetadata.instructionIdentification
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.creditorAgent
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.creditorAgentName
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.polishApiTransferMetadata.deliveryMode
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.polishApiTransferMetadata.hold
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.debtorAgent
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.executionRule
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.paymentTypeInformation
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.stetTransferMetadata.regulatoryReportingCodes
transfer.payload.metadata.providerTransferMetadata.cma9TransferMetadata.instructionIdentification
transfer.payload.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.creditorAgent
transfer.payload.metadata.providerTransferMetadata.nextGenPsd2TransferMetadata.creditorAgentName
requestPayload.transferbody.instructions.metadata.providerTransferMetadata.polishApiTransferMetadata.deliveryMode
transfer.payload.metadata.providerTransferMetadata.polishApiTransferMetadata.hold
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.debtorAgent
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.executionRule
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.paymentTypeInformation
transfer.payload.metadata.providerTransferMetadata.stetTransferMetadata.regulatoryReportingCodes
transfer.payloadSignature

If you have any feedback about the developer documentation, please contact devdocs@token.io