Fastmarkets Physical Prices API
Table of Contents
Physical Price API
The Physical Prices API provides price values and associated instrument data for Fastmarkets assessed prices. All price values are associated to instruments which uses a symbol as an identifier.
API technical documentation
For more on the specification of this API and to try it out, please refer to the API’s documentation page (Swagger)
You can try running real API calls there using your Fastmarkets Platform credentials. Ask Fastmarkets team to provide your account with Swagger access.
Authenticating
All Fastmarkets APIs require a valid Access Token to retrieve permissioned data. To generate an Access Token, please refer to the Authentication API guide with the scope: fastmarkets.physicalprices.api.
The token is then added to an Authorization header parameter using the ‘Bearer’ prefix. For example:
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Retrieving a single price
To return the most recently available assessed price for a specific instrument, the Prices endpoint is used. In this example, the symbol ‘MB-AL-0004’ is used to return the latest available price data for ‘Aluminium P1020A, in-warehouse Rotterdam duty-paid, spot $/tonne’ as of 2nd March 2019.
In the response, low, mid and high price values are returned for the 1st of March 2019, as this was the most recent assessment available for the specified date.
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004&Dates=2019-03-02
url = "https://api.fastmarkets.com/Physical/v2/Prices"
query = {'symbols':'MB-AL-0004', 'dates':'2019-03-02'}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
singlePrice = json.loads(req.content)Example Response (JSON):
{
"instruments": [
{
"firstDate": "1987-04-07T00:00:00+00:00",
"lastDate": "2019-05-21T15:00:00+00:00",
"prices": [
{
"date": "2019-03-02",
"assessmentDate": "2019-03-01T16:00:12+00:00",
"revision": 0,
"low": 130,
"mid": 135,
"high": 140
}
],
"symbol": "MB-AL-0004"
}
]
}If no value for the Dates parameter is included in the request, then the most recent price data is returned. A value for the Symbols parameter is always required.
Retrieving multiple prices
It is also possible to request prices for multiple instruments and multiple dates in single request using the Prices endpoint.
In the example request below, two different symbols and two different dates have been requested. In the result, there will be two price results for each of the two instruments.
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004,MB-AL-0006&Dates=2019-03-02,2019-03-04
url = "https://api.fastmarkets.com/Physical/v2/Prices"
query = {
'symbols': ['MB-AL-0004', 'MB-AL-0006'],
'dates': ['2019-03-02','2019-03-04']
}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
multiplePrices = json.loads(req.content)Example Response (JSON):
{
"instruments": [
{
"firstDate": "1987-04-07T00:00:00+00:00",
"lastDate": "2025-11-11T16:00:00+00:00",
"prices": [
{
"date": "2019-03-02",
"assessmentDate": "2019-03-01T16:00:12+00:00",
"revision": 0,
"low": 130.0,
"mid": 135.0,
"high": 140.0
},
{
"date": "2019-03-04",
"assessmentDate": "2019-03-01T16:00:12+00:00",
"revision": 0,
"low": 130.0,
"mid": 135.0,
"high": 140.0
}
],
"symbol": "MB-AL-0004"
},
{
"firstDate": "1995-07-05T00:00:00+00:00",
"lastDate": "2025-11-05T16:00:00+00:00",
"prices": [
{
"date": "2019-03-02",
"assessmentDate": "2019-02-27T15:06:11+00:00",
"revision": 0,
"low": 780.0,
"mid": 790.0,
"high": 800.0
},
{
"date": "2019-03-04",
"assessmentDate": "2019-02-27T15:06:11+00:00",
"revision": 0,
"low": 780.0,
"mid": 790.0,
"high": 800.0
}
],
"symbol": "MB-AL-0006"
}
],
"priceCalculationType": "None"
}
Retrieving a range of prices
Using the Prices/History endpoint, it is possible to retrieve a series of prices over a specified period. In this example, a request is made over a seven-day period (between 20th Feb 2019 to 27th Feb 2019). The response returns prices in descending order of date.
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices/History HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-IRO-0001&FromDate=2019-02-20&ToDate=2019-03-27
url = "https://api.fastmarkets.com/Physical/v2/Prices/history"
query = {
'symbols': 'MB-IRO-0001',
'fromDate': '2019-02-20',
'toDate': '2019-02-27',
'calendarType': 'Weekdays',
'carryForward': True
}
headers = {
'Authorization' : 'Bearer ' + accessToken.access_token,
'cache-control' : 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
priceRange = json.loads(req.content)
Example Response (JSON):
{
"instruments": [
{
"firstDate": "1994-08-31T00:00:00+00:00",
"lastDate": "2024-08-15T15:52:29+01:00",
"prices": [
{
"date": "2019-03-21",
"assessmentDate": "2019-03-21T15:12:56+00:00",
"revision": 0,
"low": 390.0,
"mid": 390.0,
"high": 390.0
},
. . .
{
"date": "2019-02-21",
"assessmentDate": "2019-02-21T15:45:24+00:00",
"revision": 0,
"low": 385.0,
"mid": 387.5,
"high": 390.0
}
],
"symbol": "MB-IRO-0001"
}
],
"calendar": {
"type": "AssessmentDays",
"dates": [
"2019-03-21",
"2019-03-14",
"2019-03-07",
"2019-02-28",
"2019-02-21"
]
},
"priceCalculationType": "None"
}Retrieving average prices
Periodically, average prices for many Fastmarkets instruments are published. These are calculated values based on the underlying assessment prices over a period of a week, month or year.
Both the Prices and Prices History endpoints accept an input parameter called Price Calculation Type. There are several valid values for this parameter, the most common of which are:
- WeeklyAverage
- MonthlyAverage
- YearlyAverage
If no Price Calculation Type is specified, then the actual assessment value is returned.
NB: To find out what Price Calculation Types are available for a given instrument, use the Instrument endpoint (see section: Retrieving instruments data)
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices/MonthlyAverage HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004&Dates=2019-03-02
url = "https://api.fastmarkets.com/Physical/v2/Prices/MonthlyAverage"
query = {'symbols':'MB-AL-0004',
'dates':'2019-03-02'}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
monthlyAveragePrice = json.loads(req.content)
Example Response (JSON):
{
"instruments": [
{
"firstDate": "1992-01-31T12:00:00+00:00",
"lastDate": "2025-10-31T16:11:21+00:00",
"prices": [
{
"date": "2019-03-02",
"assessmentDate": "2019-02-28T12:00:00+00:00",
"revision": 1,
"low": 125.0,
"mid": 130.32,
"high": 135.63
}
],
"symbol": "MB-AL-0004"
}
],
"priceCalculationType": "MonthlyAverage"
}Retrieving forecast prices
Short term forecast is a time series that projects future prices of instruments that already exist in Physical Prices API.
Physical Prices API will return both physical and forecast prices if forecastType parameter is provided and both prices are available in provided date range.
All available prediction options for a particular price can be requested with an additional field in the Instrument data query (for example, F24M for MB-AL-0004).
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices/History HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004&FromDate=2025-09-27&ToDate=2029-02-20
&forecastType=F24M
url = "https://api.fastmarkets.com/Physical/v2/Prices/history"
query = {
'symbols': 'MB-AL-0004',
'fromDate': '2025-11-01',
'toDate': '2029-02-20
',
'forecastType': 'F24M'
}
headers = {
'Authorization' : 'Bearer ' + accessToken.access_token,
'cache-control' : 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
priceRange = json.loads(req.content)Example Response (JSON):
{
"instruments": [
{
"firstDate": "1987-04-07T00:00:00+00:00",
"lastDate": "2025-11-11T16:00:00+00:00",
"prices": [
{
"date": "2025-11-11",
"assessmentDate": "2025-11-11T16:00:00+00:00",
"revision": 0,
"low": 310.0,
"mid": 325.0,
"high": 340.0
},
. . .
{
"date": "2025-11-04",
"assessmentDate": "2025-11-04T16:00:00+00:00",
"revision": 0,
"low": 310.0,
"mid": 320.0,
"high": 330.0
}
],
"forecast": {
"symbol": "MB-AL-0004.F24M",
"version": 73,
"publicationDate": "2025-11-04T00:00:00.000Z",
"forecastPrices": [
{
"date": "2025-11-01T00:00:00.000Z",
"low": 330.0,
"mid": 330.0,
"high": 330.0
},
. . .
{
"date": "2027-10-01T00:00:00.000Z",
"low": 265.0,
"mid": 265.0,
"high": 265.0
}
]
},
"symbol": "MB-AL-0004"
}
],
"calendar": {
"type": "AssessmentDays",
"dates": [
"2025-11-11",
"2025-11-07",
"2025-11-04"
]
},
"priceCalculationType": "None"
}Retrieving forward curve data
The forward curve data is available for some agriculture prices as the pard of price entity. It will be returned on single, multiple or range of prices called. Use Instruments endpoint to determine if price have forward curve data.
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=AG-CRN-0071url = "https://api.fastmarkets.com/Physical/v2/Prices"
query = {'symbols':'AG-CRN-0071'}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
singlePrice = json.loads(req.content)Example Response (JSON):
{
"instruments": [
{
"firstDate": "2017-09-29T12:00:00+00:00",
"lastDate": "2025-11-11T14:53:49-05:00",
"prices": [
{
"forwardCurves": [
{
"forwardCode": "M1",
"forwardMonth": "DEC",
"low": 218.25,
"mid": 218.25,
"high": 218.25
},
. . .
{
"forwardCode": "M8",
"forwardMonth": "JUL",
"low": 215.0,
"mid": 215.0,
"high": 215.0
},
{
"forwardCode": "M9",
"forwardMonth": "AUG",
"low": 213.5,
"mid": 213.5,
"high": 213.5
}
],
"date": "2025-11-12",
"assessmentDate": "2025-11-11T14:53:49-05:00",
"revision": 0,
"low": 218.25,
"mid": 218.25,
"high": 218.25
}
],
"symbol": "AG-CRN-0071"
}
],
"priceCalculationType": "None"
}Optional price data fields
When requesting price data, not all available data associated to a price is returned by default. This is by design to help reduce the size of the response if requesting a large quantity of records.
However, this additional data can be returned by using the Fields input parameter. Here is a list of the available optional fields that can be added to the request:
- appraisalPrice - Value representing whether undergoing an appraisal process at the point of assessment (Boolean)
- pricingRationale - Description of the rationale behind the assessment made by the Price Reporter (string)
- assessmentPeriod - Description of the assessment period when returning average price calculations types (string)
- lowChangeSincePrevious - Difference between low price value of previous assessment and low price value of this assessment (number)
- midChangeSincePrevious – (As above but for mid price value)
- highChangeSincePrevious – (As above but for high price value)
- lowChangeSincePreviousProportion - Difference between low price value of previous assessment and low price value of this assessment as a decimal value. 1 represents a change of 100%, -1 represents a change of -100% (number)
- midChangeSincePreviousProportion – (As above but for mid price value)
- highChangeSincePreviousProportion – (As above but for high price value)
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Prices HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004&Dates=2019-03-02&
Fields=assessmentPeriod,pricingRationale,lowChangeSincePrevious,midChangeSincePrevious
url = "https://api.fastmarkets.com/Physical/v2/Prices"
query = {
'symbols':'MB-AL-0004',
'fields': [
'assessmentPeriod',
'lowChangeSincePrevious',
'PricingRationale',
'MidChangeSincePrevious'
]
}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
priceWithOptionalFields = json.loads(req.content)
Example Response (JSON):
{
"instruments": [
{
"firstDate": "1987-04-07T00:00:00+00:00",
"lastDate": "2025-11-11T16:00:00+00:00",
"prices": [
{
"date": "2019-03-02",
"assessmentDate": "2019-03-01T16:00:12+00:00",
"revision": 0,
"low": 130.0,
"mid": 135.0,
"high": 140.0,
"pricingRationale": "Premium unchanged at $130-140/t. \n\nOne deal for small tonnage was reported at $140/t. \n\nOne bid was reported at $141/t for small tonnage and an offer for standard tonnage was reported at $127/t. One trader assessed the market unchanged $130-140/t, a second saw it at $135/t, a third at $138/t and a fourth at $140/t. \n\nOne deal for small tonnage at $150/t was discarded because in our judgement it is an outlier and not representative of the bulk of the market. \n\nContango in LME spreads continues to support premium. Participants expect premium could move higher in coming pricing sessions due to higher duty-unpaid levels.\n\nBut tighter duty-unpaid market leading to a disparity in duty spread between unpaid and paid market for now.",
"lowChangeSincePrevious": 0.0,
"midChangeSincePrevious": 0.0,
"assessmentPeriod": "01 Mar 2019"
}
],
"symbol": "MB-AL-0004"
}
],
"priceCalculationType": "None"
}Retrieving instrument data
All physical prices relate to an associated instrument. The instrument consists of various attributes, all of which are available to view using the Instrument endpoint.
If no input parameters are provided, all instruments that the calling service are entitled to see are returned. The Symbols input parameter can be used return specific instruments (see example).
Example Request (Python):
POST https://api.fastmarkets.com/physical/v2/Instruments HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-STS-0236
url = "https://api.fastmarkets.com/Physical/v2/Instruments"
query = {'symbols':'MB-STS-0236'}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
instrumentMetadata = json.loads(req.content)
Example Response (JSON):
{
"instruments": [
{
"productId": "B1GLNZZQZH7H3N",
"description": "Stainless steel scrap 304 turnings, broker buying price, delivered to processor New York, US cents/lb",
"descriptionShort": "Stainless steel scrap 304 turnings, broker buying price, delivered to processor New York, US cents/lb",
"commodityId": "STS",
"priceType": "Price",
"locationId": "USA-NY",
"currencyId": "USd",
"unitOfMeasureId": "Pound",
"incotermId": "DLVD",
"launchDate": "2015-10-20",
"frequency": "Weekly",
"sourceId": "AMM",
"status": "Discontinued",
"priceCalculationTypeIds": [
"WeeklyAverage",
"MonthlyAverage",
"QuarterlyAverage",
"YearlyAverage"
],
"symbol": "MB-STS-0236"
}
]
}By default, many of the attributes returned are ID values (for example: Commodity ID and Currency ID). To return the full name of these attributes, they need to be included in the Fields input parameter as they are optional.
These optional fields include:
- Commodity
- Location
- Currency
- UnitOfMeasure
- Incoterm
- Source
- forecastTypeIds - when forecast data is available for price, will return the list of available forecast types
- hasForwardCurves - when forward curves data is available, will return True, otherwise False
In this example, a request is made to include ForecastTypeIds, HasForwardCurves, Commodity, Currency and Location names in the response:
POST https://api.fastmarket.com/physical/v2/Instruments HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Symbols=MB-AL-0004&Fields=Commodity,Location,Currency,forecastTypeIds,hasForwardCurves
url = "https://api.fastmarkets.com/Physical/v2/Instruments"
query = {
'symbols': 'MB-AL-0004',
'fields': ['Commodity', 'Currency','Location','forecastTypeIds','hasForwardCurves
']
}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
instrumentMetadataOptional = json.loads(req.content)
Example Response (JSON):
{
"instruments": [
{
"productId": "B1GLNZZQZBPPP5",
"description": "Aluminium P1020A premium, in-whs dp Rotterdam, $/tonne",
"descriptionShort": "Aluminium P1020A premium, in-whs dp Rotterdam, $/tonne",
"commodity": "Aluminium",
"commodityId": "AL",
"priceType": "Premium/Discount",
"location": "Rotterdam",
"locationId": "ROT",
"currency": "US Dollar",
"currencyId": "USD",
"unitOfMeasureId": "Tonne",
"incotermId": "IWDP",
"launchDate": "2014-07-25",
"frequency": "Twice weekly",
"sourceId": "MB",
"status": "Active",
"priceCalculationTypeIds": [
"WeeklyAverage",
"MonthlyAverage",
"QuarterlyAverage",
"YearlyAverage"
],
"forecastTypeIds": [
"F24M"
],
"hasForwardCurves": false,
"symbol": "MB-AL-0004"
}
]
}Retrieving reference data
The References endpoint is useful for obtaining details of all valid values for a particular field (such as currency codes) or to obtain the full name a specific reference value.
The following reference data is available using this endpoint:
- Currency
- UnitOfMeasure
- PriceCalculationType
- Incoterm
- Commodity
- Source
POST https://api.fastmarkets.com/physical/v2/References HTTP/1.1
Host: api.fastmarkets.com
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdjZTkyOTQ4NDk0ODRkMDM4YzQ
Types=Currency
url = "https://api.fastmarkets.com/Physical/v2/References"
query = {'types': 'Currency'}
headers = {
'Authorization': 'Bearer ' + accessToken.access_token,
'cache-control': 'no-cache'
}
req = requests.request("GET", url, headers=headers, data = query)
currencyReferenceData = json.loads(req.content)
Example Response (JSON):
{
"references": [
{
"type": "Currency",
"items": [
{
"availableConversionIds": [],
"sign": "COP",
"id": "COP",
"description": "Colombia Peso"
},
{
"availableConversionIds": [
"SEK",
"GBP",
"GBp",
"USD",
"USd",
"BRL",
"CHF",
"VND",
"AUD",
"IDR",
"MXN",
"CNY",
. . .
"JPY",
"MYR",
"CZK",
"PLN",
"RUB",
"CLP",
"ZAR",
"CAD",
"CAd"
],
"sign": "TRY",
"id": "TRY",
"description": "Turkish lira"
},
. . .
{
"availableConversionIds": [],
"sign": "£",
"id": "SHP",
"description": "Saint Helena Pound"
}
]
}
]
}Technical API information
To find out more about our APIs please see API technical information
Further help
If you have more questions or need further support please look at all the help content available on our Support Hub. If you can't find what you need and want to contact our support teams then Let’s get you some help.