Edenred Direct Payment Services
Use Case: Belgium
1. Generalities
In Belgium, a user can spend the exact amount requested without any limitation (apart from the balance available on his account), i.e. balance can’t be negative.
These regulations are handled on the Edenred side.
Please note that all amounts in our API are given in cents 9€ = 900
2. User Security Tokens
Please refer to this section for more details about security tokens.
2.1. Login Process
1) To test the API in sandbox, you can get an authorization_code by clicking on the link bellow:
Example of account that can be used to test the API:
Account: uat1c@vva.net
Password: Secret123
Masked PAN: 7628
2) After login, you'll be redirected to a url like :
http://nowhere.edenred.net/oauth/callback?code={authorization_code}&...
3) Copy the authorization_code and use the request "Get access_token from authorization_code
" in the following collection of API calls:
Please note that an authorization_code is burned every time you try to use it. If your API call fails, you must get a new authorization_code.
2.2. Logout Process
Logout the Edenred account from your platform. All tokens are then invalid
GET /connect/endsession?id_token_hint=<idToken>=<postLogoutRedirectUri> HTTP/1.1
Host: {{authentication-URL}}
Where
'authentication-URL' = sso.sbx.edenred.io
And idToken
is retrieved from the refreshing token response
And postLogoutRedirectUri
is a callback URL whitelisted on our side (to be provided in the configuration request)
eg: postLogoutRedirectUri = http://nowhere.edenred.net/oauth/callback
3. Direct Payment API
3.1. Postman Collection
If you use the postman collection, the access_token will automatically be placed in your HTTP Authorization header.
The postman configuration available here is set in auto-clearing mode => cancel and capture routes are not available but put as examples.
Notes: You can request an access to our UAT environment in manual-clearing mode if you choose to implement the payment with Edenred this way.
3.2. User Balance
Get Balance per product
Gets the available user balance for the wallet enabled.
To request the balance of one the various wallets enabled on the account (and upon your configuration), you have to pass a query parameter in the request
- Ticket Restaurant: ETR (default value used if no query parameter provided in the request)
- Ticket Compliment : ETC
- Ticket Ecochèque : EEC
- Ticket Sport: ESC
- Consumption Voucher: CVE
The Authorization header is mandatory for this request.
Request:
GET /v2/users/{username}/balances HTTP/1.1
Query parameter: ETR
Host: directpayment.stg.eu.edenred.io
Authorization: Bearer {token}
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Response:
{
"meta": {
"status": "succeeded",
"messages": []
},
"data": {
"product_class": "ETR",
"available_amount": 12033,
"currency": "EUR"
}
}
###
Get Balances of all products
Gets the available user balances for the wallet enabled.
To request the balances of all the products enabled on the account (and upon your configuration).
Request:
GET /v2/users/{username}/balances HTTP/1.1
Host: directpayment.stg.eu.edenred.io
Authorization: Bearer {token}
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Response:
{
"meta": {
"status": "succeeded",
"messages": []
},
"data": [
{
"product_class": "CVE",
"available_amount": 0,
"currency": "EUR"
},
{
"product_class": "EEC",
"available_amount": 99991,
"currency": "EUR"
},
{
"product_class": "ETC",
"available_amount": 159798,
"currency": "EUR"
},
{
"product_class": "ETR",
"available_amount": 12033,
"currency": "EUR"
}
]
}
Estimate Charge
Check if an amount can be spent and answer the possible amount that can be spent. If the requested amount is above the available balance, the service will provide the available amount in the response.
To request the balance of one the various wallets enabled on the account (and upon your configuration), you have to pass a query parameter in the request.
The Authorization header is mandatory for this request.
Request:
POST /v2/users/{username}/actions/estimate-charge HTTP/1.1
Host: directpayment.stg.eu.edenred.io
Query parameter: ETR
Authorization: Bearer {token}
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"amount": 1900
}
Response:
{
"meta": {
"status": "succeeded",
"messages": []
},
"data": {
"available_amount": 1500,
"currency": "EUR"
}
}
3.3. User Transactions
Capture Mode: Manual
Step 1: Authorize a payment
An authorization is requested with an amount in cents of Euros (10€ = 1000).
In capture mode = manual, you must set the capture mode in the body of the request to "manual".
To request a transaction of a specific wallet enabled on the card (and upon your configuration), you have to pass a query parameter in the request
- Ticket Restaurant: ETR (default value used if no query parameter provided in the request)
- Ticket Compliment : ETC
- Ticket Ecochèque : EEC
- Ticket Sport: ESC
- Consumption Voucher: CVE
The authorization header should be set for this operation.
The field
tstamp
MUST be set in order to manage idempotency
Request:
POST /v2/transactions HTTP/1.1
Host: directpayment.stg.eu.edenred.io
Authorization: Bearer {token}
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"mid": "203696",
"amount": 1,
"security_level": "standard",
"capture_mode": "manual",
"order_ref": "30192",
"tstamp": "2020-05-26T19:45:51Z",
"currency": "EUR"
}
Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"order_ref": "30192",
"mid": "203696",
"status": "authorized",
"authorization_id": "MTU5MjIxOTg1ODIwMzY5NjYzMDEwM-780920",
"authorized_amount": 1
}
}
Step 2: Cancel OR Capture a payment
An "authorized" payment can be cancelled or captured.
The authorization_id provided during the authorization process must be provided in this request.
The authorized_amount must be provided in the body of the request. The canceled amount or captured amount can be lower or equal to the authorized amount.
The authorization header must be set for the two operations cancel and capture.
Cancel Request:
POST /v2/transactions/{authorization_id}/actions/cancel HTTP/1.1
Host: directpayment.stg.eu.edenred.io
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"amount": 1,
"currency": "EUR",
"tstamp": "2020-05-26T19:45:51Z"
}
Cancel Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"mid": "203696",
"status": "cancelled",
"cancel_id": "MTU5MjIxOTg1ODIwMzY5NjYzMDEwM",
"cancelled_amount": 1,
"order_ref": "30192",
"authorization_id": "MTU5MjIxOTg1ODIwMzY5NjYzMDEwM-780920",
"authorized_amount": 1
}
}
OR
Capture Request:
POST /v2/transactions/{authorization_id}/actions/capture HTTP/1.1
Host: directpayment.stg.eu.edenred.io
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"amount": 1,
"currency": "EUR",
"tstamp": "2020-05-26T19:45:51Z"
}
Capture Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"order_ref": "30192",
"mid": "203696",
"status": "captured",
"capture_id": "MTU5MjIyODQyMzIwMzY5NjYzMDEwM-756374",
"capture_amount": 1,
"authorization_id": "MTU5MjIyODQyMzIwMzY5NjYzMDEwM-756374",
"authorized_amount": 1
}
}
Step 3: Refund a captured payment
Once captured, a transaction can't be cancelled but have to be refunded.
The authorization_id provided during the authorization process must be provided in this request.
The exact captured_amount must be provided in the body of the request. The refund can't be partial.
The authorization header should not be set for this operation.
The capture_mode
is mandatory (and its value is manual) in case of dual messaging (Authorize + Capture).
The field
tstamp
MUST be set in order to manage idempotency
Refund Request:
POST /v2/transactions/{authorization_id}/actions/refund HTTP/1.1
Host: directpayment.stg.eu.edenred.io
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"amount": 1,
"currency": "EUR",
"tstamp": "2019-05-26T12:17:53Z",
"capture_mode": "manual"
}
Refund Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"mid": "203696",
"status": "refunded",
"refund_id": "MTU5MjIyMDE4MjIwMzY5NjYzMDEwM-014300",
"refunded_amount": 1,
"order_ref": "30192",
"capture_id": "MTU5MjIzMjU2NTIwMzY5NjYzMDEwM-014300",
"capture_amount": 1,
"authorization_id": "MTU5MjIzMjU2NTIwMzY5NjYzMDEwM-014300",
"authorized_amount": 1
}
}
Capture Mode: Auto
Step 1: Auto Capture a payment
An authorization with auto capture can be requested with an amount in cents of Euros (10€ = 1000).
To request a transaction of a specific wallet enabled on the card (and upon your configuration), you have to pass a query parameter in the request
- Ticket Restaurant: ETR (default value used if no query parameter provided in the request)
- Ticket Compliment : ETC
- Ticket Ecochèque : EEC
- Ticket Sport: ESC
- Consumption Voucher: CVE
The authorization header should be set for this operation.
The field
tstamp
MUST be set in order to manage idempotency
Request:
POST /v2/transactions HTTP/1.1
Host: directpayment.stg.eu.edenred.io
Authorization: Bearer {token}
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"order_ref": "51195",
"mid": "203696",
"amount": 1,
"currency": "EUR",
"capture_mode": "auto",
"extra_field": "51195",
"tstamp": "2019-05-23T14:02:50Z",
"security_level": "standard"
}
Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"order_ref": "51195",
"mid": "203696",
"status": "captured",
"authorization_id": "MTU5MjIzNDk0MTIwMzY5NjYzMDEwM-519587",
"authorized_amount": 1,
"capture_id": "MTU5MjIzNDk0MTIwMzY5NjYzMDEwM-519587",
"captured_amount": 1
}
}
Step 2: Refund a captured payment
Once captured, a transaction can't be cancelled but have to be refunded.
The authorization_id provided during the payment process must be provided in this request.
The authorization header should not be set for this operation.
The field
tstamp
MUST be set in order to manage idempotency
Refund Request:
POST /v2/transactions/{authorization_id}/actions/refund HTTP/1.1
Host: directpayment.stg.eu.edenred.io
X-Client-Id: {payment-clientId}
X-Client-Secret: {payment-clientSecret}
Content-Type: application/json
{
"amount": 1,
"currency": "EUR",
"tstamp": "2019-05-23T14:02:50Z"
}
Refund Response:
{
"meta": {
"status": "succeeded"
},
"data": {
"mid": "203696",
"status": "refunded",
"refund_id": "MTU5MjIzNDk0MTIwMzY5NjYzMDEwM",
"refunded_amount": 1,
"order_ref": "51195",
"authorization_id": "MTU5MjIzNDg5MTIwMzY5NjYzMDEwM-297895",
"authorized_amount": 1,
"capture_id": "MTU5MjIzNDg5MTIwMzY5NjYzMDEwM-297895",
"captured_amount": 1
}
}
4. Error Codes
Status Code | Status | Code | Level | Description |
---|---|---|---|---|
200 | succeded | SUCCESS | Success | SUCCEEDED |
200 | succeded | OK | Success | OK |
200 | succeded | AUTH | Success | The transaction has been authorized. |
200 | succeded | AUTH_PENDING | Success | The transaction authorization is pending. |
200 | succeded | PARTIAL_AUTH | Success | The transaction has been partially authorized. |
400 | failed | INVALID_CARD | Error | Invalid card information provided. |
400 | failed | CARDHOLDER_ALREADY_EXISTS | Error | CARDHOLDER ALREADY EXISTS |
400 | failed | REFERENCE_ALREADY_EXISTS | Error | REFERENCE ALREADY EXISTS |
400 | failed | BAD_REQUEST | Error | INVALID PARAMETERS |
400 | failed | INVALID_CARD | Error | INVALID CARD SERIAL NUMBER |
400 | failed | INVALID_ACCOUNT | Error | INVALID ACCOUNT NUMBER |
400 | failed | INVALID_ACTIVATION_CODE | Error | INVALID ACTIVATION CODE |
400 | failed | BAD_REQUEST | Error | INVALID PAGE OFFSET |
400 | failed | BAD_REQUEST | Error | INVALID DATE RANGE |
400 | failed | BAD_REQUEST | Error | DATE FROM TOO OLD |
400 | failed | INVALID_CARDHOLDER | Error | INVALID CARDHOLDER |
400 | failed | INVALID_EMAIL | Error | INVALID EMAIL |
400 | failed | INVALID_PHONE | Error | INVALID PHONE |
400 | failed | DUPLICATE_CARDHOLDER | Error | DUPLICATE CARDHOLDER |
400 | failed | ACCOUNT_LIMIT_EXCEEDED | Error | Account has reached the maximun allowed limit |
400 | failed | INSUFFICIENT_FUNDS | Error | Insufficient funds to complete the request |
400 | failed | INACTIVE_ACCOUNT | Error | The account is not active |
400 | failed | NON_UNIQUE_MOBILE_NUMBER | Error | NON-UNIQUE MOBILE NUMBER |
400 | failed | REQUEST_DENIED | Error | Request has been rejected due to business rule |
400 | failed | DAILY_LIMIT_EXCEEDED | Error | Daily limit on trasferring funds has been reached |
400 | failed | CARD_NOT_BLOCKED | Error | CANNOT RESUME(Card not blocked or already blocked) |
400 | failed | CARD_ALREADY_REGISTERED | Error | CARD ALREADY REGISTERED |
400 | failed | REGISTRATION_NOT_ALLOWED | Error | REGISTRATION NOT ALLOWED |
400 | failed | CARD_BLOCKED | Error | Card is not in valid state |
400 | failed | BAD_REQUEST | Error | PIN REQUIRED |
400 | failed | BAD_REQUEST | Error | PIN ERROR |
400 | failed | CARDHOLDER_STATUS_INVALID | Error | CARDHOLDER STATUS INVALID |
400 | failed | CARD_BLOCKED | Error | CARD/ACCOUNT BLOCKED |
400 | failed | BAD_REQUEST | Error | INVALID PRODUCT BALANCE |
400 | failed | BAD_REQUEST | Error | INVALID ACCOUNT EXTERNAL REFERENCE |
400 | failed | BAD_REQUEST | Error | PIN STATUS NOT BLOCKED |
400 | failed | BAD_REQUEST | Error | PIN LOCKED |
400 | failed | BAD_REQUEST | Error | CARD NOT FULFILLED |
400 | failed | INVALID_CUSTOMER | Error | The customer code provided was invalid |
400 | failed | CARD_ALREADY_ACTIVATED | Error | Card is already activated |
400 | failed | BAD_REQUEST | Error | CARD NOT ACTIVE |
400 | failed | INVALID_PAYMENT_REFERENCE | Error | Payment reference does not conform to the validation rules |
400 | failed | BANKING_NOT_SUPPORTED | Error | Banking is not configured for this Product Class |
400 | failed | INACTIVE_BANK_ACCOUNT | Error | The bank account is not active |
400 | failed | INVALID_PAYEE_DETAILS | Error | The payee details provided are invalid |
400 | failed | BAD_REQUEST | Error | PIN STATUS NOT ACTIVE ACTIVATING |
400 | failed | BAD_REQUEST | Error | MAX PIN TRIES EXCEEDED |
400 | failed | FIXED_PERIOD_LIMIT_EXCEEDED | Error | A spend limit will be exceeded if the payment is processed |
400 | failed | PAYEE_REFERENCE_NOT_FOUND | Error | Payee with the given reference does not exist on system |
400 | failed | BANK_ACCOUNT_RESTRICTED | Error | Banking functionality has been restricted for this card holder or this account |
400 | failed | INVALID_MERCHANT | Error | Invalid Merchant |
400 | failed | INVALID_AMOUNT | Error | INSUFFICIENT FUNDS |
400 | failed | INVALID_AMOUNT | Error | Invalid Amount |
400 | failed | DECLINED | Error | Declined |
400 | failed | TRANSACTION_DUPLICATED | Error | Transaction Duplicated |
400 | failed | LIMIT_EXCEEDED | Error | Limit exceeded |
400 | failed | TEMPORARY_HOLD | Error | Temporary hold |
400 | failed | PARTIAL_REVERSALS_NOT_ALLOWED | Error | Partial resversals not allowed |
400 | failed | TRANSACTION_NOT_AUTHORISED | Error | Transaction not authorised |
400 | failed | INVALID_VOUCHER | Error | Invalid Voucher |
400 | failed | INCORRECT_PIN | Error | Incorrect PIN |
400 | failed | LOCKOUT | Error | lockout |
400 | failed | PARTIAL_AUTH_NOT_SUPPORTED | Error | Partial authorization not supported |
400 | failed | CARD_NOT_ACTIVATED | Error | Card is not activated |
400 | failed | CARD_BLOCKED | Error | Card blocked |
400 | failed | INVALID_CARD | Error | Invalid card |
400 | failed | INVALID_ACCOUNT | Error | Invalid account |
400 | failed | ACCOUNT_BLOCKED | Error | Account blocked |
400 | failed | INVALID_CURRENCY_CODE | Error | Invalid currency |
400 | failed | INVALID_TRANSACTION_TYPE | Error | Invalid transaction type |
400 | failed | TOPTP_VALIDATION_FAILED | Error | toptp validation failed |
400 | failed | INVALID_CAPTURE_MODE | Error | You are not allowed to capture transaction |
400 | failed | BAD_REQUEST | Error | The input doesn't respect the contract expected (required fields, type, etc.) |
400 | failed | EMPTY_AUTHORIZATION_TOKEN | Error | Unable to retrieve the OpenId token from the request. Please verify your request and, if required, contact the API administrator for assistance. |
400 | failed | INVALID_SEARCH_PERIOD | Error | The search period is longer than 3 months. |
400 | failed | BAD_REQUEST | Error | The server cannot or will not process the request due to an apparent client error. Check messages field for more details. |
400 | failed | DECLINED | Error | Transaction declined. |
400 | failed | INVALID_REQUEST | Error | The configuration allows only single/dual messaging requests. |
400 | failed | CARD_NOT_ACTIVE | Error | No active card found for the username. |
400 | failed | INVALID_AMOUNT | Error | Insufficient funds or amount too small/big. |
400 | failed | INVALID_MERCHANT | Error | The merchant is not valid, please check the given mid. |
400 | failed | INVALID_VOUCHER | Error | Voucher not valid. |
400 | failed | LIMIT_EXCEEDED | Error | The amount is incorrect according your past orders. |
400 | failed | LOCKOUT | Error | Max PIN tries exceeded. |
400 | failed | PARTIAL_REVERSALS_NOT_ALLOWED | Error | Partial refunds are not allowed. |
400 | failed | TEMPORARY_HOLD | Error | Transaction temprorary hold. |
400 | failed | TRANSACTION_DUPLICATED | Error | A same transaction already exists. |
400 | failed | TRANSACTION_NOT_AUTHORISED | Error | The transaction has not been authorized. |
400 | failed | TRANSACTION_STATUS_MUST_BE_AUTHORIZED | Error | Invalid operation, the status of the transaction must be authorized |
400 | failed | INVALID_AMOUNT | Error | Ensure that the amount you want to cancel matches the authorized amount. |
400 | failed | TRANSACTION_NOT_AUTHORISED | Error | Transaction not authorised. |
400 | failed | TRANSACTION_STATUS_MUST_BE_CAPTURED | Error | Invalid operation, the status of the transaction must be captured |
401 | failed | UNAUTHORIZED | Error | SSL CONNECTION REQUIRED |
401 | failed | UNAUTHORIZED | Error | INVALID SSL CERTIFICATE |
401 | failed | BAD_CREDENTIALS | Error | Bad credentials (401) |
401 | failed | UNAUTHORIZED | Error | INVALID CREDENTIALS |
401 | failed | INVALID_TOKEN | Error | Invalid, revoked or expired token. You should try to re-authenticate the user. |
401 | failed | UNAUTHORIZED | Error | Missing, invalid or expired token. To fix, you should re-authenticate the user. |
401 | failed | USER_INACTIVE | Error | User Inactive. |
401 | failed | INVALID_TOKEN_ISSUER | Error | The token has not been issued (tokenUsername) for the current user (username) |
403 | failed | FORBIDDEN | Error | INVALID IP |
403 | failed | FORBIDDEN | Error | INVALID MAC |
403 | failed | FORBIDDEN | Error | The request was valid, but the server is refusing action. The user might not have the necessary permissions for this resource. |
404 | failed | TRANSACTION_NOT_FOUND | Error | No transaction found for the given transaction_id. |
404 | failed | ORIGIN_TRANSACTION_ID_NOT_FOUND | Error | The origin transaction_id is not found. |
404 | failed | NOT_FOUND | Error | If no transaction is linked to the transaction_id given as input. |
405 | failed | METHOD_NOT_ALLOWED | Error | A request was made of a resource using a request method not supported by that resource; for example, using GET on a form which requires data to be presented via POST, or using PUT on a read-only resource. |
405 | failed | METHOD_NOT_ALLOWED | Error | A request was made of a resource using a request method not supported by that resource. |
406 | failed | NOT_ACCEPTABLE | Error | The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request. |
412 | failed | PRECONDITION_FAILED | Error | A business precondition has not been; for example, the user has no active cards. |
412 | failed | PRECONDITION_FAILED | Error | A business precondition has not been. |
415 | failed | UNSUPPORTED_MEDIA_TYPE | Error | The request entity has a media type which the server or resource does not support. |
429 | failed | TOO_MANY_REQUEST | Error | Your request has been rejected due to rate limitation. Please check your subscribed service level agreement. |
500 | failed | INVALID_POST_CODE | Error | INVALID POST CODE |
500 | failed | COMPLIANCE_DATA_NOT_ALLOWED | Error | COMPLIANCE DATA NOT ALLOWED |
500 | failed | INTERNAL_ERROR | Error | Internal Server Error |
500 | failed | CARD_EXPIRED | Error | Card expired |
500 | failed | INTERNAL_ERROR | Error | Invalid Message :Field: [value.amt] must be numeric |
500 | failed | INTERNAL_ERROR | Error | We had a problem with our server. Please to try again later. |
500 | failed | TRANSACTION_MUST_BE_AUTHORIZED | Error | Invalid operation, the status of the transaction must be authorized |
501 | failed | NOT_IMPLEMENTED | Error | For the context of the current business unit, this feature is not supported. |
502 | failed | BAD_GATEWAY | Error | INVALID ORIGINATING SYSTEM |
502 | failed | BAD_GATEWAY | Error | Oups... Something wrong on one of the underlying servers! Please contact the administrator to report the issue. |