We use tracking technologies for site analytics and, if you allow it, for non-personalized advertising. These are two separate choices and neither one is required to use the site.Analytics and advertising cookies are optional and separate. Privacy Policy
No eligible rate right now
Sign in to create an API key. Keys are linked to your verified account email and can be managed and revoked from your dashboard.
Sign in to get your API keyLoading source counts…
Simple JSON endpoints, easy integration
HTTPS only, rate-limited
Swagger UI with interactive examples
Free $0 · Pro ETB 3,999 / year · Growth ETB 9,999 / year · Enterprise custom
Free tier includes 100 requests/hour. Full history & conversion on paid tiers.
See full pricingNo API key required! Customize which banks and currencies to display, choose light or dark theme, and get an iframe code ready to use.
Create Embed Widget# Fail on HTTP errors (-f), cap the total time (--max-time), and retry
# transient failures (429 / 5xx) a few times before giving up.
curl -f --retry 3 --retry-delay 1 --max-time 10 \
-H "Authorization: Bearer YOUR_API_KEY" \
"https://exchange.et/api/v1/latest-rates" \
| jq '.data.rates'# Every list endpoint supports limit (max 500) + offset and returns
# meta.pagination (total / limit / offset / has_more). Page while has_more is true.
offset=0
limit=50
while :; do
curl -f --max-time 10 \
-H "Authorization: Bearer YOUR_API_KEY" \
"https://exchange.et/api/v1/latest-rates?limit=$limit&offset=$offset" \
> /tmp/page.json
jq '.data.rates[]' /tmp/page.json
has_more=$(jq -r '.meta.pagination.has_more' /tmp/page.json)
[ "$has_more" = "true" ] || break
offset=$((offset + limit))
done# Rate limits are enforced per hour by tier:
# Free ............ 100 requests/hour
# Pro ............. 1,800 requests/hour
# Each response carries X-RateLimit-* headers; a 429 adds Retry-After (seconds).
curl -sS -D - -o /dev/null \
-H "Authorization: Bearer YOUR_API_KEY" \
"https://exchange.et/api/v1/latest-rates" \
| grep -i 'x-ratelimit\|retry-after'
# On a 429, read Retry-After and wait before retrying — never retry in a tight loop.# Health checks are reachable through the public proxy domain with no API key:
# /api/v1/healthz - liveness (is the API process responsive?)
# /api/v1/ready - readiness (is the database connected + migrated?)
# /api/v1/health - liveness (same as /healthz)
curl -sS -o /dev/null -w 'healthz: %{http_code}' https://exchange.et/api/v1/healthz
curl -sS -o /dev/null -w 'ready: %{http_code}' https://exchange.et/api/v1/ready/api/v1/latest-ratesCurrent exchange rates/api/v1/historical-ratesHistorical data/api/v1/rate-comparisonCompare across banks/api/v1/sourcesAvailable banks/api/v1/pairsCurrency pairsAgent sign-up (agent-auth) and billing endpoints are not available through the public proxy domain and return 403 there. Call them directly against the backend API origin. See the full docs for details.
View Full API DocumentationAccess current and historical exchange rates from 32 Ethiopian banks. Get your free API key instantly and start building.