MetalAPI
XAU3 997,89−1,54 %XAG53,936−1,51 %XPT1 554,47−0,83 %XPD1 047,03−0,44 %XCU6,5080+2,29 %WTI103,27+3,82 %BRENT111,70−1,30 %EUR1,120400−0,01 %GBP1,337500−0,01 %JPY0,0063761+0,14 %CHF1,213445−0,25 %TRY0,020125−0,12 %BTC80 329,75−0,55 %ETH2 329,36−1,13 %
Все статьи
ЗолотоAPIТуториал

API цен на золото: полное руководство для разработчиков

Как работать с API цен на золото: получить ключ, вызвать API из curl, JavaScript и Python, правильно читать курсы, работать с историей, ошибками, квотами и кэшем.

Автор: MetalAPI Team··9 мин чтения

Что даёт API цен на золото

API цен на золото возвращает текущую и историческую цену золота в виде структурированных данных, обычно в формате JSON по HTTPS, чтобы ваше ПО могло использовать её без парсинга веб-страниц и ручного копирования чисел. В MetalAPI золото обозначается символом XAU — это код ISO 4217 для одной тройской унции золота. Его текущая цена — спотовая: середина между межбанковскими котировками bid и ask.

Большинство интеграций — это не торговые системы. Типичные сценарии использования:

  • Интернет-магазины и ювелиры, которые переоценивают изделия из золота вслед за рынком.
  • Калькуляторы для золотого лома, ювелирных изделий по каратам или премий к слиткам.
  • Трекеры портфеля и приложения для личных финансов, которые оценивают активы в местной валюте.
  • Бухгалтерские и ERP-системы, которые переоценивают запасы по дневной цене закрытия.
  • Дашборды, рассылки и внутренние отчёты, которым нужен график за последний год.

Тот же API охватывает серебро (XAG), платину (XPT) и палладий (XPD), четыре промышленных металла, пять энергетических контрактов, 57 валют и 13 криптовалют — всего 83 символа, и все они перечислены на странице символов. Это руководство посвящено золоту, но всё сказанное в нём относится и к остальным символам.

Получите ключ API

Создайте бесплатный аккаунт. Для тарифа Free не нужна банковская карта; он включает 100 запросов в месяц с ежедневным обновлением цен — этого достаточно, чтобы разработать и протестировать интеграцию. Платные тарифы добавляют более свежие цены, больше запросов и дополнительные эндпоинты; их краткое сравнение приведено в таблице ниже.

В личном кабинете откройте раздел API keys и создайте ключ. Ключи начинаются с mk_live_. Полный ключ показывается только один раз, потому что хранится лишь его хеш, поэтому сразу сохраните его в переменной окружения или в менеджере секретов:

Shell
export METALAPI_KEY="mk_live_your_key_here"

API принимает ключ тремя равнозначными способами: в параметре запроса api_key, в заголовке Authorization: Bearer или в заголовке X-API-Key. В продакшене лучше использовать заголовок, потому что полные URL часто попадают в журналы доступа, прокси и системы отслеживания ошибок. В руководстве по аутентификации также описаны ключи с ограничением по доменам для вызовов из браузера.

Три способа аутентификации
# 1. Query parameter
curl "https://metalapi.com/api/v1/latest?api_key=$METALAPI_KEY&currencies=XAU"

# 2. Authorization header
curl "https://metalapi.com/api/v1/latest?currencies=XAU" \
  -H "Authorization: Bearer $METALAPI_KEY"

# 3. X-API-Key header
curl "https://metalapi.com/api/v1/latest?currencies=XAU" \
  -H "X-API-Key: $METALAPI_KEY"

Первый запрос на curl, JavaScript и Python

Каждый эндпоинт — это обычный запрос GET к адресу внутри https://metalapi.com/api/v1/. Эндпоинт /latest возвращает текущие цены. base задаёт валюту, в которой выражены цены (по умолчанию USD), а currencies ограничивает ответ нужными вам символами. Один запрос может вернуть много символов и всё равно считается одним запросом.

curl
curl "https://metalapi.com/api/v1/latest?base=USD&currencies=XAU,XAG" \
  -H "X-API-Key: $METALAPI_KEY"

Успешный ответ выглядит так. Числа — это примерные значения, которые используются во всей документации MetalAPI, а не актуальные цены:

