Ferro Chrome (FE-CR) - Per Troy Ounce Spot Price: Daily API Retrieval Guide
You need a reliable, daily spot price for Ferro Chrome (FE-CR), expressed per troy ounce, to power pricing, P&L, or dashboard logic. By the end of this guide, you’ll query the FE-CR spot via Metals-API’s latest endpoint, interpret the response correctly (including USD per troy ounce), normalize to grams/kilograms if needed, and set up a daily retrieval workflow with caching and fallbacks.
What you’ll pull each day: FE-CR spot per troy ounce, ready for pricing
Metals-API returns exchange-style rates relative to a base currency (USD by default). For metals, this yields two useful symbols for Ferro Chrome:
- FE-CR — troy ounces per 1 USD (oz/USD)
- USDFE-CR — USD per troy ounce (USD/oz), typically what you need for pricing
Request both symbols in one call so you can use USD/oz directly and still have oz/USD available for conversions. If you only receive FE-CR, invert it to get USD per ounce: USD_per_oz = 1 / FE-CR.
Always verify the symbol code in the catalog before integrating. See the authoritative list here: Metals-API Supported Symbols.
One-line request: fetch today’s FE-CR spot
Use the Latest Rates endpoint with your API key and request both FE-CR and USDFE-CR. The base is USD by default, so you don’t need to set base=USD explicitly.
curl "https://metals-api.com/api/latest?access_key=YOUR_API_KEY&symbols=FE-CR,USDFE-CR"
Official JSON response example
The following is an actual Metals-API response for the latest endpoint with FE-CR at the time it was captured. Use it to build and test your parser.
{"success":true,"timestamp":1791763740,"date":"2026-10-12","base":"USD","rates":{"FE-CR":7.8828648659206,"USD":1,"USDFE-CR":0.12685743279999956}}
How to read this
- success — boolean; check this first to guard against failures.
- timestamp — UNIX seconds when the rates were last updated by Metals-API. Use this to de-duplicate writes or drive cache TTLs.
- date — calendar date in YYYY-MM-DD corresponding to the data snapshot.
- base — USD; all quoted “rates” are relative to this base.
- rates.FE-CR — troy ounces per 1 USD (oz/USD). For the sample above, 1 USD buys approximately 7.8828648659 troy ounces of FE-CR.
- rates.USDFE-CR — USD per troy ounce (USD/oz). This is typically what you’ll store for pricing. In the sample, one troy ounce costs ~0.1268574328 USD.
- rates.USD — utility value showing 1 USD = 1 USD.
Units: Metals-API rates for metals are standardized to troy ounces. 1 troy ounce = 31.1034768 grams. Convert to grams or kilograms as needed.
Production-grade parsing in Python
The snippet below retrieves FE-CR and USDFE-CR, validates the response, derives USD/oz if needed, and converts to USD/kg for downstream systems that price by mass.
import os
import time
import requests
API_KEY = os.getenv("METALS_API_KEY", "YOUR_API_KEY")
URL = "https://metals-api.com/api/latest"
def fetch_fecr_spot():
params = {
"access_key": API_KEY,
"symbols": "FE-CR,USDFE-CR"
}
r = requests.get(URL, params=params, timeout=20)
r.raise_for_status()
data = r.json()
if not data.get("success"):
# Graceful failure with upstream message if present
raise RuntimeError(f"Metals-API error: {data}")
ts = data.get("timestamp")
date_str = data.get("date")
rates = data.get("rates", {})
usd_per_oz = rates.get("USDFE-CR")
if usd_per_oz is None:
fecr_oz_per_usd = rates.get("FE-CR")
if fecr_oz_per_usd is None or fecr_oz_per_usd == 0:
raise ValueError("Neither USDFE-CR nor FE-CR available for conversion.")
usd_per_oz = 1.0 / fecr_oz_per_usd
# Convert to USD per kilogram (1 ozt = 31.1034768 g)
OZT_TO_G = 31.1034768
G_PER_KG = 1000.0
usd_per_kg = usd_per_oz * (G_PER_KG / OZT_TO_G)
return {
"timestamp": ts,
"date": date_str,
"usd_per_oz": usd_per_oz,
"usd_per_kg": usd_per_kg
}
if __name__ == "__main__":
quote = fetch_fecr_spot()
print(f"FE-CR {quote['date']} | {quote['usd_per_oz']:.8f} USD/oz | {quote['usd_per_kg']:.6f} USD/kg | ts={quote['timestamp']}")
Implementation notes:
- Prefer USDFE-CR if present; it’s already USD per troy ounce. Otherwise invert FE-CR safely.
- Use the UNIX timestamp for idempotent writes (skip insert if timestamp hasn’t advanced).
- Increase timeout moderately (e.g., 20s) and surface the upstream error body for observability.
Scheduling a daily FE-CR pull
Many teams snapshot the spot once per trading day for end-of-day marks or daily price lists. The Latest endpoint updates periodically depending on plan tier (for example, every 60 minutes or every 10 minutes). For daily use:
- Schedule one fetch near your market close or just before your daily pricing batch.
- Store both the numeric value and the timestamp/date from Metals-API to make your pipeline deterministic.
- If your job reruns, de-duplicate by timestamp to avoid duplicate rows.
If your process requires a specific calendar date regardless of when you run, consider the Historical or Time-Series endpoints for backfills or deterministic daily valuations. Details are in the Metals-API Documentation.
Caching, retries, and weekend handling
- Caching: Cache the latest payload keyed by timestamp. If a subsequent call returns the same timestamp, you can skip downstream writes and API usage.
- Retries: Use short, bounded retries with exponential backoff on transient network errors. Avoid infinite loops to stay within your usage policies.
- Weekend and holiday closures: Metals markets may not update continuously over weekends or local holidays. The Latest endpoint will still return the last available snapshot with its original timestamp/date; this is normal. If you need “the previous business day,” pin your run to the Historical endpoint with an explicit YYYY-MM-DD.
- Timezone: The date returned is in API terms (not your local timezone). If you cut EOD by local market time, use the timestamp to convert to your timezone and decide which business date bucket to attach.
Unit conversions: troy ounces, grams, kilograms
By convention in metals pricing, troy ounces are standard for precious/industrial spot references. For Ferro Chrome:
- 1 troy ounce (ozt) = 31.1034768 grams
- USD/oz to USD/g: divide by 31.1034768
- USD/oz to USD/kg: multiply by 1000 / 31.1034768 ≈ 32.1507466
If your application uses metric units internally, convert once and store both USD/oz and USD/kg for flexibility.
If you need a refresher on the troy ounce unit, see this concise definition: Investopedia: Troy Ounce.
Historical snapshots and backfills (when you need more than “today”)
Even if your primary workflow is “fetch today,” you’ll eventually need to backfill missing days or align to a valuation date. Use these two endpoints (linking to docs for full parameter descriptions):
- Historical Rates — single date snapshot: GET /api/YYYY-MM-DD with symbols=FE-CR,USDFE-CR.
- Time-Series — multiple dates over a range: GET /api/timeseries with start_date, end_date, symbols=FE-CR,USDFE-CR.
Do not assume that weekends or holidays will produce new timestamps; build your range logic to skip non-updated days, or to fill-forward last available values according to your accounting policy. Implementation details for these endpoints are in the Documentation.
Designing your FE-CR pricing model
A minimal schema for daily FE-CR spot might include:
- as_of_date (DATE) — the API’s date field
- timestamp (INT) — metals-api UNIX seconds
- usd_per_oz (DECIMAL) — from USDFE-CR or invert(1/FE-CR)
- usd_per_kg (DECIMAL) — derived via 1000 / 31.1034768
- source (VARCHAR) — e.g., “metals-api/latest”
- raw_json (JSONB) — optional for audit/reprocessing
Store both directions (FE-CR and USDFE-CR) if you need auditing. For downstream calculations (quotes, margins, escalators), use the finalized USD/oz rounded with a transparent policy (e.g., 4–6 decimal places depending on your product). Keep raw precision in storage for recalculation integrity.
Integrating FE-CR spot into pricing and analytics
Common integration patterns with daily FE-CR include:
- Contract escalators: Pull USD/oz once per day, convert to USD/kg for material surcharges, and apply to sales orders at midnight UTC or market close.
- Dashboards: Cache the latest USD/oz and show change vs. previous business day (obtain prior date via Historical).
- Risk metrics: Compute daily returns using USD/oz time series. Drop days without new timestamps or forward-fill per your methodology.
If you’re building multi-metal workflows or need currency conversions with USD as an intermediate, the Convert endpoint is documented in the Documentation. For symbol coverage and classifications, always rely on the Symbols page.
Operational safeguards and observability
- Schema evolution: Keep a raw_json column for stress-free upgrades when new fields appear.
- Alerting: If the latest timestamp hasn’t advanced in your expected window, alert but continue using the last good value until your escalation policy says otherwise.
- Idempotency: Write a unique constraint on (as_of_date, source) or (timestamp, source) to prevent duplicates under retries.
- Validation: Reject or quarantine values outside expected bounds or z-scores vs. a 30-day median if that aligns with your business logic.
- Costs and scheduling: Align polling frequency with your plan’s update cadence. For daily retrieval, one or two calls per business day typically suffice.
JavaScript alternative: minimal browser/node fetch
If you are prototyping in JavaScript, the following snippet demonstrates extracting USD/oz with inversion fallback. Do not expose YOUR_API_KEY in client-side code in production.
async function fetchFeCrSpot() {
const url = "https://metals-api.com/api/latest?access_key=YOUR_API_KEY&symbols=FE-CR,USDFE-CR";
const res = await fetch(url, { method: "GET" });
if (!res.ok) throw new Error("HTTP " + res.status);
const data = await res.json();
if (!data.success) throw new Error("Metals-API error: " + JSON.stringify(data));
const ts = data.timestamp;
const date = data.date;
const rates = data.rates || {};
let usdPerOz = rates["USDFE-CR"];
if (usdPerOz == null) {
const fecrOzPerUsd = rates["FE-CR"];
if (!fecrOzPerUsd || fecrOzPerUsd === 0) {
throw new Error("Neither USDFE-CR nor FE-CR available for conversion.");
}
usdPerOz = 1.0 / fecrOzPerUsd;
}
const OZT_TO_G = 31.1034768;
const usdPerKg = usdPerOz * (1000.0 / OZT_TO_G);
return { timestamp: ts, date, usdPerOz, usdPerKg };
}
fetchFeCrSpot()
.then(q => console.log(`FE-CR ${q.date} | ${q.usdPerOz.toFixed(8)} USD/oz | ${q.usdPerKg.toFixed(6)} USD/kg`))
.catch(err => console.error(err));
Security, keys, and environments
- Keep your API key out of client-side code or public repos. Use environment variables or secrets management.
- Separate keys by environment (dev/stage/prod) so you can monitor and rotate independently.
- If you need to manage keys across teams, see the account and plan controls under MCP.
Future-proofing: analytics and innovation on top of FE-CR
With a stable daily FE-CR price feed, you can integrate modern analytics without overhauling your stack:
- Automated anomaly detection: alert when USD/oz breaks historical volatility bands.
- Supplier indexing: peg contract adjustments to a moving average of FE-CR USD/kg over the last N business days.
- Smart quoting: reprice open quotes against the newest timestamp automatically while preserving the “as quoted” audit trail.
Metals-API’s unified symbol taxonomy and consistent response structure make it straightforward to add additional materials later. Explore endpoint capabilities and limits in the Documentation and verify coverage in Symbols.
Common pitfalls and how to avoid them
- Confusing FE-CR with USDFE-CR: FE-CR is oz per USD; USDFE-CR is USD per oz. For pricing, prefer USDFE-CR.
- Dropping precision on ingestion: keep full precision in storage, round only at the presentation or contract level.
- Timezone drift: if you define “daily” by local market time, use the API timestamp to bucket values correctly.
- Assuming continuous updates: expect unchanged timestamps over weekends/holidays; use Historical to pin exact dates.
- Exposing secrets: never embed YOUR_API_KEY in client apps; proxy via your backend.
Where to go next
- Get your API key: Register
- Review endpoints, parameters, and error formats: Documentation
- Confirm symbol codes and units: Symbols
- Account and plan controls: MCP
FAQ
Q1: Which field should I store for pricing—FE-CR or USDFE-CR?
A: Store USDFE-CR (USD per troy ounce). If it’s not present, invert FE-CR to compute it. Keep the original payload for audit.
Q2: How do I convert USD/oz to USD/kg for Ferro Chrome?
A: Multiply USD/oz by (1000 / 31.1034768) ≈ 32.1507466. Always use the exact 31.1034768 grams per troy ounce for consistency.
Q3: What if the latest date or timestamp doesn’t change over the weekend?
A: That’s expected when markets don’t update. Use the last available snapshot for display; for EOD books, request a Historical rate for the specific business date you need.
Q4: How often should I poll for a daily spot?
A: For daily workflows, one call per business day near your cutoff is usually sufficient. If you also run intraday checks, align your schedule with your plan’s update cadence described in the documentation.
Q5: Can I backfill a month of FE-CR in one go?
A: Yes—use the Time-Series endpoint with start_date, end_date, and symbols=FE-CR,USDFE-CR. Parse the per-day objects and apply your business-day logic. See the exact parameters in the Documentation.
If you’re ready to automate daily Ferro Chrome spot retrieval, create your key and ship your first call in minutes: Register. For endpoint details and error handling patterns, keep the Documentation open as you integrate.