Card Issuance

With the Cards API, you can offer debit cards to your users - requested, issued and managed through your platform, powered by Wise.

Please visit our Postman collection for more details and examples of how to use our API, including how to link users to your integration, create cards, manage spending limits, set authorization rules and simulate and retrieve card transactions.

Wise cards are linked to Wise Multi-Currency Accounts. The Multi-Currency Accounts guide is available here: Multi-Currency Accounts Guide

Guides on customer authentication can be found here:

Retrieve card programs availability

Retrieves the list of available card programs and their details.

Card program: a Card Program is what Wise calls all the cards you will be issuing with us, grouped by product type and by issuing country.

Issuing country: the country where your card is created.

Product type: the type of card we are issuing on your behalf (consumer, corporate, digital, physical, etc.).

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/card-orders/availability \
-H 'Authorization: Bearer <your api token>' \
-H 'Content-Type: application/json'
Example Response
{
"cardPrograms": [
{
"name": "VISA_DEBIT_BUSINESS_UK_1",
"scheme": "VISA",
"defaultCurrency": "GBP",
"cardType" : "VIRTUAL_NON_UPGRADEABLE"
}
]
}

Create a card order

POST /v3/spend/profiles/{{profileId}}/card-orders

Orders a new card for a given profile. The card program should come from the list of available card programs.

The lifetimeLimit parameter is the maximum amount that can be spent with the card for the entire lifetime of the card. The lifetime limit currency is the card's default currency defined in the card program. The default lifetime limit value is 0, which means the card cannot be used until the lifetime limit is updated.

The billing address fields (firstLine, secondLine, thirdLine, city, state) all have a maximum length of 30 characters.

Please also note that this call needs an extra field in the header called "X-idempotence-uuid". This should be generated and used for any subsequent retry call in the case that the initial POST fails.

The returned response contains the status. The possible status values are:

  • PLACED - The profile is not verified. The digital card will be generated once the profile is verified.
  • REQUIREMENTS_FULFILLED - The card is being generated, which usually takes less than one second.
  • CARD_DETAILS_CREATED - The card has been generated. The completion of a digital card order only takes a few extra milliseconds.
  • COMPLETED - The card has been generated and the card order has been completed.
  • CANCELLED - The card order has been canceled. This can happen if you ask Wise customer support team to cancel a card order.

Response

Returns a card order.

Example Request
curl -X POST https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/card-orders \
-H 'Authorization: Bearer <your api token>' \
-H 'Content-Type: application/json' \
-H 'X-idempotence-uuid: <generated uuid>' \
-d '{
"program": "<card program name>",
"cardHolderName": "<card holder name>",
"phoneNumber": "<phone number>",
"billingAddress": {
"firstLine": "<first line of the address>",
"secondLine": "<optional second line>",
"thirdLine": "<optional third line>",
"city": "<city>",
"state": "<optional state>",
"postCode": "<optional postal code>",
"country": "<2 letter country code using ISO 3166-1 alpha-2>"
},
"lifetimeLimit": 100,
}'

Retrieve all cards orders by profile

GET /v3/spend/profiles/{{profileId}}/card-orders?pageSize=10&pageNumber=1

The following parameters are optional:

  • pageSize - the maximal number of requested card orders (used for pagination). This parameter has to be between 10 and 100 inclusive. If ommitted the default value 10 is used.
  • pageNumber - the requested page number starting from 1 (used for pagination). This parameter has to be equal or greater than 1. If ommitted the default value of 1 is used.

Both parameters are optional and if not provided their default values will be used.

Response

The returned response contains 2 elements:

  • totalCount - the total number of card orders, this number is never affected by the given pageSize or pageNumber parameters
  • cardOrders - the list of card orders starting from the given pageNumber (please keep in mind that the size of this list is limited by the given pageSize parameter with a default value of 10)
Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/card-orders?pageSize=10&pageNumber=1 \
-H 'Authorization: Bearer <your api token>'

Retrieve details of a particular card order