Пример ответа
{
  "success": true,
  "timestamp": 1792834892,
  "date": "2026-10-24",
  "base": "USD",
  "rates": {
    "XAU": 0.0002501319,
    "USDXAU": 3997.89,
    "XAG": 0.0185392857,
    "USDXAG": 53.94
  },
  "rate_limit": {
    "limit": 10000,
    "remaining": 9876,
    "reset": 1793491200,
    "used": 124,
    "plan": "Standard",
    "reset_date": "2026-11-01T00:00:00.000Z"
  }
}

Тот же вызов из Node.js 18 или новее, где fetch встроен. Сохраните код как gold.mjs, чтобы работал await верхнего уровня, и запустите node gold.mjs:

gold.mjs
const params = new URLSearchParams({ base: "USD", currencies: "XAU,XAG" });
const res = await fetch(`https://metalapi.com/api/v1/latest?${params}`, {
  headers: { Authorization: `Bearer ${process.env.METALAPI_KEY}` },
  signal: AbortSignal.timeout(10_000),
});
const data = await res.json();

if (!data.success) {
  throw new Error(`MetalAPI ${data.error.code} (${data.error.type}): ${data.error.info}`);
}

const gold = data.rates[`${data.base}XAU`];
const asOf = new Date(data.timestamp * 1000).toISOString();
console.log(`Gold: ${gold} ${data.base} per troy ounce (data from ${asOf})`);

И из Python с библиотекой requests:

gold.py
import os

import requests

resp = requests.get(
    "https://metalapi.com/api/v1/latest",
    params={"base": "USD", "currencies": "XAU,XAG"},
    headers={"X-API-Key": os.environ["METALAPI_KEY"]},
    timeout=10,
)
data = resp.json()
if not data["success"]:
    err = data["error"]
    raise RuntimeError(f"MetalAPI {err['code']} ({err['type']}): {err['info']}")

base = data["base"]
print(f"Gold:   {data['rates'][base + 'XAU']} {base} per troy ounce")
print(f"Silver: {data['rates'][base + 'XAG']} {base} per troy ounce")

Оба фрагмента формируют ключ курса из data.base, а не прописывают его жёстко. Эта маленькая привычка сохраняет код корректным, если позже вы смените базовую валюту, и подводит нас к самой важной части руководства.

Правильно читайте формат курсов

Каждый символ встречается в rates дважды, и эти два числа обратны друг другу:

КлючЗначениеПример
USDXAUЦена одной тройской унции золота в базовой валюте (USD)3997.89
XAUКоличество тройских унций золота, которое можно купить на одну единицу базовой валюты0.0002501319

Общее правило: rates.<BASE><SYMBOL> — цена одной единицы символа в базовой валюте. Ключ без префикса rates.<SYMBOL> — обратная величина: количество единиц символа на одну единицу базовой валюты. Обратная форма сохранена для совместимости с API в стиле форекс и со старыми интеграциями MetalAPI.

Самая частая ошибка в интеграциях цен на золото — читать rates.XAU и считать это ценой. Это 1 ÷ цена, поэтому на странице товара появится 0,00025 вместо 3 997,89, а любой расчёт, который умножает на это число, ошибётся на много порядков. Читайте ключ с префиксом, например rates.USDXAU или rates.EURXAU.

Если вы уже храните обратные значения из старой интеграции, загружать их заново не нужно: цена = 1 ÷ обратная величина. В примере выше 1 ÷ 0,0002501319 снова даёт 3 997,89 — с точностью до последних знаков округления.

Валюты подчиняются тому же правилу. При базе USD ключ USDEUR — цена одного евро в долларах, а EUR — количество евро за один доллар. В руководстве по форматам данных есть больше примеров, включая ключи bid и ask, доступные на тарифе Standard и выше.

Базовые валюты и единицы измерения

Чтобы получить цену золота в другой валюте, измените base. Ключ курса меняется вместе с ней: base=EUR возвращает EURXAU, а base=INR — INRXAU. Кросс-курсы берутся из одного снимка, поэтому цена золота в евро и курс евро к доллару всегда согласованы между собой.

По умолчанию цены металлов указываются за тройскую унцию. Параметр unit возвращает их за другую единицу массы:

