Real-Time Uranium Oct 2025 (UXV25) - Per Pound Price for API Integration Best Practices
You need to display or consume the per‑pound price for the Uranium October 2025 contract (UXV25) in your app, trading model, or ERP. By the end of this guide, you’ll be able to call the Metals-API latest endpoint for UXV25, detect when a futures symbol has expired, and implement robust fallbacks and unit conversions to compute a USD per pound value you can ship to production.
Understanding UXV25 and why your integration must handle expiration
UXV25 denotes an October 2025 uranium contract. Like any expiring instrument, its symbol lifecycle matters for your integration. If you request a symbol that has rolled off, you should not assume you’ll receive a tradable price. Instead, your code must:
- Check for symbol warnings in the API response.
- Discover and switch to the current active uranium symbol before computing prices.
- Log and alert when a requested symbol is no longer available.
This guide focuses on the Metals-API latest endpoint and practical handling of the expired UXV25 symbol, including per‑pound price derivation when a valid rate is available.
Requesting UXV25 and detecting an expired symbol
The latest endpoint is the fastest way to check whether UXV25 is currently live and to retrieve a tradable rate when available. Use symbols=UXV25 to scope the response.
curl -s "https://metals-api.com/api/latest?access_key=YOUR_API_KEY&symbols=UXV25"
Sample response (actual server response provided by Metals-API for this symbol):
{"success":true,"timestamp":1792541400,"date":"2026-10-21","base":"USD","rates":{"USD":1},"warnings":[{"symbol":"UXV25","code":410,"type":"expired_symbol","info":"The requested symbol has expired and is no longer available."}]}
What to read from this response
- success: true – The request succeeded, but that does not guarantee a live price for the requested symbol.
- base: "USD" – Rates are expressed relative to USD by default.
- timestamp: 1792541400 – Unix epoch seconds (UTC). Use this to validate cache freshness.
- warnings: Array – The critical signal here. For UXV25 the warning type is "expired_symbol", meaning no live quotes are returned for this code.
- rates: {"USD":1} – Because the symbol is expired, you don’t receive a UXV25 rate; only USD:1 echoes the base.
Action item: When warnings[].type == "expired_symbol", do not compute or display a price. Instead, pivot to symbol discovery and roll logic as detailed below.
Rolling your integration to an active uranium symbol
When a futures symbol expires, you need to target a current uranium code supported by Metals-API. To do that:
- Consult the official, continually updated list of supported tickers to find the presently active uranium symbol: Browse the Metals-API Supported Symbols.
- Update your configuration to reference the current uranium symbol for production requests.
- Keep a symbol map for roll-forward logic. For scheduled maintenance, rotate your target symbol based on your institution’s roll convention (e.g., a fixed calendar rule) and validate availability via the API before cutover.
If you operate multiple environments, store the active uranium symbol in configuration (or feature flags) instead of hard-coding UXV25. This allows non-breaking rollovers without code deployments.
Price math: base currency, inversion, and per‑pound conversion
Metals-API defaults to base=USD. In this mode, each metal rate is quoted as “metal units per 1 USD.” For precious metals, the examples show unit “per troy ounce.” The inversion rule you’ll use in code is:
- Given base=USD, rates.SYMBOL = ounces per USD.
- Therefore USD per ounce = 1 / rates.SYMBOL (conceptually rates.USDSYMBOL).
To report USD per pound, convert ounces to pounds. Uranium is typically transacted per pound (avoirdupois), not per troy ounce. Use these constants:
- 1 avoirdupois pound = 453.59237 grams
- 1 troy ounce = 31.1034768 grams
- 1 pound (avoirdupois) = 453.59237 / 31.1034768 ≈ 14.583333333 troy ounces
So, if r = rates.UXV25 (ounces per USD), then:
- USD per troy ounce = 1 / r
- USD per pound = (1 / r) × 14.583333333
If your target uranium symbol’s unit differs (e.g., per kilogram), adapt the conversion accordingly.
| Unit | To Troy Ounces | To Pounds (avoirdupois) | Notes |
|---|---|---|---|
| 1 troy ounce | 1 | 1 / 14.583333333 | 31.1034768 g |
| 1 pound (avdp) | 14.583333333 | 1 | 453.59237 g |
| 1 kilogram | 32.1507465686 | 2.20462262185 | 1000 g |
If you need a quick audit for your unit math, calculate both USD/oz and USD/lb and verify USD/lb ≈ USD/oz × 14.583333333.
Python example: call latest, detect expiration, and compute USD/lb when available
This snippet requests UXV25, checks for an expired symbol warning, and, if a valid rate is present, computes USD per pound. It also shows how to safely invert a USD-base rate.
import os
import sys
import time
import json
import urllib.request
import urllib.parse
API_KEY = os.getenv("METALS_API_KEY", "YOUR_API_KEY")
BASE_URL = "https://metals-api.com/api/latest"
def fetch_latest(symbol):
url = f"{BASE_URL}?{urllib.parse.urlencode({'access_key': API_KEY, 'symbols': symbol})}"
with urllib.request.urlopen(url, timeout=10) as resp:
return json.loads(resp.read().decode("utf-8"))
def usd_per_pound_from_usd_base_oz_per_usd(oz_per_usd):
if not oz_per_usd or oz_per_usd <= 0:
raise ValueError("Invalid ounces-per-USD rate for inversion.")
usd_per_oz = 1.0 / oz_per_usd
OUNCES_PER_POUND = 14.583333333 # avoirdupois lb
return usd_per_oz * OUNCES_PER_POUND
def main():
symbol = "UXV25"
data = fetch_latest(symbol)
# Basic sanity checks
if not data.get("success", False):
print("Request failed.", file=sys.stderr)
sys.exit(1)
# Detect and act on warnings (e.g., expired symbol)
warnings = data.get("warnings", []) or []
expired = any(w.get("type") == "expired_symbol" for w in warnings)
# Timestamp and date for logging
ts = data.get("timestamp")
dt = data.get("date")
print(f"API timestamp: {ts} (UTC), date: {dt}")
if expired:
print(f"Symbol {symbol} is expired; no tradable rate. Inspect symbols and switch to an active uranium ticker.")
# Next step: look up the current uranium code at:
# https://metals-api.com/symbols
sys.exit(0)
# If not expired, attempt to read the rate
rates = data.get("rates", {})
oz_per_usd = rates.get(symbol)
if oz_per_usd is None:
print(f"No rate for {symbol} in response. Response keys: {list(rates.keys())}")
sys.exit(2)
usd_per_lb = usd_per_pound_from_usd_base_oz_per_usd(oz_per_usd)
print(f"{symbol} USD per pound: {usd_per_lb:.4f}")
if __name__ == "__main__":
main()
Notes:
- The response above for UXV25 includes only USD:1 and an expired_symbol warning. In that case, exit early and rotate to an active symbol.
- Once you select the correct active uranium code from the supported symbols catalog, the same code path will compute USD/lb correctly.
Production safeguards that save you hours
- Base currency and inversion: With base=USD, rates.SYMBOL is ounces per USD. Always invert to get USD per ounce, then apply unit conversions (e.g., ounces → pounds). Keep this math isolated in one function to avoid duplication and subtle mistakes.
- Timestamps and timezone: timestamp is Unix seconds in UTC. Use it for request deduplication, cache age decisions, and audit logs. Do not assume local time.
- Caching: If your update cadence is coarser than the feed frequency, cache the most recent successful payload for at least the interval you display to users. Memoize the symbol availability check too; a symbol does not oscillate between expired and active intraday.
- Retries and fallbacks: Handle transient network failures with short exponential backoff. If the symbol is expired, retries will not help—switch symbols.
- Market closures and weekends: Metals markets can have reduced or no updates during weekends or holidays. Your UI should surface the last updated time and possibly gray the value if older than your SLA threshold.
- Monitoring: Alert on warning types (expired_symbol, etc.), stale timestamps, or missing key rates. Include the symbol and request ID in logs.
- Configuration-driven symbols: Keep your active uranium symbol in a config store so you can rotate without a deploy. Pair it with a healthcheck that validates a usable rate is present.
Choosing the right endpoints for uranium price workflows
For UXV25 and its rollover, these endpoints are the most relevant:
- Latest endpoint: Your primary read path for the current uranium price and symbol-health detection. This guide’s examples use it for UXV25.
- Time-series endpoint: Useful to validate your roll timing and backfill a chart across the handoff from UXV25 to the next active symbol using two series, joined at your roll date. See the Metals-API Documentation for parameters and limits.
- OHLC endpoint: If you need open/high/low/close for a specific session, query OHLC for your active uranium symbol and compute USD/lb from the open and close. Again, details are in the documentation.
Limit your scope to these until you’ve implemented symbol roll logic, unit conversion, and caching. You can always expand to bid/ask or fluctuation later if your product needs quote depth or period-over-period deltas.
A minimal, resilient pipeline for per‑pound uranium pricing
- Lookup the active uranium symbol in the Symbols catalog and store it as configuration.
- Call latest with that symbol. If the response contains an expired_symbol warning, switch to discovery mode and alert.
- Invert the ounces-per-USD rate to USD per ounce and multiply by 14.583333333 to obtain USD per pound.
- Round and format. Display the timestamp (UTC) and an “as of” badge. Document your rounding policy for financial auditability.
- Cache for your SLA interval; refresh in the background. If the new fetch fails, serve the last known-good value with a “stale” indicator.
Security, keys, and deployment
- Never ship your API key in client-side code. Call Metals-API server-to-server from your backend. Provide your frontend with only the formatted USD/lb number and metadata.
- Use environment variables or a secrets manager for the access_key.
- Rate-limiting and batching: If you quote multiple metals, batch symbols in a single latest call to reduce round-trips. For uranium-only displays, a single-symbol call is fine.
Validation tips for analysts
- Cross-verify your computed USD/lb with reputable references when available. For background market context (not for API pricing), see the U.S. EIA uranium pages at eia.gov/nuclear.
- Keep in mind that index/benchmark methodologies and contract specs differ; align your symbol choice to your product’s use case.
Notes on units and content display
- Label clearly: “USD per lb (avdp), as of YYYY‑MM‑DD HH:MM UTC.” Avoid ambiguous “ounce” without “troy.”
- If your end users expect metric units, also show USD/kg. Compute as USD/lb × 2.20462262185.
- For downloadable reports, include: symbol, unit basis, base currency, timestamp, and the conversion constants used.
When you need historical continuity across rolls
For charts or regressions that span multiple contract months, you’ll often stitch a back-adjusted or simple concatenated series:
- Pull time-series for the expiring symbol up to its roll date.
- Pull time-series for the new active symbol from the roll date onward.
- Normalize to a consistent unit (USD/lb) and join on a documented cutover timestamp.
The specifics of back-adjustment are a product decision; Metals-API provides the daily values you need to implement your chosen methodology. Consult the Documentation for date range parameters and constraints.
End-to-end example with curl, then integrate
Here’s the ready-to-run request you’ll likely start from in development. It demonstrates how Metals-API reports symbol expiry for UXV25 so you can build the right fallbacks before you ship:
curl -s "https://metals-api.com/api/latest?access_key=YOUR_API_KEY&symbols=UXV25"
Response you should expect for UXV25 (copy/paste for tests):
{"success":true,"timestamp":1792541400,"date":"2026-10-21","base":"USD","rates":{"USD":1},"warnings":[{"symbol":"UXV25","code":410,"type":"expired_symbol","info":"The requested symbol has expired and is no longer available."}]}
After verifying your warning handling, switch your config to the current uranium symbol from the Symbols catalog and proceed to compute USD/lb as described earlier.
FAQ
Why does the latest response for UXV25 not include a price?
Because the symbol is expired. Metals-API returns a warnings array with type "expired_symbol" and does not include a UXV25 rate. Switch to an active uranium symbol from the supported symbols list.
How do I compute USD per pound from the API output?
With base=USD, rates.SYMBOL is ounces per USD. Invert to get USD per ounce (1 / rate), then multiply by 14.583333333 to convert to USD per pound (avoirdupois).
What timezone is the API timestamp?
The timestamp field is Unix epoch seconds in UTC. Display an “as of” time and store it for audit trails and cache freshness checks.
How should I handle weekends and holidays?
Expect little or no intraday change during closures. Cache the last successful value and display it with the UTC timestamp. Set alerts if data is older than your SLA threshold.
Where can I find the currently supported uranium symbol?
Use the official, always-updated list here: Metals-API Supported Symbols. Update your configuration accordingly.
Ready to implement this in your stack? Get your API key and start building: Register. For managed connectivity patterns and consolidated market connectivity options, explore MCP. If you need parameter details or endpoint options beyond latest, see the full Documentation on Metals-API.