Example - PIN

This is a walkthrough of how to use PIN as an authentication method for SCA including setting it up for your end customers.

Things To Note

The requirements for SCA can vary depends on where the customer base is.

For more information please reach out to your implementation manager.

Create PIN API allow customers to setup their PIN with Wise directly.

This will allow customers to send their desired PIN to Wise in a direct encrypted manner which not even Wise will know about its value.

The Create PIN API is currently in closed Beta and subject to change. We would advise against using it directly without consulting your implementation manager.

Once an end customer's PIN is set up. It can now be used as an authentication factor to clear an SCA challenge.

Image below illustrates the interaction between Client and Wise.

PIN Verification Flow

Steps

  1. Client makes an HTTP call to get balance account statement which is a SCA protected endpoint.
Get Balance Account Statement - Request
curl -X GET https://api.sandbox.transferwise.tech/v1/profiles/{{profileId}}/balance-statements/{{balanceId}}/statement.json \
?currency=EUR \
&intervalStart=2023-01-01T00:00:00.000Z \
&intervalEnd=2023-01-15T23:59:59.999Z \
&type=COMPACT \
-H 'Authorization: Bearer <your api token>'
  1. Wise rejects the request with status 403 Forbidden. Please see the example response on the right.
Get Balance Account Statement - Response
HTTP/1.1 403 Forbidden
Date: Wed, 06 Dec 2023 08:57:34 GMT
x-2fa-approval: bb676aeb-7c4d-4930-bb55-ab949fd3fd87
x-2fa-approval-result: REJECTED
...other headers
  1. Client gets status of a one time token to get all required challenges to clear this OTT.
Get Status of One Time Token - Request
curl -X GET https://api.sandbox.transferwise.tech/v1/identity/one-time-token/status \
-H 'Authorization: Bearer <your api token>' \
-H 'One-Time-Token: bb676aeb-7c4d-4930-bb55-ab949fd3fd87'
  1. Wise returns one time token that describes all required challenges.

    For the complete list of challenges available please refer to ChallengeType.

Get Status of One Time Token - Response
{
"oneTimeTokenProperties": {
"oneTimeToken": "bb676aeb-7c4d-4930-bb55-ab949fd3fd87",
"challenges": [
{
"primaryChallenge": {
"type": "PIN",
"viewData": {
"attributes": {
"userId": 6146956
}
}
},
"alternatives": [],
"required": true,
"passed": false
}
],
"validity": 3600,
"actionType": "BALANCE__GET_STATEMENT",
"userId": 6146956
}
}
  1. Client verify pin by passing OTT acquired in step 2.
Verify Pin - Request
curl -X POST https://api.sandbox.transferwise.tech/v1/identity/one-time-token/pin/verify \
-H 'Authorization: Bearer <your api token>'
-H 'One-Time-Token: <one time token>'
-d '{
"pin": "1111"
}'
  1. Wise returns one time token properties after a successful pin verification.
    • Assuming that the challenges array field is empty, indicating that the OTT is now usable.

    • If you are unsure, you can always get status of a one time token again.

    • It is possible that the challenges array returns type of challenge. In that case, please perform the verification flow as written in our guides.

Verify PIN - Response
{
"oneTimeTokenProperties": {
"oneTimeToken": "bb676aeb-7c4d-4930-bb55-ab949fd3fd87",
"challenges": [],
"validity": 3600,
"actionType": null,
"userId": null
}
}
  1. Client calls Get Balance Statement with the approved OTT.
Get Balance Account Statement - Request
curl -X GET https://api.sandbox.transferwise.tech/v1/profiles/{{profileId}}/balance-statements/{{balanceId}}/statement.json \
?currency=EUR \
&intervalStart=2023-01-01T00:00:00.000Z \
&intervalEnd=2023-01-15T23:59:59.999Z \
&type=COMPACT \
-H 'Authorization: Bearer <your api token>' \
-H 'x-2fa-approval: bb676aeb-7c4d-4930-bb55-ab949fd3fd87'
  1. Wise returns Balance Account Statement.
Get Balance Account Statement - Response
{
"accountHolder": {
"type": "PERSONAL",
"address": {
"addressFirstLine": "Veerenni 24",
"city": "Tallinn",
"postCode": "12112",
"stateCode": "",
"countryName": "Estonia"
},
"firstName": "Oliver",
"lastName": "Wilson"
},
"otherFields": "..."
}