unitЦена заТипичное применение
troy_oz (по умолчанию)Тройскую унцию, 31,1034768 гКотировки слитков
gramГраммЮвелирные изделия и розница
kilogramКилограммКилограммовые слитки, опт
ounceТорговую унцию (avoirdupois), 28,349523125 гДля золота почти никогда не подходит
poundТорговый фунт (avoirdupois)Медь
metric_tonМетрическую тонну (1 000 кг)Алюминий, цинк
short_tonКороткую тонну (2 000 фунтов)Сталь (HRC)

Этот запрос возвращает цены золота и серебра в евро за грамм. Если unit отличается от значения по умолчанию, ответ повторяет его в поле unit верхнего уровня:

bash
curl "https://metalapi.com/api/v1/latest?base=EUR&currencies=XAU,XAG&unit=gram" \
  -H "X-API-Key: $METALAPI_KEY"

unit=ounce (и его краткая форма oz) — это торговая унция (avoirdupois), примерно на 8,9% легче тройской. Для цен на слитки не указывайте unit или передавайте troy_oz.

unit влияет только на драгоценные и промышленные металлы. На энергоносители, валюты и криптовалюты он не действует. Подробнее о тройских унциях, граммах, тола и округлении читайте в статье «Тройские унции, граммы и килограммы». Если вы продаёте ювелирные изделия, статья «Цены на золото по каратам» рассказывает о ценах 22K и 18K и эндпоинте /carat.

Исторические цены на золото

Для прошлых цен используются те же параметры и тот же формат ответа. История начинается с 2000 года для металлов и энергоносителей, с 4 января 1999 года для валют и с 2014 года для криптовалют. Четыре эндпоинта закрывают большинство задач:

  • /YYYY-MM-DD (или /historical?date=YYYY-MM-DD, или /yesterday): цены закрытия за один день. Для выходных и праздников возвращается цена закрытия последнего торгового дня.
  • /timeframe (псевдоним /timeseries): дневные цены закрытия между start_date и end_date — до 30 дней на запрос на Free и до 365 дней на платных тарифах.
  • /change: начальный курс, конечный курс, абсолютное и процентное изменение между двумя датами.
  • /ohlc: цены открытия, максимума, минимума и закрытия за один день.
bash
# Gold and silver at the close of 15 January 2024
curl "https://metalapi.com/api/v1/2024-01-15?currencies=XAU,XAG" \
  -H "X-API-Key: $METALAPI_KEY"

# Daily gold closes in euros for September 2026
curl "https://metalapi.com/api/v1/timeframe?start_date=2026-09-01&end_date=2026-09-30&base=EUR&currencies=XAU" \
  -H "X-API-Key: $METALAPI_KEY"

Цены закрытия прошедших дней не меняются, поэтому сохраните их один раз, а не запрашивайте повторно. В статье «Исторические цены на золото и серебро через API» разобрано, как загрузить 25 лет данных по частям, сохранить их локально и построить графики. В руководстве по историческим данным есть вспомогательная функция на JavaScript для длинных диапазонов.

Ошибки, квоты и ограничения тарифов

Неудачный запрос возвращает HTTP-статус ошибки и тело с success: false. Объект error содержит числовой code, машиночитаемый type и понятное человеку описание info. Ветвите логику по code или type, но никогда — по тексту info. Ошибки лимита запросов (104), квоты (105), ограничения тарифа (106) и диапазона (207) также содержат upgrade_url:

Пример ошибки
{
  "success": false,
  "error": {
    "code": 106,
    "type": "plan_restriction",
    "info": "The carat endpoint requires a paid subscription plan",
    "upgrade_url": "https://metalapi.com/dashboard/billing"
  }
}

Коды, с которыми вы, скорее всего, столкнётесь:

КодТипHTTPЧто делать
101, 102no_api_key, invalid_api_key401Передайте действительный ключ и проверьте переменную окружения
104too_many_requests429Подождите столько секунд, сколько указано в Retry-After, и повторите запрос
105quota_exceeded429Месячная квота исчерпана; она обновляется 1-го числа (UTC)
106plan_restriction403Эндпоинт или параметр не входит в ваш тариф
205invalid_date400Исправьте некорректную дату или дату в будущем
207timeframe_too_long400Разбейте диапазон на более короткие запросы
300no_results404Нет данных, например для даты раньше начала истории
500, 503server_error, service_unavailable500, 503Повторите запрос с экспоненциальной задержкой

