Skip to main content

Send Money

You can send money using the Skrill Automated Payments Interface (API). This offers the same functionality that is available on My Account, but it allows you to automate the sending of payment details from your servers to Skrill using an HTTPS request to the following URL:

https://www.skrill.com/app/pay.pl

The process consists of two steps:

  • Sending a transfer preparation request to initiate a session which lasts 15 minutes
  • Executing the transfer within the session

After each step Skrill returns an XML response that contains the result of the performed action. See the example below.

Send money

Using a multi-currency account, Skrill automatically debits the account matching the currency of the send money request. If the currency specified in the request is not supported by your merchant account, the primary currency account will be debited.

Executing a Transfer Preparation Request

Request

You must include the parameters described below in your HTTPS request.

ParameterDescriptionRequiredExample Value
actionThe required action. In the first step, this is prepare.Yesprepare
emailYour merchant account email address.Yesinfo@merchant.com
passwordYour MD5 API/MQI password.Yes9f535b6ae672f627e4a5f79f2b7c63fe
amountAmount to be transferred.Yes10.95
currencyCurrency. For a list of currencies accepted by Skrill, see Currencies section.YesEUR
bnf_emailRecipient's (beneficiary's) email address.Yescustomer@host.com
subjectSubject of the notification email. Up to 250 1-byte characters.NoYour order is ready
noteComment to be included in the notification email. Up to 2000 1-byte characters.NoDetails are available on our website.
frn_trn_idYour reference ID (must be unique if submitted).NoA1234
account_idYour currency account ID. For more information, see Separating balances by fund origin.No1234567

Response

Skrill returns an XML response to your request, which contains a <response> element containing one of the following elements:

  • <sid> element - returned if the authorisation and payment preparation is successful. The Session ID must be submitted in your transfer execution request.
  • <error> element – included if an error occurs. It includes an <error_msg> element, which contains the error message description.

Example 1: Successful Preparation Request

Request:

curl --location 'https://www.skrill.com/app/pay.pl' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'action=prepare' \
--data-urlencode 'email=merchant@host.com' \
--data-urlencode 'password=6b4c1ba48880bcd3341dbaeb68b2647f' \
--data-urlencode 'amount=1.2' \
--data-urlencode 'currency=EUR' \
--data-urlencode 'bnf_email=beneficiary@domain.com' \
--data-urlencode 'subject=some_subject' \
--data-urlencode 'note=some_note' \
--data-urlencode 'frn_trn_id=111'

Response:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<sid>5e281d1376d92ba789ca7f0583e045d4</sid>
</response>

Example 2: Failed Preparation Request

This example shows a request that failed, due to a missing amount parameter.

Request:

curl --location 'https://www.skrill.com/app/pay.pl?action=prepare&email=merchant%40host.com&password=6b4c1ba48880bcd3341dbaeb68b2647f&currency=EUR&bnf_email=beneficiary%40domain.com&subject=some_subject&note=some_note&frn_trn_id=111'

Response:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<error>
<error_msg>MISSING_AMOUNT</error_msg>
</error>
</response>

Example 3: Failed with Error LOCK_LEVEL_9

This example shows a request that failed because a Skrill Wallet merchant account with 1-Tap enabled is locked following more than three failed login attempts.

curl --location 'https://www.skrill.com/app/pay.pl' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'action=prepare' \
--data-urlencode 'email=merchant@host.com' \
--data-urlencode 'password=6b4c1ba48880bcd3341dbaeb68b2647f' \
--data-urlencode 'currency=EUR' \
--data-urlencode 'bnf_email=beneficiary@domain.com' \
--data-urlencode 'subject=some_subject' \
--data-urlencode 'note=some_note' \
--data-urlencode 'frn_trn_id=111'

Response:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<error>
<error_msg>LOCK_LEVEL_9</error_msg>
</error>
</response>

To clear the error, reset the password for the merchant account; and then reconfigure your API/MQI password, which is the MD5 hash of your merchant password, before making any further prepare requests.

note

In some situations you will not be able to reset the password, in which case you should contact merchantservices@skrill.com.

Executing a Transfer Request

Request

Your web servers should include the Session ID provided in the XML response from Skrill in the transfer execution request, as described below.

ParameterDescriptionRequired?Example Value
actionThe required action. In the second step, this is transfer.Yestransfer
sidSession identifier returned in response to the prepare request.Yes5e281d1376d92ba789ca7f0583e045d4

Response

The correct XML response contains a <response> element that includes the following elements:

  • <transaction> element – returned if the transfer is successful; the response includes the elements described in yhe table below.
  • <error> element – returned if an error occurs, which includes an <error_msg> element, which provides details of the error.
FieldDescription
AmountAmount paid in the currency of your Skrill account.
CurrencyCurrency of your Skrill account.
IdTransaction ID.
StatusNumeric value of the transaction status:
1 – scheduled (if beneficiary is not yet registered at Skrill)
2 - processed (if beneficiary is registered)
status_msgText value of the transaction status.

Example: Successful Transfer Request

Request:

curl --location 'https://www.skrill.com/app/pay.pl' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'action=transfer' \
--data-urlencode 'sid=5e281d1376d92ba789ca7f0583e045d4'

Response:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<transaction>
<amount>1.20</amount>
<currency>EUR</currency>
<id>497029</id>
<status>2</status>
<status_msg>processed</status_msg>
</transaction>
</response>

Error Categories

Transfer Preparation Request Errors

Error CodeDescription
INVALID_OR_MISSING_ACTIONInvalid action or no action is provided
INVALID_*Invalid parameter, * = name of parameter
MISSING_*Missing parameter, * = name of parameter
LOGIN_INVALIDEmail address and/or password were not provided
CANNOT_LOGINEmail address and/or API/MQI password are incorrect
NOT_SUPPORTED_CURRENCY_*The specified currency is not supported
PAYMENT_DENIEDCheck in your account profile that the API is enabled and you are posting from the allowed IP
NO_LOGIN_EXPLANATIONMerchant using non-existent email address

Transfer Request Errors

Error CodeDescription
ALREADY_EXECUTEDDuplicate frn_trn_id value submitted for transfer when uniqueness is required
DISALLOWED_CROSS_REGION_PAYMENTThe account_id you have provided does not match the region of the recipient
BALANCE_NOT_ENOUGHThe customer's account balance is insufficient
SINGLE_TRN_LIMIT_VIOLATEDMaximum amount per transaction = EUR 10,000
GAMING_RESTRICTED_MONEY_APITransfers to this recipient type are restricted for regulatory reasons
CUSTOMER_TYPES_MISMATCH_N_TSending funds between Test and Normal accounts is not permitted
CANNOT_SEND_MONEY_YOURSELFNot permitted to send money to your own account
SESSION_EXPIREDSession expired
MERCHANT_CLASS_RESTRICTED_TO_SEND_MONEY_TO_INC_RECIPIENTNot permitted to send funds to an INC recipient account

Reposting a Transfer Request

If there is a communication error during the transfer, you must resend the transfer request within 15 minutes of the previous request, before the session expires.

note

The Skrill server executes only one transaction per session, so the request cannot be duplicated.

The outcome of reposting a transfer request depends on the transfer execution status:

  • If the transaction has already been executed within this session you will need to generate a new Session ID, since only one transaction is allowed per session.
  • If the transaction associated with this session is still being executed, Skrill responds with status EXECUTION_PENDING. In this case you do not need to generate a new session ID and can wait for the response.