Crystal Ball Markets publishes three free JSON files: exchange rates against the US dollar for 60 currencies, the gold price in local money for 69 countries, and live quotes for 212 markets. There is no key and no sign-up, cross-origin requests are allowed, and the one condition is a visible link back to us wherever the figures appear.

This is a short guide for developers: what each file holds, how to call it, a worked example, and the limits. The full terms and live examples are on the rates API page.

What does the API return?

  • rates.json: units of each currency per US dollar. Each rate names its source: our own forex quote where we quote the pair, an official fixed rate (a peg), the European Central Bank’s reference rate, or for other currencies the reference rate of the country’s own central bank, with the day it was published.
  • gold.json: the gold price in each country’s money, in the unit and purity people there buy in: 10 grams of 24 karat in India, the tola in Pakistan, the baht weight of 96.5% gold in Thailand, the tael in Hong Kong, the troy ounce in a few countries and the gram in most, plus the price of one gram of 24 karat gold and the source of the exchange rate behind it.
  • quotes.json: our live bid and ask for every market on our markets hub, from forex and metals to energy, indices, shares and crypto, with the day’s change, high and low, the decimals each market is quoted to and a link to its page.

Each file is refreshed every minute and carries the same wrapper: attribution (the link to show), terms, notice, updated (when the newest figure was priced, in UTC) and data.

How do I call it?

From the command line:

curl https://crystalballmarkets.com/markets/api/v1/rates.json 

From a web page, with the credit link built from the file’s own attribution field:

const res = await fetch('https://crystalballmarkets.com/markets/api/v1/gold.json'); const { data, attribution } = await res.json(); const india = data.countries.find((c) => c.country === 'IN'); const price = new Intl.NumberFormat('en-IN', { style: 'currency', currency: india.currency }).format(india.price); const credit = document.createElement('a'); credit.href = attribution.url; credit.textContent = attribution.text; document.querySelector('#gold').append(`24K gold, 10 grams: ${price} `, credit); 

From Python:

import requests rates = requests.get('https://crystalballmarkets.com/markets/api/v1/rates.json', timeout=10).json() naira = rates['data']['rates']['NGN'] print(naira['rate'], naira['source'], naira['time']) 

JSON drops trailing zeros, so a price of 182.50 arrives as 182.5. Each market in quotes.json has a digits field: format bid, ask, high and low to that many decimals.

Worked example: the gold price in rupees

At 17:39 UTC on 12 November 2026 gold.json gave gold at $3,873.01 a troy ounce, and rates.json gave the rupee at 94.04 to the dollar (the European Central Bank’s reference rate). A troy ounce is 31.1035 grams, so one gram of 24 karat gold came to 3,873.01 × 94.04 ÷ 31.1035 = ₹11,709.88, and the 10 grams Indian buyers quote came to ₹117,098.76, the figure the file gave for India. Our gold price in India page works it out the same way.

For 22 karat jewellery gold, multiply by the fineness of 0.916. A shop’s price will be higher than either figure: import duty, GST and the making charge are added on top, and dealers set their own margins. Our guide to how the Indian gold rate is set walks through each step.

What are the limits and terms?

  • Show this link, visible and unchanged, wherever the figures appear: [Rates by Crystal Ball Markets](https://crystalballmarkets.com/markets). Do not mark it nofollow, ugc or sponsored.
  • Each address may make 60 requests a minute. The files change at most once a minute, so keep each response for at least 60 seconds; beyond the limit the API answers 429.
  • The figures are indicative, for information only. They are not an offer to buy or sell and must not be shown as dealing prices.
  • Do not resell the files or offer them as a data feed of your own.

Sites that call the files from their own pages are checked once a day for the link. Where it is missing, the files carry a warning saying what to fix for seven days, then stop answering that site until the link is back. Server-side use is welcome too: the link then goes wherever you show the figures.

Is there an OpenAPI description?

Yes: openapi.json, in OpenAPI 3.1. Import it into Postman or Insomnia, or feed it to a code generator for typed clients. Every field is described there, with its type and, for currencies and countries, the ISO code it uses.

Where do the figures come from?

Market quotes come from our own trading platform. Exchange rates come from our own forex quotes where we quote the pair, then official pegs and the European Central Bank’s daily reference rates; for currencies the ECB does not publish, such as the naira, the Kenyan shilling or the Pakistani rupee, we use the issuing central bank’s own reference rate, collected once a business day through Frankfurter. Rates from commercial data vendors are never included, because their terms do not allow it. Gold in local money is our XAU/USD quote multiplied by that rate. The figures can differ from what banks, exchange offices and jewellers charge.

What to read next

If you want to trade the markets behind these figures, you can open an account and use the same quotes on our platform. CFDs are complex and carry a high risk of losing money because of leverage.

Sources