GET /v3/spend/profiles/{{profileId}}/card-orders/{{cardOrderId}}

Retrieves the details of a particular card order given its id.

Response

Returns a card order.

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/card-orders/{{cardOrderId}} \
-H 'Authorization: Bearer <your api token>'

Retrieve all cards by profile

GET /v3/spend/profiles/{{profileId}}/cards?pageSize=10&pageNumber=1

Retrieves the details of all cards that belong to a given profile.

The following parameters are optional:

  • pageSize - the maximal number of requested cards (used for pagination). This parameter has to be between 10 and 100 inclusive. If omitted the default value 10 is used.
  • pageNumber - the requested page number starting from 1 (used for pagination). This parameter has to be equal or greater than 1. If omitted the default value of 1 is used.

Both parameters are optional and if not provided their default values will be used.

Response

The returned response contains 2 elements:

  • totalCount - the total number of cards, this number is never affected by the given pageSize or pageNumber parameters
  • cards - the list of cards starting from the given pageNumber (please keep in mind that the size of this list is limited by the given pageSize parameter with a default value of 10)
Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards?pageSize=10&pageNumber=1 \
-H 'Authorization: Bearer <your api token>'

Retrieve details of a card by card token

GET /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}

Retrieves the details of one card given its id (also referred as a card token).

Response

Returns a card object.

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}} \
-H 'Authorization: Bearer <your api token>'

Set card status by card token

PUT /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/status

Modifies the card status, where the possible new status values are:

  • ACTIVE - the card is active and usable
  • FROZEN - the card is temporarily frozen resulting in all authorisation requests to be declined
  • BLOCKED - the card is irreversibly blocked and is no longer usable

Response

Returns a card object.

Example Request
curl -X PUT https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/status \
-H 'Authorization: Bearer <your api token>' \
-H 'Content-Type: application/json' \
-d '{
"status": "ACTIVE"
}'

Get card limits

GET /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits

Retrieves the card limits

Response

Returns a set of limits for the card sent.

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits \
-H 'Authorization: Bearer <your api token>'
Example Response
{
"spendings": [
{
"type": "ATM_WITHDRAWAL",
"limits": null
},
{
"type": "ECOM_PURCHASE",
"limits": null
},
{
"type": "CHIP_WALLET_PURCHASE",
"limits": null
},
{
"type": "GENERAL",
"limits": [
{
"type": "LIFETIME",
"usage": 2993.76,
"threshold": 5000.00,
"currency": "AUD",
"expiresAt": null
}
]
}
]
}

Retrieve profile spend limits

Retrieves the profile limits.

Limit details are defined as follows:

