Python API — MCX

pip install mcx-data

Quick Start

from mcxdata import mcx

# Today's spot prices — all 28 commodities
df = mcx.get_spot_recent()

# Historical archive — GOLD for May 2026
df = mcx.get_spot_archive("2026-05-01", "2026-05-22", commodity="GOLD")

mcx.get_spot_recent() — Today’s Prices

mcx.get_spot_recent(commodity="ALL", location="ALL")  pd.DataFrame

Returns spot prices as of the latest MCX polling session (updated ~2x daily).

from mcxdata import mcx

# All 28 commodities
df = mcx.get_spot_recent()

# Filter by commodity
df = mcx.get_spot_recent(commodity="GOLD")
df = mcx.get_spot_recent(commodity="SILVER")
df = mcx.get_spot_recent(commodity="CRUDEOIL")
df = mcx.get_spot_recent(commodity="NATURALGAS")
df = mcx.get_spot_recent(commodity="COPPER")

Returns: Commodity, Unit, Location, Spot Price (Rs.), Up/Down, Date

Commodity Unit Location Spot Price (Rs.) Up/Down Date
GOLD 10 GRMS AHMEDABAD 157549.0 -0.20 2026-05-22 12:33:08
SILVER 1 KGS AHMEDABAD 266292.0 -0.57 2026-05-22 12:33:08
CRUDEOIL 1 BBL NA 9280.0 -2.48 2026-05-22 12:33:08

mcx.get_spot_archive() — Historical Prices

mcx.get_spot_archive(from_date, to_date, commodity="ALL", location="ALL")  pd.DataFrame

Important: MCX archive API requires a specific commodity — "ALL" returns empty. Always specify a commodity name.

from mcxdata import mcx

# GOLD — May 2026
df = mcx.get_spot_archive("2026-05-01", "2026-05-22", commodity="GOLD")

# SILVER — April 2026
df = mcx.get_spot_archive("2026-04-01", "2026-04-30", commodity="SILVER")

# CRUDEOIL — year to date
df = mcx.get_spot_archive("2026-01-01", "2026-05-22", commodity="CRUDEOIL")

# Date formats accepted: YYYY-MM-DD, DD/MM/YYYY, YYYYMMDD
df = mcx.get_spot_archive("01/05/2026", "22/05/2026", commodity="GOLD")

Returns: Commodity, Unit, Location, Spot Price (Rs.), Up/Down, Date

Commodity Unit Location Spot Price (Rs.) Up/Down Date
GOLD 10 GRMS AHMEDABAD 157549.0 -1 2026-05-22 12:33:08
GOLD 10 GRMS AHMEDABAD 157857.0 1 2026-05-22 08:15:12
GOLD 10 GRMS AHMEDABAD 157838.0 -1 2026-05-21 12:27:04

Returns ~2 rows per trading day per commodity (morning + afternoon polling sessions).


mcx.list_commodities() — Available Commodities

commodities = mcx.list_commodities()
# → ['ALUMINI', 'ALUMINIUM', 'CARDAMOM', 'COPPER', 'COTTON', 'COTTONOIL',
#    'CPO', 'CRUDEOIL', 'CRUDEOILM', 'ELECDMBL', 'GOLD', 'GOLDGUINEA',
#    'GOLDM', 'GOLDPETAL', 'GOLDTEN', 'KAPAS', 'LEAD', 'LEADMINI',
#    'MENTHAOIL', 'NATGASMINI', 'NATURALGAS', 'NICKEL', 'SILVER', 'SILVERM',
#    'SILVERMIC', 'STEELREBAR', 'ZINC', 'ZINCMINI']

Generic mcx.get() — Mirrors nse-data API

# Recent
df = mcx.get("spot", "market", "spot_recent")
df = mcx.get("spot", "market", "spot_recent", commodity="GOLD")

# Archive
df = mcx.get("spot", "market", "spot_archive",
             from_date="2026-05-01", to_date="2026-05-22", commodity="GOLD")

mcx.download() — Save to Disk or S3

from mcxdata import mcx

# Local file
path = mcx.download("spot", "market", "spot_recent",
                    commodity="GOLD", output_dir="./data")
# → "./data/MCX_spot_recent_GOLD_20260522.csv"

# S3 (Lambda with IAM role)
uri = mcx.download("spot", "market", "spot_archive",
                   from_date="2026-05-01", to_date="2026-05-22",
                   commodity="GOLD",
                   s3_bucket="my-bucket", s3_prefix="raw/mcx/")
# → "s3://my-bucket/raw/mcx/MCX_spot_archive_GOLD_20260522.csv"

Date Format

The Date column is returned as YYYY-MM-DD HH:MM:SS (UTC).

df = mcx.get_spot_recent()
print(df["Date"].iloc[0])
# → "2026-05-22 12:33:08"

MCX polls spot prices at approximately 08:00 IST and 12:30 IST (02:30 UTC and 07:00 UTC). The archive returns both sessions per trading day.

To convert to IST in pandas:

import pandas as pd
df["Date_IST"] = pd.to_datetime(df["Date"]).dt.tz_localize("UTC").dt.tz_convert("Asia/Kolkata")

Error Handling

from mcxdata import mcx

try:
    df = mcx.get_spot_archive("2026-05-01", "2026-05-22", commodity="ALL")
    # Returns empty DataFrame — MCX doesn't support ALL for archive
    if df.empty:
        print("No data — specify a commodity name")
except RuntimeError as e:
    print(f"Failed: {e}")
    # RuntimeError: HTTP 403 — Akamai WAF (curl_cffi not installed or blocked)