Merchant enrichment for developers
Make sense
of the spend.
Messy transaction descriptions in. Structured merchant data out. One simple API for your app, with open source at its core.
01 / Example request
curl 'https://ultrafinance.app/v1/enrich' \
-H 'Content-Type: application/json' \
-d '{
"description": "STARBUCKS",
"amount": "6.50",
"currency": "CAD",
"country": "CA"
}'
cargo run -- enrich 'STARBUCKS' \
--amount '6.50' \
--currency 'CAD' \
--country 'CA'
02 / Example response200 OK
{
"merchant": {
"status": "matched",
"data": {
"id": "mer_7ef5fd20e86f4237b039766ea9968b86",
"name": "Starbucks",
"markets": ["CA", "GB", "MX", "US"],
"website": "https://www.starbucks.ca/",
"categories": [
{
"id": "4bf58dd8d48988d128941735",
"name": "Cafeteria",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{"id": "4bf58dd8d48988d128941735", "name": "Cafeteria"}
]
},
{
"id": "4bf58dd8d48988d16d941735",
"name": "Café",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{
"id": "63be6904847c3692a84b9bb6",
"name": "Cafe, Coffee, and Tea House"
},
{"id": "4bf58dd8d48988d16d941735", "name": "Café"}
]
},
{
"id": "4bf58dd8d48988d1e0931735",
"name": "Coffee Shop",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{
"id": "63be6904847c3692a84b9bb6",
"name": "Cafe, Coffee, and Tea House"
},
{"id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop"}
]
},
{
"id": "4d4b7105d754a06374d81259",
"name": "Restaurant",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{"id": "4d4b7105d754a06374d81259", "name": "Restaurant"}
]
}
]
}
},
"location": {"status": "unresolved", "data": null},
"counterparties": [
{
"id": "mer_7ef5fd20e86f4237b039766ea9968b86",
"name": "Starbucks",
"markets": ["CA", "GB", "MX", "US"],
"website": "https://www.starbucks.ca/",
"categories": [
{
"id": "4bf58dd8d48988d128941735",
"name": "Cafeteria",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{"id": "4bf58dd8d48988d128941735", "name": "Cafeteria"}
]
},
{
"id": "4bf58dd8d48988d16d941735",
"name": "Café",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{
"id": "63be6904847c3692a84b9bb6",
"name": "Cafe, Coffee, and Tea House"
},
{"id": "4bf58dd8d48988d16d941735", "name": "Café"}
]
},
{
"id": "4bf58dd8d48988d1e0931735",
"name": "Coffee Shop",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{
"id": "63be6904847c3692a84b9bb6",
"name": "Cafe, Coffee, and Tea House"
},
{"id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop"}
]
},
{
"id": "4d4b7105d754a06374d81259",
"name": "Restaurant",
"path": [
{
"id": "63be6904847c3692a84b9bb5",
"name": "Dining and Drinking"
},
{"id": "4d4b7105d754a06374d81259", "name": "Restaurant"}
]
}
],
"type": "merchant"
}
],
"kind": "purchase"
}
Actual API response
Try a real lookup
What’s behind the transaction?
Enter a transaction description. Add a little context, and see what the API returns.
Live API response
Ready when you are.
Your lookup result will appear here. Uncertain matches can stay unresolved.
Explore the catalog
Meet the merchants.
Browse the catalog, or search names and aliases for the closest matches. Pick a merchant to try a lookup.
Browse or search to load merchants.
01 / INPUT
Start with what you have.
Only a description is required. Add amount, currency, country, or extra context when you have it.
02 / EVALUATE
Clear results. Honest uncertainty.
Get a merchant match when the evidence supports it. Ambiguous transactions can stay unresolved.
03 / BUILD
Hosted convenience. Open source.
Build against the hosted API, or run the Rust service yourself. The code is yours to explore.