Exchange rate API
The USD and EUR rates from the homepage as JSON, for apps built in Suriname. Free to use: ask for a token and you're set.
Authentication
Every request needs a bearer token in the Authorization header. Tokens are issued by hand: ask dulamari on WhatsApp.
Authorization: Bearer <your-token>Endpoint
https://koers.dulamari.com/api/Returns the latest rate for every bank, the average buy and sell across all banks, and the latest fuel prices. There is one endpoint and it always returns the full dataset.
- Rates have up to 3 decimals. Trailing zeros are dropped, so
37.4means 37.400. - If a bank's latest scrape failed, you get its last good rate;
updated_atshows when it was recorded. - All timestamps are Suriname time (UTC−3), formatted
YYYY-MM-DD HH:MM:SS.
Example request
curl -H "Authorization: Bearer <your-token>" \
https://koers.dulamari.com/api/Example response
Shortened to two banks; the real response lists all of them.
{
"banks": [
{
"bank": "cbvs",
"name": "CBvS",
"usd": { "buy": 37.35, "sell": 37.754 },
"eur": { "buy": 41.75, "sell": 42.338 },
"updated_at": "2026-11-09 11:17:57",
"published_at": "2026-11-09 10:00:00"
},
{
"bank": "cme",
"name": "CME",
"usd": { "buy": 37.4, "sell": 37.7 },
"eur": { "buy": 40.8, "sell": 41.85 },
"updated_at": "2026-11-09 10:00:01",
"published_at": "2026-11-09 10:00:01"
}
],
"average": {
"usd": { "buy": 37.29, "sell": 37.792 },
"eur": { "buy": 41.538, "sell": 42.282 }
},
"fuel": {
"gasoline": 48.32,
"diesel": 53.27,
"currency": "SRD",
"unit": "liter",
"price_date": "2026-11-09",
"updated_at": "2026-11-09 10:00:01"
},
"updated_at": "2026-11-09 11:17:57"
}Response fields
| Field | Type | Meaning |
|---|---|---|
banks[] | array | One entry per bank or exchange. |
bank | string | Short id, e.g. cbvs, finabank. |
name | string | Display name. |
usd.buy, eur.buy | number | SRD the bank pays you for 1 USD or EUR. |
usd.sell, eur.sell | number | SRD you pay the bank for 1 USD or EUR. |
updated_at | string | When we recorded the rate. |
published_at | string | When the bank published it. Only CBvS gives its own time; for the others it equals updated_at. |
average | object | Average buy and sell across all banks, per currency. |
fuel | object | null | Gasoline and diesel in SRD per liter (source: GOw2). null when unavailable. |
updated_at (top level) | string | The newest updated_at of all banks. |
Rate limits
Rates refresh at 6:00, 8:00, 10:00, 12:30 and 15:00 SRT, so each token gets up to 100 requests per day. The count resets at midnight SRT. Polling more often won't return newer data.
Every response tells you what's left:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97Errors
Errors come back as JSON with an error message.
| Status | Meaning |
|---|---|
| 200 | Success, JSON body returned. |
| 401 | Missing, malformed or invalid bearer token. |
| 404 | No rate data available right now. |
| 429 | Daily limit reached. The Retry-After header gives the seconds until reset. |
| 500 | Server or database error. |
Ready to build?
Send a short note on WhatsApp about your app and you'll get a token.