FieldDescriptionFormat
typeCard limit type. Allowed Values: TRANSACTION, DAILY, MONTHLY, LIFETIMEText
usageHow much was used so farDecimal
thresholdThreshold of the limitDecimal
currencyLimit currencyText
expiresAtDate & time when a limit will resetText
Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spending-limits' \
-H 'Authorization: Bearer {{API token}}'
Example Response
{
"spendings": [
{
"type": "ATM_WITHDRAWAL",
"limits": [
{
"type": "TRANSACTION",
"usage": 0,
"threshold": 1750,
"currency": "SGD",
"expiresAt": null
},
{
"type": "DAILY",
"usage": 0,
"threshold": 2700,
"currency": "SGD",
"expiresAt": "2022-12-15T16:00:00Z"
},
{
"type": "MONTHLY",
"usage": 0,
"threshold": 5250,
"currency": "SGD",
"expiresAt": "2022-12-31T16:00:00Z"
}
]
},
{
"type": "ECOM_PURCHASE",
"limits": [
{
"type": "TRANSACTION",
"usage": 0,
"threshold": 17500,
"currency": "SGD",
"expiresAt": null
},
{
"type": "DAILY",
"usage": 0,
"threshold": 17500,
"currency": "SGD",
"expiresAt": "2022-12-15T16:00:00Z"
},
{
"type": "MONTHLY",
"usage": 0,
"threshold": 35000,
"currency": "SGD",
"expiresAt": "2022-12-31T16:00:00Z"
}
]
},
{
"type": "CHIP_WALLET_PURCHASE",
"limits": [
{
"type": "TRANSACTION",
"usage": 0,
"threshold": 4300,
"currency": "SGD",
"expiresAt": null
},
{
"type": "DAILY",
"usage": 0,
"threshold": 5300,
"currency": "SGD",
"expiresAt": "2022-12-15T16:00:00Z"
},
{
"type": "MONTHLY",
"usage": 0,
"threshold": 17500,
"currency": "SGD",
"expiresAt": "2022-12-31T16:00:00Z"
}
]
},
{
"type": "CONTACTLESS_PURCHASE",
"limits": [
{
"type": "TRANSACTION",
"usage": 0,
"threshold": 900,
"currency": "SGD",
"expiresAt": null
},
{
"type": "DAILY",
"usage": 0,
"threshold": 900,
"currency": "SGD",
"expiresAt": "2022-12-15T16:00:00Z"
},
{
"type": "MONTHLY",
"usage": 0,
"threshold": 7000,
"currency": "SGD",
"expiresAt": "2022-12-31T16:00:00Z"
}
]
},
{
"type": "MAGSTRIPE_PURCHASE",
"limits": [
{
"type": "TRANSACTION",
"usage": 0,
"threshold": 550,
"currency": "SGD",
"expiresAt": null
},
{
"type": "DAILY",
"usage": 0,
"threshold": 700,
"currency": "SGD",
"expiresAt": "2022-12-15T16:00:00Z"
},
{
"type": "MONTHLY",
"usage": 0,
"threshold": 2100,
"currency": "SGD",
"expiresAt": "2022-12-31T16:00:00Z"
}
]
}
]
}

Set card limits

PATCH /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits

Set or change card spending limits. By default, a new card will have a lifetime limit set to 0.

Request Fields
cardLimitTypetext

Card limit type (TRANSACTION, DAILY, MONTHLY, LIFETIME)

maxLimitAmountdecimal

Limit amount on the card for the specified limit type.

Response

Returns a 200 response - No Content

Example Request
curl -X PATCH https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits \
-H 'Authorization: Bearer <your api token>' \
-H 'Content-Type: application/json' \
-d '{
"cardLimitType": "LIFETIME",
"maxLimitAmount": <your spending limit value>
}'

Delete lifetime limit

DELETE /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits/lifetime

Delete the lifetime limit.

Response

Returns a 200 response - No Content

Example Request
curl -X DELETE https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-limits/lifetime \
-H 'Authorization: Bearer <your api token>'

Get card permissions

GET /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-permissions

Retrieves the card permissions

Response

Returns a set of permissions for the card sent.

The possible type values are:

  • ECOM
  • POS_CHIP
  • POS_MAGSTRIPE
  • ATM_WITHDRAWAL
  • POS_CONTACTLESS
  • MOBILE_WALLETS
Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-permissions \
-H 'Authorization: Bearer <your api token>'
Example Response
{
"permissions": [
{
"type": "ECOM",
"isEnabled": false
},
{
"type": "POS_CHIP",
"isEnabled": true
},
{
"type": "ATM_WITHDRAWAL",
"isEnabled": false
},
{
"type": "MOBILE_WALLETS",
"isEnabled": true
}
]
}

Enable or disable card permissions

PATCH /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-permissions

Enable or disable a card permission

Request Fields
typetext

Must be one of the permission types as returned in get card permissions

isEnabledboolean

Whether to enable to disable the permission

The possible type values are:

  • ECOM
  • POS_CHIP
  • POS_MAGSTRIPE
  • ATM_WITHDRAWAL
  • POS_CONTACTLESS
  • MOBILE_WALLETS

Response

Returns a 200 response - No Content