Каждый аутентифицированный ответ сообщает состояние квоты — и в заголовках X-RateLimit-*, и в объекте rate_limit в теле. /usage и /symbols никогда не расходуют квоту, поэтому системы мониторинга могут вызывать их свободно. Запросы, отклонённые с ошибками 104, 106, 107 или с ошибкой сервера, не тарифицируются, а ошибки валидации — тарифицируются. В руководстве по обработке ошибок перечислены все коды и есть вспомогательная функция для повторных попыток.

Тарифы различаются в основном объёмом запросов и свежестью цен:

ТарифЦена в месяцЗапросов в месяцОбновлениеЧто добавляет
Free0 $100Раз в деньДиапазоны до 30 дней
Lite4,99 $1 00030 минЦены по каратам, диапазоны до 365 дней
Standard11,99 $10 00010 минЦены bid/ask
Advanced24,99 $50 0001 минОповещения через вебхуки
Pro49,99 $100 0001 минПоток в реальном времени
Ultra99,99 $500 00015 сБольший объём
Business149,99 $500 00015 сSLA по доступности
Enterprise299,99 $1 500 0005 сМаксимальный объём

При оплате за год экономия составляет до 25%. Актуальные условия всегда есть на странице тарифов.

Кэширование и советы для продакшена

Если запрашивать /latest чаще, чем обновляются цены на вашем тарифе, вы получите те же числа и впустую потратите квоту. Кэшируйте последние цены как минимум на интервал обновления вашего тарифа, а цены прошедших дней — навсегда. Эта вспомогательная функция на Python кэширует последние цены и продолжает отдавать последний удачный ответ, если API недоступен:

cache.py
import os
import time

import requests

TTL_SECONDS = 600  # Standard plan: prices update every 10 minutes
session = requests.Session()
session.headers["X-API-Key"] = os.environ["METALAPI_KEY"]
_cache = {"at": 0.0, "data": None}


def latest_prices():
    now = time.monotonic()
    if _cache["data"] and now - _cache["at"] < TTL_SECONDS:
        return _cache["data"]
    try:
        r = session.get(
            "https://metalapi.com/api/v1/latest",
            params={"currencies": "XAU,XAG,XPT,XPD"},
            timeout=10,
        )
        data = r.json()
    except (requests.RequestException, ValueError):
        data = None
    if data and data.get("success"):
        _cache.update(at=now, data=data)
        return data
    if _cache["data"]:
        return _cache["data"]  # last good prices; show their timestamp
    raise RuntimeError(data["error"] if data else "MetalAPI unreachable")

Ещё несколько привычек, которые делают интеграцию дешёвой и надёжной:

  • Запрашивайте все символы одним вызовом. currencies=XAU,XAG,XPT,XPD стоит одного запроса, а четыре отдельных вызова — четырёх.
  • Храните ключ на сервере. Если API нужно вызывать из браузера, используйте ключ с ограничением по доменам. Чтобы показывать цены на сайте без написания кода, используйте встраиваемый виджет — тогда ключа на странице не будет вовсе.
  • Показывайте метку времени. timestamp — это время данных, а не вашего запроса. Отображайте его рядом с ценой, особенно когда отдаёте закэшированное значение или рынок закрыт на выходные.
  • Планируйте бюджет опроса. Опрос каждые 10 минут расходует около 4 500 запросов в месяц, а опрос каждую минуту — около 45 000. Начиная с тарифа Pro вместо этого можно использовать поток в реальном времени, а начиная с Advanced — получать ценовые оповещения через вебхуки.
  • Используйте тайм-ауты и выборочные повторы. Установите тайм-аут около 10 секунд, повторяйте запрос после ошибки 104 по истечении Retry-After, а после ошибок 5xx — с нарастающей задержкой, и никогда не повторяйте запросы с ошибками валидации.
  • Проверяйте символы заранее. Загрузите /symbols один раз при запуске (это бесплатно) и отклоняйте неизвестные коды до того, как они потратят запрос.

Если вы работаете с ИИ-ассистентами, MCP-сервер MetalAPI по адресу https://metalapi.com/mcp предоставляет те же данные в виде инструментов, так что Claude, ChatGPT, Cursor или VS Code могут узнавать цены на золото и их историю в рамках вашего тарифа; подробнее — в разделе ИИ и MCP. Справочником по всем эндпоинтам и параметрам служит документация API.

Попробуйте на своих данных

Создайте бесплатный аккаунт и отправьте первый запрос меньше чем за две минуты. 100 запросов в месяц, без банковской карты.

Читайте также