API documentation
egenio FX serves official daily exchange rates from Latin American central banks and tax authorities, and the ECB, through one HTTPS API with consistent JSON.
| Base URL | https://api.egenio.net |
|---|---|
| Format | JSON (UTF-8); CSV for the F&O endpoint on request |
| Dates | YYYY-MM-DD |
| Rates | Text, exactly as published (e.g. "17.7100"), never rounded. Each rate is units of the currency per 1 unit of the base. |
Authentication
Every /v1 request needs an API key. Send your key in the X-API-Key header:
curl -H "X-API-Key: fx_your_key_here" https://api.egenio.net/v1/rates
For a quick test in a browser you may add ?api_key=… to the address instead; prefer the header in integrations, because addresses can end up in logs and browser history. Keep keys secret: anyone with your key can use your quota. Need a key? Get a free test key; lost one? Just create a new one. New free test keys are paused for now; keys you already have keep working.
X-API-Plan: no-key, and X-API-Key-Warning if you sent a key we don't recognise. A revoked key is always refused with 401. Several people behind the same office network share one address and its daily limit, so use a key for anything regular.
curl https://api.egenio.net/v1/rates?currencies=MXN,BRL
Try it
Enter your API key, pick an endpoint and options, and send a real request. Your key stays in this page: it is sent only to api.egenio.net in the X-API-Key header and is not saved anywhere. Each request counts toward your limit. No key? Leave the field empty to use the no-key access level.
Latest & daily rates
All rates for one day: each currency's most recent official rate on or before date.
| Parameter | Default | Description |
|---|---|---|
date | latest day | The day you need the rates for. |
currencies | all | Only these currencies: one code, or several separated by commas, e.g. MXN or MXN,BRL,COP. |
base | USD | USD for Latin American currencies, EUR for ECB reference rates. |
GET /v1/rates?date=2026-09-28
{
"date": "2026-09-28",
"base": "USD",
"rates": [
{ "currency": "BRL", "rate": "5.30160", "rate_date": "2026-09-28", "source": "BCB" },
{ "currency": "MXN", "rate": "17.7100", "rate_date": "2026-09-28", "source": "Banxico" }
]
}
rate_date is the day the rate was published for. It can be earlier than date on weekends and holidays (see below).
Some currencies: latest rate or a specific date
Add currencies with one code, or several separated by commas (currencies=MXN,BRL,COP). Leave out date for the latest rate, or add it for the rate in effect on that day (on a weekend or holiday, the previous business day's rate).
# Latest USD→MXN rate curl -H "X-API-Key: fx_your_key_here" \ "https://api.egenio.net/v1/rates?currencies=MXN" # USD→MXN rate for 28 September 2026 curl -H "X-API-Key: fx_your_key_here" \ "https://api.egenio.net/v1/rates?currencies=MXN&date=2026-09-28" # Mexican peso, Brazilian real and Colombian peso for 28 September 2026 curl -H "X-API-Key: fx_your_key_here" \ "https://api.egenio.net/v1/rates?currencies=MXN,BRL,COP&date=2026-09-28"
{
"date": "2026-09-28",
"base": "USD",
"rates": [
{ "currency": "MXN", "rate": "17.7100", "rate_date": "2026-09-28", "source": "Banxico" }
]
}
With one currency, the rate is at rates[0].rate; with several, rates has one entry per currency, in alphabetical order. Other examples: euro to Brazilian real with base=EUR¤cies=BRL; for a quick look in a browser, https://api.egenio.net/v1/rates?currencies=MXN&api_key=fx_your_key_here.
In Power Automate: an HTTP action with method GET, the address above and the X-API-Key header; then use the expression body('HTTP')?['rates']?[0]?['rate'] wherever you need the rate (wrap it in float(…) for calculations).
In Excel: Data → From Web → Advanced, enter the address and add the header X-API-Key; Power Query turns the reply into a table.
History
One currency, one rate per published day, oldest first.
| Parameter | Default | Description |
|---|---|---|
from | 30 days before to | First day. |
to | latest day | Last day. At most 1,830 days per request. |
base | USD | Base currency. |
GET /v1/rates/MXN?from=2026-09-24&to=2026-09-30
{
"base": "USD", "currency": "MXN", "from": "2026-09-24", "to": "2026-09-30",
"rates": [
{ "date": "2026-09-24", "rate": "17.5030", "source": "Banxico" },
…
]
}
Dynamics 365 Finance & Operations
Rows named like the Exchange rates data entity (ExchangeRates). EndDate is omitted: F&O sets it from the next rate's start date.
| Parameter | Default | Description |
|---|---|---|
from, to | latest day only | Date range. |
currencies | all | Comma-separated, e.g. MXN,BRL. |
base | USD | Becomes FromCurrency. |
rate_type | Default | Your F&O exchange rate type (up to 20 letters, digits, spaces or . - _ / & ( )). |
format | json | json (OData style) or csv (file download). |
GET /v1/fo/exchange-rates?from=2026-09-28&to=2026-09-28¤cies=MXN&rate_type=Default
{
"value": [{
"RateTypeName": "Default", "FromCurrency": "USD", "ToCurrency": "MXN",
"StartDate": "2026-09-28T00:00:00Z", "Rate": "17.7100", "ConversionFactor": "One"
}]
}
With Power Automate
Download our sample solution and import it into the Power Platform environment linked to F&O. It contains one cloud flow that runs twice a day, reads the last 7 days of rates from egenio FX, skips the rates F&O already has, and creates the rest in the ExchangeRates entity. It signs in to F&O with the standard Fin & Ops Apps connector, so no Azure app registration is needed. If a run fails, it emails you which step failed and why; while you test, it can also email a summary after every successful run.
Download sample solution (.zip)
Technical details: what the flow does
The solution egenioFXRates 1.2.2.0 is unmanaged, with publisher prefix egfx. It contains one cloud flow, egenio FX - Import exchange rates into FO, 6 environment variables and two connection references (Fin & Ops Apps (Dynamics 365) and Office 365 Outlook). It adds no tables or security roles.
Steps
- Trigger: twice a day, at 13:00 and 20:00 UTC. Each run looks back 7 days, so rates published late are not missed.
- Try (scope):
- FO_address: the F&O host name as the connector expects it (
https://, a trailing/and anything after it are removed, so a URL copied from the browser works). - Get_rates_from_egenio_FX (HTTP):
GET /v1/fo/exchange-ratesfor the last 7 days, with your currencies and theX-API-Keyheader. - Parse_rates: reads the rows (
FromCurrency,ToCurrency,StartDate,Rate). - Get_existing_rates_from_FO (Fin & Ops Apps, List items present in table): the
ExchangeRatesof your rate type, from USD, of the last 8 days. - Existing_keys and New_rates: keep only the rates F&O does not have yet (key
CURRENCY|YYYY-MM-DD), so running again never creates duplicates. - For_each_new_rate (Fin & Ops Apps, Create record): adds each new rate to
ExchangeRates, one at a time, with your exchange rate type andConversionFactorOne. - Summary: “Rates received: X. Already in F&O: Y. Created: Z.”
- FO_address: the F&O host name as the connector expects it (
- Catch (scope, runs only if a step in Try failed or timed out): lists the failed steps with their status and error message, emails them to the notification address with a link to the run, then ends the run as Failed so it stays red in the run history.
- Email_on_success: if Email on success is Yes, emails the summary after a successful run.
The call to egenio FX retries up to 4 times with growing waits (from 30 seconds), and its inputs, including the API key, are hidden in the run history.
Environment variables
| Schema name | Type | Default | Used for |
|---|---|---|---|
egfx_ApiKey | Text | egenio FX API key | |
egfx_FinOpsUrl | Text | F&O environment URL | |
egfx_RateType | Text | Default | F&O exchange rate type to fill |
egfx_Currencies | Text | MXN,BRL,ARS,CLP,COP,PEN | Currencies to import against USD |
egfx_NotifyEmail | Text | Who gets the emails | |
egfx_NotifyOnSuccess | Yes/No | Yes | Also email after successful runs |
Good to know
- The rates are created as the user of the Fin & Ops Apps connection; F&O shows that user as their creator.
- Only rates from USD are imported and checked for duplicates.
- A rate that is already in F&O is never changed, even if the source corrects it later.
- If the Outlook connection itself fails, the run still ends as Failed, so it shows in the run history.
Before you import
- Get an egenio FX API key (a free test key is fine to start).
- Choose the F&O account the flow will work as: a user (ideally a service account) who may maintain exchange rates.
- Make sure the exchange rate type (e.g.
Default) and the currencies exist in F&O. - Pick the Office 365 mailbox that will send the flow's emails (a shared or service mailbox works well).
Import
- In Power Apps → Solutions → Import solution, choose the downloaded zip.
- When asked for connections, create or pick a Fin & Ops Apps (Dynamics 365) connection, signed in as that F&O account, and an Office 365 Outlook connection for that mailbox.
- Fill in the environment variables when asked:
Variable Example egenio FX API key fx_…FO environment URL https://contoso.operations.dynamics.comExchange rate type DefaultCurrencies MXN,BRL,ARS,CLP,COP,PENNotification email [email protected](several: separate with;)Email on success Yes while testing, No later (failures are always emailed) - Open the flow egenio FX - Import exchange rates into FO, run it once with Test → Manually, then turn it on. It is imported turned off.
The flow uses the premium HTTP action and the premium Fin & Ops Apps connector, so its owner needs a Power Automate premium license. Building it yourself instead? The steps are: Recurrence → HTTP GET /v1/fo/exchange-rates with the X-API-Key header → Parse JSON → Apply to each over value → Fin & Ops Apps Create record in ExchangeRates.
With Data management (CSV)
- Download
/v1/fo/exchange-rates?from=…&to=…&format=csv. - In F&O: Data management → Import, entity Exchange rates, source format CSV. Columns map automatically.
- Dates are
YYYY-MM-DD; if your source data format expects another date format, adjust it there.
Always test the import in a sandbox first.
Sources & conventions
| Country | Pair | Source & rate | Dated |
|---|---|---|---|
| 🇲🇽 Mexico | USD/MXN | Banxico FIX | On its DOF publication day (the business day after Banxico determines it): Friday's FIX is Monday's rate. |
| 🇧🇷 Brazil | USD/BRL | BCB PTAX, sell rate (venda), closing bulletin | Brazilian business days. |
| 🇦🇷 Argentina | USD/ARS | BCRA, Estadísticas Cambiarias | Argentine business days. |
| 🇨🇱 Chile | USD/CLP | Banco Central de Chile, dólar observado | Chilean business days. |
| 🇨🇴 Colombia | USD/COP | TRM (Superintendencia Financiera) | Every calendar day it is valid for, weekends included. |
| 🇵🇪 Peru | USD/PEN | SUNAT official rate, sell (venta) | SUNAT's date. History from October 2026. |
| 🇵🇾 Paraguay | USD/PYG, EUR/PYG | Banco Central del Paraguay (BCP), reference interbank rate | Paraguayan business days. |
| 🇺🇾 Uruguay | USD/UYU, EUR/UYU | Banco Central del Uruguay (BCU): "dólar billete" and BCU's euro rate, sell | BCU's date (the day the rate closed), Uruguayan business days. |
| 🇨🇷 Costa Rica | USD/CRC | Banco Central de Costa Rica (BCCR), reference rate, sell (venta) | Every calendar day BCCR lists, weekends included. |
| 🇧🇴 Bolivia | USD/BOB | Banco Central de Bolivia (source BCBO), official rate; before July 2026 the official sell rate | Bolivian business days. |
| 🇪🇺 Euro | EUR/USD, EUR/MXN, EUR/BRL… | ECB euro reference rates (base EUR, ~30 currencies) | TARGET business days. |
Sources are checked every hour; recent days are re-checked so corrections are picked up. Rates are never computed or inverted: what you get is what the authority published.
Weekends & holidays
Most authorities publish nothing on weekends and holidays. /v1/rates then returns each currency's most recent rate (at most 10 days old) and shows its rate_date. This follows the usual rule (e.g. SUNAT's) of using the previous business day's rate. The history and F&O endpoints list only published days; F&O keeps each rate in effect until the next one.
Service endpoints
Two public addresses that need no API key, both plain text or JSON for tools rather than pages to read:
| Address | What it is |
|---|---|
/health | Service status for uptime monitors: {"status": "ok", "version": "…"}. |
/.well-known/security.txt | How to report a security issue privately (the security.txt standard). |
Errors
Errors return JSON: {"error": "explanation"}.
| Status | Meaning |
|---|---|
400 | A parameter is invalid (date format, currency code, range too long…). |
401 | Revoked API key. When access without a key is switched off, also a missing or unknown key. |
403 | The date is outside the history your key allows. |
404 | No rates stored for that request. |
429 | Too many requests: your key's monthly limit, the daily limit without a key, or too many requests per minute (see Retry-After). |
500 | Something went wrong on our side. Please retry later. |
Limits
Access is free during testing. Each key has an access level with a monthly request limit and a history window:
| Access level | Requests / month | History via date / from |
|---|---|---|
| free | 500 | last 7 days |
| starter | 5,000 | last 730 days |
| business | 50,000 | unlimited |
| partner | 250,000 | unlimited |
| No key | 250 per day, per IP address | last 7 days |
Every response includes X-RateLimit-Limit and X-RateLimit-Remaining for the month (for the day, without a key). Separately, each client address may make up to 300 requests per minute, and addresses sending many invalid keys are paused for a minute.
FAQ
Why is rate_date different from date?
On weekends and holidays no new rate is published, so you get the latest published one, and rate_date tells you which day it is from.
Why do rates have different numbers of decimals?
Each authority publishes its own precision (Banxico 4, PTAX 4–5, SUNAT 3…). We keep it exactly. Round in your system if you need to.
How do I get USD→EUR?
The ECB publishes EUR→USD. Use base=EUR. Most ERPs, including F&O, can use the reverse direction of a rate.
Can I use this in production?
Not yet: it is a test service without guarantees. Use it for evaluation, and verify against official sources.
How do I report a security issue?
See security.txt for the private reporting channel.