Example Request
curl -X PATCH https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/spending-permissions \
-H 'Authorization: Bearer <your api token>'
--d '{
"type": <permission type>,
"isEnabled": <true or false>
}'

Get card transactions

GET /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/transactions?pageSize=10&pageNumber=1&fromTransactionDate=2022-11-01&toTransactionDate=2022-11-15

You can also use the card transaction webhook instead.

You can follow this guide to simulate various card transactions in the sandbox environment.

Retrieves the card transactions list.

The following parameters are optional:

  • pageSize - the maximal number of requested card orders (used for pagination). This parameter has to be between 10 and 100 inclusive. If ommitted the default value 10 is used.
  • pageNumber - the requested page number starting from 1 (used for pagination). This parameter has to be equal or greater than 1. If ommitted the default value of 1 is used.
  • fromTransactionDate - the starting date of the date filter. The date format is YYYY-MM-DD.
  • toTransactionDate - the end date of the date filter. The date format is YYYY-MM-DD.

The possible type values are:

  • ACCOUNT_CREDIT - Receiving money on the card, excluding Visa OCT or Mastercard MoneySend
  • ACCOUNT_FUNDING - Sending money to another card or e-wallet
  • CASH_ADVANCE - Cash disbursement
  • CASH_WITHDRAWAL - ATM withdrawal
  • CHARGEBACK - Currently unused. Reserved for future use.
  • CREDIT_TRANSACTION - Visa OCT and Mastercard MoneySend
  • ECOM_PURCHASE - Online purchase
  • POS_PURCHASE - Purchase via a POS Terminal
  • REFUND - Partial or full refund of an existing card transaction

The possible state values are:

  • IN_PROGRESS - The transaction has been authorized but not captured.
  • COMPLETED - The transaction has been captured and/or settled.
  • DECLINED - The transaction has been declined.
  • CANCELLED - The transaction has been cancelled.
  • UNKNOWN - Default fallback status if the state can't be confirmed.

When a refund happens, a separate transaction will be added with a REFUND transaction type.

Response

Returns a set of transactions for the card.

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/transactions?pageSize=10&pageNumber=1&fromTransactionDate=2022-11-01&toTransactionDate=2022-11-15 \
-H 'Authorization: Bearer <your api token>'
Example Response
{
"totalCount": 1,
"transactions": [
{
"id": "342671",
"cardToken": "590b5b72-223d-45f9-b840-0ad4a4f80937",
"type": "ECOM_PURCHASE",
"declineReason": null,
"createdDate": "2022-11-28T08:17:54.241236Z",
"state": "IN_PROGRESS",
"cardLastDigits": "3086",
"transactionAmount": {
"amount": 1.5,
"currency": "SGD"
},
"fees": [],
"transactionAmountWithFees": {
"amount": 1.5,
"currency": "SGD"
},
"merchant": {
"id": "332512",
"name": "Test Payment",
"location": {
"country": "France",
"city": "Rouen",
"zipCode": "00000",
"region": null,
"state": null
},
"category": {
"name": "RMiscellaneousAndSpecial",
"code": "5999",
"description": "5999 R Miscellaneous and Special"
}
},
"authorisationMethod": "MANUAL_ENTRY",
"balanceTransactionId": 2598366,
"debits": [
{
"balanceId": 52832,
"debitedAmount": {
"amount": 1.06,
"currency": "EUR"
},
"forAmount": {
"amount": 1.5,
"currency": "SGD"
},
"rate": 1.43073,
"fee": {
"amount": 0.01,
"currency": "EUR"
}
}
]
}
]
}

Get card transaction by ID

GET /v3/spend/profiles/{{profileId}}/cards/transactions/{{transactionId}}

Retrieve a card transaction by transaction id.

