Last update | December 2019 |
Operating System | Any |
Tool | Postman |
In the first tutorial we authenticated to the server and requested our token, and then retrieved some data.
This tutorial covers ESG, i.e. Environmental Social & Governance data retrieval.
After a brief introduction to ESG data, we shall cover the available API calls, as well as their input parameters and expected outputs.
We shall illustrate this with requests in Postman. These calls are included in the Postman collection, available under the downloads tab.
The ESG acronym stands for Environmental Social & Governance. This is data that highlights how companies are rated on Environmental, Social and Corporate Governance criteria.
The data is of 2 natures:
There are more than 400 measures (the actual number can vary depending on the company), which as their name indicates are measures of specific criteria, self reported by the companies. The type of data can be a boolean, a number, or eventually a string, depending on the nature of the underlying data. Here are a few areas that are covered:
Using the measures, we calculate a set of scores, i.e. analytics whose result is a number that indicates how well a company scores on various criteria. Some of these are on specific topics, like the Innovation Score, others are summaries, like the Environment, Social and Governance Pillar Score, which are overall ratings of these 3 pillars, and the ESG Score which is an overall score for the company, based on those 3 pillars. Scores have values between 0 and 1, 0 being the worst and 1 the best.
All these values are delivered on a yearly basis, i.e. there is one record per calendar year.
Please note that the source data for measures is self reported by the companies. Depending on when it is published, values for the preceding year might not be available.
We plan to have 2 ways of accessing ESG data from the Refinitiv Data Platform:
There are several levels of access to the data, that relate to the data usage (display on public or private websites), as well as the number of data fields and the depth of history available.
Depending on your contract, you might only be able to access a subset of the API calls described in this tutorial.
In case of doubt about your access rights, please contact your Refinitiv account manager.
Data is currently available for more than 8000 companies, with history going all the way back to 2002 (when available). Companies are regularly added to the list, and delisted companies are not removed.
There are several API call parameters, that are common to most of the ESG API calls. Please note that they are case sensitive:
Parameter | Mandatory? | API calls where it applies | Purpose | Example value | Default |
universe | Mostly | All except the universe call | Instrument identifier. | Example codes for Apple Incorporated: | none |
The following codes are supported: | AAPL.O | ||||
RIC1 | 4295905573 | ||||
PermID2 | |||||
Cusip | 37833100 | ||||
ISIN | |||||
OrgID | US0378331005 | ||||
Sedol | |||||
Valoren | 19775 | ||||
Wert | |||||
2046251 | |||||
To use several, separate them with commas. | |||||
908440 | |||||
865985 | |||||
start | Optional | Measures and scores calls | Start year | -2 | -2 (standard calls) |
(number of years before the most recent year) | -20 (full calls) | ||||
end | Optional | Measures and scores calls | End year | 0 | 0 |
(most recent year) | |||||
format | Optional | All calls | Remove messages3 from output | noMessages | Messages are delivered |
(this is the only possible value if it is set) |
1ESG also supports special RICs that do not deliver market depth data, it is therefore possible to use BNPP.PA or BNPP.PA1, TEF.MC or TEF.MC1, MSFT.NB or MSFT.O.
2See Open PermID for information on what the PermID is, and how you can use it. RIC is the Reuters Identification Code.
3Messages are numeric codes that validate output fields.
As all API calls use the GET method, the API parameters are set in the URL of the call to the API. Their order is not important. Example:
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=IBM.N&format=noMessages&start=-1&end=0
By default, API calls for standard data will return 3 years of history, and calls for full data will return all years history.
The optional start and end parameters can be used to restrict that range to a subset of years.
Note: for a standard call, start cannot be lower than -2. For a full call, start cannot be lower than -20.
API call | Start | End | Result |
universe | not applicable | not applicable | |
basic | not applicable | not applicable | 2017 |
standard | not set | not set | 2015-2017 |
standard | -1 | 0 | 2016-2017 |
standard | -1 | -1 | 2016 |
standard | -3 | -1 | Error (start value should be between -2 and 0) |
full | not set | not set | All available history |
full | -3 | -1 | 2014-2016 |
full | -15 | -15 | 2002 |
full | -21 | 0 | Error (start value should be between -20 and 0) |
The output of the calls is in JSON format. All calls deliver data with a common structure, each one contains the following objects:
Here is an example, from the API call for basic data (the headers section was truncated in this exerpt):
{
"links": {
"count": 1
},
"variability": "variable",
"universe": [
{
"Instrument": "ALVG.DE",
"Company Common Name": "Allianz SE",
"Organization PermID": "4295870171",
"Reporting Currency": ""
}
],
"data": [
[
"ALVG.DE",
"2018-12-31",
100,
"2019-09-20T00:00:00",
285866,
37.7999999999999,
24
]
],
"messages": {
"codes": [
[
-1,
-1,
-1,
-1,
-1,
-1,
-1
]
],
"descriptions": [
{
"code": -1,
"description": "ok"
}
]
},
"headers": [
{
"name": "instrument",
"title": "Instrument",
"type": "string",
"description": "The requested Instrument as defined by the user."
},
...
{
"name": "TR.AvgTrainingHours",
"title": "Average Training Hours",
"type": "number",
"decimalChar": ".",
"description": "Average hours of training per year per employee.\n- if the company has reported the total training hours, divide the value by total number of employees and not employees trained only\n- consider only employee average training hours\n- include all types of training given to general employees (such as health & safety, environmental, emergency response, skills & career development training)\n- if the value is given in days, multiply by 8, assuming that 1 day = 8 hours worked"
}
]
}
Note: if a returned value is null, that means no data is available. If it is 0, then it means a value exists, and it is zero.
Messages are numeric codes that validate received output fields.
There is one message record per returned data record, and one message value per output field in a data record, as can be seen in the example above.
The meaning of the returned message codes is explained in the accompanying description record:
Code | Meaning |
-1 | ok (the value is ok) |
-2 | empty (there is no available value) |
As we saw previously, these messages can be disabled using the format=noMessages API call parameter.
This simple API call returns the universe of instruments for which ESG data is currently available. This is very useful to find out if there is any data for a specific company, and as such it is a good idea to store this list locally on your servers. As the coverage is regularly increased, if you store this list locally then we recommend you update it on a daily basis.
Parameters: format (optional)
Examples:
https://api.refinitiv.com/data/environmental-social-governance/v1/universe?format=noMessages
https://api.refinitiv.com/data/environmental-social-governance/v1/universe
Output:
After the count of results, variability and universe objects, we get the actual data for the universe of instruments.
Fields are the PermID, the primary RIC and the company common name, you can use these to map between a name, a RIC and a PermID:
...
"data": [
[
"4295533401",
"RST",
"Rosetta Stone Inc"
],
[
"4295613014",
"PWF.TO",
"Power Financial Corp"
],
...
This is followed by the messages with their descriptions (except if messages were disabled):
...
],
"messages": {
"codes": [
[
-1,
-1,
-1
],
[
-1,
-1,
-1
],
...
],
"descriptions": [
{
"code": -2,
"description": "empty"
},
{
"code": -1,
"description": "ok"
}
]
},
At the end, we find the headers, i.e. the definitions of the 3 data fields:
...
"headers": [
{
"name": "TR.OrganizationID",
"title": "Organization PermID",
"type": "string",
"description": "Organization level permanent identifier. (OA Permid, Organization Permid, etc)"
},
{
"name": "TR.PrimaryRIC",
"title": "Ric Code",
"type": "string",
"description": "Reuters Identification Code for the primary issue of a company."
},
{
"name": "TR.CommonName",
"title": "Common name",
"type": "string",
"description": "Where available provides the name of the organisation most commonly used."
}
]
}
ESG supports special RICs that do not deliver market depth data (like BNPP.PA1, TEF.MC1, MSFT.NB), but this call will only deliver the main RICs (BNPP.PA, TEF.MC, MSFT.O).
This API call delivers the latest value for a limited set of data, including mainly the following measures: CO2 emissions in tonnes, percentage of women managers and average hours of training per employee.
Parameters: universe (mandatory), format (optional)
Examples:
https://api.refinitiv.com/data/environmental-social-governance/v1/views/basic?universe=ALVG.DE
https://api.refinitiv.com/data/environmental-social-governance/v1/views/basic?universe=ALVG.DE,VOD.L
https://api.refinitiv.com/data/environmental-social-governance/v1/views/basic?universe=4295870171
https://api.refinitiv.com/data/environmental-social-governance/v1/views/basic?universe=ALVG.DE&format=noMessages
Output:
The (nearly) complete output can be seen here.
After the count of results and the variability, we get the universe record which describes the instrument, followed by the data, the messages and the headers.
Here is the actual data, for Allianz:
"data": [
[
"ALVG.DE",
"2018-12-31",
100,
"2019-09-20T00:00:00",
285866,
37.7999999999999,
24
]
],
We can understand the data by using the returned header fields. They show that we received the values for ALVG.DE for the end of the latest current available year (2018). The reporting scope (100) means 100% of the companies activities are covered by the ESG report. We know when the ESG auditor last updated the metrics (2019-09-20), the total CO2 emissions (285866 tonnes), the percentage of women managers (37.8%) and the average hours of training per year per employee (24).
API calls for standard data will return 3 years of history, except if the start and end parameters were used to restrict that range to a subset of years.
There are 2 API calls for standard data, one for measures that delivers more than 400 data fields (the actual number can vary depending on the company), and one just for scores that delivers 16 scores. The measures call actually also includes the scores.
Parameters: universe (mandatory), format (optional), start and end (optional)
Examples:
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=ALVG.DE
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=ALVG.DE,VOD.L
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=4295870171
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=ALVG.DE&format=noMessages
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=ALVG.DE&start=-1&end=0
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-standard?universe=ALVG.DE&format=noMessages&start=-1&end=0
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-standard?universe=ALVG.DE
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-standard?universe=4295870171
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-standard?universe=ALVG.DE&format=noMessages
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-standard?universe=ALVG.DE&start=0&end=0
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-standard?universe=ALVG.DE&format=noMessages&start=-1&end=-1
Output:
After the count of results and the variability, we get the universe record which describes the instrument, followed by the data, the messages and the headers.
Here is an exerpt of the measures-standard data for Allianz (which starts with the 16 scores, which are also delivered by the scores-standard call):
"data": [
[
"2018-12-31",
48.0697490253411,
89.8894980506822,
6.25,
88.1263616557734,
91.4351851851851,
89.8889128559102,
86.3425925925925,
85.8796296296296,
92.8240740740741,
84.9537037037037,
96.0648148148148,
99.7685185185185,
93.75,
99.0131578947368,
75.3289473684211,
74.0131578947368,
null,
"2019-09-20T00:00:00",
true,
true,
true,
...
We can understand the data by using the returned header fields. They show that we received the values for ALVG.DE for the end of the latest current available year (2018). The overall combined ESG score was 48.07 (this score on the 3 pillars is overlayed with the controversies score), the ESG score was 89.89 (without taking controversies into account), the controversies score is 6.25. And so on ...
Here is an exerpt of the scores data for Allianz, containing all the latest scores :
"data": [
[
"ALVG.DE",
"2018-12-31",
48.0697490253411,
89.8894980506822,
6.25,
88.1263616557734,
91.4351851851851,
89.8889128559102,
86.3425925925925,
85.8796296296296,
92.8240740740741,
84.9537037037037,
96.0648148148148,
99.7685185185185,
93.75,
99.0131578947368,
75.3289473684211,
74.0131578947368,
100,
null,
"2019-09-20T00:00:00"
],
It contains the same data as the first part of the measures call illustrated above.
API calls for full data will return all years of history, except if the start and end parameters were used to restrict that range to a subset of years.
There are 2 API calls for full data, one for measures that delivers more than 400 data fields (the actual number can vary depending on the company), and one just for scores that delivers 16 scores. The measures call actually also includes the scores.
Parameters: universe (mandatory), format (optional), start and end (optional)
Examples:
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=ALVG.DE
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=ALVG.DE,VOD.L
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=4295870171
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=ALVG.DE&format=noMessages
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=ALVG.DE&start=-1&end=0
https://api.refinitiv.com/data/environmental-social-governance/v1/views/measures-full?universe=ALVG.DE&format=noMessages&start=-10&end=-10
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-full?universe=ALVG.DE
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-full?universe=4295870171
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-full?universe=ALVG.DE&format=noMessages
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-full?universe=ALVG.DE&start=0&end=0
https://api.refinitiv.com/data/environmental-social-governance/v1/views/scores-full?universe=ALVG.DE&format=noMessages&start=-5&end=0
Output:
The output is similar to that of the standard calls, but with more records as it can deliver the full history.