Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

icon exchange-rates


Querying a rate-limited foreign currency exchange API using Redis as a cache.

  • Number of Requests per Hour: 100 (See config file)

Http Endpoints

GET /v1/currencies

Returns a list of the available currencies. Eg:


GET /v1/rates?from=EUR&to=USD

Returns the current exchange rate, if available:


Run it locally

You'll need a Redis instance. The easiest way to get started is by using docker:

docker run -it --rm -p 6379:6379 redis:5.0.0

And then run the web server app using cabal new-run exchange-rates, or using Nix nix-shell --pure shell.nix and cabal new-run exchange-rates. You should see something like:

AppConfig {forex = ForexConfig {host = "", apiKey = [SECRET], keyExpiration = 1800}, redis = RedisConfig {redisHost = "", redisPort = 6379}}
Started server on localhost:8080
Calling web service for: USD -> GBP
Calling web service for: USD -> EUR
Cache hit: USD -> GBP
Calling web service for: USD -> PLN
Cache hit: USD -> PLN

Exchange rates are cached to avoid hitting the (limited) external service many times.

Browse the documentation

The docs are generated at compile time from the API definition. The API serves a swagger.json response that you can visualize in the Swagger UI:

docker run -p 80:8080 swaggerapi/swagger-ui

Go to localhost and enter http://localhost:8080/swagger.json.