{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreifxwy5bogimrqd34v47ncpg3dwlsc6yrqxh6wo2u73sgs5jnhlfny",
    "uri": "at://did:plc:25rdn5elo5izoxrmtis34zuk/app.bsky.feed.post/3mopkvqhppaq2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreigz5c35ccdmukuodbka2vjvd5r5d5d4x7bv5gssfw2v6uluanos2u"
    },
    "mimeType": "image/webp",
    "size": 222846
  },
  "path": "/oleksandr_kaiukov_63f3e92/i-built-a-free-currency-converter-api-no-api-key-no-signup-k0m",
  "publishedAt": "2026-06-20T09:07:25.000Z",
  "site": "https://dev.to",
  "tags": [
    "api",
    "currency",
    "webdev",
    "opensource",
    "currencyexchangetool.com/api-docs",
    "currencyexchangetool.com",
    "github.com/Kaiukov/currency-converter-vercel"
  ],
  "textContent": "I needed a simple exchange rate API for my currency converter project, but all the popular ones (XE, OANDA, CurrencyLayer, Fixer.io) require signup, an API key, or a credit card. Some cap you at 100 requests per month. Others return data cached yesterday.\n\nSo I built my own — and made it completely public.\n\n**→ Try it now: currencyexchangetool.com/api-docs**\n\nNo signup. No API key. No monthly cap. Just make a GET request.\n\n##  What It Does\n\nThe API provides live exchange rates for 100+ currencies, including major, emerging-market, and cross-rate pairs. Rates are fetched live from Yahoo Finance on each request — you always get the current rate, not cached data.\n\nIt is rate-limited per IP (not per account): 100 requests/minute for convert and currencies, 30 requests/minute for history. There is no monthly cap and no key to manage.\n\n###  Endpoints\n\n\n    # Convert 100 USD to EUR\n    GET /api/v1/convert?from=USD&to=EUR&amount=100\n\n    # List supported currencies\n    GET /api/v1/currencies\n\n    # Historical data — last N days, a single date, or a range (max 365 days)\n    GET /api/v1/history?from=USD&to=UAH&days=7\n    GET /api/v1/history?from=USD&to=UAH&date=2026-05-01\n    GET /api/v1/history?from=USD&to=UAH&start_date=2026-04-01&end_date=2026-05-28\n\n\n###  Quick Start — cURL\n\n\n    curl -s \"https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=UAH\"\n\n\n###  Quick Start — Python\n\n\n    import requests\n\n    res = requests.get(\n        'https://www.currencyexchangetool.com/api/v1/convert',\n        params={'amount': 100, 'from': 'USD', 'to': 'UAH'}\n    )\n    data = res.json()\n    print(f\"100 USD = {data['result']} UAH\")\n\n\n###  Quick Start — JavaScript\n\n\n    const res = await fetch(\n      'https://www.currencyexchangetool.com/api/v1/convert?amount=100&from=USD&to=UAH'\n    );\n    const data = await res.json();\n    console.log(`100 USD = ${data.result} UAH`);\n\n\n###  Quick Start — Go\n\n\n    package main\n\n    import (\n        \"encoding/json\"\n        \"fmt\"\n        \"net/http\"\n        \"net/url\"\n    )\n\n    func main() {\n        params := url.Values{}\n        params.Add(\"amount\", \"100\")\n        params.Add(\"from\", \"USD\")\n        params.Add(\"to\", \"UAH\")\n\n        resp, _ := http.Get(\n            \"https://www.currencyexchangetool.com/api/v1/convert?\" + params.Encode(),\n        )\n        defer resp.Body.Close()\n\n        var data map[string]any\n        json.NewDecoder(resp.Body).Decode(&data)\n        fmt.Printf(\"100 USD = %v UAH\\n\", data[\"result\"])\n    }\n\n\n###  Quick Start — PHP\n\n\n    <?php\n    $response = file_get_contents(\n        'https://www.currencyexchangetool.com/api/v1/convert?' .\n        http_build_query(['amount' => 100, 'from' => 'USD', 'to' => 'UAH'])\n    );\n    $data = json_decode($response, true);\n    echo \"100 USD = {$data['result']} UAH\";\n    ?>\n\n\n###  Google Sheets — IMPORTXML\n\nAdd `format=xml` for Google Sheets compatibility:\n\n\n\n    =VALUE(IMPORTXML(\n      \"https://www.currencyexchangetool.com/api/v1/convert?amount=1&from=USD&to=EUR&format=xml\",\n      \"/response/rate\"\n    ))\n\n\n##  How It Compares to Other Free Currency APIs\n\nAPI | API Key | Signup | Currencies | Free Limit | Updates\n---|---|---|---|---|---\n**Currency Exchange Tool** ⭐ | No | No | 100+ | 100/min, no monthly cap | Live\nFrankfurter | No | No | ~30 (ECB) | Unlimited | Daily\nMoneyConvert | No | No | 182+ | Rate-limited | 5 min\nExchangeRate-API (Open) | No | No | 160+ | Rate-limited | Daily\nExchangeRate-API (Free) | Yes | Yes | 160+ | 1,500/mo | Daily\nFreeCurrencyAPI | Yes | Yes | 32 | 1,000/mo | Daily\nOpen Exchange Rates | Yes | Yes | 170+ | 1,000/mo | Hourly\nFixer.io | Yes | Yes | 170+ | 100/mo | Daily\nCurrencyAPI.net | Yes | Yes | 300+ | 500/mo | Daily\n\n**Key insight:** Our API is the only one that combines **no API key** , **no signup** , **no monthly cap** , live rates, and **100+ currencies**.\n\n##  Why \"No API Key\" Matters\n\n  1. **Prototyping:** No need to stop coding and fill out a registration form\n  2. **Open source:** You can commit working examples without exposing API keys\n  3. **CI/CD:** No env variables to configure in every pipeline\n  4. **Education:** Every student can follow along without their own key\n  5. **Hackathons:** Zero setup friction — just write code\n\n\n\n##  Response Format\n\nAll endpoints return a consistent JSON envelope (or XML with `format=xml`):\n\n\n\n    {\n      \"success\": true,\n      \"from\": \"USD\",\n      \"to\": \"EUR\",\n      \"amount\": 100,\n      \"rate\": 0.9234,\n      \"result\": 92.34,\n      \"change24h\": -0.0002,\n      \"changePct24h\": -0.0229,\n      \"updatedAt\": \"2026-06-08T12:00:00.000Z\"\n    }\n\n\nError responses are predictable:\n\n\n\n    {\n      \"success\": false,\n      \"error\": \"Unsupported currency\",\n      \"code\": \"unsupported_currency\"\n    }\n\n\nWhen you exceed the rate limit you get HTTP 429 with a `Retry-After` header, and every response carries `X-RateLimit-Limit` / `X-RateLimit-Remaining` so you can back off early.\n\n##  Production Features\n\n  * **CORS enabled** — `Access-Control-Allow-Origin: *` on every endpoint, with OPTIONS preflight\n  * **Rate limit headers** — X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset\n  * **XML output** — `format=xml` for Google Sheets integration\n  * **Historical data** — Up to 365 days of daily rates\n  * **SSL/HTTPS** — Every request is encrypted\n\n\n\n##  Who This Is For\n\n  * **Side projects & MVPs** — Get building in seconds, not minutes\n  * **E-commerce** — Display prices in local currencies\n  * **Fintech dashboards** — Live rate widgets without auth complexity\n  * **AI assistants** — Simple REST endpoint for currency queries\n  * **Google Sheets users** — Pull live rates into spreadsheets\n  * **Students** — Learn REST API integration with a no-friction endpoint\n\n\n\n##  Tech Stack\n\nBuilt with Next.js API routes running on Vercel. No backend database — rates are fetched on-demand from Yahoo Finance. The main site (a currency converter) and the API share the same infrastructure, keeping operational costs near zero.\n\n##  Give It a Try\n\nThe API is live and running right now:\n\n\n\n    curl -s \"https://www.currencyexchangetool.com/api/v1/convert?amount=1&from=USD&to=EUR\"\n\n\nNo signup, no API key — it just works.\n\n**Documentation:** currencyexchangetool.com/api-docs\n\n**Main site:** currencyexchangetool.com\n\n**GitHub:** github.com/Kaiukov/currency-converter-vercel\n\n_Feedback welcome! Open an issue on GitHub or leave a comment below. If you find this useful, a quick star on GitHub helps others discover it._",
  "title": "I Built a Free Currency Converter API — No API Key, No Signup"
}