DescriptorAPI turns the raw text a bank prints for a card transaction into the merchant behind it. You send a descriptor, you get back a name, category, website, location, payment processor and a confidence score.
1. Get an API key
Create a free account and copy your key from the dashboard. Keys start with dk_live_ and are shown once, so store it somewhere safe, such as an environment variable:
Copy export DESCRIPTORAPI_KEY="dk_live_…"
2. Send a descriptor
Post the statement line, exactly as your bank or processor gives it to you. Add the card country in country if you know it; it helps with ambiguous names.
Copy curl https://api.descriptorapi.com/v1/enrich \
-H "Authorization: Bearer $DESCRIPTORAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE"}'
3. Read the response
The fields you will use most:
merchant: the clean merchant (name, category, website, logo), or null when we cannot tell. We never invent a merchant.
confidence: how sure we are, from 0 to 1. See Confidence and source .
location and processor: where the payment happened and which aggregator or wallet carried it, when the descriptor says so.
request_id: quote it if you contact us about a result.
The full response is on the right, and every field is described in the API reference .
Next steps
Try it
Runs through the playground, no key needed
Next Authentication
Request
curl Go Node Python PHP
Copy
curl https://api.descriptorapi.com/v1/enrich \
-X POST \
-H "Authorization: Bearer $DESCRIPTORAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE", "mcc": "4121"}'
Copy
body := strings.NewReader(`{"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE", "mcc": "4121"}`)
req, _ := http.NewRequest("POST", "https://api.descriptorapi.com/v1/enrich", body)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+os.Getenv("DESCRIPTORAPI_KEY"))
resp, err := http.DefaultClient.Do(req)
Copy
const res = await fetch("https://api.descriptorapi.com/v1/enrich", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DESCRIPTORAPI_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE", "mcc": "4121"}),
});
const data = await res.json();
Copy
import os, requests
res = requests.post(
"https://api.descriptorapi.com/v1/enrich",
headers={"Authorization": f"Bearer {os.environ['DESCRIPTORAPI_KEY']}"},
json={"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE", "mcc": "4121"},
timeout=10,
)
data = res.json()
Copy
$ch = curl_init("https://api.descriptorapi.com/v1/enrich");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => '{"descriptor": "POS 4521 CAREEM*RIDE DXB AE", "country": "AE", "mcc": "4121"}',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DESCRIPTORAPI_KEY'),
'Content-Type: application/json',
],
]);
$data = json_decode(curl_exec($ch), true);
Response · 200 OK
Copy {
"descriptor" : "POS 4521 CAREEM*RIDE DXB AE" ,
"normalized" : "CAREEM RIDE" ,
"merchant" : {
"id" : "mer_01M4TKG2681HHBYZWQE4FEQARK" ,
"name" : "Careem" ,
"legal_name" : null ,
"website" : "https://www.careem.com" ,
"logo_url" : "https://cdn.descriptorapi.com/logos/careem-218be11e.png" ,
"category" : "transportation" ,
"subcategory" : "ride_hailing" ,
"mcc" : "4121"
},
"location" : {
"city" : "Dubai" ,
"country" : "AE"
},
"processor" : null ,
"is_subscription" : false ,
"confidence" : 0.97 ,
"source" : "cache" ,
"verified" : true
}