Skrill
Skrill wallet provides a secure and efficient payment solution that allows you to accept payments online via a variety of payment methods. With the Skrill wallet, you can benefit from a hassle-free payment experience, and customers can transact with confidence. Skrill wallet's key strength is its multi-currency support and its focus on user experience, which ensures that you can reach a global audience and increase sales conversion rates.
Skrill wallet is available in over 200 countries and territories worldwide, making it a truly global payment solution. Skrill wallet caters to a wide range of industries, including e-commerce, gaming and gambling, digital goods and services, travel and tourism, and more.
Features 
| Transaction Type | Payments (2-step, Withdrawals (2-Step), Verification (API Based), Refunds (API Based) |
| Supported Regions | Global |
| Supported Currency | AED, AUD, BGN, BHD, BRL, CAD, CHF, CZK, DKK, EUR, GBP, HKD, HRK, HUF, ILS, INR, ISK, JOD, JPY, KES, KWD, LTL, MAD, MXN, MYR, NOK, NZD, OMR, PEN, PHP, PLN, QAR, RON, RSD, RUB, SAR, SEK, SGD, THB, TND, TRY, TWD, USD, ZAR |
| Special Features | Remember Me functionality, Lock specific users for Payment, Verified withdrawal |
Setup Requirements
- Get onboarded with Paysafe and receive your credentials as mentioned in Before you Begin.
- Get onboarded with Skrill Wallet as a merchant – Our integrations team can help.
-
After the above steps are done, our Integrations team will coordinate with you to get the following details.
Parameter Type Requirement Description Pay to Email Email Mandatory This is your Skrill Merchant Wallet email ID where the money would debited/credited in transactions. Password AlphaNumeric Mandatory This is a specific password set up by you for API Integrations, called API/MQI password.
Note: Enure this password is not the same as your wallet login.Secret Word AlphaNumeric Conditional This is a specific secret key that is used only in case when Verification API service is required. - The final step is to finalize how you want to handle incomplete transactions, auto-settlement or auto-refund.
You can find all the details mentioned above in the Skrill Business Portal.
Payments
In payments, for Skrill wallet solution, Paysafe provides two uses cases:
- Customer is free to pay with any Skrill wallet account.
- Customer is restricted to pay with the specific Skrill wallet account which is provided by you during the setup.
Regular User
To process a payment, follow these steps:
Setup:
- Provide the Public API Key:
- Provide the following options:
- currency, amount, merchantRefNum, customer.
- paymentMethodDetails object is mandatory, but can be sent empty.
- Create a resultCallback function to capture the details of transaction.
- Optional closeCallback to know the status of payment handle before taking the next action.
Initialization of Checkout
Server-to-Server Calls:
- From the resultCallback function in result, capture the amount, paymentHandleToken and transactionType.
- If transactionType matches PAYMENT, trigger Payments API
- In the response, you will get transaction and settlement details, which can be used for reconciliation.
- The id in Payments API response should be captured as it can be used for refunds.
In case you don't trigger the Payments API call, the paymentHandleToken moves to EXPIRED from PAYABLE state in 15–20 mins, which means the customer has completed the money movement.
For such scenarios, Paysafe offers the auto-settlement and auto-refund options, which you can pre-configure.
- In auto-settlement, Paysafe will check the status of the transaction and complete the payment.
- In auto-refund, Paysafe will check the status, complete the transaction and then trigger a refund to the customer.
Payments: No User Restriction
<html>
<head>
<script src="https://api.test.paysafe.com/checkout/v2/paysafe.checkout.min.js"></script>
</head>
<body>
<button onclick="checkout()">Deposit</button>
</body>
<script>
function checkout() {
var API_key = "c3V0LTM0ODg2MDpCLXFhMi0wLTVkM2VjYjMwLTEtMzAyYzAyMTQyYTM3NjgxMmE2YzJhYzRlNmQxMjI4NTYwNGMwNDAwNGU2NWI1YzI4MDIxNDU1N2EyNGFiNTcxZTJhOWU2MDVlNWQzMjk3MjZjMmIzZWNjNjJkNWY=";
options = {
currency: "USD",
amount: 540,
merchantRefNum: "162938285366512",
customer: {
firstName: "Kumar",
lastName: "Priyanshu",
email: "priyanshukumar.0309@gmail.com",
},
paymentMethodDetails: {},
};
paysafe.checkout.setup(
API_key,
options,
function resultCallback(instance, error, result) {
if (result && result.paymentHandleToken) {
instance.showSuccessScreen( "Your goods are now purchased. Expect them to be delivered in next 5 business days.");
if (instance.isOpen()) {
instance.close();
}
// make AJAX call to Payments API
} else {
console.error(error); // Handle the error
instance.showFailureScreen( "The payment was declined. Please, try again with the same or another payment method.");
}
},
function(stage, expired) {
if (stage) {
switch (stage) {
case "PAYMENT_HANDLE_NOT_CREATED" :
case "PAYMENT_HANDLE_CREATED" :
case "PAYMENT_HANDLE_REDIRECT" :
case "PAYMENT_HANDLE_PAYABLE" :
default:
}
}
else {
console.log(expired) //Add action in case Checkout is expired
}
}
);
}
</script>
</html>
Locked User Email
To process a payment, follow these steps:
Setup:
- Provide the Public API Key:
- Provide these options:
- currency, amount, merchantRefNum, customer
- paymentMethodDetails object is mandatory it should contain skrill object with consumerId which is the email of the user that needs to be locked for transaction.
- Create a resultCallback function to capture the details of transaction.
- Optional closeCallback to know the status of payment handle before taking the next action.
Initialization of Skrill Checkout
Server-to-Server Calls:
- From the resultCallback function in the result, capture the amount, paymentHandleToken and transactionType.
- If transactionType matches PAYMENT, trigger Payments API.
- In the response, you will get transaction and settlement details, which can be used for reconciliation.
- The id in Payments API response should be captured as it can be used for refunds.
In case you don't trigger the Payments API call for any reason, the paymentHandleToken moves to EXPIRED from PAYABLE state in 15–20 mins, which means the customer has completed the money movement.
For such scenarios, Paysafe offers the auto-settlement and auto-refund options, which you can pre-configure.
- In auto-settlement, Paysafe will check the status of the transaction and complete the payment.
- In auto-refund, Paysafe will check the status, complete the transaction and then trigger a refund to the customer.
Payments : User Email Locked
<html>
<head>
<script src="https://api.test.paysafe.com/checkout/v2/paysafe.checkout.min.js"></script>
</head>
<body>
<button onclick="checkout()">Deposit</button>
</body>
<script>
function checkout() {
var API_key = "c3V0LTM0ODg2MDpCLXFhMi0wLTVkM2VjYjMwLTEtMzAyYzAyMTQyYTM3NjgxMmE2YzJhYzRlNmQxMjI4NTYwNGMwNDAwNGU2NWI1YzI4MDIxNDU1N2EyNGFiNTcxZTJhOWU2MDVlNWQzMjk3MjZjMmIzZWNjNjJkNWY=";
options = {
currency: "USD",
amount: 540,
merchantRefNum: "162938285366512",
customer: {
firstName: "Kumar",
lastName: "Priyanshu",
email: "priyanshukumar.0309@gmail.com",
},
paymentMethodDetails: {
skrill : {
consumerId:"darkknight-team@paysafe.com"
}
}
};
paysafe.checkout.setup(
API_key,
options,
function resultCallback(instance, error, result) {
if (result && result.paymentHandleToken) {
instance.showSuccessScreen( "Your goods are now purchased. Expect them to be delivered in next 5 business days.");
if (instance.isOpen()) {
instance.close();
}
//Check PaymentHandle Stage to initiate next step
} else {
console.error(error); // Handle the error
instance.showFailureScreen( "The payment was declined. Please, try again with the same or another payment method.");
}
},
function(stage, expired) {
if (stage) {
switch (stage) {
case "PAYMENT_HANDLE_NOT_CREATED" :
case "PAYMENT_HANDLE_CREATED" :
case "PAYMENT_HANDLE_REDIRECT" :
case "PAYMENT_HANDLE_PAYABLE" :
default:
}
}
else {
console.log(expired) //Add action in case Checkout is expired
}
}
);
}
</script>
</html>
Withdrawal
For withdrawals, the customer email needs to be locked always to ensure secure payouts.
To process a Withdrawal/Standalone Credit, follow these steps:
Setup:
- Provide the Public API key.
- Provide these options:
- currency, amount, merchantRefNum, customer.
- paymentMethodDetails object is mandatory it should contain skrill object with consumerId, which is the email of the user, emailSubject and emailMessage.
- Create a resultCallback function to capture the details of transaction.
- Optional closeCallback to know the status of payment handle before taking the next action
Initialization of Checkout:
Server-to-Server Calls :
- From the resultCallback function in result capture the amount, paymentHandle and transactionType.
- if transactionType matches STANDALONE_CREDIT, trigger Standalone Credits API.
- In the response, you will get transaction and settlement details which can be used for reconciliation.
Withdrawal: User Email Locked
<html>
<head>
<script src="https://api.test.paysafe.com/checkout/v2/paysafe.checkout.min.js"></script>
</head>
<body>
<button onclick="checkout()"> Withdrawal </button>
</body>
<script>
function checkout() {
var API_key = "cTYwNGMwNDAw";
options = {
currency: "USD",
amount: 540,
merchantRefNum: "162938285366512",
payout:true,
customer: {
firstName: "Kumar",
lastName: "Priyanshu",
email: "priyanshukumar.0309@gmail.com",
},
paymentMethodDetails: {
skrill : {
consumerId:"darkknight-team@paysafe.com",
emailSubject: "Payout for Kumar Priyanshu from Gaming ",
emailMessage: "Note for email here"
}
}
};
paysafe.checkout.setup(
API_key,
options,
function resultCallback(instance, error, result) {
if (result && result.paymentHandleToken) {
instance.showSuccessScreen( "Your goods are now purchased. Expect them to be delivered in next 5 business days.");
if (instance.isOpen()) {
instance.close();
}
//Check PaymentHandle Stage to initiate next step
} else {
console.error(error); // Handle the error
instance.showFailureScreen( "The payment was declined. Please, try again with the same or another payment method.");
}
},
function(stage, expired) {
if (stage) {
switch (stage) {
case "PAYMENT_HANDLE_NOT_CREATED" :
case "PAYMENT_HANDLE_CREATED" :
case "PAYMENT_HANDLE_REDIRECT" :
case "PAYMENT_HANDLE_PAYABLE" :
default:
}
}
else {
console.log(expired) //Add action in case Checkout is expired
}
}
);
}
</script>
</html>
Refunds
To process a refund transaction using a Skrill Payment, follow these steps:
A refund transaction can only be initiated by you for a transaction whose Settlement/Payment is completed.
Partial Refunds are also available.
- After the payment and then settlement is done, the status changes to COMPLETED in the response of payments information. The refund can be initiated using the Settlement ID which is the same as the Payment ID if settleWithAuth is TRUE.
- Create a refund request with the Refunds API.
- POST: /paymenthub/v1/settlements/{settlementId }/refunds
- The response will contain the details of the payment done and a unique identifier that could be used to refer to each individual refund, either partial or full.
- The status of the refund will initially be in the PENDING state and will move to COMPLETED once the refund is processed to the customer's Skrill Wallet Account, at each step a webhook will be triggered to you.
- The gatewayResponse.id can be used for reconciliation purpose with Skrill system in case of discrepancies.
Verification 
This is a standalone API service that allows you to validate if the customer is registered at Skrill's end and the details provided match or not.
For more details, read the Skrill Verification.
Code Examples
API Calls
Payments API
Payments API Request
{
"amount": 540,
"merchantRefNum": "ce9245a8-17c4-46bd-ae2b-3932f0e14d51",
"currencyCode": "USD",
"paymentHandleToken":"PHYkLq3iI6YZ2PWU"
}
Payments API Response
{
"id": "98315317-0276-4636-a552-e475e34a4897",
"paymentType": "SKRILL",
"paymentHandleToken": "PHYkLq3iI6YZ2PWU",
"merchantRefNum": "ce9245a8-17c4-46bd-ae2b-3932f0e14d51",
"currencyCode": "USD",
"settleWithAuth": true,
"dupCheck": true,
"txnTime": "2023-07-28T13:58:28Z",
"customerIp": "115.114.129.142",
"status": "COMPLETED",
"gatewayReconciliationId": "d087c81f-b438-4a4e-934a-77d9a6c457de",
"amount": 540,
"availableToRefund": 540,
"consumerIp": "115.114.129.142",
"liveMode": false,
"simulator": "EXTERNAL",
"updatedTime": "2023-07-28T14:02:40Z",
"statusTime": "2023-07-28T14:02:40Z",
"gatewayResponse": {
"transaction_id": "d087c81f-b438-4a4e-934a-77d9a6c457de",
"amount": "5.40",
"mb_transaction_id": "4921450195",
"pay_from_email": "darkknight-team@paysafe.com",
"pay_to_email": "paysafe-unity@outlook.com",
"currency": "USD",
"merchant_id": "139129672",
"id": "4921450195",
"processor": "SKRILL_QCO",
"status": "2",
"sid": "c6baa2526c63a062089fee27725ae068"
},
"availableToSettle": 0,
"profile": {
"firstName": "Kumar",
"lastName": "Priyanshu",
"email": "priyanshukumar.0309@gmail.com"
},
"settlements": {
"amount": 540,
"txnTime": "2023-07-28T13:58:28.000+0000",
"availableToRefund": 540,
"merchantRefNum": "ce9245a8-17c4-46bd-ae2b-3932f0e14d51",
"id": "98315317-0276-4636-a552-e475e34a4897",
"status": "COMPLETED"
}
}
Standalone Credits API Request
{
"amount": 540,
"merchantRefNum": "ce9245a8-17c4-46bd-ae2b-3932f0e14d51",
"currencyCode": "USD",
"paymentHandleToken":"PHYkLq3iI6YZ2PWU"
}
Standalone Credits API Response
{
"id": "7f2ac605-4833-46f3-83f7-278110fc165f",
"paymentType": "SKRILL",
"paymentHandleToken": "PHYkLq3iI6YZ2PWU",
"merchantRefNum": "ce9245a8-17c4-46bd-ae2b-3932f0e14d51",
"currencyCode": "USD",
"txnTime": "2023-07-27T12:02:24Z",
"billingDetails": {
"street1": "100 Queen",
"street2": "Unit 201",
"city": "Melbourne",
"zip": "3000",
"country": "NL"
},
"customerIp": "172.0.0.1",
"status": "COMPLETED",
"gatewayReconciliationId": "AQAAAATRMA",
"amount": 540,
"liveMode": false,
"simulator": "EXTERNAL",
"updatedTime": "2023-07-24T12:02:24Z",
"statusTime": "2023-07-24T12:02:24Z",
"gatewayResponse": {
"status_msg": "processed",
"id": "-1461309521",
"processor": "SKRILL_QCO",
"sid": "55bfdaaaddc94233bba7f649ec322480",
"status": "2"
},
"skrill": {
"consumerId": "darkknight-team@paysafe.com",
"emailSubject": "Payout for Kumar Priyanshu from Gaming X ",
"emailMessage": "Note for email here"
}
}
Refunds API Request
{
"merchantRefNum": "ead5981f-ba7f-42d0-809f-f67948d58c09",
"amount": 140
}
Refunds API Response
{
"id": "7b85013a-f093-4944-a494-f18e87644566",
"paymentType": "SKRILL",
"merchantRefNum": "0af48e6a-fc71-4768-9090-282238f15cb5",
"currencyCode": "USD",
"txnTime": "2023-07-28T14:11:09Z",
"status": "COMPLETED",
"gatewayReconciliationId": "4921472201",
"amount": 140,
"updatedTime": "2023-07-28T14:11:09Z",
"statusTime": "2023-07-28T14:11:09Z",
"liveMode": false,
"simulator": "EXTERNAL",
"gatewayResponse": {
"id": "4921472201",
"status": "2",
"merchant_id": "139129672",
"processor": "SKRILL_QCO"
},
"source": "CheckoutV2"
}
Webhooks
Payment Handles
| No | Event | Description |
|---|---|---|
| 1 | PAYMENT_HANDLE_PAYABLE | This webhook signifies that the Payment Handle token created for the required purpose can now be executed, and the preliminary requirements are completed, the next API call with the payment handle can be done. |
| 2 | PAYMENT_HANDLE_PROCESSING | This webhook is triggered when the customer is successfully redirected to the payment platform page and operation has started for the payment by the customer. |
| 3 | PAYMENT_HANDLE_COMPLETED | This webhook is triggered when the process of the payment handle is token is completed after triggering the next API, Payments or Standalone Credit API. |
| 4 | PAYMENT_HANDLE_EXPIRED | This webhook is triggered when the next step is not initiated after the payment handle is created within the given time frame, the duration can be seen in the response to/paymenthub/v1/paymenthandles API under the tag timeToLiveSeconds. |
| 5 | PAYMENT_HANDLE_FAILED | This webhook is triggered when the event or transaction is failed at VIP Preferred end |
| 6 | PAYMENT_HANDLE_ERRORED | This webhook is triggered when SSN is missing in the request |
Payments
| No. | Event | Description |
|---|---|---|
| 1 | PAYMENT_PROCESSING | The payment is in progress. In some cases, there might be delays due to an action pending by the customer or you. |
| 2 | PAYMENT_PENDING | The payment is pending because the transaction hasn't been completed from the Bank Account to Skrill Wallet to Merchant. |
| 3 | PAYMENT_COMPLETED/SETTLEMENT_COMPLETED | The payment was completed successfully. |
| 4 | PAYMENT_FAILED | This webhook is triggered when the payment fails during the process. |
| 5 | PAYMENT_RECEIVED | Our system has received the payment request and is waiting for the downstream processor’s response. |
| 6 | PAYMENT_COMPLETED | The payment request is completed. |
Withdrawals/Standalone Credits
| No. | Event | Description |
|---|---|---|
| 1 | SA_CREDIT_PROCESSING | The credit request is being processed. |
| 2 | SA_CREDIT_RECEIVED | Our system has received the credit request and is waiting for the downstream processor’s response. |
| 3 | SA_CREDIT_COMPLETED | The credit request is completed. |
| 4 | SA_CREDIT_FAILED | This webhook is triggered in case the transaction was initially completed and later failed due to some settlement error. |
| 5 | SA_CREDIT_HELD | The credit request is placed on hold due to risk considerations. |
| 6 | SA_CREDIT_CANCELLED | This webhook is triggered when the transaction was cancelled after it was completed |
| 7 | SA_CREDIT_ERRORED | This webhook is used when there is a technical error during the initiation of a transaction. |
| 8 | SA_CREDIT_PENDING | This webhook is triggered when the withdrawal has been initiated but due to various bank delay reasons or time zone issues the actual money transfer has not happened. |
Refunds
| S.no | Event | Description |
|---|---|---|
| 1 | REFUND_FAILED | This webhook is triggered when the refund is initiated but failed due to a functional error for e.g. Refund amount is more than the payment amount. |
| 2 | REFUND_COMPLETED | This webhook is triggered when the refund has been successfully transferred from the merchant account to the user's chosen bank account. |
| 3 | REFUND_PENDING | This webhook is triggered when refund has been initiated but due to various bank delay reasons or time zone issues the actual money transfer has not happened. |