{"info":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","description":"<html><head></head><body><h1 id=\"currencyfreaks-api-v20\">CurrencyFreaks API v2.0</h1>\n<p>The official Postman collection for the <strong>CurrencyFreaks</strong> exchange-rate API — live and\nhistorical rates for around 1026 currencies, covering fiat, cryptocurrencies and precious\nmetals, with history reaching back to 1984 for major pairs.</p>\n<ul>\n<li><strong>Documentation</strong> — <a href=\"https://currencyfreaks.com/documentation\">https://currencyfreaks.com/documentation</a></li>\n<li><strong>Sign up (free, no card required)</strong> — <a href=\"https://currencyfreaks.com/signup\">https://currencyfreaks.com/signup</a></li>\n<li><strong>Pricing and plans</strong> — <a href=\"https://currencyfreaks.com/pricing\">https://currencyfreaks.com/pricing</a></li>\n<li><strong>Support</strong> — <a href=\"mailto:support@currencyfreaks.com\">support@currencyfreaks.com</a></li>\n</ul>\n<h2 id=\"get-your-first-200-ok\">Get your first 200 OK</h2>\n<ol>\n<li>Open the folder <strong>01 — Metadata</strong>. Those three requests need no API key, so you can\nsend one right now.</li>\n<li><a href=\"https://currencyfreaks.com/signup\">Create a free account</a> and copy your key from the\ndashboard.</li>\n<li>Set the <code>apikey</code> collection variable to your key — paste it into the <strong>Current value</strong>\ncolumn.</li>\n<li>Send <strong>02 — Latest Rates → Latest Rates — filtered by symbols</strong>.</li>\n</ol>\n<p>Authentication is configured once at collection level, as an API key in the query string\nnamed <code>apikey</code>, and every request inherits it. There is no header-based alternative.</p>\n<h2 id=\"variables\">Variables</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>Default</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>baseUrl</code></td>\n<td><code>https://api.currencyfreaks.com/v2.0</code></td>\n<td>API root</td>\n</tr>\n<tr>\n<td><code>apikey</code></td>\n<td><code>YOUR_APIKEY</code></td>\n<td>Your API key. Paste into <strong>Current value</strong> so it stays local to you.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"whats-included\">What's included</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Folder</th>\n<th>Contents</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>01 — Metadata</td>\n<td>Currency catalogue, display names, historical coverage. No key needed.</td>\n</tr>\n<tr>\n<td>02 — Latest Rates</td>\n<td>Current rates, symbol filtering, custom base, XML</td>\n</tr>\n<tr>\n<td>03 — Conversion</td>\n<td>Convert an amount at current or past rates</td>\n</tr>\n<tr>\n<td>04 — Historical Rates</td>\n<td>Single date, daily time series, period fluctuation</td>\n</tr>\n<tr>\n<td>05 — IP to Currency</td>\n<td>Localise prices from a visitor's IP address</td>\n</tr>\n<tr>\n<td>06 — Error Handling</td>\n<td>Deliberate failures showing the error envelope</td>\n</tr>\n</tbody>\n</table>\n</div><p>Every request carries tests, so you can run the whole collection in the Collection Runner\nor via Newman and confirm your integration end to end.</p>\n<h2 id=\"plans\">Plans</h2>\n<p>Endpoint availability depends on your subscription. A request outside your plan returns\n<code>402</code> with <code>This feature is available on {PLAN_NAME} plan and onwards!</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Tier</th>\n<th>Unlocks</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No key</td>\n<td><code>/supported-currencies</code>, <code>/currency-symbols</code>, <code>/historical-data-limits</code></td>\n</tr>\n<tr>\n<td>Free</td>\n<td><code>/rates/latest</code></td>\n</tr>\n<tr>\n<td>Any paid plan</td>\n<td><code>base</code> parameter, <code>/convert/latest</code>, <code>/rates/historical</code>, <code>/convert/historical</code></td>\n</tr>\n<tr>\n<td>Growth and above</td>\n<td><code>/iptocurrency</code></td>\n</tr>\n<tr>\n<td>Professional and above</td>\n<td><code>/timeseries</code>, <code>/fluctuation</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>See <a href=\"https://currencyfreaks.com/pricing\">pricing</a> for request quotas.</p>\n<h2 id=\"integration-notes\">Integration notes</h2>\n<p><strong>All numeric values are strings.</strong> Rates, amounts and percentages are JSON-encoded as\nstrings to preserve full precision. Parse them into a decimal type rather than a float,\nparticularly for financial calculations.</p>\n<p><strong><code>/supported-currencies</code> is authoritative.</strong> Filter on <code>status == \"AVAILABLE\"</code> to\ndetermine what you can query. Use <code>/currency-symbols</code> for display labels only.</p>\n<p><strong>Check coverage before querying history.</strong> Depth varies by currency, so call\n<code>/historical-data-limits</code> rather than assuming a start date.</p>\n<p><strong>Filter with <code>symbols</code>.</strong> An unfiltered response spans every available currency. Passing\n<code>symbols</code> reduces both payload size and latency.</p>\n<p><strong>Quotas are monthly, not per-second.</strong> There are no hourly or daily throttles, so a <code>429</code>\nmeans your plan quota is exhausted and retrying will not help. We email at 80%, 90% and\n100% usage on paid plans.</p>\n<p><strong>Call the API server-side.</strong> Because the key travels in the query string, requests should\noriginate from your backend, not from browser JavaScript. Proxy through your own endpoint\nand keep the key on your server.</p>\n<p><strong>JSON is recommended for cryptocurrency symbol sets.</strong> XML element names derive from\ncurrency codes, and codes containing characters that are invalid in XML names are\nnormalised. See the XML request in folder 02 for details.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"CurrencyFreaks API v2.0","slug":"currencyfreaks-api-v20"}],"owner":"57124893","collectionId":"eb48304d-2cb0-40ba-92c1-1906e43be64c","publishedId":"2sBY4TryiX","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"008080"},"publishDate":"2026-08-04T15:14:33.000Z"},"item":[{"name":"01 — Metadata (no API key required)","item":[{"name":"Supported Currencies","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const m = pm.response.json().supportedCurrenciesMap;","pm.test('Catalogue is populated', () => pm.expect(Object.keys(m).length).to.be.above(500));","pm.test('Status is AVAILABLE or DEPRECIATED', () => {","    Object.values(m).forEach(c =>","        pm.expect(['AVAILABLE','DEPRECIATED']).to.include(c.status));","});","const avail = Object.keys(m).filter(k => m[k].status === 'AVAILABLE');","pm.collectionVariables.set('availableCount', avail.length);","console.log('Available currencies:', avail.length);"],"id":"d58d0a4c-84bf-40fb-accd-73783ae35460"}}],"id":"c87f32de-051e-46c6-ae93-5ddfdd8f5fde","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/supported-currencies","description":"<p>The full CurrencyFreaks catalogue: currency code, name, country, coverage window, icon, and an <code>AVAILABLE</code> or <code>DEPRECIATED</code> status.</p>\n<p><strong>Use this endpoint as your source of truth.</strong> Filter on <code>status == \"AVAILABLE\"</code> to get the set of currencies that are actively updated. <code>DEPRECIATED</code> currencies stopped updating at their <code>availableUntil</code> date and remain queryable only for historical dates.</p>\n<p>As of August 2026 the catalogue holds roughly 1100 entries — about 1026 available — comprising ~185 fiat currencies, 837 cryptocurrencies and 4 precious metals.</p>\n<p>Crypto entries carry a <code>countryCode</code> of <code>Crypto</code> and metals carry <code>Metal</code>; both use a <code>countryName</code> of <code>Global</code>.</p>\n<p>The response is around 260 KB. Cache it on your side rather than calling it per request.</p>\n","urlObject":{"path":["supported-currencies"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"1afe5822-4599-4c3d-a1db-392083f653a1","name":"200 — truncated","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"supportedCurrenciesMap\": {\n    \"PKR\": {\n      \"currencyCode\": \"PKR\",\n      \"currencyName\": \"Pakistani Rupee\",\n      \"countryCode\": \"PK\",\n      \"countryName\": \"Pakistan\",\n      \"status\": \"AVAILABLE\",\n      \"availableFrom\": \"1985-10-02\",\n      \"availableUntil\": \"2026-08-04\",\n      \"icon\": \"https://currencyfreaks.com/photos/flags/pkr.png\"\n    },\n    \"BTC\": {\n      \"currencyCode\": \"BTC\",\n      \"currencyName\": \"Bitcoin\",\n      \"countryCode\": \"Crypto\",\n      \"countryName\": \"Global\",\n      \"status\": \"AVAILABLE\",\n      \"availableFrom\": \"2013-01-07\",\n      \"availableUntil\": \"2026-08-04\",\n      \"icon\": \"https://currencyfreaks.com/photos/flags/btc.png\"\n    },\n    \"GBX\": {\n      \"currencyCode\": \"GBX\",\n      \"currencyName\": \"Penny Sterling\",\n      \"countryCode\": \"UK\",\n      \"countryName\": \"United Kingdom\",\n      \"status\": \"DEPRECIATED\",\n      \"availableFrom\": \"2021-04-05\",\n      \"availableUntil\": \"2023-03-15\",\n      \"icon\": \"https://currencyfreaks.com/photos/flags/gbx.png\"\n    }\n  }\n}"}],"_postman_id":"c87f32de-051e-46c6-ae93-5ddfdd8f5fde"},{"name":"Currency Symbols","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const s = pm.response.json().currencySymbols;","pm.test('Map is populated', () => pm.expect(Object.keys(s).length).to.be.above(500));","pm.test('Major fiat present', () => {","    ['USD','EUR','GBP','JPY'].forEach(c => pm.expect(s).to.have.property(c));","});"],"id":"aae9d7b6-cb8d-491d-acaa-b9ae644e4cda"}}],"id":"e87c4d4d-8a8f-48d7-886c-77fa86548bcd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/currency-symbols","description":"<p>A lightweight code-to-name map, around 21 KB versus 260 KB for <code>/supported-currencies</code>. No API key required.</p>\n<p>This endpoint is intended for populating display labels, dropdowns and pickers. For programmatic decisions about which currencies you can query — and for coverage dates and status — use <code>/supported-currencies</code>, which is authoritative and updated first.</p>\n","urlObject":{"path":["currency-symbols"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"9e39af6c-2522-4916-934a-e3bb26a4a086","name":"200 — truncated","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"currencySymbols\": {\n    \"USD\": \"US Dollar\",\n    \"EUR\": \"Euro\",\n    \"GBP\": \"Pound Sterling\",\n    \"PKR\": \"Pakistani Rupee\",\n    \"BTC\": \"Bitcoin\",\n    \"XAU\": \"Gold\"\n  }\n}"}],"_postman_id":"e87c4d4d-8a8f-48d7-886c-77fa86548bcd"},{"name":"Historical Data Limits","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const p = pm.response.json().availabilityPeriod;","pm.test('Windows parse as \"date to date\"', () => {","    Object.values(p).slice(0, 50).forEach(v =>","        pm.expect(v).to.match(/^\\d{4}-\\d{2}-\\d{2} to \\d{4}-\\d{2}-\\d{2}$/));","});","console.log('GBP coverage:', p.GBP);"],"id":"e95f66a0-dd32-46ee-bab4-2a4912898544"}}],"id":"bdabd108-c8bf-4b58-8c4b-0b1db3411193","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/historical-data-limits","description":"<p>The date range for which we hold rates for each currency, returned as the string <code>\"YYYY-MM-DD to YYYY-MM-DD\"</code>. Split on <code>\" to \"</code> to parse. No API key required.</p>\n<p>Call this before any historical query. Coverage varies widely by currency: our deepest history reaches 1984-11-28 for nine major currencies (AUD, CAD, CHF, DKK, GBP, JPY, NOK, SEK, USD), most other fiat begins 1989-08-18, and cryptocurrencies begin on their individual listing dates from 2013 onward.</p>\n","urlObject":{"path":["historical-data-limits"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"941f6d03-9092-4dce-8ce4-f1c4f75924a5","name":"200 — truncated","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"availabilityPeriod\": {\n    \"GBP\": \"1984-11-28 to 2026-08-04\",\n    \"FJD\": \"1989-08-18 to 2026-08-04\",\n    \"BTC\": \"2013-01-07 to 2026-08-04\",\n    \"AGLD\": \"2022-05-16 to 2026-08-04\"\n  }\n}"}],"_postman_id":"bdabd108-c8bf-4b58-8c4b-0b1db3411193"}],"id":"d2f7bc5d-e465-48f6-b660-c47c6aad610d","description":"<p>Catalogue and coverage endpoints. These need <strong>no API key</strong> and are available on every plan, so you can run them immediately after importing.</p>\n<p>Start here. <code>/supported-currencies</code> tells you which currencies you can query, and <code>/historical-data-limits</code> tells you how far back each one goes.</p>\n","_postman_id":"d2f7bc5d-e465-48f6-b660-c47c6aad610d","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}},{"name":"02 — Latest Rates","item":[{"name":"Latest Rates — all currencies","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has base and rates', () => {","    pm.expect(b).to.have.property('base');","    pm.expect(b).to.have.property('rates');","});","pm.test('Rates are strings, not numbers', () => {","    const first = Object.values(b.rates)[0];","    pm.expect(first).to.be.a('string');","});"],"id":"4b8bdb02-a786-4dd5-8a8e-1b2fff0351c7"}}],"id":"f58bba36-a4a0-4066-adfd-d4c961aa5327","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest","description":"<p>Every available currency against USD.</p>\n<p>This returns roughly 1026 rates. If you only need a handful, use the filtered request below — it is faster and lighter.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[],"_postman_id":"f58bba36-a4a0-4066-adfd-d4c961aa5327"},{"name":"Latest Rates — filtered by symbols","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has base and rates', () => {","    pm.expect(b).to.have.property('base');","    pm.expect(b).to.have.property('rates');","});","pm.test('Rates are strings, not numbers', () => {","    const first = Object.values(b.rates)[0];","    pm.expect(first).to.be.a('string');","});","pm.test('Only requested symbols returned', () => {","    pm.expect(Object.keys(b.rates).sort())","      .to.eql(['EUR','GBP','PKR','USD']);","});"],"id":"1ddb9880-c9d2-4a2d-8e28-0c1023c3c35d"}}],"id":"39ffee1c-df10-4382-a40a-9903640d5976","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest?symbols=USD,EUR,GBP,PKR","description":"<p>Restrict the response with <code>symbols</code> to reduce payload size and latency. This is the recommended pattern for production use.</p>\n<p>Currency codes are case-insensitive. Available on all plans, including Free.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"USD,EUR,GBP,PKR"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"66eefa60-4fcd-4a38-9116-8346850152ed","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2023-03-21 13:26:00+00\",\n  \"base\": \"USD\",\n  \"rates\": {\n    \"EUR\": \"0.9278605451274349\",\n    \"GBP\": \"0.8172754173817152\",\n    \"PKR\": \"281.6212943333344\",\n    \"USD\": \"1.0\"\n  }\n}"}],"_postman_id":"39ffee1c-df10-4382-a40a-9903640d5976"},{"name":"Latest Rates — custom base currency","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has base and rates', () => {","    pm.expect(b).to.have.property('base');","    pm.expect(b).to.have.property('rates');","});","pm.test('Rates are strings, not numbers', () => {","    const first = Object.values(b.rates)[0];","    pm.expect(first).to.be.a('string');","});","pm.test('Base echoed as requested', () => pm.expect(b.base).to.eql('EUR'));"],"id":"195f21fe-bb87-4bea-b27e-6c93cf3f7c76"}}],"id":"871251ad-daff-4488-8d3c-cc9f1457bff8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest?symbols=USD,GBP,PKR,INR&base=EUR","description":"<p>Re-quote rates against any currency using <code>base</code>.</p>\n<p>Available on paid plans. On the Free plan this returns <code>402 This feature is available on {PLAN_NAME} plan and onwards!</code></p>\n<p>Because rates are sourced against USD, a custom base is computed as a cross rate. For high-precision accounting, retrieve the USD legs and perform the division yourself with a decimal type.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"USD,GBP,PKR,INR"},{"description":{"content":"<p>Currency to quote rates against. Defaults to USD. Available on paid plans — sending this on the Free plan returns 402.</p>\n","type":"text/plain"},"key":"base","value":"EUR"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"352a875c-05a1-49b5-8511-0ce5802eaf35","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2023-03-21 13:29:00+00\",\n  \"base\": \"EUR\",\n  \"rates\": {\n    \"EUR\": \"1.0\",\n    \"GBP\": \"0.8810222794437683\",\n    \"PKR\": \"303.60317616075287\",\n    \"USD\": \"1.0780547579946744\"\n  }\n}"}],"_postman_id":"871251ad-daff-4488-8d3c-cc9f1457bff8"},{"name":"Latest Rates — XML response","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","pm.test('Content-Type is XML', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('xml'));"],"id":"40fffb7e-5418-4db3-ba3f-3031060092aa"}}],"id":"88bf2747-c15b-4afd-81a6-63f9d525d31b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest?symbols=USD,EUR,GBP&format=xml","description":"<p>Any endpoint accepts <code>format=xml</code>. The root element here is <code>&lt;LatestRatesResponse&gt;</code>.</p>\n<p>XML element names are derived from currency codes, so codes that are not valid XML names are normalised:</p>\n<ul>\n<li>Codes beginning with a digit receive a leading underscore — <code>1INCH</code> becomes <code>&lt;_1INCH&gt;</code>.</li>\n<li>Codes containing other non-alphanumeric characters, which occur among cryptocurrency tickers, are normalised by removing those characters. This is lossy, and in rare cases two distinct tickers can normalise to the same element name.</li>\n</ul>\n<p><strong>JSON is recommended when your symbol set includes cryptocurrencies.</strong> XML is fully reliable for fiat and metals, and for any explicitly filtered <code>symbols</code> list you control.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"USD,EUR,GBP"},{"description":{"content":"<p>Switch to XML.</p>\n","type":"text/plain"},"key":"format","value":"xml"}],"variable":[]}},"response":[],"_postman_id":"88bf2747-c15b-4afd-81a6-63f9d525d31b"}],"id":"c9bd4b37-23ae-4795-9c94-898634df3ed8","description":"<p>Current exchange rates, updated continuously. Available on every plan, including Free. The <code>base</code> parameter requires a paid plan.</p>\n<p>Rates are quoted against USD and re-based on request, so non-USD bases are derived as cross rates.</p>\n","_postman_id":"c9bd4b37-23ae-4795-9c94-898634df3ed8","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}},{"name":"03 — Conversion","item":[{"name":"Convert — latest rate","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has conversion fields', () => {","    ['from','to','rate','givenAmount','convertedAmount'].forEach(k =>","        pm.expect(b).to.have.property(k));","});","pm.test('convertedAmount = givenAmount * rate', () => {","    const expected = parseFloat(b.givenAmount) * parseFloat(b.rate);","    pm.expect(parseFloat(b.convertedAmount)).to.be.closeTo(expected, expected * 1e-6);","});"],"id":"668c6738-7e80-437f-9187-cdd9aeea29cb"}}],"id":"175d7d4c-b314-4813-a42e-24a0b6df6c44","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/convert/latest?from=USD&to=PKR&amount=500","description":"<p>Convert an amount at the current rate. Available on paid plans.</p>\n<p><code>amount</code> defaults to 1.0 and must be greater than zero. Every numeric field in the response, including <code>givenAmount</code>, is returned as a string to preserve precision.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["convert","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Currency to convert from. Required.</p>\n","type":"text/plain"},"key":"from","value":"USD"},{"description":{"content":"<p>Currency to convert to. Required.</p>\n","type":"text/plain"},"key":"to","value":"PKR"},{"description":{"content":"<p>Amount to convert. Defaults to 1.0. Must be greater than zero.</p>\n","type":"text/plain"},"key":"amount","value":"500"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"1537c1bb-23bb-4599-8bd4-d4ada09b69a1","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2023-03-21 15:22:00+00\",\n  \"from\": \"USD\",\n  \"to\": \"PKR\",\n  \"rate\": \"281.683\",\n  \"givenAmount\": \"500.0\",\n  \"convertedAmount\": \"140841.475\"\n}"}],"_postman_id":"175d7d4c-b314-4813-a42e-24a0b6df6c44"},{"name":"Convert — historical rate","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has conversion fields', () => {","    ['from','to','rate','givenAmount','convertedAmount'].forEach(k =>","        pm.expect(b).to.have.property(k));","});","pm.test('convertedAmount = givenAmount * rate', () => {","    const expected = parseFloat(b.givenAmount) * parseFloat(b.rate);","    pm.expect(parseFloat(b.convertedAmount)).to.be.closeTo(expected, expected * 1e-6);","});","pm.test('Date echoed without time component', () => pm.expect(b.date).to.match(/^\\d{4}-\\d{2}-\\d{2}$/));"],"id":"c1c9f330-4b9d-4bd1-b405-ac0062219593"}}],"id":"ddaa3a0c-a466-4845-8fc1-fa29f4fc8d7a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/convert/historical?date=2022-01-10&from=USD&to=PKR&amount=500","description":"<p>Convert an amount at the rate that applied on a past date. Available on paid plans.</p>\n<p>The response <code>date</code> echoes your <code>YYYY-MM-DD</code> with no time component. Confirm the date falls inside both currencies' coverage windows using <code>/historical-data-limits</code>, otherwise the request returns 404.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["convert","historical"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Past date, <code>YYYY-MM-DD</code>. Required.</p>\n","type":"text/plain"},"key":"date","value":"2022-01-10"},{"description":{"content":"<p>Currency to convert from. Required.</p>\n","type":"text/plain"},"key":"from","value":"USD"},{"description":{"content":"<p>Currency to convert to. Required.</p>\n","type":"text/plain"},"key":"to","value":"PKR"},{"description":{"content":"<p>Amount to convert. Defaults to 1.0. Must be greater than zero.</p>\n","type":"text/plain"},"key":"amount","value":"500"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"cfa33608-ae5c-4998-84af-dd296d9e7352","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2022-01-10\",\n  \"from\": \"USD\",\n  \"to\": \"PKR\",\n  \"rate\": \"176.750\",\n  \"givenAmount\": \"500.0\",\n  \"convertedAmount\": \"88375.000\"\n}"}],"_postman_id":"ddaa3a0c-a466-4845-8fc1-fa29f4fc8d7a"}],"id":"cfbf5eeb-9cef-4c2c-ba6e-022ac53051c4","description":"<p>Single-pair conversion for a given amount. Available on paid plans.</p>\n<p>If you convert many pairs against the same base, fetching rates once from <code>/rates/latest</code> and multiplying locally uses fewer requests against your monthly quota.</p>\n","_postman_id":"cfbf5eeb-9cef-4c2c-ba6e-022ac53051c4","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}},{"name":"04 — Historical Rates","item":[{"name":"Historical Rates — single date","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has base and rates', () => {","    pm.expect(b).to.have.property('base');","    pm.expect(b).to.have.property('rates');","});","pm.test('Rates are strings, not numbers', () => {","    const first = Object.values(b.rates)[0];","    pm.expect(first).to.be.a('string');","});","pm.test('Date echoed without time component', () => pm.expect(b.date).to.match(/^\\d{4}-\\d{2}-\\d{2}$/));"],"id":"1415db8b-897f-4a92-91d0-ce3a22142182"}}],"id":"7c849b8e-60a8-433a-9117-43adb3532b25","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/historical?date=2022-03-20&symbols=USD,EUR,GBP,PKR","description":"<p>End-of-day rates for one past date. Available on paid plans.</p>\n<p>A date outside a currency's coverage returns 404 naming the available window. A date we hold no data for at all returns <code>Rates of provided date {DATE} are not available in our database</code>.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["rates","historical"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Past date, <code>YYYY-MM-DD</code>. Required.</p>\n","type":"text/plain"},"key":"date","value":"2022-03-20"},{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"USD,EUR,GBP,PKR"},{"disabled":true,"description":{"content":"<p>Currency to quote rates against. Defaults to USD. Available on paid plans — sending this on the Free plan returns 402.</p>\n","type":"text/plain"},"key":"base","value":"EUR"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"9a461621-9e9c-4414-95c2-bb00e743fb36","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2022-03-20\",\n  \"base\": \"USD\",\n  \"rates\": {\n    \"FJD\": \"2.1176\",\n    \"MXN\": \"20.385892\",\n    \"ZAR\": \"14.9602\"\n  }\n}"}],"_postman_id":"7c849b8e-60a8-433a-9117-43adb3532b25"},{"name":"Time Series — daily rates over a range","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Series is a non-empty array', () => {","    pm.expect(b.historicalRatesList).to.be.an('array').that.is.not.empty;","});","pm.test('Dates are ascending and unique', () => {","    const d = b.historicalRatesList.map(x => x.date);","    pm.expect(d).to.eql([...d].sort());","    pm.expect(new Set(d).size).to.eql(d.length);","});"],"id":"c3a611a2-cd44-4c7f-b367-b36dd9c2eb1f"}}],"id":"1ec86286-f59e-488d-bacf-66f99b2641d7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/timeseries?startDate=2022-06-01&endDate=2022-06-07&symbols=USD,PKR&base=EUR","description":"<p>One rate set per day, ordered ascending under <code>historicalRatesList</code>. Requires the Professional plan or above.</p>\n<p>Constrain <code>symbols</code> for long ranges. An unfiltered multi-year request spans every available currency for every day in the range and produces a very large response.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["timeseries"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>First date of the range, <code>YYYY-MM-DD</code>. Required. Must not be in the future or after <code>endDate</code>.</p>\n","type":"text/plain"},"key":"startDate","value":"2022-06-01"},{"description":{"content":"<p>Last date of the range, <code>YYYY-MM-DD</code>. Defaults to yesterday.</p>\n","type":"text/plain"},"key":"endDate","value":"2022-06-07"},{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"USD,PKR"},{"description":{"content":"<p>Currency to quote rates against. Defaults to USD. Available on paid plans — sending this on the Free plan returns 402.</p>\n","type":"text/plain"},"key":"base","value":"EUR"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"05ca26ea-c281-4a2b-9d39-46ef63c9800f","name":"200 — truncated","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"startDate\": \"2022-06-01\",\n  \"endDate\": \"2022-06-03\",\n  \"base\": \"EUR\",\n  \"historicalRatesList\": [\n    {\n      \"date\": \"2022-06-01\",\n      \"rates\": {\n        \"PKR\": \"210.58073648790247\",\n        \"USD\": \"1.0651300000000001\"\n      }\n    },\n    {\n      \"date\": \"2022-06-02\",\n      \"rates\": {\n        \"PKR\": \"212.41441993262268\",\n        \"USD\": \"1.07504\"\n      }\n    },\n    {\n      \"date\": \"2022-06-03\",\n      \"rates\": {\n        \"PKR\": \"211.80743999999882\",\n        \"USD\": \"1.0719\"\n      }\n    }\n  ]\n}"}],"_postman_id":"1ec86286-f59e-488d-bacf-66f99b2641d7"},{"name":"Fluctuation — change between two dates","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const f = pm.response.json().rateFluctuations;","pm.test('Has fluctuation fields', () => {","    const first = Object.values(f)[0];","    ['startRate','endRate','change','percentChange'].forEach(k =>","        pm.expect(first).to.have.property(k));","});","pm.test('change equals startRate minus endRate', () => {","    const x = Object.values(f)[0];","    const expected = parseFloat(x.startRate) - parseFloat(x.endRate);","    pm.expect(parseFloat(x.change)).to.be.closeTo(expected, 0.01);","});"],"id":"4ba32963-cf2b-4a85-b30a-8cf0d4d4b1fb"}}],"id":"843fef44-1b22-495c-8349-1b7ecbe66552","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/fluctuation?startDate=2022-10-01&endDate=2022-10-15&symbols=PKR&base=GBP","description":"<p>Opening rate, closing rate, absolute change and percentage change for each requested currency. Requires the Professional plan or above.</p>\n<p><strong>How <code>change</code> is calculated:</strong> <code>change = startRate - endRate</code>, and <code>percentChange</code> expresses that as a percentage of <code>startRate</code>. A currency whose rate against the base <em>fell</em> over the period therefore reports a <em>positive</em> change.</p>\n<p>In the example response below, PKR moves from 254.331 to 243.874 per GBP, so <code>change</code> is <code>10.457</code> and <code>percentChange</code> is <code>4.11</code>. If your charts use an up-is-positive convention, negate both fields.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["fluctuation"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>First date of the range, <code>YYYY-MM-DD</code>. Required.</p>\n","type":"text/plain"},"key":"startDate","value":"2022-10-01"},{"description":{"content":"<p>Last date of the range, <code>YYYY-MM-DD</code>. Defaults to yesterday.</p>\n","type":"text/plain"},"key":"endDate","value":"2022-10-15"},{"description":{"content":"<p>Comma-separated currency codes. Omit to receive every available currency. Case-insensitive, no spaces after commas.</p>\n","type":"text/plain"},"key":"symbols","value":"PKR"},{"description":{"content":"<p>Currency to quote rates against. Defaults to USD. Available on paid plans — sending this on the Free plan returns 402.</p>\n","type":"text/plain"},"key":"base","value":"GBP"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"9e43e388-d78f-4c87-8d73-62bf62256c8b","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"startDate\": \"2022-10-01\",\n  \"endDate\": \"2022-10-15\",\n  \"base\": \"GBP\",\n  \"rateFluctuations\": {\n    \"PKR\": {\n      \"startRate\": \"254.331\",\n      \"endRate\": \"243.874\",\n      \"change\": \"10.457\",\n      \"percentChange\": \"4.11\"\n    }\n  }\n}"}],"_postman_id":"843fef44-1b22-495c-8349-1b7ecbe66552"}],"id":"333202a8-a83e-4926-9c83-c283c69d70f5","description":"<p>Rates for a past date, a daily series across a range, or a start-to-end summary.</p>\n<p><code>/rates/historical</code> is available on paid plans. <code>/timeseries</code> and <code>/fluctuation</code> require the Professional plan or above.</p>\n<p>Check <code>/historical-data-limits</code> before querying — coverage runs from 1984 for our deepest fiat pairs to individual listing dates for cryptocurrencies.</p>\n","_postman_id":"333202a8-a83e-4926-9c83-c283c69d70f5","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}},{"name":"05 — IP to Currency","item":[{"name":"IP to Currency","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","pm.test('Responds under 5s', () => pm.expect(pm.response.responseTime).to.be.below(5000));","const b = pm.response.json();","pm.test('Has conversion fields', () => {","    ['from','to','rate','givenAmount','convertedAmount'].forEach(k =>","        pm.expect(b).to.have.property(k));","});","pm.test('convertedAmount = givenAmount * rate', () => {","    const expected = parseFloat(b.givenAmount) * parseFloat(b.rate);","    pm.expect(parseFloat(b.convertedAmount)).to.be.closeTo(expected, expected * 1e-6);","});","pm.test('Echoes the geolocated IP', () => pm.expect(b).to.have.property('ipAddress'));"],"id":"fdd9fbef-8fd4-475f-be92-860ac7da886a"}}],"id":"79d208e4-3c1a-4e85-83ea-ffcc0ae0f9df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/iptocurrency?from=GBP&ip=182.186.18.9&amount=500","description":"<p>Converts <code>amount</code> from the <code>from</code> currency into the local currency of the country the IP resolves to. Both IPv4 and IPv6 are supported. Requires the Growth plan or above.</p>\n<p><strong>Pass the <code>ip</code> explicitly when calling from a backend.</strong> With <code>ip</code> omitted we geolocate the requesting IP, which for server-side integrations is your own infrastructure rather than your visitor. Forward the visitor's address from your web tier.</p>\n<p>A syntactically valid address we cannot place — a private range, for example, or unallocated space — returns <code>404 Geolocation of provided IP {IP} is unknown</code> rather than a default currency, so handle that branch in your integration.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}},"urlObject":{"path":["iptocurrency"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Currency to convert from. Required.</p>\n","type":"text/plain"},"key":"from","value":"GBP"},{"description":{"content":"<p>IPv4 or IPv6 address to geolocate. If omitted, the IP the request originates from is used.</p>\n","type":"text/plain"},"key":"ip","value":"182.186.18.9"},{"description":{"content":"<p>Amount to convert. Defaults to 1.0. Must be greater than zero.</p>\n","type":"text/plain"},"key":"amount","value":"500"},{"disabled":true,"description":{"content":"<p><code>json</code> (default) or <code>xml</code>. Any other value returns 400.</p>\n","type":"text/plain"},"key":"format","value":"json"}],"variable":[]}},"response":[{"id":"33bf16bd-014d-4d58-a131-efc1c499faf2","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":""},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"date\": \"2023-03-22 08:03:00+00\",\n  \"from\": \"GBP\",\n  \"to\": \"PKR\",\n  \"rate\": \"346.232\",\n  \"ipAddress\": \"182.186.18.9\",\n  \"givenAmount\": \"500.0\",\n  \"convertedAmount\": \"173115.892\"\n}"}],"_postman_id":"79d208e4-3c1a-4e85-83ea-ffcc0ae0f9df"}],"id":"875a4397-d316-466c-9f60-e10234c12a8e","description":"<p>Resolve an IP address to a country and convert into that country's local currency. Requires the Growth plan or above.</p>\n<p>Designed for localising displayed prices without prompting visitors for their location.</p>\n","_postman_id":"875a4397-d316-466c-9f60-e10234c12a8e","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}},{"name":"06 — Error Handling","item":[{"name":"400 — missing API key","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('400', () => pm.response.to.have.status(400));","pm.test('Error envelope shape', () => {","    const b = pm.response.json();","    ['timestamp','status','error','message','path'].forEach(k =>","        pm.expect(b).to.have.property(k));","    pm.expect(b.path).to.include('/v2.0');","});"],"id":"6c645034-9572-43ae-9062-7c2d6eea8c89"}}],"id":"58151cf1-944e-473a-8edc-67fdf82d609f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest?symbols=USD,EUR","description":"<p>A request with no <code>apikey</code>. Returns <code>400 Invalid Param Exception</code>.</p>\n<p>The API key is supplied as a query parameter. Header-based authentication is not supported, so sending <code>apikey</code> as an HTTP header also produces this response.</p>\n","urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"key":"symbols","value":"USD,EUR"}],"variable":[]}},"response":[{"id":"beacc25b-d045-4819-9dc4-d42a4e34aed3","name":"400 Bad Request","originalRequest":{"method":"GET","header":[],"url":""},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": 1785841638881,\n  \"status\": 400,\n  \"error\": \"Invalid Param Exception\",\n  \"message\": \"Please provide API Key to use CurrencyFreaks API. To get an apikey for free, signup here https://currencyfreaks.com/signup.html.\",\n  \"path\": \"/v2.0/rates/latest\"\n}"}],"_postman_id":"58151cf1-944e-473a-8edc-67fdf82d609f"},{"name":"401 — invalid API key","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('401', () => pm.response.to.have.status(401));"],"id":"d9781acd-afdc-4055-9d6b-8ccc0b07c1f5"}}],"id":"2b6561c2-20aa-445e-be6f-39c611bc2f1f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/latest?apikey=INVALID_KEY_123&symbols=USD,EUR","description":"<p>An unrecognised key returns <code>401 Invalid Api Access Exception</code>. A key that exists but has been deactivated also returns 401, with a message noting the key is inactive.</p>\n","urlObject":{"path":["rates","latest"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Deliberately unrecognised key.</p>\n","type":"text/plain"},"key":"apikey","value":"INVALID_KEY_123"},{"key":"symbols","value":"USD,EUR"}],"variable":[]}},"response":[{"id":"cc6b5e9b-81b1-4a0d-8cc5-97a3bcbbac6a","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":""},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": 1785841639172,\n  \"status\": 401,\n  \"error\": \"Invalid Api Access Exception\",\n  \"message\": \"Provided API key is invalid. [Contact tech. support for assistance at support@currencyfreaks.com]\",\n  \"path\": \"/v2.0/rates/latest\"\n}"}],"_postman_id":"2b6561c2-20aa-445e-be6f-39c611bc2f1f"},{"name":"400 — unsupported format","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('400', () => pm.response.to.have.status(400));"],"id":"aac0d63d-04df-42fe-a505-790d87a703a1"}}],"id":"01d09490-7e6a-455b-9f05-b7afb6037aa7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/currency-symbols?format=yaml","description":"<p>Returns <code>400 Http Media Type Not Acceptable</code> with the message <code>Invalid format (Available formats: json, xml)</code>.</p>\n","urlObject":{"path":["currency-symbols"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[{"description":{"content":"<p>Only <code>json</code> and <code>xml</code> are accepted.</p>\n","type":"text/plain"},"key":"format","value":"yaml"}],"variable":[]}},"response":[{"id":"b87ab215-09d2-441a-819b-a77489f8f788","name":"400 Bad Request","originalRequest":{"method":"GET","header":[],"url":""},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": 1785841641178,\n  \"status\": 400,\n  \"error\": \"Http Media Type Not Acceptable\",\n  \"message\": \"Invalid format (Available formats: json, xml). [Contact tech. support for assistance at support@currencyfreaks.com]\",\n  \"path\": \"/v2.0/currency-symbols\"\n}"}],"_postman_id":"01d09490-7e6a-455b-9f05-b7afb6037aa7"},{"name":"404 — unknown path","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('404', () => pm.response.to.have.status(404));"],"id":"045d6bab-c6d4-4678-a1ad-01b5692cebe3"}}],"id":"398b9c89-eea4-4b1a-ba8d-a7b4934e5668","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.currencyfreaks.com/v2.0/rates/nonexistent","description":"<p>An unrecognised URL returns <code>404 No Handler Found Exception</code>. All endpoints are <code>GET</code>; other methods on a valid path return 400.</p>\n","urlObject":{"path":["rates","nonexistent"],"host":["https://api.currencyfreaks.com/v2.0"],"query":[],"variable":[]}},"response":[{"id":"d940db8d-9b6d-4e76-acb6-d2eed295f36c","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":""},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"timestamp\": 1785841640620,\n  \"status\": 404,\n  \"error\": \"No Handler Found Exception\",\n  \"message\": \"Required URL is not found. [Contact tech. support for assistance at support@currencyfreaks.com]\",\n  \"path\": \"/v2.0/rates/nonexistent\"\n}"}],"_postman_id":"398b9c89-eea4-4b1a-ba8d-a7b4934e5668"}],"id":"dc6bf4bf-6fab-4d4f-a37e-75cad1db527f","description":"<p>Requests that deliberately fail, so you can see the error envelope and build handling against it.</p>\n<p>Every non-2xx response uses the same shape: <code>timestamp</code>, <code>status</code>, <code>error</code>, <code>message</code> and <code>path</code>. Note that <code>path</code> includes the <code>/v2.0</code> prefix.</p>\n<p>The <code>status</code> field mirrors the HTTP status code, so you can branch on either.</p>\n","_postman_id":"dc6bf4bf-6fab-4d4f-a37e-75cad1db527f","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]},"isInherited":true,"source":{"_postman_id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","id":"eb48304d-2cb0-40ba-92c1-1906e43be64c","name":"CurrencyFreaks API v2.0","type":"collection"}}}],"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"apikey"},{"key":"value","value":"YOUR_APIKEY"}]}},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Remind the user to set their key, unless the request doesn't need one.","const key = pm.collectionVariables.get('apikey');","const url = pm.request.url.toString();","const isPublic = ['supported-currencies', 'currency-symbols',","                  'historical-data-limits'].some(p => url.includes(p));","const isErrorDemo = /^(4|5)\\d\\d /.test(pm.info.requestName);","if (!isPublic && !isErrorDemo && (!key || key === 'YOUR_APIKEY')) {","    console.warn('Set the `apikey` collection variable before sending this request. Get a free key at https://currencyfreaks.com/signup');","}"],"id":"a7781ae5-11f7-4c12-b0fe-007a6c3dab6d"}},{"listen":"test","script":{"type":"text/javascript","exec":["// Applies to every request in the collection.","pm.test('Response body is parseable', () => {","    const ct = pm.response.headers.get('Content-Type') || '';","    if (ct.includes('json')) {","        pm.response.to.be.json;","    } else {","        pm.expect(pm.response.text()).to.not.be.empty;","    }","});"],"id":"329c48dd-3438-46db-8949-b7e76a2461c1"}}],"variable":[{"key":"baseUrl","value":"https://api.currencyfreaks.com/v2.0","description":"API root."},{"key":"apikey","value":"YOUR_APIKEY","description":"Your CurrencyFreaks API key. Get one free at https://currencyfreaks.com/signup — paste it into the Current value column so it is not shared."},{"key":"availableCount","value":"","description":"Populated by the Supported Currencies test script."}]}