# Migrate from CurrencyAPI

> Move a currencyapi.com v3 integration to CurrencyCore: apikey to bearer auth, latest, historical, convert and range mapping, response envelope changes, and cutover checks.

Canonical: https://currency-core.com/docs/guides/migrate-currencyapi/
Updated: 2026-11-11
Published: 2026-11-11

---
currencyapi.com authenticates with an `apikey` header or query parameter and wraps every response in a `data` object. CurrencyCore uses a bearer header and returns either a flat `rates` map or a `results` array. Currency codes and decimal arithmetic survive the move; key placement and response unwrapping do not.

Public currencyapi.com pricing and coverage below were checked on **2026-11-10**. Verify the vendor's current plan before you budget.

## What changes at a glance

| Area | currencyapi.com | CurrencyCore |
|---|---|---|
| Currencies | 171 fiat, plus 16 crypto and 4 metals | 160 fiat currencies |
| History | Daily history back to 1999 on every plan | 1949 parity for GBP/USD and USD/INR, daily majors from 1971, EUR pairs from 1999; Free has the last 30 days |
| Free quota | 300 requests/mo, private use, 10 requests/min | 1,000 requests/mo, 60/min |
| Entry paid plan | Small, $12.99/mo billed monthly for 15,000 requests | Starter, $9/mo for 50,000 requests, full history |
| Auth | `apikey` header or query parameter | `Authorization: Bearer` or `x-api-key` |
| Base | Any supported currency, USD by default | Base in the path, for example `/v1/rates/EUR` |
| Cadence | Daily on Free, hourly on Small, 15 minutes on Pro, 60 seconds from Medium | Central-bank reference rates polled hourly, daily fixings |
| Conversion | Starts on Small; not included on Free | `/v1/convert` on every plan |
| Analytics | OHLC, fluctuation, averages, and official central bank rates | Volatility, correlation, drawdown, safe haven, and more on Growth |

## 1. Move the key out of the URL

```bash
# Before
curl "https://api.currencyapi.com/v3/latest?apikey=YOUR_KEY&base_currency=USD&currencies=EUR,INR"

# After
curl "https://api.currency-core.com/v1/rates/USD" \
  -H "Authorization: Bearer cc_test_your_key"
```

currencyapi.com accepts the key in an `apikey` header or query parameter. CurrencyCore accepts only headers. Remove the query form from URLs and logs, and use a test key until the integration is stable.

## 2. Map endpoints

| currencyapi.com | CurrencyCore | Note |
|---|---|---|
| `/v3/latest?base_currency=USD&currencies=EUR,INR` | `/v1/rates/USD` | No `currencies` filter; read the codes you need from `rates` |
| `/v3/historical?date=2026-11-10&base_currency=USD` | `/v1/rates/USD?date=2026-11-10` | One dated snapshot |
| `/v3/convert?value=100&from=USD&to=INR` | `/v1/convert?from=USD&to=INR&amount=100` | `value` becomes `amount` |
| `/v3/range?datetime_start=&datetime_end=&base_currency=USD` | `/v1/history?currency=INR&base=USD&from=&to=` | One currency per call, inclusive UTC dates |

The base code stays; only its location changes: `base_currency` becomes the path segment on `/v1/rates` or the `base` parameter on `/v1/history`.

## 3. Unwrap the v3 envelope

A currencyapi.com latest response nests one object per code:

```json
{
  "meta": { "last_updated_at": "2026-11-10T23:59:59Z" },
  "data": {
    "EUR": { "code": "EUR", "value": 0.8924 },
    "INR": { "code": "INR", "value": 94.13 }
  }
}
```

CurrencyCore returns a flat map:

```json
{ "base": "USD", "date": "2026-11-10", "rates": { "USD": 1, "EUR": 0.8924, "INR": 94.13 } }
```

For conversions, v3 returns `data` keyed by target with a `value`. CurrencyCore returns a `results` array with `to`, `result`, and `rate`. For range requests, v3 returns a date-keyed `data` object; `/v1/history` returns a date-keyed `rates` map of numbers. Update the readers, not the rounding rules. `meta.last_updated_at` has no direct equivalent; use `date`, plus `asOf` on dated reads.

## 4. Cut over

1. Inventory every `apikey` usage, including query strings in cron jobs and notebooks.
2. Create a CurrencyCore organization and a `cc_test_` key.
3. Map `/v3/latest` to `/v1/rates/{base}` and filter codes locally.
4. Map `/v3/convert` to `/v1/convert` and read `results[0].result`.
5. Map `/v3/range` to `/v1/history`, one currency per call.
6. Run both APIs for a day and compare the same dates, including a weekend.
7. Watch `401`, `403` on the Free history window, and `429`, then revoke the old key.

## When CurrencyAPI is the better fit

currencyapi.com includes daily history back to 1999 on its 300-request Free tier, which is simpler if deep history on a tiny quota is the main requirement. It also covers 16 crypto and 4 metals, while CurrencyCore is fiat only, and sells 60-second updates from Medium. Stay if you need those assets, that cadence, or the dashboard. Move for PPP, 1949 parity, or Growth analytics.

## Related

- [API reference](/docs/api/)
- [OpenAPI specification](/docs/openapi/)
- [Authentication](/docs/authentication/)
- [Errors](/docs/errors/)
- [All guides](/docs/guides/)
- [Provider-neutral migration checklist](/docs/guides/migration/)