The possible type values are:

  • ACCOUNT_CREDIT - Receiving money on the card, excluding Visa OCT or Mastercard MoneySend
  • ACCOUNT_FUNDING - Sending money to another card or e-wallet
  • CASH_ADVANCE - Cash disbursement
  • CASH_WITHDRAWAL - ATM withdrawal
  • CHARGEBACK - Currently unused. Reserved for future use.
  • CREDIT_TRANSACTION - Visa OCT and Mastercard MoneySend
  • ECOM_PURCHASE - Online purchase
  • POS_PURCHASE - Purchase via a POS Terminal
  • REFUND - Partial or full refund of an existing card transaction

The possible state values are:

  • IN_PROGRESS - The transaction has been authorized but not captured.
  • COMPLETED - The transaction has been captured and/or settled.
  • DECLINED - The transaction has been declined.
  • CANCELLED - The transaction has been cancelled.
  • UNKNOWN - Default fallback status if the state can't be confirmed.

When a refund happens, a separate transaction will be added with a REFUND transaction type.

Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/transactions/{{transactionId}}
-H 'Authorization: Bearer {{API token}}'
Example Response
{
"id": "342671",
"cardToken": "590b5b72-223d-45f9-b840-0ad4a4f80937",
"type": "ECOM_PURCHASE",
"declineReason": null,
"createdDate": "2022-11-28T08:17:54.241236Z",
"state": "IN_PROGRESS",
"cardLastDigits": "3086",
"transactionAmount": {
"amount": 1.5,
"currency": "SGD"
},
"fees": [],
"transactionAmountWithFees": {
"amount": 1.5,
"currency": "SGD"
},
"merchant": {
"id": "332512",
"name": "Test Payment",
"location": {
"country": "France",
"city": "Rouen",
"zipCode": "00000",
"region": null,
"state": null
},
"category": {
"name": "RMiscellaneousAndSpecial",
"code": "5999",
"description": "5999 R Miscellaneous and Special"
}
},
"authorisationMethod": "MANUAL_ENTRY",
"balanceTransactionId": 2598366,
"debits": [
{
"balanceId": 52832,
"debitedAmount": {
"amount": 1.06,
"currency": "EUR"
},
"forAmount": {
"amount": 1.5,
"currency": "SGD"
},
"rate": 1.43073,
"fee": {
"amount": 0.01,
"currency": "EUR"
}
}
]
}

Update card phone number

PUT /v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/phone-number

Update phone number of a card. The new phone number must be a valid phone number.

Request Fields
phoneNumbertext

Must be a valid phone number prefixed with + and country code. An example of a valid phone number would be +6588888888.

Response

Returns a 200 response

Example Request
curl -X PUT 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/cards/{{cardToken}}/phone-number' \
--H 'Authorization: Bearer <your api token>' \
--d '{
"phoneNumber": <new phone number>
}'
Example Response
{
"token": "12345-12345-12345-12345",
"profileId": 30000000,
"phoneNumber": "+6588888888"
}

Retrieve dispute reasons

GET /v3/spend/profiles/{{profileId}}/dispute-form/reasons

Retrieves the list of possible reasons for submitting a dispute.

Response

Returns a set of dispute objects.

Example Request
curl -X GET https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/dispute-form/reasons \
-H 'Authorization: Bearer <your api token>'

Dispute dynamic flows entry point

GET /v3/spend/profiles/{{profileId}}/dispute-form/flows/{{scheme}}/{{reason}}?transactionId={{transactionId}}

Retrieves the JSON for initiating the dispute flow. The returned result can be used to generate the dispute flow UI using the Wise's open-source Dynamic Flows framework . The Dynamic Flows Framework will generate UI according to the received JSON and will handle the rest of the multi-step dispute submission including the generation of the subsequent pages (if needed) and the actual submission of the dispute and all the relevant documents.

An example of using a Dispute flow can be found here.

Request Details
schemetext

Scheme (VISA, MASTERCARD)

reasontext

One of the reasons returned by /reasons endpoint

transactionIdnumeric

ID of the transaction to dispute

Because the calls to the above endpoint are authorised they cannot be made from the Dynamic Flows JavaScript framework directly (from the browser), but instead must be proxied by the partner with the added auth headers. Therefore, a partner is expected to implement 2 additional internal endpoints:

