curl --request GET \
--url https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffersimport requests
url = "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"uuid": "41ac6075-5d30-4159-815d-6da233cb3ce8",
"responseTimestamp": "2026-09-15T10:20:30Z",
"referenceNumber": "ATM-REF-001234",
"baseAmount": "250.00",
"baseFeeAmount": "5.00",
"exchangeRate": {
"uuid": "93ec7885-c72b-4f70-99a5-afe1e1f787c6",
"baseCurrency": {
"numericCode": 978,
"alphaCode": "EUR",
"minorUnits": 2
},
"rate": "1.0922",
"foreignCurrency": {
"numericCode": 840,
"alphaCode": "USD",
"minorUnits": 2
},
"marginPercentage": "3",
"commissionPercentage": "0.010000",
"source": "REUTERS WHOLESALE INTERBANK",
"sourceTimestamp": "2026-09-15T08:00:00Z",
"expiry": "2026-09-16T08:00:00Z"
},
"foreignAmount": "273.05",
"foreignFeeAmount": "5.46",
"foreignTotalAmount": "278.51",
"bin": {
"number": "411111*****",
"currency": {
"numericCode": 840,
"alphaCode": "USD",
"minorUnits": 2
},
"schemeCode": 1
}
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/ATM00001/dccoffers?baseamount=-1",
"error": "BAD_REQUEST",
"status": 400,
"message": "baseamount must be greater than zero"
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/UNKNOWN01/dccoffers?baseamount=250.00",
"error": "NOT_FOUND",
"status": 404,
"message": "No such ATM"
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/ATM00001/dccoffers?baseamount=250.00",
"error": "INTERNAL_SERVER_ERROR",
"status": 500,
"message": "An unexpected error occurred"
}Request a DCC offer for an ATM
Use this endpoint to request a DCC rate offer for a cash withdrawal transaction at an ATM. Identify the ATM using the Fexco-assigned ATM ID.
For DCC, transaction-specific calls can be made using the withdrawal amount in the ATM’s base currency. If the cardholder’s card is eligible for DCC, the response includes the equivalent amount and exchange rate in the cardholder’s home currency. An optional ATM access fee (basefeeamount) can be included to return a converted fee and total amount in the response.
For VISA compliance, transactions that occur for currencies with 3 minor units, such as the Kuwaiti dinar, the transaction amount will be rounded at the second decimal place with the third decimal place always zero.
Note: The response may be a single DccRateOffer or a list of DccRateOffer objects.
curl --request GET \
--url https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffersimport requests
url = "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/dhsv2/acquirers/{acquirerId}/atms/{atmId}/dccoffers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"uuid": "41ac6075-5d30-4159-815d-6da233cb3ce8",
"responseTimestamp": "2026-09-15T10:20:30Z",
"referenceNumber": "ATM-REF-001234",
"baseAmount": "250.00",
"baseFeeAmount": "5.00",
"exchangeRate": {
"uuid": "93ec7885-c72b-4f70-99a5-afe1e1f787c6",
"baseCurrency": {
"numericCode": 978,
"alphaCode": "EUR",
"minorUnits": 2
},
"rate": "1.0922",
"foreignCurrency": {
"numericCode": 840,
"alphaCode": "USD",
"minorUnits": 2
},
"marginPercentage": "3",
"commissionPercentage": "0.010000",
"source": "REUTERS WHOLESALE INTERBANK",
"sourceTimestamp": "2026-09-15T08:00:00Z",
"expiry": "2026-09-16T08:00:00Z"
},
"foreignAmount": "273.05",
"foreignFeeAmount": "5.46",
"foreignTotalAmount": "278.51",
"bin": {
"number": "411111*****",
"currency": {
"numericCode": 840,
"alphaCode": "USD",
"minorUnits": 2
},
"schemeCode": 1
}
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/ATM00001/dccoffers?baseamount=-1",
"error": "BAD_REQUEST",
"status": 400,
"message": "baseamount must be greater than zero"
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/UNKNOWN01/dccoffers?baseamount=250.00",
"error": "NOT_FOUND",
"status": 404,
"message": "No such ATM"
}{
"timestamp": "2026-09-15T10:20:30Z",
"url": "/dhsv2/acquirers/TST/atms/ATM00001/dccoffers?baseamount=250.00",
"error": "INTERNAL_SERVER_ERROR",
"status": 500,
"message": "An unexpected error occurred"
}Headers
Path Parameters
Query Parameters
List of foreign ISO4217 currency codes. You can specify any combination of alphabetic and numeric currency codes.
Note: Please do not add spaces before or after the commas that separate the currency codes
If you want to override the Card foreigner's currency with a custom currency you can pass the foreign currency in this parameter with the bin information
Note: The base currency is GBP. Please do not use GBP in the currency field
Note: The currency field is only for an MCP Rate Call
This value is an extension of bin allowing for the next 6 digits of the card number. This value is the Card Currency Identifier (or Currency ID) which is used in conjunction with the BIN specified and provides the next 6 digits of the card number, whereby:
- bin: specifies only digits 1 to 6 of the BIN
- cid: specifies digits 7 to 12 of the card number A maximum of 6 digits is accepted while 4 is the recommended length. Note: Only 4 digits of the CID are stored
6This is an optional POS Entry Mode used with the Contactless Transaction Lower Limit (TLL).
The Contactless TLL is an optional configurable limit per MID or ATM ID on DHS. A contactless transaction with an amount less than or equal to the TLL will not be eligible for DCC. A contactless transaction with an amount greater than the TLL will be eligible for DCC. The optional POS Entry Mode field is used to indicate if the transaction is contactless or not.
This POS Entry Mode field indicates the method by which the Primary Account Number (PAN) was captured at the point of service and the PIN entry capabilities of the POS used
It consists of a two-digit sub-field followed by a one-digit sub-field. Possible values are as defined by ISO 8583.
Two-digit sub-field 1:
- '00' PAN entry mode unknown or unspecified.
- '01' PAN manual entry.
- '02' PAN auto-entry via magnetic stripe – the magnetic stripe has not been fully read and/or transmitted.
- '03' PAN auto-entry via bar code reader.
- '04' PAN auto-entry entry via optical character reader (OCR).
- '05' PAN auto entry via ICC.
- '07' PAN auto entry via Contactless ICC EMV*
- '80' Fallback from integrated circuit card (ICC) to a magnetic stripe.
- '90' PAN auto-entry via Magnetic stripe.
- '91' PAN auto-entry via contactless magnetic stripe.
- '95' PAN auto-entry via ICC. CVV may not be checked.
" +
One-digit sub-field 2:
- '0' Unspecified or unknown.
- '1' Terminal has PIN entry capability.
- '2' Terminal does not have PIN entry capability.
- '8' Terminal has PIN entry capability but the PIN pad is not currently operative =
'07' and '91' are the current Contactless values configured for TLL on the DHS service
3Response
DCC Rate Offer.
The service can return an Entity or a List of Entities.
- object
- object[]
DccRateOffer
