API Documentation
SOFORT Paycode
1. Introduction to SOFORT Paycode
The SOFORT Paycode function allows you to generate a 10 digit code which the customer can use to make a payment by SOFORT at a later point of time within the period of validity.
A SOFORT transaction with a paycode consists of the following steps:
- Generate a paycode. You can either generate a paycode in your merchant menu of SOFORT or via the HTTP-XML interface. (See Section 2: Item Paycode in the merchant menu of SOFORT or Section 3: Paycode generation via HTTP-XML interface)
- Share paycode with your customer.
- Your customer can enter the paycode at https://www.sofort.com/paycode/ to carry out the payment.
- Depending on the project configuration, you will either receive a notification or you can see in the merchant menu that the transfer has been listed in your customer's online banking.
2. Integration steps
The following steps are basically required to integrate SOFORT Banking Paycode in your system. A detailed description of the individual steps is provided subsequently:
- Register as a merchant on our website https://sofort.com/register.
- Activate the product "SOFORT Banking Paycode“ (at "My account" → "Product activation")
- Create a new SOFORT Gateway Project.
- Configure your SOFORT Banking Paycode project; select "SOFORT Banking Paycode" as a payment method.
- After you have created and configured the new project, you will receive an API key (which can be found in the left menu at "Additional services" → "API key".
- If you want to automatically generate paycode via the SOFORT interface and to automatically process the notifications on a successful transaction in your shop, the next step is the integration in your shop:
- Integrate the generation of paycodes in your shop
- Define or create a success/abort page to which your customer will be redirected after a successful/failed SOFORT Banking transaction.
- Configure your shop to receive notifications and initiate status detail requests.
Important general information
- The used standard coding for all parameters is UTF-8.
- The reasons for "SOFORT Banking" are adjusted by SOFORT in certain cases. Adjustments refer to the parameters <reason> that are subelements of the container <reasons>. Text containing "sofortbanking", "sofort-banking", "Payment Network AG", "directebanking" and combinations thereof e.g. hyphenated "direct-ebanking" (upper and lower case is not significant) will be deleted from the field reason. The domains sofortüberweisung.de, sofortueberweisung.de, sofort-überweisung.de, sofort-ueberweisung.de, directebanking.com and direct-ebanking.com will also be removed.
- In case line 1 of the field reason is empty after deleting, it will be filled with the contents of line 2. In case both lines are empty, the recipient's name will be written in line 1.
3. Menu item Paycode in the SOFORT merchant menu
3.1. Paycode generation
Paycodes can be easily generated in the SOFORT merchant menu.
- To generate a paycode in your merchant menu, log in with your user data at https://www.sofort.com/payment/users/login.
- Go to "My projects" (left navigation) and select a project to generate paycodes for. Then open the "Paycodes" tab.
- You can determine the desired criteria for your paycode here. The following settings are possible:
Project
Choose the project which you want to use for this paycode.
Validity
Expiration date - Enter the start and expiration date of your paycode here. If the paycode used by the customer has expired, an error message will appear.
Number of uses (needs to be activated by SOFORT)
Enter the number of times a paycode can be used
Payment data
Amount - Enter the desired amount.
Currency - Select the desired currency.
Reason - Enter the desired reason. Please pay attention to the details given in the Section "Integration steps: Important general information".
Settings
Success link - This link redirects your customer back to your shop after a successful transaction.
Abort link - This link redirects your customer back to your shop after a failed transaction (cancelled by customer or SOFORT not possible).
Customer variables
You can transfer own variables to be used e.g. for internal allocation. Detailed information on customer variables can be found in our SOFORT manual.
Generate paycode
Finally, you press the button "Generate paycode" at the bottom of the page. The code will be displayed at the top of the page including the URL to enter the paycode. - Send the paycode to your customer together with the URL https://www.sofort.com/paycode/. Additionally, you can send the paycode by email or sms via the SOFORT merchant menu (additional costs apply for text messages).
- Depending on the project configuration, you will either receive a notification (see tab "Extended settings" → "Notifications") or you can see in the merchant menu that the payment has been made by the customer.
3.2. Additional functions in the paycode menu
In the merchant menu, you can also get an overview of the paycodes generated to date.
Go to "Transactions for" in the menu and click "SOFORT Paycode". You will receive a list of paycodes that have been generated so far and the corresponding (SOFORT) transactions initiated by a paycode. This list can be further filtered by the search function.
Furthermore, you have the possibility to display details on a specific paycode.
4. Paycode generation via the HTTP-XML interface (API)
Apart from generating paycodes in the merchant menu, you can also generate paycodes via the HTTP-XML interface (API) to integrate the transmitted value (paycode) directly in your system.
4.1. Communication with the SOFORT Paycode interface
Our interface (API) can be called from your shop by a HTTP POST with attached XML parameters. The responses for calls of our interface are formatted in XML as well.
Direct communication with our interface via XML-HTTP messages always follows the same pattern:
- (API step 1) Initial API call and transaction parameter transfer
- (API step 2) API response with generated paycode and payment URL
- (Customer action) Redirection of received paycode and listing of transfer
- (API step 3) Transaction status change notification (if configured)
- (API step 4) Transaction data request
- (API step 5) Response to transaction data request
In addition, the API provides another possibility to request the status of a previously generated paycode:
- (API step SR-1) Paycode status call
- (API step SR-2) Response to paycode status call
To change an already existing Paycode we provide the following API:
- (API step M-1) API call to change a paycode
- (API step M-2) API response of a changed paycode
In order to deactivate paycodes and reactivate them later on, the followin API is provided:
- (API step DA-1) API call to deactivate a paycode
- (API step DA-2) API response with deactivation confirmation
- (API step RA-1) API call to reactivate a paycode
- (API step RA-2) API response with reactivation confirmation
4.2. Initial API call and transaction parameter transfer (API step 1)
4.2.1. API call and authentication
To prevent abuse of the interface, authentication must be performed for every interface call, using your customer number as user name and the API key as password. The API key is provided in the merchant menu at Additional services → API key. Please note the following before using the interface:
- You have to call the correct URL using HTTPS as a protocol.
- You have to transfer the correct authentication information. For authentication, the basic HTTP authentication (RFC 2617) is used.
- You have to enter the correct content type headers.
- Your data must be correctly formatted in XML (RFC 3023, see parameter description) and sent by HTTP POST.
The interface is called via the following URL:
https://api.sofort.com/api/xml
4.2.2. Transfer of transaction data
Various parameters must be transferred to our API for the call. Some parameters are mandatory, some are optional. Details on the use of the individual parameters are listed in the overview of parameters. An example of a call for the generation of a SOFORT paycode formatted in XML might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <paycode> <project_id>53245</project_id> <interface_version>pn_test_1</interface_version> <start_date>2014-01-01T00:00:00+01:00</start_date> <end_date>2015-05-01T01:12:59+02:00</end_date> <amount>2.20</amount> <currency_code>EUR</currency_code> <max_usage>2</max_usage> <sender> <bank_code>00000</bank_code> <bic>SFRTDE20XXX</bic> <country_code>DE</country_code> </sender> <reasons> <reason>Reason Line 1 üäöß</reason> <reason>Reason Line 2</reason> </reasons> <success_url>https://www.example.com/success.php?trx=-TRANSACTION-</success_url> <success_link_redirect>0</success_link_redirect> <abort_url>https://www.example.com/abort.php</abort_url> <notification_urls> <notification_url>https://www.example.com/notify.php</notification_url> </notification_urls> <notification_emails> <notification_email>notify@example.com</notification_email> </notification_emails> <user_variables> <user_variable>Test123</user_variable> </user_variables> <intervals> <interval> <from_date>2014-10-01</from_date> <amount>3.30</amount> <reasons> <reason>Reason Line 1üöäß</reason> <reason>Reason Line 2 - interval2</reason> </reasons> </interval> <interval> <from_date>2014-02-01</from_date> <amount>4.40</amount> <reasons> <reason>Reason Line 1üöäß</reason> <reason>Reason Line 2 - interval3</reason> </reasons> </interval> </intervals> </paycode>
With the transfer of several validity intervals within <intervals> you can define timeframes in which specified amounts and reasons hold. Therefore, the <interval> sections define the date when an interval begins (<from_date>) and which values hold for that interval. Thus, it is possible to handle e.g. early bird discounts or discounts on invoices with the paycode. For the paycode that results from the above mentioned request the following validity intervals would hold:
Paycode start - 2014-01-01 00:00:00
Amount: | 2.20 |
Reason: | Customer ID 100256 |
Paycode Int 0 |
Interval 1 - 2014-10-01 00:01:00
Amount: | 3.30 |
Reason: | Customer ID 100256 |
Paycode Int 1 |
Interval 2 - 2015-02-01 00:01:00
Amount: | 4.40 |
Reason: | Customer ID 100256 |
Paycode Int 2 |
Paycode end - 2015-05-01 01:12:59
Note: In contrast to the start and end date of a paycode the validity interval begins with a new day at 00:01:00. Either the time zone MEZ (UTC+1) or MESZ (UTC+2) are assumed (depending of the season).
4.3. API response with generated paycode and payment URL (API step 2)
If the API call was correct, the API response will include the generated paycode and the URL to directly open the paycode wizard at SOFORT. Details on the use of the individual parameters are listed in the overview of parameters.
An example of the interface response formatted in XML might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <new_paycode> <paycode>6c9d197ddb</paycode> <paycode_url>https://www.sofort.com/paycode/6c9d197ddb</paycode_url> </new_paycode>
4.4. Redirection of received paycode and listing of transfer (customer action)
Send the generated paycode (tag content <paycode>) and the URL https://www.sofort.com/paycode/ to your customer. When calling the URL, your customer will be requested to enter the paycode. Then, your customer will be guided through SOFORT. Alternatively, you can redirect your customer to the generated direct link to the payment wizard (tag content <paycode_url>), e.g. in an email on the payment request.
After successful execution of SOFORT paycode, your customer will be redirected to the success link stored with the project or transferred with the call (API step 1). Ideally, the order will be confirmed in a final summary including the successful execution of SOFORT in the customer's online banking. In the background, your shop system should meanwhile have received a confirmation of the transaction (see API steps 3, 4, and 5) and stored the order with the corresponding status. If no success link has been stored with the project and no success link was transferred in the initial API call (API step 7), your customer will only see a summary of the listed transfer.
In case SOFORT has not been carried out successfully, your customer will be redirected to the abort link.
4.5. Transaction status change notification (if configured) (API step 3)
After successful execution of SOFORT, you will be notified of the executed transaction while the customer is redirected to the success page. This is done by calling the notification URL or by sending an email. You can store the URL with the project or already transfer it when initially calling the API (API step 1). This notification includes the transaction ID of the transaction whose status changed. If no URL/email address has been stored with the project or transferred with the API call, no notification will be given.
An example of an interface notification formatted in XML might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <status_notification> <transaction>99999-53245-5483-4891</transaction> <time>2013-04-02T14:19:08+01:00</time> </status_notification>
You will receive a notification of every transaction status change. Please initiate a transaction data request (see API step 4) to learn the reason for the status change (see API step 4).
The IP address which is used to send out the notification can be found under: https://www.sofort.com/payment/status/ipList.
4.6. Transaction data request (API step 4)
You should respond to a notification by requesting transaction data. You may either request transaction data on specified transaction IDs or all transaction data of transactions carried out in a specified time.
Two examples of transaction data requests formatted in XML might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <transaction_request version="2"> <transaction>99999-53245-5483-4891</transaction> <transaction>99999-53245-5741-1896</transaction> </transaction_request>
or:
<?xml version="1.0" encoding="UTF-8" ?> <transaction_request version="2"> <from_time>2013-04-01</from_time> <to_time>2013-04-30</to_time> <product>paycode</product> <number>10</number> <page>2</page> </transaction_request>
4.7. Response to transaction data request (API step 5)
Any data available on requested transactions will be transmitted. The parameters and their descriptions which might be included in a response are listed in the overview of parameters. If no transactions match the assigned search parameters of API-step 4 the response contains only an empty <transactions/> tag.
<?xml version="1.0" encoding="UTF-8" ?> <transactions> <transaction_details> <project_id>53245</project_id> <transaction>99999-53245-5483-4891</transaction> <test>1</test> <time>2013-04-02T14:19:08+01:00</time> <status>pending</status> <status_reason>not_credited_yet</status_reason> <status_modified>2013-04-02T14:19:08+01:00</status_modified> <payment_method>paycode</payment_method> <language_code>de</language_code> <amount>2.20</amount> <amount_refunded>0.00</amount_refunded> <currency_code>EUR</currency_code> <reasons> <reason>Reason Line 1 ueaeoess</reason> <reason>Reason Line 2</reason> </reasons> <user_variables> <user_variable>Test123</user_variable> </user_variables> <sender> <holder>Max Mustermann</holder> <account_number>23456789</account_number> <bank_code>00000</bank_code> <bank_name>Demo Bank</bank_name> <bic>SFRTDE20XXX</bic> <iban>DE06000000000023456789</iban> <country_code>DE</country_code> </sender> <email_customer/> <phone_customer/> <exchange_rate>1.0000</exchange_rate> <recipient> <holder>Max Mustermann</holder> <account_number>123456789</account_number> <bank_code>70011110</bank_code> <bank_name>Deutsche Handelsbank</bank_name> <bic>DEKTDE7GXXX</bic> <iban>DE0370011110123456789</iban> <country_code>DE</country_code> </recipient> <costs> <fees>0.00</fees> <currency_code>EUR</currency_code> <exchange_rate>1.0000</exchange_rate> </costs> <paycode> <code>6c9d197ddb</code> </paycode> <status_history_items> <status_history_item> <status>pending</status> <status_reason>not_credited_yet</status_reason> <time>2013-04-02T14:19:08+01:00</time> </status_history_item> </status_history_items> </transaction_details> </transactions>
Status messages
The response of the transaction data includes the notification of the current status of the requested transaction(s).
A transaction will not be created with SOFORT until the online banking details have been successfully entered and the customer's bank has confirmed and listed the transfer in the customer's online banking. If this has not yet taken place (for example when the payment process is still on-going or the payment could not be made by SOFORT), you will receive a response with an empty <transactions /> tag when requesting transaction data on a transferred transaction ID. The final failure of a transaction cannot be established before the period of validity has expired (<timeout> from API step 1).
After successful execution of SOFORT, a distinction must be made whether you have set up an account with Deutsche Handelsbank as a recipient account or not. In the first case, SOFORT can immediately confirm the receipt of the money on your account and notify you if the money has not been received within a certain period of time. In the second case, if you have not set up an account with Deutsche Handelsbank as a recipient account, the status "untraceable" will be displayed after successful execution of SOFORT.
Detailed information on possible statuses and their descriptions can be found in the Appendix.
4.8. Error messages
HTTP error messages (for example 401 (-> unauthorised, HTTP authentication via customer number, API key failed), 404, ...)
When a call of the interface is made incorrectly, you will receive different error messages.
HTTP error codes
- Error code 401 Unauthorized is displayed when you entered incorrect authentication data (Base64-coded combination of customer number and API key)
- Error code 404 Not Found is displayed when you call an incorrect URL
API error codes
If the HTTP call including authentication was successful (HTTP 200 OK), errors within the transferred XML data may generate additional error messages. The individual XML error codes and their descriptions which might be included in a response are listed in the overview of errors. An example of a response including an error code and description formatted in XML might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <new_paycode> ... <warnings> <warning> <code>8049</code> <message>Unsupported language.</message> <field>language_code</field> </warning> </warnings> </new_paycode>
bzw.
<?xml version="1.0" encoding="UTF-8" ?> <errors> <error> <code>6100</code> <message>Paycode request could not be processed.</message> </error> </errors>
bzw.
<?xml version="1.0" encoding="UTF-8" ?> <errors> <error> <code>8014</code> <message>Invalid amount.</message> <field>amount</field> </error> </errors>
4.9. Paycode status call (API step SR-1)
If you generated a paycode previously, you can request its status with the following call. This call only expects the generated paycode to be passed:
<?xml version="1.0" encoding="UTF-8" ?> <paycode_request> <paycode>6c9d197ddb</paycode> </paycode_request>
4.10. Response to paycode status call (API step SR-2)
The response to a specific paycode status call includes all information on the paycode. The parameters and their descriptions which might be included in a response are listed in the overview of parameters.
<?xml version="1.0" encoding="UTF-8" ?> <paycode_details> <status>open</status> <paycode>6c9d197ddb</paycode> <project_id>53245</project_id> <amount>2.2</amount> <reasons> <reason>Rasenmäher</reason> <reason>Bleistift</reason> </reasons> <time_created>2015-04-10T10:01:07+02:00</time_created> <time_used>2015-04-10T10:55:43+02:00</time_used> <start_date>2015-01-01T00:00:00+01:00</start_date> <end_date>2015-12-12T23:59:59+01:00</end_date> <max_usage>5</max_usage> <currency_code>EUR</currency_code> <language_code>DE</language_code> <sender> <bank_code>00000</bank_code> <bic>SKGIDE5FXXX</bic> <country_code>DE</country_code> </sender> <user_variables> <variable>Variable 1</variable> <variable>Variable 2</variable> </user_variables> <transactions> <transaction>99999-53245-5527834B-437A</transaction> <transaction>99999-53245-55278802-16BB</transaction> <transaction>99999-53245-5527900F-5F33</transaction> </transactions> </paycode_details>
The fields transaction and time_used are only filled with a value if the paycode has been activated.
4.11. API call to change a paycode (API step M-1)
If you have already created a paycode you can change it later on. Here, you can transfer all parameters with adapted values that are possible in the initial API call (API step 1) except <project_id> and <interface_version>. Only those parameters need to be transferred that should be changed. All other parameters remain valid with their previous transferred values.
Note: If you want to change the validity intervals (<intervals>) you need to transfer a new set of intervals with the changed values. If you want to delete the validity intervals please transfer <intervals />.
An example of an API call to change the paycode might look as follows:
<?xml version="1.0" encoding="UTF-8" ?> <edit_paycode> <paycode>6c9d197ddb</paycode> <amount>5.50</amount> <minimal_amount>4.00</minimal_amount> <start_date>2014-12-01T00:00:00+01:00</start_date> <max_usage>100</max_usage> <reasons> <reason>Reason Line 1 changed</reason> </reasons> <intervals> <interval> <from_date>2014-12-15</from_date> <amount>6.60</amount> <minimal_amount>5.00</minimal_amount> <reasons> <reason>Reason Line 1 new</reason> <reason>Reason Line 2 new</reason> </reasons> </interval> <interval> <from_date>2014-12-20</from_date> <amount>7.70</amount> <minimal_amount>6.00</minimal_amount> <reasons> <reason>Reason Line 1 newer</reason> </reasons> </interval> </intervals> </edit_paycode>
4.12. API response of a changed paycode (API step M-2)
As a response to the call for changing a paycode you receive the paycode and the status message "edited":
<?xml version="1.0" encoding="UTF-8" ?> <edit_paycode> <paycode>6c9d197ddb</paycode> <paycode_url>https://www.sofort.com/paycode/6c9d197ddb</paycode_url> <status>edited</status> </edit_paycode>
4.13. API call to deactivate a paycode (API step DA-1)
To deactivate an already existing paycode you can use the following API call. Afterwards the deactivated paycode cannot be used.
<?xml version="1.0" encoding="UTF-8" ?> <deactivate_paycode> <paycode>6c9d197ddb</paycode> </deactivate_paycode>
4.14. API response with deactivation confirmation (API step DA-2)
As a response to the call for deactivating a paycode you receive the paycode and the status message "deactivated":
<?xml version="1.0" encoding="UTF-8" ?><deactivate_paycode> <paycode>6c9d197ddb</paycode> <status>deactivated</status></deactivate_paycode>
4.15. API call to reactivate a paycode (API step RA-1)
To activate a previously deactivated paycode you can use the following API call. Afterwards the paycode can be used again with the previously defined parameter values.
<?xml version="1.0" encoding="UTF-8" ?> <activate_paycode> <paycode>6c9d197ddb</paycode> </activate_paycode>
4.16. API response with reactivation confirmation (API step RA-2)
As a response to the call for reactivating a paycode you receive the paycode and the status message "activated":
<?xml version="1.0" encoding="UTF-8" ?> <activate_paycode> <paycode>6c9d197ddb</paycode> <status>activated</status> </activate_paycode>
5. Testing
In order to fully test the functionality of the integration of the SOFORT paycode, please carry out a test generation including a test transfer directly in your system. Please note the following steps:
- Activate test mode
- Generate test paycode
- Carry out test transaction
- Check redirection to shop and notification
Please note that no real transfers will be made if you activate the test mode and use one of the specified test sort codes.
The test mode also allows real transfers when using a valid sort code.
Make sure to deactivate the test mode for productive use.
5.1. Activate test mode
Activate the test mode in your paycode project in the merchant area on the SOFORT website.
5.2. Generate test paycode
Generate a paycode in your system and by calling the XML interface.
5.3. Carry out test transaction
- Open the URL https://www.sofort.com/paycode and enter the test paycode generated before.
- Check the transferred data (recipient including address, reason, amount) in the SOFORT payment wizard.
- Then enter "88888888" (8 times the number "8") in the payment wizard as the sort code for German sender accounts, choose "Others" and "999" (3 times the number "9") for Belgium and "00000" (5 times the number "0") or "Demo Bank" for all other countries. (Instead of the test bank code a country specific test BIC will shortly be available: "SFRT{ISO-country code}20XXX", e.g. "SFRTDE20XXX" for Germany. Via the API you can already transfer the test BIC as <sender><bic>)
- You can freely enter the other data requested, but make sure you observe a minimum length of 4 characters.
5.4. Check redirection/notification
If you set up a redirection to a success/abort page or a notification, check whether they are performed correctly and whether your system responds properly.
- Is the customer redirected to the confirmation page after the transaction?
- Do you get all notifications correctly provided that they have been activated and transferred?
- Are the order details recorded and loaded correctly?
- Is the order/payment status set correctly and is the order created correctly?
6. Overview of parameters
If you do not use the code library (SofortLib), you will find the detailed XML interface documentation here.
Description of the table columns of the subsequent tables
- Parameter: XML tag name which is transferred (<parameter>parameter-content</parameter>)
The logical structure of an XML document is a tree structure, thus featuring a hierarchical organisation. The hierarchy is illustrated by indentation in the tables. Parameters marked in boldface symbolises parent nodes with one or more child nodes. - Number: specifies how frequently a parameter may be used under its higher-level parameter
- [1] = mandatory parameter
- [0,1] = optional parameter, a maximum of one value can be transferred
- [0..20] = optional parameter, up to 20 values can be transferred
- [n] = optional parameter, any number of parameters can be transferred
- [1..n] = mandatory parameter, a minimum of one parameter must and any number of parameters can be transferred
- Type (length): specifies the data type of the parameter content; if this is a string, the maximum permissible number of characters is stated
- Description: detailed description of the use of the parameter
6.1. (API step 1) Initial API call and transaction parameter transfer
6.1.1. API call and authentication
The interface is called via the following URL:
https://api.sofort.com/api/xml
The basic http authentication (RFC 2617) is used for authentication. Please enter your customer number as user name (for example 99999) and your API key as password (for example a12b34cd567890123e456f7890123456), separated by ":" and coded by Base64 (base64(99999:a12b34cd567890123e456f7890123456)).
For every call, the field Content Type and the field Accept in the HTTP header requires input of "application/xml".
An example of a HTTP header might look as follows:
Authorization: Basic OTk5OTk6YTEyYjM0Y2Q1Njc4OTAxMjNlNDU2Zjc4OTAxMjM0NTYg Content-Type: application/xml; charset=UTF-8 Accept: application/xml; charset=UTF-8
After successful authentication, the server will confirm your API call with HTTP 200 OK.
The content of the messages must be correctly formatted in XML. The possible parameters are described in detail in the following.
Note: You have to use the URL specified above for every API call described in the following and authenticate yourself as described.
6.1.2. Payment data transfer
This table contains all possible parameters which you can transfer to our system in a call.
Parameter | Number of | Type (Length) | Description | ||||
paycode | [1] | Container | Identifies the paycode API call, encloses the entire message | ||||
project_id | [1] | Integer | Project number | ||||
interface_version | [0,1] | String (255) | Version of shop interface, e.g. „xt:commerce_v4.1.0“ | ||||
language_code | [0,1] | String (2) | Language of payment wizard, according to ISO 639-1 e.g. "DE"; is interdependent with <sender><country_code> and should only be used if a certain language should be fored. Otherwise, dynamic parameters like the browser language are used to determine the language of the payment wizard. | ||||
start_date | [0,1] | String (19) | Validity begin of a paycode in the format "YYYY-MM-DDThh:mm:ss+HH:mm" (alternatively "YYYY-MM-DD hh:mm:ss" can be used, while UTC+1/UTC+2 are assumed) - must be before the end date. If the start is not defined, the paycode is valid from its creation. | ||||
end_date | [0,1] | String (19) | Validity end of a paycode in the format "YYYY-MM-DDThh:mm:ss+HH:mm" (alternatively "YYYY-MM-DD hh:mm:ss" can be used, while UTC+1/UTC+2 are assumed) - must be in the future (max. 900 days later than the start_date). If the end is not defined, the expiration date of the "max. validity in days" (at 23:59:59) stored in the project is automatically stated here. | ||||
amount | [1]* | Decimal (8.2) |
Amount, format: no thousands separators, two digits behind the decimal point, separated by a point ".", e.g. "150.00" (150 Euro) Please note that if the currency_code is "HUF" and a float value is assigned the amount will be rounded to the nearest integer value. (e.g. 1000.50 > 1001 and 1000.49 > 1000). *With activated option "Customer may change amount" in the SOFORT merchant area, this parameter is not mandatory. |
||||
minimal_amount | [0,1] | Decimal (8.2) |
The amount that has to be transferred at least by the payer (this parameter has only an effect if the feature "Customer may change amount" is activated in the SOFORT merchant area). Please note that if the currency_code is "HUF" and a float value is assigned the amount will be rounded to the nearest integer value. (e.g. 1000.50 > 1001 and 1000.49 > 1000). |
||||
currency_code | [0,1] | String (3) | Currency according to ISO 4217, e.g. "EUR", if no value has been transferred, "EUR" will be stated as default value. | ||||
max_usage | [0,1] | Integer | Sets the maximum amount the paycode can be used.Allowed values: 1-999999 (needs to be activated by SOFORT) | ||||
sender | [0,1] | Container | Sender account of your customer | ||||
bank_code | [0,1] | String (30) | DEPRECATED: Sort code of your customer, please use <bic> instead | ||||
bic | [0,1] | String (11) | BIC of your customer's account | ||||
country_code | [0,1] | String (2) | Country code of the country in which the account has been established according to ISO 3166-1; e.g. "de" | ||||
reasons | [1] | Container | List of reasons | ||||
reason | [1..2] | String (27) |
Reason; please transfer a unique value (e.g. order number), only the following characters are allowed: '0-9', 'a-z','A-Z', ' ', '+', ',', '-', '.'. Umlauts are replaced, e.g. ä -> ae. Other characters will be removed for the display on our payment page and for notifications. Therefore, a modified string for reason_1 and reason_2 may be transmitted for redirections (success and abort link and notifications). Some banks do not display the entire characters of both reasons, e.g. on the account statements the last characters are cut off. Therefore, the important data should be inserted at the beginning of the first reason field. |
||||
intervals | [0,1] | Container | Container that contains a list of validity intervals. For each validity interval certain parameters can have specified values that are only valid during this interval. | ||||
interval | [0,n] | Container | Container that contains the details for a validity interval. | ||||
from_date | [1] | String (19) | Start date of a validity interval foramtted "YYYY-MM-DD". The interval lasts until the startdate of the next validity interval or if no further interval is transferred until the end of the validity time of the paycode. The date has to be previous to the <end_date> of the paycode (i.e. the <end_date> needs to lie more ahead than the start date of the interval). | ||||
amount | [0,1]* | Decimal (8.2) |
Amount that holds during the validity interval; format: no thousands separators, two digits behind the decimal point, separated by a point ".", e.g. "150.00" (150 Euro) Please note that if the currency_code is "HUF" and a float value is assigned the amount will be rounded to the nearest integer value. (e.g. 1000.50 > 1001 and 1000.49 > 1000). * at least one of the parameters <amount>, <minimal_amount> or <reasons> need to be transferred. |
||||
minimal_amount | [0,1]* | Decimal (8.2) |
The amount that has to be transferred at least by the payer (this parameter has only an effect if the feature "Customer may change amount" is activated in the SOFORT merchant area). Please note that if the currency_code is "HUF" and a float value is assigned the amount will be rounded to the nearest integer value. (e.g. 1000.50 > 1001 and 1000.49 > 1000). * at least one of the parameters <amount>, <minimal_amount> or <reasons> need to be transferred. |
||||
reasons | [0,1]* | Container |
List of reasons that hold during the validity interval. * at least one of the parameters <amount>, <minimal_amount> or <reasons> need to be transferred. |
||||
reason | [1..2] | String (27) |
Reason of the validity interval; please transfer a unique value (e.g. order number), only the following characters are allowed: '0-9', 'a-z','A-Z', ' ', '+', ',', '-', '.'. Umlauts are replaced, e.g. ä -> ae. Other characters will be removed for the display on our payment page and for notifications. Therefore, a modified string for reason_1 and reason_2 may be transmitted for redirections (success and abort link and notifications). Some banks do not display the entire characters of both reasons, e.g. on the account statements the last characters are cut off. Therefore, the important data should be inserted at the beginning of the first reason field. |
||||
success_url | [0,1] | String (255) | Success link, overwrites the default value from the project settings. If the transaction ID of SOFORT should be used as part of the URL, the parameter '-TRANSACTION-' can be inserted in the URL String. | ||||
success_link_redirect | [0,1] | Boolean | Automatic redirection to success page. If this has not been activated, a summary page of SOFORT GmbH will be displayed to the customer. | ||||
abort_url | [0,1] | String (255) | Abort link, overwrites the default value from the project settings. If the transaction ID of SOFORT should be used as part of the URL, the parameter '-TRANSACTION-' can be inserted in the URL String. | ||||
notification_urls | [0,1] | Container | List of notification links | ||||
notification_url | [0..5] | String (255) | Notification link; an example of a transfer can be found in the example of an XML call. If the transaction ID of SOFORT should be used as part of the URL, the parameter '-TRANSACTION-' can be inserted in the URL String. | ||||
notification_url notify_on=“xyz“ | [0..5] | String (255) | Notification link; by replacing the part “xyz“ by a special status, only this URL is used for notifications with this status. It is possible to enter several statuses separated by commas, e.g. <notification_url notify_on=“pending, loss“> Possible statuses: "pending", "received", "loss", "refunded". | ||||
notification_emails | [0,1] | Container | List of notification email addresses | ||||
notification_email | [0..10] | String (255) | Notification email address | ||||
notification_email notify_on=“xyz“ | [0..10] | String (255) | Notification link; by replacing the part “xyz“ by a special status, only this email is used for notifications with this status. It is possible to enter several statuses separated by commas, e.g. <notification_email notify_on=“pending, loss“> Possible statuses: "pending", "received", "loss", "refunded". | ||||
user_variables | [0,1] | Container | List of variables to be freely assigned | ||||
user_variable | [0..20] | String (255) | Variable to be freely assigned |
Table 1: Parameter definition of the initial call and transaction parameter transfer (API step 1)
6.2. (API step 2) API response with generated paycode and payment URL
The response to the API call includes a paycode and the payment wizard URL to redirect the customer to. The response may also include warnings.
Parameter | Number of | Type (Length) | Description | |||
new_paycode | [0,1] | Container | Identifies the response to a paycode API call, encloses the entire message | |||
paycode | [1] | String (10) | The generated paycode to be forwarded to your customer | |||
paycode_url | [1] | String (255) | The link to the payment wizard with the attached paycode. Immediately redirects your customer to the correct payment wizard | |||
warnings | [0,1] | Container | List of warnings | |||
warning | [1..n] | Container | List of warnings | |||
code | [1] | Integer | Warning number | |||
message | [1] | String (255) | Warning message | |||
field | [1] | String (255) | Field the warning refers to | |||
errors | [0,1] | Container | Error (find definition below) - may be alternatively returned instead of the tag <new_paycode> | |||
... |
Table 2: Parameter definition of the response to the initial call with generated paycode (API step 2)
6.3. (API step 3) Transaction status change notification
Upon completion of a transaction or in case of a status change, you will receive a message containing the following parameters.
Parameter | Number of | Type (Length) | Description | |
status_notification | [1] | Container | Identifies a transaction status change, encloses the entire message | |
transaction | [1] | String (27) | Transaction number | |
time | [1] | String (25) | Date and time (with time zone) according to ISO 8601 in the format YYYY-MM-DDThh:mm:ss+HH:mm, e.g. 2013-03-14T11:38:00+02:00 |
Table 3: Parameter definition of the transaction status change notification (API step 3)
6.4. (API step 4) Transaction data request
If you want to learn more about status changes, submit a transaction detail request containing the following parameters. You may either request details on specific transaction numbers (<transaction>) or on a specific period of time and more filter criteria, in which the transactions were generated.
Note on data requests on a specific period of time:
You cannot request more than 100 transaction data records at a time, even if you omit the <number> parameter (in this case the default value 100 takes effect).
Periods comprising more than 100 transactions require iterative requests with <page>1</page>, <page>2</page> etc.
Parameter | Number of | Type (Length) | Description | |
transaction_request (with attribute version="2") | [1] | Container | Identifies the transaction data request, encloses the entire message | |
transaction | [0..100] | String (27) | Transaction number; it is possible to request several transaction numbers at a time | |
from_time | [0,1] | String (25) |
Start of a time interval if no transaction number was transferred. Default: [date of call] 0:00 hrs Formatted according to ISO 8601 YYYY-MM-DD or YYYY-MM-DDThh:mm:ss+HH:mm |
|
to_time | [0,1] | String (25) |
End of a time interval if no transaction number was transferred. Default: [time of call] Formatted according to ISO 8601 YYYY-MM-DD or YYYY-MM-DDThh:mm:ss+HH:mm |
|
from_status_modified_time | [0,1] | String (25) |
Start of a time interval if no transaction number was transferred. This interval refers to transactions which have undergone the latest status change within this period of time. Default: date of call 0:00 hrs. |
|
to_status_modified_time | [0,1] | String (25) |
End of a time interval if no transaction number was transferred. This interval refers to transactions which have undergone the latest status change within this period of time. Default: date of call 0:00 hrs. |
|
status | [0,1] | String | Statuses to which the returned transactions are to be limited | |
status_reason | [0,1] | String | Status reasons to which the returned transactions are to be limited | |
product | [0,1] | String | Product to which the returned transactions are to be limited ("paycode": SOFORT Paycode, "payment": SOFORT) | |
number | [0,1] | Integer | Number of transactions to be transmitted (for request of time period). Default/Max: 100 | |
page | [0,1] | Integer |
If number is used, the following transactions can be requested with this parameter. Default: 1 e.g. number=10, page=2 → transactions 11-20 are displayed |
Table 4: Parameter definition of transaction data request (API step 4)
6.5. (API step 5) Response to transaction data request
The table provides an overview of all parameters which a transaction detail request may contain.
Parameter | Number of | Type (Length) | Description | ||||||
transactions | [0,1] | Container | Identifies the response to a transaction data request, encloses the entire message | ||||||
transaction_details | [0..n] | Container | Details of a transaction | ||||||
project_id | [1] | Integer | Project number | ||||||
transaction | [1] | String (27) | Transaction number | ||||||
test | [1] | Boolean | Test transaction ("0" for false, "1" for true) | ||||||
time | [1] | String (25) | Date and time of transaction generation (with time zone) according to ISO 8601 in the format YYYY-MM-DDThh:mm:ss+HH:mm , e.g. "2013-03-14T13:02:10+01:00" | ||||||
status | [1] | String (20) | Status code of the transaction (see status codes) | ||||||
status_reason | [1] | String (255) | Status reason | ||||||
status_history_items | [1] | Container | Container for status history items | ||||||
status_history_item | [0...n] | Container | Sub-category for individual, previous status items | ||||||
status | [1] | String (20) | Status code of the transaction (see status codes) | ||||||
status_reason | [1] | String (255) | Status reason | ||||||
time | [1] | String (25) | Time of the set status according to ISO 8601 in the format YYYY-MM-DDThh:mm:ss+HH:mm, e.g. "2013-03-14T13:02:10+01:00" | ||||||
status_modified | [1] | String (25) | Date and time of the latest status change (with time zone) according to ISO 8601 in the format YYYY-MM-DDThh:mm:ss+HH:mm, e.g. "2013-03-14T13:17:10+01:00" | ||||||
payment_method | [1] | String (7) | Payment method used ("paycode" for SOFORT Paycode - others: su) | ||||||
language_code | [1] | String (2) | Language according to ISO 639-1 | ||||||
amount | [1] | Decimal (8.2) |
Transfer amount Please note that if the currency_code is "HUF" and a float value has been assigned in API-step 1 the returned amount is rounded to the nearest integer value (e.g. 1000.50 > 1001 and 1000.49 > 1000). |
||||||
amount_refunded | [0,1] | Decimal (8.2) | Refund amount (this also includes partial amounts) | ||||||
currency_code | [1] | String (3) | Currency according to ISO 4217, e.g. "EUR" | ||||||
reasons | [1] | Container | List of reasons | ||||||
reason | [0..2] | String (255) | Reason | ||||||
user_variables | [1] | Container | List of user variables | ||||||
user_variable | [0..20] | String (255) | User variable | ||||||
sender | [1] | Container | Sender data (bank account of your customer) - These values might be completed or calculated from the customer's data, therefore we can not guarantee for their correctness. | ||||||
holder | [1] | String (255) | Account holder | ||||||
account_number | [1] | String (30) | DEPRECATED: Account number | ||||||
bank_code | [1] | String (30) | DEPRECATED: Sort code | ||||||
bank_name | [1] | String (255) | Name of bank | ||||||
bic | [1] | String (11) | BIC | ||||||
iban | [1] | String (34) | IBAN | ||||||
country_code | [1] | String (2) | Country code according to ISO 3166-1 | ||||||
recipient | [1] | Container | Recipient data (bank account of merchant) | ||||||
holder | [1] | String (27) | Account holder | ||||||
account_number | [1] | String (30) | DEPRECATED: Account number | ||||||
bank_code | [1] | String (30) | DEPRECATED: Sort code | ||||||
bank_name | [1] | String (255) | Name of bank | ||||||
bic | [1] | String (11) | BIC | ||||||
iban | [1] | String (34) | IBAN | ||||||
country_code | [1] | String (2) | Country code according to ISO 3166-1 | ||||||
email_customer | [1] | String (255) | End customer email address, e.g. for invoice | ||||||
phone_customer | [1] | String (255) | End customer phone number (starts with "+"; possible characters: "0-9 , - / ( )" – no letters! ) | ||||||
exchange_rate | [1] | Decimal (8.4) | Exchange rate | ||||||
costs | [1] | Container | Data on fees | ||||||
fees | [1] | Decimal (8.2) | Fees associated with the requested transaction | ||||||
currency_code | [1] | String (3) | Currency according to ISO 4217, e.g. "EUR" | ||||||
exchange_rate | [1] | Decimal (8.4) | Exchange rate | ||||||
paycode | [1] | Container | Container for data regarding the Paycode | ||||||
code | [1] | String (10) | The paycode that is assigned to the transaction | ||||||
errors | [0,1] | Container | Error (find definition below) - may be alternatively returned instead of the tag <transactions> | ||||||
... |
Table 5: Parameter definition of response to transaction data request (API step 5)
Status messages
A transaction detail message always includes a transaction status provided that a Deutsche Handelsbank account exists.
Parameter <status> | Parameter <status_reason> | Description |
loss | not_credited | The money has not been received. |
pending | not_credited_yet | The money has not yet been received. |
received | credited | The money has been received. |
refunded | compensation | The money has been refunded (partial refund). |
refunded | refunded | The money has been refunded (complete refund of total amount). |
Table 6: Status messages for transactions with SOFORT Paycode and a Deutsche Handelsbank account
Parameter <status> | Parameter <status_reason> | Description |
untraceable | sofort_bank_account_needed | The Paycode transaction was successfully completed. Additional status messages on the receipt of the amount on the account are only possible if a Deutsche Handelsbank account exists. Note: if the API call <transaction_request> is transmitted without the version attribute with value "2", the <status> value "untraceable" is replaced by "pending" with <status_reason> "not_credited_yet". This version 1 transaction request is deprecated. |
refunded | compensation | The money has been refunded (partial refund). |
refunded | refunded | The money has been refunded (complete refund of total amount). |
Table 7: Status messages for transactions with SOFORT Paycode without a Deutsche Handelsbank account
6.6. (API step SR-1) Paycode status call
In addition, the API provides another possibility to request the status of a previously generated paycode.
Parameter | Number of | Type (Length) | Description | |
paycode_request version="2" | [1] | Container | Identifies the status request of a transferred paycode, encloses the entire message | |
paycode | [1] | String (10) | Paycode whose status is to be requested |
Table 8: Parameter details for the paycode status call
6.7. (API step SR-2) Response to paycode status call
Parameter | Number of | Type (Length) | Description | ||
paycode_details | [0,1] | Container | Identifies the paycode API call, encloses the entire message | ||
status | [1] | String (20) | Paycode status (open, used, expired, deactivate) | ||
paycode | [1] | String (10) | Paycode whose status has been requested | ||
project_id | [1] | Integer | Project number the paycode is assigned to | ||
transactions | [1] | Container | List of transaction numbers; can be empty if no transaction with the paycode has been carried out yet. | ||
transaction | [0..n] | String (27) | Transaction number | ||
amount | [1] | Decimal (8.2) | Amount stated upon paycode generation | ||
reasons | [1] | Container | List of reasons | ||
reason | [1..2] | String (27) | Reason | ||
time_created | [1] | String (25) | Time when the paycode was generated (with timezone) according to ISO 8601 in the format "YYYY-MM-DDThh:mm:ss+HH:mm", e.g. 2013-03-13T08:59:00+01:00 | ||
time_used | [0,1] | String (25) | Time when paycode was activated; is only set when the paycode was activated, otherwise, the day is empty (with timezone) according to ISO 8601 in the format "YYYY-MM-DDThh:mm:ss+HH:mm", e.g. 2013-03-13T08:59:00+01:00 | ||
start_date | [0,1] | String (25) | Time when the paycode validity will begin (with timezone) according to ISO 8601 in the format "YYYY-MM-DDThh:mm:ss+HH:mm", e.g. 2013-03-13T08:59:00+01:00 | ||
end_date | [0,1] | String (25) | Time when the paycode validity will expire (with timezone) according to ISO 8601 in the format "YYYY-MM-DDThh:mm:ss+HH:mm", e.g. 2013-03-13T08:59:00+01:00 | ||
max_usage | [1] | Integer | Sets the maximum amount the paycode can be used (needs to be activated by SOFORT) | ||
currency_code | [1] | String (3) | Currency according to ISO 4217, e.g. "EUR" | ||
language_code | [0,1] | String (2) | Language according to ISO 639-1 | ||
sender | [0,1] | Container | Sender data (bank account of your customer) | ||
bank_code | [1] | String (30) | DEPRECATED: Sort code | ||
bic | [1] | String (11) | BIC | ||
country_code | [1] | String (2) | Country code according to ISO 3166-1 | ||
user_variables | [0,1] | Container | List of user variables | ||
variable | [0..20] | String (255) | User variable | ||
errors | [0,1] | Container | Error (find definition below) - may be alternatively returned instead of the tag <paycode_details> | ||
... |
Table 9: Parameter details for the response to a paycode status call
As regards the tags "sender" and "user_variables", it must be ensured that the data always correspond with the data transferred when the paycode was generated. For example, the sender data may differ between paycode and transaction.
6.8. (API step M-1) API call to change a paycode
Already existing paycodes can be edited with the following parameters:
Parameter | Number of | Type (Length) | Description | |
edit_paycode | [1] | Container | Identifies the call to change the transferred paycode which encloses the entire message. | |
paycode | [1] | String (10) | Paycode that should be changed | |
... | ... | ... | [each tag of API step 1 is possible, except the tags <project_id> and <interface_version>] |
Table 10: Parameter details for the call to change a paycode
6.9. (API step M-2) API response of a changed paycode
The response to the call for changing a paycode contains the following parameters:
Parameter | Number of | Type (Length) | Description | |||
edit_paycode | [0,1] | Container | Identifies the response of a call to change a paycode which encloses the entire message. | |||
paycode | [1] | String (10) | The paycode that has been changed. | |||
paycode_url | [1] | String (255) | The URL to the payment form with attached paycode. This redirects the customer directly to the payment form. | |||
status | [1] | String (6) | Status "edited" | |||
warnings | [0,1] | Container | List of warnings | |||
warning | [1..n] | Container | Warning | |||
code | [1] | Integer | Warning id | |||
message | [1] | String (255) | Warning message | |||
field | [0,1] | String (255) | Parameter that causes the warning | |||
errors | [0,1] | Container | Error (see the definition below) - can be returned alternatively to the tag <edit_paycode>. | |||
... | ... | ... |
Table 11: Parameter details for the response of a call to change a paycode
6.10. (API step DA-1) API call to deactivate a paycode
To deactivate existing paycodes so that they cannot be used anymore, use the following parameters:
Parameter | Number of | Type (Length) | Description | |
deactivate_paycode | [1] | Container | Identifies the call to deactivate a paycode which encloses the entire message. | |
paycode | [1] | String (10) | Paycode that should be deactivated. |
Table 12: Parameter details for the call to deactivate a paycode
6.11. (API step DA-2) API response with deactivation confirmation
The response to the call for deactivating a paycode contains the following parameters:
Parameter | Number of | Type (Length) | Description | |||
deactivate_paycode | [0,1] | Container | Identifies the response of a call to deactivate a paycode which encloses the entire message. | |||
paycode | [1] | String (10) | The paycode that has been deactivated | |||
status | [1] | String (6) | Status "deactivated" | |||
warnings | [0,1] | Container | List of warnings | |||
warning | [1..n] | Container | Warning | |||
code | [1] | Integer | Warning id | |||
message | [1] | String (255) | Warning message | |||
field | [0,1] | String (255) | Parameter that causes the warning | |||
errors | [0,1] | Container | Error (see the definition below) - can be returned alternatively to the tag <deactivate_paycode>. | |||
... | ... | ... |
Table 13: Parameter details for the response of a call to deactivate a paycode
6.12. (API step RA-1) API call to reactivate a paycode
To reactivate paycodes that have been deactivated earlier so that they can be used again with the previously defined parameter values, the following parameters can be used:
Parameter | Number of | Type (Length) | Description | |
activate_paycode | [1] | Container | Identifies the call to reactivate a paycode which encloses the entire message. | |
paycode | [1] | String (10) | Paycode that should be reactivated. |
Table 14: Parameter details for the call to reactivate a paycode
6.13. (API step RA-2) API response with reactivation confirmation
The response to a call for reactivating a paycode contains the following parameters:
Parameter | Anzahl | Typ (Länge) | Erklärung | |||
activate_paycode | [0,1] | Container | Identifies the response for the paycode reactivation and encloses the entire message. | |||
paycode | [1] | String (10) | The paycode that has been reactivated | |||
status | [1] | String (6) | Status "activated" | |||
warnings | [0,1] | Container | List of warnings | |||
warning | [1..n] | Container | Warning | |||
code | [1] | Integer | Warning id | |||
message | [1] | String (255) | Warning message | |||
field | [0,1] | String (255) | Parameter that causes the warning | |||
errors | [0,1] | Container | Error (see the definition below) - can be returned alternatively to the tag <activate_paycode>. | |||
... | ... | ... |
Table 15: Parameter details for the response of a call to reactivate a paycode
6.14. Error messages/Warning
In case of an error/warning, you will receive the corresponding error code in the message.
Parameter | Number of | Type (Length) | Description | ||
errors | [0..1] | Container | Fehlerliste | ||
error | [1..n] | Container | Einzelner Fehler | ||
code | [1] | Integer | Fehlernummer | ||
message | [1] | String (255) | Fehlermeldung | ||
field | [0..1] | String (255) | Feld, auf das sich der Fehler bezieht | ||
warnings | [0..1] | Container | Warnungsliste | ||
warning | [1..n] | Container | Einzelne Warnung | ||
code | [1] | Integer | Warnungsnummer | ||
message | [1] | String (255) | Warnungsmeldung | ||
field | [0..1] | String (255) | Feld, auf das sich die Warnung bezieht |
Table 16: Parameter definition of the response to errors
Error codes
General errors upon a call
Code | Message | Beschreibung |
1000 | Invalid request. | Invalid request |
1001 | Technical error. | Technical error |
7000 | Invalid XML | Invalid XML |
7004 | XML parameter not provided in request | Empty POST data |
7005 | Project has no Deutsche Handelsbank account. | No Deutsche Handelsbank account stored with the project. |
7006 | Service temporarily unavailable due to maintenance | The service of SOFORT GmbH/Deutsche Handelsbank is temporarily unavailable due to maintenance. |
Table 17: General errors
Error code for paycode request (API step 1&6)
Code | Message | Beschreibung |
6100 | Paycode request could not be processed | Paycode interface must not be used because for example the project has not been released for paycode, the test mode does not run, or the project does not belong to the merchant |
6101 | Provide valid future datetime | The date is in the past. |
6102 | Invalid date format. | Incorrect date format transferred for the field 'start_date' or 'end_date'. Correct format: YYYY-MM-DD HH-MM-SS. Field may also remain empty, then the date will be calculated based on the project setting. |
6103 | Start date has to be earlier than end date. | The start date has to be before the end date. |
6104 | A paycode can only be used for maximal 900 days. | The interval between start date and end date is too large and has to be lower or equal to 900 days. |
6105 | Interval start date has to be in the validity period of the paycode. | The start date of a validity intercal has to be between the start date and the end date of the paycode.. |
6106 | Provide a valid start date for the interval. | Either no or a faulty start date of a validty interval has been transferred. |
6107 | Invalid parameter in interval provided. | Within the tag <interval> a parameter has been transferred that is not allowed. |
6108 | Provide at least one parameter for an interval. | Within the tag <interval> neither <amount> nor <reasons> has been transferred. |
6109 | This paycode has already been used and cannot be changed anymore. | The paycode has already been used and therefore no change is possible. |
6110 | This paycode has already been deactivated. | The paycode has already been deactivated. |
6111 | This paycode is already active. | The paycode is already active. |
6112 | End date was updated automatically based on project settings. Provide end_date in the API request to change it manually. | The end date has been delayed to a future date based on the project settings. This is due to a change of the paycode while only a start date and no end date has been transferred. |
6113 | The code has already been used and cannot be changed anymore. | The paycode has already been used and therefore no change is possible. |
6114 | End date has to be after the start date. | The end date has to be chronologically after the start date. |
6115 | Changing start_date or end_date of the Paycode may affect the validity of intervals. | By the change of the start date or the end date of the paycode further validity intervals may become invalid. |
6116 | The paycode is in use and therefore locked for 30 minutes. Please try again later. | The paycode is being used and therefore locked for 30 minutes. If the paycode will not be redeemed it can be used after the 30 minutes again. |
6117 | The minimal amount is higher than the paycode amount. | The minimal amount that needs to be payed by the customer is greater than the current amount of the paycode. |
6118 | The minimum amount is only relevant, if the consumer is allowed to change the amount. | The minimal amount should only be transferred if the feature to edit the amount by the customer is activated in the project settings. |
6119 | The amount of the interval may not be smaller than the minimal amount of the paycode | The amount of a transferred vailidity interval must not be less than the minimal amount that needs to be paid by the customer. |
6120 | No paycode provided. | A mandatory paycode is missing. Please repeat the request and transfer a specific paycode. |
6122 | Value for maximal usage of the paycode is out of range. | The number of times a paycode can be used must be between 1 and 999999 |
Table 18: Specific errors upon paycode requests
Specific errors/warnings upon a call (API step 1)
Code | Message | Meaning |
8000 | No project ID provided | No project ID transferred |
8001 | Unknown project | Unknown project |
8002 | Validation Error | Data cannot be validated |
8003 | Request could not be processed | Response to the transaction request not possible due to an error |
8004 | No product is selected | No date was transferred for a payment method in the call. |
8006 | Logic error. | e.g. the project has not been activated and is neither in the test mode, the requested product has not been activated or the data in the call contradict the project settings |
8010 | must not be empty | The field listed must not be empty. |
8011 | not in list of valid values | The transferred value is not included in the list of possible values. |
8012 | must be a positive number | The transferred value is not a positive number, e.g. the number of items of a shopping cart position. |
8013 | unsupported currency | The transferred currency is not supported by the system. At this time, only EUR, GBP, CHF, PLN, HUF, and CZK are accepted. |
8014 | invalid amount | The transferred amount must be positive and must only have two decimal numbers at the most. A "." or "," is accepted as a decimal separator. |
8015 | amount is out of range | The transferred amount is too large or too small. |
8016 | must be a valid url | The transferred URL is invalid. |
8017 | invalid chars | The transferred value contains characters which are not accepted, e.g. only certain characters are permitted in the field reason. |
8018 | maximum length of 27 chars exceeded | Permitted number of characters exceeded, excess characters will be removed where required (e.g. in the field reason) |
8019 | invalid email address | Invalid email |
8021 | invalid country code | Value must be transferred according to ISO 3166. |
8022 | unsupported country code | Transferred country code is not supported by our system. |
8023 | invalid BIC | Invalid BIC |
8024 | only German addresses (DE) are supported | An address abroad was specified as an invoice or shipping address. |
8025 | must be 2 or 3 // salutation | Mr. = 2, Mrs. = 3. |
8026 | must be a boolean, either 0 or 1 | 0 or 1 must be entered as a value. |
8027 | product not activated and not in testmode | The requested payment method is not available as the test mode has been deactivated and the payment method has not yet been released. |
8028 | locked_sender_country_id is activated in project settings, but not provided | The settings of the payment method determine that the sender country must not be changed by the end customer during the payment process. When initiating the payment, the sender country must then be stated. |
8040 | No amount with comma allowed for HU. | The amount has been transferred with decimal places which has been rounded down/up to the next integer (see also <amount>). |
8042 | consumer protection is only available for sender accounts from DE, AT and CH | Buyer protection is only possible for sender accounts from Germany, Austria, and Switzerland. |
8045 | product in testmode and given bank_code is not a test bank code | Account number, sort code, and account holder were transferred. Since the payment method runs in the test mode, one of the test sort codes must be entered (e.g. 00000). |
8046 | validation of given bank account and bank code failed | The settings of the payment method determine that the sender data must not be changed by the end customer during the payment process. The transferred account data could not be validated however. |
8047 | Maximum length of 255 characters exceeded. | Maximum number of characters (255) exceeded. |
8049 | unsupported language | The transferred language is not supported by the system. |
8050 | value too small. setting timeout to minimum value. | The transferred value for the duration of the payment process was too small and will be set to the minimum permissible value (120 seconds) |
8051 | invalid items found | The request contained invalid shopping cart items |
8054 | all products deactivated due to errors. Initiation aborted | All requested payment methods contained validation errors. The payment session could not be initiated. |
8057 | activate this product in your project settings | The requested payment method has not been activated for the project. The merchant must activated the payment method in the merchant menu to be able to use the payment method. |
8058 | payment not possible with this service | The payment cannot be used for this service |
8059 | sender country not supported for this currency | Payments in the desired currency cannot be made for the specified sender country |
8060 | Blacklisted | The payment cannot be executed as either the transferred banking details or the country has been blocked by the merchant. |
8063 | No success_url provided in request and in project settings | The success link was neither set in the request nor in the settings. |
8064 | No abort_url provided in request and in project settings | The abort link was neither set in the request nor in the settings. |
8072 | maximum number of notification exceeded | Too many notification urls or notification email addresses have been assigned. |
8073 | Maximum number of user variables exceeded | Too many user variables have been assigned. |
Table 19: Special errors/warnings
Errors upon a transaction detail request (API step 4)
Code | Message | Meaning |
7999 | Out of range (Too many entries or invalid values for the site) | Too many entries per page or invalid value for the page |
8005 | Too many transactions requested | Too many transactions requested |
8007 | Invalid date format. Format is YYYY-MM-DD [HH:MM:SS] | Invalid date format |
8008 | from_time equals to_time | The from/to data must be different |
8009 | max date range exceeded | Search interval too big |
Table 20: Error for the transaction detail request SOFORT Gateway
Possible HTTP status codes of the interface
200 OK: message accepted
401 Unauthorized: no permission, e.g. wrong API key
404 Not Found: called URL does not exist or wrong URL was called
7. Support & Contact
The ''Direct Bank Transfer'' team will be available if you need help.
You may send us an email at service@sofort.com.
We are also glad to assist you in case of technical issues:
Technical support:
Phone: +49 (0)89 24 88 37 691
Email: integration@sofort.com
Business hours:
Monday to Thursday: 8:30 a.m. to 6:00 p.m.
Friday: 8:30 a.m. to 5:00 p.m.
8. Legal Notice
SOFORT GmbH
Theresienhöhe 12
80339 Munich
Germany
Support for customers
Phone: +49 (0)89 24 88 37 690
Support for merchants
Phone: +49 (0)89 24 88 37 692
info@sofort.com
www.sofort.com
Directors
Felix Würtenberger
Wilhelmus Geerling Klaassen
External Data Protection Officer
Mr. Michael Schramm, LL.M.
For privacy questions please contact us at: datenschutz@sofort.com
Registered at the District Court Munich
HRB 218675
VAT-ID: DE248376956
© SOFORT GmbH. All rights reserved, including the translation.
The documentation including all published content is protected by copyright. Reprints or reproduction of any kind and processing, duplication, and distribution using electronic systems of any kind shall only be permitted with prior written consent of SOFORT GmbH.
The contents of this documentation and the implementation of the information contained therein may only be used at your own risk. SOFORT GmbH assumes no responsibility for the function of individual programmes or of parts of them. In particular, SOFORT GmbH assumes no responsibility for possible damages resulting from the use.