1. Get Dynamic Form Page:

GET https://{{yourApiUrl}}/v3/spend/profiles/{{profileId}}/dispute-form/flows/step/{{scheme}}/{{reason}}?transactionId={{transactionId}}

The implementation of this endpoint is expected to redirect the call to:

POST https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/dispute-form/flows/step/{{scheme}}/{{reason}}

This implementation is also expected to add an email of the disputer and the ID of the disputed transaction. The email is added in order to allow direct communication with a person who knows the dispute details. The body of the POST request forwarded to Wise should be of the following form:

{
"email": "abc@def.com",
"transactionId": "<transaction id>"
}

2. Post Dynamic Form Results:

The final step of the dispute flow will have to submit all the collected data to Wise. However, since Authorization header is required, a partner is expected to implement the following endpoint (please note the absence of a step in the URL path):

POST https://{{yourApiUrl}}/v3/spend/profiles/{{profileId}}/dispute-form/flows/{{scheme}}/{{reason}}

The request body will be generated by Dynamic Forms. The implementation of this endpoint is expected to redirect the call to:

POST https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/dispute-form/flows/{{scheme}}/{{reason}}

The response to this last call of the dynamic flow will include x-df-exit: true HTTP header. This header is used by the JavaScript framework to add an option to exit the dynamic flow and redirect the user to a different page (or exit a WebView depending on the client's implementation). In order to intercept the last page response on the frontend onClose function should be added to JavaScript, for example:

const onClose = () => {
console.log("DF is exiting");
window.location.href = "https://www.google.com/";
};

Both endpoints are expected to proxy the requests with the added auth headers. In order to redirect the Dynamic Flows JavaScript library to your domain please use baseUrl or fetcher as part of the dynamic flows setup.

The Dynamic Form CSS styles can be overriden. An example of a Dispute flow with custom CSS can be found here.

Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/dispute-form/flows/{{scheme}}/{{reason}}?transactionId={{transactionId}}' \
-H 'Authorization: Bearer <your api token>'
Example Response
{
"key": "TROUBLE_WITH_GOODS_SERVICES",
"type": "form",
"title": "There's a problem with the goods or service I ordered",
"actions": [],
"schemas": [],
"layout": [
{
"type": "decision",
"options": [
{
"title": "I never got the goods or service I ordered",
"action": {
"url": "/v3/spend/profiles/12345/dispute-form/flows/visa/no-goods-or-services?transactionId=6789",
"method": "GET"
},
"disabled": false,
"description": "Choose this if the order was cancelled or never arrived"
},
{
"title": "Something is wrong with the goods or service I ordered",
"action": {
"url": "/v3/spend/profiles/12345/dispute-form/flows/visa/something-wrong-what-was-received?transactionId=6789",
"method": "GET"
},
"disabled": false
},
{
"title": "I think there might be an issue with the merchant",
"action": {
"url": "/v3/spend/profiles/12345/dispute-form/flows/visa/scam?transactionId=6789",
"method": "GET"
},
"disabled": false,
"description": "Choose this if you haven't heard from the merchant, or have found scam reviews"
}
]
}
]
}

Retrieve sensitive card details

The sensitive card details endpoint allows you to retrieve card data such as Primary Account Number, expiry date, CVV and PIN.

Wise is a PCI DSS compliant provider, and stores all of your Cards API data securely. The scope for PCI compliance depends on your use case and will impact how you integrate with Cards API.

Rule based authorisation

It is possible to define which card transactions will be approved or declined by adding authorisation rules. Currently the only supported rules are based on MCC (Merchant Category Code) and transaction currency. An example list of MCC can be found here: https://www.citibank.com/tts/solutions/commercial-cards/assets/docs/govt/Merchant-Category-Codes.pdf. The currencies should be specified in ISO 4217 alphabetic format, for example USD.

The rules management is done as follows:

Adding an authorization rule

A rule is an instruction to Wise that dictates which transactions should be declined or approved. Defining a rule has no practical implication until it is applied to a particular CARD/PROFILE or every card, which is achieved by applying a rule to a PARTNER.

The id of a rule is unique and will refer to this rule in any further call.

The parameters for the creation of rules are as follows:

FieldDescriptionFormat
typeAllowed Values: MCC, CURRENCYText
operationDefines whether the given values will be allowed or blocked. Allowed Values: ALLOW, BLOCKText
description [optional]Textual description of a rule, has no practical implicationText
valuesThe list of values to block or to approveArray of Text
Example Request
curl -X POST 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/authorisation' \
-H 'Authorization: Bearer {{API token}}' \
-H 'Content-Type: application/json' \
-d '{
"description": "my first test rule",
"type": "MCC",
"operation": "ALLOW",
"values": ["1234", "5678"]
}'
Example Response
{
"id": 110000000,
"description": "my first test rule",
"type": "MCC",
"operation": "ALLOW",
"values": [
"1234",
"5678"
]
}

Delete an authorization rule

Deletes an existent rule. Rule deletion is only possible if a rule does not apply to any scope. If a rule was already applied to a scope, unapply should be invoked prior to the rule deletion.

HTTP response code should be assessed to verify the success or failure of this call.

Example Request
curl -X DELETE 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/authorisation/{{ruleId}}' \
-H 'Authorization: Bearer {{API token}}' \
-H 'Content-Type: application/json'

List existing authorization rules

Lists all the defined rules. The list will include all the rules whether these were applied to a scope or not.

Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/authorisation' \
-H 'Authorization: Bearer {{API token}}'
Example Response
[
{
"id": 1,
"description": "gambling blacklisting",
"type": "MCC",
"operation": "BLOCK",
"values": [
"7801",
"7802",
"7995",
"9754"
]
}
]

Apply an authorization rule

The following endpoint applies a defined rule to a give scope (card/profile or partner). This will result in a rule being evaluated against every incoming card authorisation request for the given CARD/PROFILE/PARTNER.

HTTP response code should be assessed to verify the success or failure of this call.

The parameters for the apply endpoint are as follows:

FieldDescriptionFormat
ruleIdThe ID of a previously created ruleText
scopeDefines the scope to which a rule would apply to. Allowed Values: CARD, PROFILE, PARTNERText
scopeIdThe id of the scope defined above. It should be cardToken for CARD scope, prrofileId for PROFILE scope or clientId for PARTNER scopeText
Example Request
curl -X POST 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/apply' \
-H 'Authorization: Bearer {{API token}}' \
-H 'Content-Type: application/json' \
-d '{
"ruleId": 110000000000,
"scope: "CARD",
"scopeId": "30000000000"
}'

Unapply an authorization rule

This endpoint reverses the apply endpoint and it's invocation will result in removing a rule from a given scope.

HTTP response code should be assessed to verify the success or failure of this call.

The parameters for the unapply endpoint are as follows:

FieldDescriptionFormat
ruleIdThe ID of a previously created ruleText
scopeDefines the scope to which a rule would apply to. Allowed Values: Allowed Values: CARD, PROFILE, PARTNERText
scopeIdThe id of the scope defined above. It should be cardToken for CARD scope, prrofileId for PROFILE scope or clientId for PARTNER scopeText
Example Request
curl -X POST 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/unapply' \
-H 'Authorization: Bearer {{API token}}' \
-H 'Content-Type: application/json' \
-d '{
"ruleId": 11000000000,
"scope: "CARD",
"scopeId": "3000000000"
}'

List applied authorization rules

Returns the list of all the active authorisation rules and the scopes they have been applied to.

Example Request
curl -X GET 'https://api.sandbox.transferwise.tech/v3/spend/profiles/{{profileId}}/spend-controls/rule/applied' \
-H 'Authorization: Bearer {{API token}}'
Example Response
[
{
"ruleId": 1,
"scope": "PROFILE",
"scopeId": "12345678"
}
]