# Overview (https://docs.datia.app/docs/) The Connect Earth Compliance API returns sustainability and regulatory data for the instruments and portfolios you hold. Send a list of ISINs and get back SFDR, PAI, ESG, EU Taxonomy and sustainable investment data. You can also store portfolios as dated snapshots and generate sustainability reports as PDFs. ## Base URL ``` https://eco.datia.app ``` Every request is JSON over HTTPS and needs your API key in the `x-api-key` header. See [Authentication](https://docs.datia.app/docs/authentication/). [Download the OpenAPI spec](https://docs.datia.app/openapi.yml) to generate a client or import the API into your tools. ## What you can do - [Instruments](https://docs.datia.app/docs/api-reference/instruments/get-sfdr-classification/): SFDR classification, PAI indicators, ESG data and business involvements for up to 10,000 ISINs per request. - [Portfolios](https://docs.datia.app/docs/guides/portfolios/): Store holdings as quarterly snapshots and manage them. - [Sustainable investments](https://docs.datia.app/docs/api-reference/sustainable-investments/list-methodologies/): Classify holdings under your sustainable investment methodology. - [EU Taxonomy](https://docs.datia.app/docs/api-reference/eu-taxonomy/get-eu-taxonomy-alignment/): Alignment, eligibility, and gas and nuclear breakdowns. - [Climate](https://docs.datia.app/docs/api-reference/climate/get-temperature-scores/): Temperature scores for companies and funds. Not yet available on eco.datia.app. - [Reports](https://docs.datia.app/docs/guides/reports/): ESG overview and MiFID II sustainability reports as PDF. ## Access Your API key belongs to your organization, and every key in it shares the same stored portfolios. Each data family (SFDR, ESG, sustainable investments, EU Taxonomy, temperature score) is enabled per organization. If a route returns `403` with "You don't have access to any of the frameworks requested.", contact [customers@connect.earth](mailto:customers@connect.earth). # Quickstart (https://docs.datia.app/docs/quickstart/) ### Get an API key Ask your Connect Earth contact or [customers@connect.earth](mailto:customers@connect.earth) for a key. Keep it on your server. Never ship it in a browser or mobile app. Export it in your shell. The samples in these docs read the key from `CE_API_KEY`. ```bash export CE_API_KEY="your-api-key" ``` ### Request the SFDR classification of three instruments ```bash curl https://eco.datia.app/instruments/sustainability-profile \ --request POST \ --header "Content-Type: application/json" \ --header "x-api-key: $CE_API_KEY" \ --data '{"holdings":[{"isin":"US0378331005"},{"isin":"IE00B4L5Y983"},{"isin":"DE000BU2Z015"}]}' ``` ### Read the response ```json { "data": [ { "isin": "US0378331005", "sustainability_profile": { "classification": 6, "description": "Other", "metadata": null } }, { "isin": "DE000BU2Z015", "sustainability_profile": { "classification": null, "description": null, "metadata": null } }, { "isin": "IE00B4L5Y983", "sustainability_profile": { "classification": 6, "description": "Other", "metadata": null } } ], "metadata": { "message": "Sustainability profile of instruments fetched successfully" } } ``` `classification` is the SFDR article (6, 8 or 9), or `null` when there is no data for the ISIN. An ISIN without data does not fail the request; it comes back with `null` values. Funds are listed after the other instruments, so match results on `isin` rather than on position. ## Next steps * [Authentication](https://docs.datia.app/docs/authentication/) explains how keys and access work. * [Working with portfolios](https://docs.datia.app/docs/guides/portfolios/) shows how to store holdings as dated snapshots and manage them. * The [API reference](https://docs.datia.app/docs/api-reference/instruments/get-sfdr-classification/) lists every endpoint with its request and response schemas. # Authentication (https://docs.datia.app/docs/authentication/) Every request needs the header: ```http x-api-key: ``` Requests pass through a gateway before they reach the API. If the header is missing or the gateway does not recognize the key, it returns `403` with this body: ```json { "message": "Forbidden" } ``` Once a request passes the gateway, the API can still refuse it with `403`. In that case it says why in `data.message`: | Situation | Status | `data.message` | | --------------------------------------------------------- | ------ | ----------------------------------------------------------------------- | | Key accepted by the gateway but not recognized by the API | 403 | You must provide a valid API key | | Key disabled | 403 | You must provide an active API key | | Key valid, data family not enabled for your organization | 403 | You don't have access to any of the frameworks requested. | | Too many instruments in one request | 403 | You can only request data for a maximum of 10000 instruments at a time. | Keys belong to your organization. Portfolios you create with a key are stored for your organization and are shared by every key in it. To get, rotate or revoke a key, contact [customers@connect.earth](mailto:customers@connect.earth). # Errors and limits (https://docs.datia.app/docs/errors/) ## Error format Most errors come from the API and return JSON in this shape: ```json { "data": { "message": "Please provide at least one holding", "error": "Unknown error. Please contact support" } } ``` `data.message` says what went wrong. `data.error` holds extra detail when there is any. It can be a string, an object or a list. When the request body does not match the schema in the [API reference](https://docs.datia.app/docs/api-reference/instruments/get-sfdr-classification/), for example a required field is missing or a value has the wrong type, the API returns `400` with a fixed `data.message` and one entry per problem in `data.error`: ```json { "data": { "message": "An error occurred while processing your request", "error": [ { "path": ".body.snapshot_at", "message": "should have required property 'snapshot_at'", "errorCode": "required.openapi.validation" } ] } } ``` Errors raised by the gateway in front of the API use a shorter shape with a single `message`: ```json { "message": "Endpoint request timed out" } ``` The gateway returns these for a missing or unknown API key (`403`, "Forbidden"), a request that takes too long (`504`), a request body that is too large (`413`) and some `429` responses. The API can also return `429` with its own body; see [Limits](https://docs.datia.app/docs/errors/#limits) for both shapes. A request to a path the gateway does not route, for example a mistyped path or the temperature score route, which is not yet available, gets `403` with `{"message": "Missing Authentication Token"}`. ## Status codes | Status | Meaning | | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 200, 201 | Success. Routes that compute results on the fly (sustainable investments insights, EU Taxonomy, reports, create portfolio) return 201. | | 400 | The request is invalid, or the portfolio was not found. Read `data.message`. | | 403 | Missing, unknown or disabled API key, no access to the data family, or too many instruments in one request. | | 413 | The request body is larger than 10 MB. | | 429 | Too many requests, or the monthly quota is used up. See [Limits](https://docs.datia.app/docs/errors/#limits). | | 500 | Unexpected error. Retry once. If it persists, contact [customers@connect.earth](mailto:customers@connect.earth) with the time of the request. | | 503 | A dependency is temporarily unavailable. Retry with backoff. | | 504 | The request took longer than 29 seconds. Send fewer holdings per request. | ## Limits * **Requests per key:** 10,000 requests per key per calendar month. * **Short bursts:** sending many requests in a short time is also limited. * **Instruments per request:** up to 10,000 holdings on `/instruments/*` routes. Above that the API returns `403` with "You can only request data for a maximum of 10000 instruments at a time." Send many ISINs in one request, up to this limit, rather than one request per ISIN. * **Request timeout:** 29 seconds at the gateway. Requests for large portfolios on computed routes (EU Taxonomy, reports) can hit this. Split them. * **Body size:** 10 MB per request. When a limit is hit, the API returns `429`. The body tells you which limit: | Body | Meaning | What to do | | ------------------------------------------------------------------------ | ------------------------------------------ | -------------------------------------------------------------------------------- | | `{"message": "Too Many Requests"}` | Too many requests in a short time. | Wait, then retry with backoff. | | `{"status": 429, "error": "Too many requests, please try again later."}` | Too many requests in a short time. | Wait, then retry with backoff. | | `{"message": "Limit Exceeded"}` | The monthly quota for your key is used up. | Do not retry. Contact [customers@connect.earth](mailto:customers@connect.earth). | ## Other `400` messages Some requests pass the schema check and are still rejected with `400`. The reason is in `data.message`: | `data.message` | Cause | | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Snapshot date cannot be higher than actual date | `snapshot_at` is in a future year (`POST /portfolios`, `DELETE /portfolios/{identifier}`, `POST /reports`). | | You are not using a valid date as snapshot parameter | `snapshot_at` cannot be read as a date. | | No data found for the given parameters | `POST /taxonomy/insights` found neither taxonomy data nor market values for the holdings. | | Some instruments are missing required properties | A holding sent to `POST /sustainable-investments/insights` or `POST /taxonomy/insights` has no `isin`, `name`, `instrument_type` or `market_value`, for example a cash row. | # Working with portfolios (https://docs.datia.app/docs/guides/portfolios/) ## Snapshots A portfolio is a set of holdings at a date. Each date is a snapshot. The `snapshot_at` you send is moved to the end of its quarter, so `2026-05-14` is stored as `2026-06-30`. A portfolio holds at most one snapshot per quarter. Stored portfolios appear in your organization in the Connect Earth app. The API does not read them back yet: the other routes take the holdings in the request body. ## Create a portfolio Send the holdings with [`POST /portfolios`](https://docs.datia.app/docs/api-reference/portfolios/create-or-replace-a-portfolio-snapshot/). `name`, `snapshot_at` and `holdings` are required. `currency` is an ISO 4217 code and defaults to `USD`; a code that is not recognized creates the portfolio in EUR. Give every holding a `name`, a `currency` and a non-zero `market_value`. `weight` and `market_value` must be numbers. Use `null` as the ISIN for cash or instruments without an ISIN. ```bash curl https://eco.datia.app/portfolios \ --request POST \ --header "Content-Type: application/json" \ --header "x-api-key: $CE_API_KEY" \ --data @portfolio.json ``` ```json title="portfolio.json" { "name": "Pension fund A", "identifier": "pension-fund-a", "currency": "USD", "snapshot_at": "2026-06-30", "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 30, "market_value": 3000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 25, "market_value": 2500000 }, { "name": "iShares Core MSCI World UCITS ETF", "isin": "IE00B4L5Y983", "instrument_type": "etf", "currency": "USD", "weight": 25, "market_value": 2500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 15, "market_value": 1500000 }, { "name": "Cash", "isin": null, "instrument_type": "cash", "currency": "USD", "weight": 5, "market_value": 500000 } ] } ``` The response (`201`) gives the portfolio's `identifier`: ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund created successfully at 2026-06-30" } } ``` The returned `identifier` has the form `datia-portfolio:_`. Store it: it is the value you pass to `PUT` and `DELETE /portfolios/{identifier}`, and it must match exactly. Always send an `identifier`. Portfolios created without one share the same identifier, so you cannot update or delete them one by one. Use only letters, digits, `-` and `_` in it, so the returned value can be used in a URL path as is. ### Replace a snapshot Send `POST /portfolios` again with the same `identifier` and a date in the same quarter. The holdings for that quarter are replaced. A date in a different quarter adds a new snapshot to the same portfolio. Both return `201`. Whenever the portfolio already exists, the message reads "Fund updated successfully at" followed by the quarter-end date, whether a snapshot was replaced or added. Only the holdings change. To change `name` or `currency` of an existing portfolio, use `PUT /portfolios/{identifier}`. ## List portfolios [`GET /portfolios`](https://docs.datia.app/docs/api-reference/portfolios/list-portfolios/) lists every portfolio in your organization, including portfolios created in the Connect Earth app, each with its `identifier` and the quarter-end dates that have holdings, oldest first. Snapshots older than about five years are not listed. ```json { "data": { "members": 4, "funds": [ { "identifier": "datia-portfolio:12345_pension-fund-a", "name": "Pension fund A", "snapshots": ["2026-03-31", "2026-06-30"] } ] }, "metadata": { "message": "Organization metadata successfully retrieved" } } ``` ## Rename or change currency [`PUT /portfolios/{identifier}`](https://docs.datia.app/docs/api-reference/portfolios/rename-a-portfolio-or-change-its-currency/) updates the name or currency of a portfolio. Send only the fields you want to change. An unknown currency code is ignored. ```bash curl https://eco.datia.app/portfolios/datia-portfolio:12345_pension-fund-a \ --request PUT \ --header "Content-Type: application/json" \ --header "x-api-key: $CE_API_KEY" \ --data '{"name":"Pension fund A (EUR)","currency":"EUR"}' ``` ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund metadata updated successfully with id: 67890" } } ``` ## Delete a snapshot [`DELETE /portfolios/{identifier}`](https://docs.datia.app/docs/api-reference/portfolios/delete-a-portfolio-snapshot/) deletes one snapshot. Send its date as `snapshot_at` in the JSON body. Like on create, the date is moved to the end of its quarter. `PUT` and `DELETE` work on any portfolio in your organization, including portfolios created in the Connect Earth app. ```bash curl https://eco.datia.app/portfolios/datia-portfolio:12345_pension-fund-a \ --request DELETE \ --header "Content-Type: application/json" \ --header "x-api-key: $CE_API_KEY" \ --data '{"snapshot_at":"2026-06-30"}' ``` ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund snapshot deleted successfully" } } ``` `metadata.message` says what happened: | `metadata.message` | What happened | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Fund snapshot deleted successfully | The snapshot was deleted. | | Fund deleted successfully with all snapshots | It was the last listed snapshot, so the portfolio was deleted too. | | Fund deleted successfully | The portfolio had no listed snapshots, for example because they are all older than about five years, so the whole portfolio was deleted, whatever `snapshot_at` you sent. | | Fund snapshot not found | The snapshot is not listed. Nothing was deleted. The status is still `200`. | # Requesting reports (https://docs.datia.app/docs/guides/reports/) ## Report types Set `type` to one of: * `esg-overview`: an ESG overview of the portfolio. * `mifid2`: a MiFID II sustainability report. ## Request a report Send the holdings with [`POST /reports`](https://docs.datia.app/docs/api-reference/reports/generate-a-sustainability-report/). The request needs: * `name`: name of the portfolio, shown in the report. * `snapshot_at`: date of the holdings (ISO 8601). It is moved to the end of its quarter. * `identifier`: your label for the portfolio. It is not linked to portfolios stored with `POST /portfolios`. * `type`: `esg-overview` or `mifid2`. * `holdings`: at least one holding. Each holding needs `isin`, `name`, `currency`, `weight` and `market_value`. `isin` must be a string; `null` is not accepted, so leave out cash and instruments without an ISIN. Optional fields: * `benchmark_index`: the name of an index from the list in the [reference](https://docs.datia.app/docs/api-reference/reports/generate-a-sustainability-report/). It defaults to `S&P 500` when no benchmark is sent. A name that is not in the list fails with `400`. Contact [customers@connect.earth](mailto:customers@connect.earth) if you need another index. * `benchmark_etf_mutual_fund`: the ISIN of an ETF or mutual fund to compare with. If you send both, `benchmark_etf_mutual_fund` is used. * `methodology_id`: the sustainable investments methodology, from [`GET /sustainable-investments/methodologies`](https://docs.datia.app/docs/api-reference/sustainable-investments/list-methodologies/). It applies to `mifid2` reports only. ```bash curl https://eco.datia.app/reports \ --request POST \ --header "Content-Type: application/json" \ --header "x-api-key: $CE_API_KEY" \ --data @report.json ``` ```json title="report.json" { "name": "Pension fund A", "identifier": "pension-fund-a", "type": "esg-overview", "snapshot_at": "2026-06-30", "benchmark_etf_mutual_fund": "IE00B4L5Y983", "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 40, "market_value": 4000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 35, "market_value": 3500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 25, "market_value": 2500000 } ] } ``` ## What you get back The request is synchronous. The response (`201`) contains `document.location_url`, a link to the PDF. Download the PDF right away; the link may expire. ```json { "document": { "location_url": "https://cdn.datia.app/reports/report-0001.pdf", "request_id": "REQUEST-ID-0001" }, "metadata": { "snapshot_at": "2026-06-30", "type": "esg-overview", "default_benchmark": "IE00B4L5Y983", "identifier": "report-reference-0001" } } ``` `metadata.default_benchmark` is the ISIN of the benchmark used. If you contact support about a report, quote `document.request_id`. Reports are built within the request, so they are subject to the 29-second timeout described in [Errors and limits](https://docs.datia.app/docs/errors/). A report that times out (`504`) may still be generated, but it cannot be retrieved. Retry with fewer holdings. # Generate a sustainability report (https://docs.datia.app/docs/api-reference/reports/generate-a-sustainability-report/) POST https://eco.datia.app/reports Builds a PDF sustainability report for the holdings you send and returns a link to it. The report compares the portfolio with one benchmark: `benchmark_etf_mutual_fund` when you send it, otherwise `benchmark_index`, which defaults to `S&P 500`. A request without `identifier`, without `type` or with an empty `holdings` list fails with `400`. A `snapshot_at` in a future year fails with `400` and the message `Snapshot date cannot be higher than actual date`. A date that cannot be read fails with `400` and the message `You are not using a valid date as snapshot parameter`. ## Request body - `name` (string, required): Name of the portfolio, shown in the report. - `identifier` (string, required): Your label for the portfolio. It is not linked to portfolios stored with `POST /portfolios`. - `type` (string, one of: "esg-overview", "mifid2", required): Report type. - `snapshot_at` (string (date), required): Date of the holdings (ISO 8601). It is moved to the end of its quarter. - `holdings` (array, required): Holdings in the portfolio. Must contain at least one holding. - `isin` (string, required): ISIN of the instrument. `null` is not accepted. - `name` (string, required): Name of the instrument. - `currency` (string, required): Currency of the market value, as an ISO 4217 code. - `weight` (number | string, required): Weight of the holding in the portfolio, from 0 to 100. - `market_value` (number | string, required): Market value of the holding, in `currency`. ETF and mutual fund holdings with a zero or unreadable market value are skipped. - `instrument_type` (string, one of: "stock", "bond", "etf", "mutual-fund", "cash", "option", "future", "forward-contract", "lending", "other", "warrant", "sovereign-bond", optional): Type of instrument. A holding with a type outside this list is skipped, unless its ISIN is a known fund. - `benchmark_index` (string, one of: "S&P 500", "Nasdaq 100", "DOW 30", "FTSE 100", "OMX 30", "OMX Stockholm", "OMXC 30", "DAX", "CAC 40", "SMI", "AEX", "IBEX 35", "PSI 20", "BEL 20", "ATX 20", "EURO STOXX 50", "Solactive SEK IG Credit Index", optional, default "S&P 500"): Name of the index to compare the portfolio with. Defaults to `S&P 500`. A name that is not in the list fails with `400`. Use `benchmark_etf_mutual_fund` instead to compare with a specific ETF or mutual fund. - `benchmark_etf_mutual_fund` (string, optional): ISIN of the ETF or mutual fund to compare the portfolio with. Takes priority over `benchmark_index`. - `methodology_id` (number, optional): Sustainable investments methodology to use. Only applies to `mifid2` reports. Get the ids from `GET /sustainable-investments/methodologies`. Example: ```json { "name": "Pension fund A", "identifier": "pension-fund-a", "type": "esg-overview", "snapshot_at": "2026-06-30", "benchmark_etf_mutual_fund": "IE00B4L5Y983", "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 40, "market_value": 4000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 35, "market_value": 3500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 25, "market_value": 2500000 } ] } ``` ## Response 201 The report was generated. - `document` (object, optional) - `location_url` (string (uri), optional): Link to the PDF report. Download it right away, because the link may expire. - `request_id` (string, optional): Reference to quote when contacting support. - `metadata` (object, optional) - `snapshot_at` (string (date), optional): Quarter-end date the report was built for. - `type` (string, optional): Report type you requested. - `default_benchmark` (string, optional): ISIN of the benchmark used. - `identifier` (string, optional): Internal reference. ```json { "document": { "location_url": "https://cdn.datia.app/reports/report-0001.pdf", "request_id": "REQUEST-ID-0001" }, "metadata": { "snapshot_at": "2026-06-30", "type": "esg-overview", "default_benchmark": "IE00B4L5Y983", "identifier": "report-reference-0001" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key. ## Response 500 Unexpected server error. # List portfolios (https://docs.datia.app/docs/api-reference/portfolios/list-portfolios/) GET https://eco.datia.app/portfolios Lists every portfolio in your organization, including portfolios created in the Connect Earth app, and the snapshot dates each one has. Snapshots older than about five years are not listed. ## Response 200 The portfolios in your organization. - `data` (object, optional) - `members` (integer, optional): Number of members in your organization. - `funds` (array, optional) - `identifier` (string, optional): Identifier of the portfolio. Use it in `/portfolios/{identifier}`. - `name` (string, optional): Name of the portfolio. - `snapshots` (array, optional): Quarter-end dates that have holdings, oldest first. - `metadata` (object, optional) - `message` (string, optional) ```json { "data": { "members": 4, "funds": [ { "identifier": "datia-portfolio:12345_pension-fund-a", "name": "Pension fund A", "snapshots": [ "2026-03-31", "2026-06-30" ] } ] }, "metadata": { "message": "Organization metadata successfully retrieved" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key. ## Response 500 Unexpected server error. # Create or replace a portfolio snapshot (https://docs.datia.app/docs/api-reference/portfolios/create-or-replace-a-portfolio-snapshot/) POST https://eco.datia.app/portfolios Uploads the holdings of a portfolio for one date. Sending the same `identifier` with a date in the same quarter replaces that snapshot. A date in another quarter adds a new snapshot. When the `identifier` already exists, only the holdings are replaced or added: `name` and `currency` are changed only with `PUT /portfolios/{identifier}`. Use the `identifier` in the response to update or delete the portfolio later. A `snapshot_at` in a future year fails with `400` and the message `Snapshot date cannot be higher than actual date`. A date that cannot be read fails with `400` and the message `You are not using a valid date as snapshot parameter`. ## Request body - `name` (string, required): Name of the portfolio. - `identifier` (string, optional): Your identifier for the portfolio. Always send it: portfolios created without one share the same identifier, so you cannot update or delete them one by one. - `currency` (string, optional, default "USD"): Currency of the portfolio, as an ISO 4217 code. If the code is not recognized, the portfolio is created in EUR. - `snapshot_at` (string (date), required): Date of the holdings (ISO 8601). It is moved to the end of its quarter. - `holdings` (array, required): Holdings in the portfolio. Use `null` as the ISIN for cash or instruments without an ISIN. Send a `name`, `currency` and non-zero `market_value` for every holding. ETF and mutual fund holdings without them are skipped without an error; other holdings without a valid `currency` make the request fail. - `isin` (string | null, optional): ISIN of the instrument. Use null for cash or instruments without an ISIN. - `name` (string, optional): Name of the instrument. - `currency` (string, optional): Currency of the market value, as an ISO 4217 code. - `weight` (number, optional): Weight of the holding in the portfolio, from 0 to 100. A missing weight is stored as 0. Weights that add up to more than 100 are scaled down to a total of 100. - `market_value` (number, optional): Market value of the holding, in `currency`. - `instrument_type` (string, one of: "stock", "bond", "etf", "mutual-fund", "cash", "option", "future", "forward-contract", "lending", "other", "warrant", "sovereign-bond", optional): Type of instrument. A holding with a type outside this list is skipped, unless its ISIN is a known fund. Example: ```json { "name": "Pension fund A", "identifier": "pension-fund-a", "currency": "USD", "snapshot_at": "2026-06-30", "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 30, "market_value": 3000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 25, "market_value": 2500000 }, { "name": "iShares Core MSCI World UCITS ETF", "isin": "IE00B4L5Y983", "instrument_type": "etf", "currency": "USD", "weight": 25, "market_value": 2500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 15, "market_value": 1500000 }, { "name": "Cash", "isin": null, "instrument_type": "cash", "currency": "USD", "weight": 5, "market_value": 500000 } ] } ``` ## Response 201 The portfolio snapshot was created or replaced. - `identifier` (string | null, optional): Identifier of the portfolio. Use it in `/portfolios/{identifier}`. - `metadata` (object, optional) - `message` (string, optional) ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund created successfully at 2026-06-30" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key. ## Response 500 Unexpected server error. # Delete a portfolio snapshot (https://docs.datia.app/docs/api-reference/portfolios/delete-a-portfolio-snapshot/) DELETE https://eco.datia.app/portfolios/{identifier} Deletes one snapshot of a portfolio. It works on any portfolio in your organization, including portfolios created in the Connect Earth app. When you delete the last listed snapshot, the portfolio is deleted too. A portfolio with no listed snapshots, for example one whose snapshots are all older than about five years, is deleted entirely by a `DELETE`, whatever `snapshot_at` you send. If the snapshot is not listed, nothing is deleted and the message says so. `metadata.message` is one of `Fund snapshot deleted successfully`, `Fund deleted successfully with all snapshots`, `Fund deleted successfully` or `Fund snapshot not found`. ## Parameters - `identifier` (path, required): The portfolio `identifier` returned by `POST /portfolios` or `GET /portfolios`. Example: `datia-portfolio:12345_pension-fund-a`. ## Request body - `snapshot_at` (string (date), required): Date of the snapshot to delete (ISO 8601). It is moved to the end of its quarter. A date in a future year or a date that cannot be read fails with `400`. Example: ```json { "snapshot_at": "2026-06-30" } ``` ## Response 200 The request was processed. `metadata.message` says what was deleted. - `identifier` (string | null, optional): Identifier of the portfolio. Use it in `/portfolios/{identifier}`. - `metadata` (object, optional) - `message` (string, optional) ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund snapshot deleted successfully" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key. ## Response 500 Unexpected server error. # Rename a portfolio or change its currency (https://docs.datia.app/docs/api-reference/portfolios/rename-a-portfolio-or-change-its-currency/) PUT https://eco.datia.app/portfolios/{identifier} Updates the name or currency of a portfolio. Send only the fields you want to change. It works on any portfolio in your organization, including portfolios created in the Connect Earth app. An unknown currency code is ignored. ## Parameters - `identifier` (path, required): The portfolio `identifier` returned by `POST /portfolios` or `GET /portfolios`. Example: `datia-portfolio:12345_pension-fund-a`. ## Request body - `name` (string, optional): New name of the portfolio. - `currency` (string, optional): New currency of the portfolio, as an ISO 4217 code. Example: ```json { "name": "Pension fund A (EUR)", "currency": "EUR" } ``` ## Response 200 The portfolio was updated. - `identifier` (string | null, optional): Identifier of the portfolio. Use it in `/portfolios/{identifier}`. - `metadata` (object, optional) - `message` (string, optional) ```json { "identifier": "datia-portfolio:12345_pension-fund-a", "metadata": { "message": "Fund metadata updated successfully with id: 67890" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key. ## Response 500 Unexpected server error. # Get SFDR classification (https://docs.datia.app/docs/api-reference/instruments/get-sfdr-classification/) POST https://eco.datia.app/instruments/sustainability-profile Returns the SFDR article (6, 8 or 9) for each ISIN. Needs access to the SFDR framework. Up to 10,000 holdings per request. Entries without an `isin` are skipped. An empty `holdings` list fails with `400` and the message `Please provide at least one instrument`. When no entry has an `isin`, the response has an empty `data` list. ## Request body - `holdings` (array, required): Instruments to look up. - `isin` (string, optional): ISIN of the instrument. Entries without an `isin` are skipped. Example: ```json { "holdings": [ { "isin": "US0378331005" }, { "isin": "IE00B4L5Y983" }, { "isin": "DE000BU2Z015" } ] } ``` ## Response 200 The SFDR classification of each ISIN. Funds are listed after the other instruments. - `data` (array, optional) - `isin` (string, optional): ISIN of the instrument. - `sustainability_profile` (object, optional) - `classification` (integer | null, one of: 6, 8, 9, null, optional): SFDR article, or `null` when it is not known. - `description` (string | null, one of: "Other", "Environmental and social characteristics", "Sustainability as an objective", null, optional): Name of the SFDR article. - `metadata` (null, optional) - `metadata` (object, optional) - `message` (string, optional) ```json { "data": [ { "isin": "US0378331005", "sustainability_profile": { "classification": 6, "description": "Other", "metadata": null } }, { "isin": "DE000BU2Z015", "sustainability_profile": { "classification": null, "description": null, "metadata": null } }, { "isin": "IE00B4L5Y983", "sustainability_profile": { "classification": 6, "description": "Other", "metadata": null } } ], "metadata": { "message": "Sustainability profile of instruments fetched successfully" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, your organization has no access to the data family this route needs, or the request has more than 10,000 instruments. ## Response 500 Unexpected server error. # Get business involvements (https://docs.datia.app/docs/api-reference/instruments/get-business-involvements/) POST https://eco.datia.app/instruments/business-involvements Returns ESG scores and business involvements, such as thermal coal or tobacco, for each ISIN. Needs access to the ESG framework. Up to 10,000 holdings per request. Entries without an `isin` are skipped. An empty `holdings` list, or one where no entry has an `isin`, fails with `400` and the message `Please provide at least one instrument`. ## Request body - `holdings` (array, required): Instruments to look up. - `isin` (string, optional): ISIN of the instrument. Entries without an `isin` are skipped. - `minimum_threshold` (number, optional, default 0): Leave out involvements where the share of revenue involved is below this value. When it is above 0, involvements with no activity are also left out. Example: ```json { "holdings": [ { "isin": "US0378331005" }, { "isin": "IE00B4L5Y983" } ], "minimum_threshold": 0 } ``` ## Response 200 Business involvements for each ISIN, in the order you sent them. - `data` (array, optional) - `sustainability_data` (object | null, optional): Scores and involvements, or `null` when the ISIN is not known. - `total_score` (number | null, optional): Total ESG score, out of 300. `null` when missing; a score of 0 may also come back as `null`. - `environment_score` (number | null, optional): Environmental score, out of 100. `null` when missing; a score of 0 may also come back as `null`. - `social_score` (number | null, optional): Social score, out of 100. `null` when missing; a score of 0 may also come back as `null`. - `governance_score` (number | null, optional): Governance score, out of 100. `null` when missing; a score of 0 may also come back as `null`. - `business_involvements` (object | array, optional): Involvements keyed by name, for example `thermal_coal` or `tobacco_distributor`. For a company, an involvement has weight 100 and count 1, and one with no activity has weight 0 and count 0. For a fund, weight is the share of the fund involved and count is the number of holdings involved. When a company has no involvement data, this is an empty array. - `` (object, optional) - `weight` (number, optional): Share involved, from 0 to 100. - `count` (integer, optional): Number of holdings involved. - `metadata` (object, optional) - `isin` (string, optional): ISIN you sent. - `is_fund` (boolean, optional): Whether the ISIN is a fund. Left out when there is no data for the ISIN. - `message` (string, optional) ```json { "data": [ { "sustainability_data": { "total_score": 212, "environment_score": 71, "social_score": 68, "governance_score": 73, "business_involvements": { "thermal_coal": { "weight": 0, "count": 0 }, "tobacco_distributor": { "weight": 0, "count": 0 }, "nuclear_weapons": { "weight": 0, "count": 0 } } }, "metadata": { "isin": "US0378331005", "is_fund": false } }, { "sustainability_data": { "total_score": 186, "environment_score": 62, "social_score": 61, "governance_score": 64, "business_involvements": { "thermal_coal": { "weight": 0.4, "count": 3 }, "tobacco_distributor": { "weight": 0.6, "count": 5 }, "nuclear_power_generation": { "weight": 1.2, "count": 7 } } }, "metadata": { "isin": "IE00B4L5Y983", "is_fund": true } } ], "message": "Business involvements of instruments fetched successfully" } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, your organization has no access to the data family this route needs, or the request has more than 10,000 instruments. ## Response 500 Unexpected server error. # Get PAI indicators (https://docs.datia.app/docs/api-reference/instruments/get-pai-indicators/) POST https://eco.datia.app/instruments/sustainability-data Returns the mandatory SFDR principal adverse impact (PAI) indicators for each ISIN, with their units. Needs access to the SFDR framework. Up to 10,000 holdings per request. Entries without an `isin` are skipped. An empty `holdings` list, or one where no entry has an `isin`, fails with `400` and the message `Please provide at least one instrument`. ## Request body - `holdings` (array, required): Instruments to look up. - `isin` (string, optional): ISIN of the instrument. Entries without an `isin` are skipped. Example: ```json { "holdings": [ { "isin": "US0378331005" }, { "isin": "US5949181045" } ] } ``` ## Response 200 PAI indicators for each ISIN, in the order you sent them. - `data` (array, optional) - `sustainability_data` (object | null, optional): Indicators keyed by name, or `null` only when the ISIN is not known. Keys are the mandatory PAI codes, for example `scope_1_emissions`, `scope_2_emissions`, `carbon_footprint` and `ghg_intensity_investee_companies`, plus `sfdr_classification` and `fund_currency` for funds. An indicator's `value` can be `null`. - `` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `metadata` (object, optional) - `isin` (string, optional): ISIN you sent. - `is_fund` (boolean, optional): Whether the ISIN is a fund. Left out when there is no data for the ISIN. - `metadata` (object, optional) - `message` (string, optional) ```json { "data": [ { "sustainability_data": { "scope_1_emissions": { "value": 55200, "unit": "tonnes" }, "scope_2_emissions": { "value": 3400, "unit": "tonnes" }, "carbon_footprint": { "value": 1.9, "unit": "tCO2e/M€" }, "ghg_intensity_investee_companies": { "value": 4.3, "unit": "tCO2e/M€" } }, "metadata": { "isin": "US0378331005", "is_fund": false } }, { "sustainability_data": { "scope_1_emissions": { "value": 144960, "unit": "tonnes" }, "scope_2_emissions": { "value": 393134, "unit": "tonnes" }, "carbon_footprint": { "value": 3.2, "unit": "tCO2e/M€" }, "ghg_intensity_investee_companies": { "value": 17.6, "unit": "tCO2e/M€" } }, "metadata": { "isin": "US5949181045", "is_fund": false } } ], "metadata": { "message": "Sustainability data of instruments fetched successfully" } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, your organization has no access to the data family this route needs, or the request has more than 10,000 instruments. ## Response 500 Unexpected server error. # Get ESG data (https://docs.datia.app/docs/api-reference/instruments/get-esg-data/) POST https://eco.datia.app/instruments/esg-data Returns ESG scores and environmental, social and governance metrics for each ISIN, with their units. Needs access to the ESG framework. Up to 10,000 holdings per request. Entries without an `isin` are skipped. An empty `holdings` list, or one where no entry has an `isin`, fails with `400` and the message `Please provide at least one instrument`. ## Request body - `holdings` (array, required): Instruments to look up. - `isin` (string, optional): ISIN of the instrument. Entries without an `isin` are skipped. Example: ```json { "holdings": [ { "isin": "US0378331005" }, { "isin": "IE00B4L5Y983" } ] } ``` ## Response 200 ESG data for each ISIN, in the order you sent them. - `data` (array, optional) - `sustainability_data` (object | null, optional): Metrics keyed by name, or `null` only when the ISIN is not known. A metric's `value` can be `null`. - `total_score` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `environment_score` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `social_score` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `governance_score` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `carbon_footprint` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `total_amount_waste_produced_by_sales_or_revenue` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `co2_and_equivalents_totals_by_revenue_or_sales` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `total_amount_hazardous_waste_produced_by_sales_or_revenue` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `total_direct_indirect_energy_consumption` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `percentage_of_women_managers` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `average_percentage_employee_turnover` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `average_gender_pay_gap` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `percentage_independent_board_member` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `female_representations_board` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `foreign_culture_representation_board` (object, optional) - `value` (number | string | boolean | null, optional): The value, usually a number. - `unit` (string | null, optional): Unit of the value, or `null` when it has none. - `metadata` (object, optional) - `isin` (string, optional): ISIN you sent. - `is_fund` (boolean, optional): Whether the ISIN is a fund. Left out when there is no data for the ISIN. - `message` (string, optional) ```json { "data": [ { "sustainability_data": { "total_score": { "value": 212, "unit": "out of 300" }, "environment_score": { "value": 71, "unit": "out of 100" }, "carbon_footprint": { "value": 2.1, "unit": "tonnes/ M€" }, "percentage_of_women_managers": { "value": 31, "unit": "%" } }, "metadata": { "isin": "US0378331005", "is_fund": false } }, { "sustainability_data": { "total_score": { "value": 186, "unit": "out of 300" }, "environment_score": { "value": 62, "unit": "out of 100" }, "carbon_footprint": { "value": 58.4, "unit": "tonnes/ M€" }, "percentage_of_women_managers": { "value": 27, "unit": "%" } }, "metadata": { "isin": "IE00B4L5Y983", "is_fund": true } } ], "message": "ESG data of instruments fetched successfully" } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, your organization has no access to the data family this route needs, or the request has more than 10,000 instruments. ## Response 500 Unexpected server error. # List methodologies (https://docs.datia.app/docs/api-reference/sustainable-investments/list-methodologies/) GET https://eco.datia.app/sustainable-investments/methodologies Lists the sustainable investments methodologies you can use. Needs access to the sustainable investments framework. ## Response 200 The methodologies available to your organization. - `data` (array, optional) - `id` (integer, optional): Methodology id. Use it as `methodology_id`. - `name` (string, optional): Name of the methodology. ```json { "data": [ { "id": 1, "name": "Connect Earth's Sample" }, { "id": 230, "name": "Custom methodology" } ] } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, or your organization has no access to the data family this route needs. ## Response 500 Unexpected server error. # Classify sustainable investments (https://docs.datia.app/docs/api-reference/sustainable-investments/classify-sustainable-investments/) POST https://eco.datia.app/sustainable-investments/insights Classifies each holding as sustainable, moderate, not sustainable or uncovered under a methodology. Needs access to the sustainable investments framework. Every holding needs a non-null `isin`, `name`, `instrument_type` and `market_value`, so remove cash rows; otherwise the request fails with `400`. ## Request body - `methodology_id` (number, optional): Methodology to use, from `GET /sustainable-investments/methodologies`. Defaults to the standard methodology. - `holdings` (array, required): Holdings to classify. Must contain at least one holding. - `isin` (string, required): ISIN of the instrument. - `name` (string, required): Name of the instrument. - `instrument_type` (string, one of: "stock", "bond", "etf", "mutual-fund", "cash", "option", "future", "forward-contract", "lending", "other", "warrant", "sovereign-bond", required): Type of instrument. A holding with a type outside this list is skipped, unless its ISIN is a known fund. - `currency` (string, optional): Currency of the market value, as an ISO 4217 code. Defaults to EUR. - `weight` (number, optional): Weight of the holding in the portfolio, from 0 to 100. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `market_value` (number, required): Market value of the holding, in `currency`. ETF and mutual fund holdings with a market value of 0 are skipped. Example: ```json { "methodology_id": 230, "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 40, "market_value": 4000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 35, "market_value": 3500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 25, "market_value": 2500000 } ] } ``` ## Response 201 The classification of each holding. Results are grouped by classification; match on `isin`. - `data` (array, optional) - `name` (string, optional): Name of the holding. - `isin` (string, optional): ISIN of the holding. - `weight` (number | null, optional): Weight of the holding as stored. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `sustainability_profile` (object, optional) - `classification` (integer | null, one of: 9, 8, 6, null, optional): 9 for sustainable, 8 for moderate, 6 for not sustainable, `null` for uncovered. - `description` (string, one of: "Sustainable", "Moderate", "Not sustainable", "Uncovered", optional) - `metadata` (null, optional) ```json { "data": [ { "name": "Microsoft Corp.", "isin": "US5949181045", "weight": 35, "sustainability_profile": { "classification": 9, "description": "Sustainable", "metadata": null } }, { "name": "Apple Inc.", "isin": "US0378331005", "weight": 40, "sustainability_profile": { "classification": 8, "description": "Moderate", "metadata": null } }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "weight": 25, "sustainability_profile": { "classification": null, "description": "Uncovered", "metadata": null } } ] } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, or your organization has no access to the data family this route needs. ## Response 500 Unexpected server error. # Get EU Taxonomy alignment (https://docs.datia.app/docs/api-reference/eu-taxonomy/get-eu-taxonomy-alignment/) POST https://eco.datia.app/taxonomy/insights Returns the EU Taxonomy eligibility and alignment of the holdings you send, taken together as one portfolio. Needs access to the EU Taxonomy framework. Every holding needs a non-null `isin`, `name`, `instrument_type` and `market_value`, so remove cash rows; otherwise the request fails with `400`. When neither taxonomy data nor a market value can be found for the holdings, the request fails with `400` and the message `No data found for the given parameters`. ## Request body - `holdings` (array, required): Holdings to analyze. Must contain at least one holding. - `isin` (string, required): ISIN of the instrument. - `name` (string, required): Name of the instrument. - `instrument_type` (string, one of: "stock", "bond", "etf", "mutual-fund", "cash", "option", "future", "forward-contract", "lending", "other", "warrant", "sovereign-bond", required): Type of instrument. A holding with a type outside this list is skipped, unless its ISIN is a known fund. - `currency` (string, optional): Currency of the market value, as an ISO 4217 code. Defaults to EUR. - `weight` (number, optional): Weight of the holding in the portfolio, from 0 to 100. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `market_value` (number, required): Market value of the holding, in `currency`. ETF and mutual fund holdings with a market value of 0 are skipped. Example: ```json { "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 40, "market_value": 4000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 35, "market_value": 3500000 }, { "name": "Bund 2.6% 2033", "isin": "DE000BU2Z015", "instrument_type": "sovereign-bond", "currency": "EUR", "weight": 25, "market_value": 2500000 } ] } ``` ## Response 201 EU Taxonomy figures for the holdings. Every value is a percentage. - `data` (object, optional) - `taxonomy_alignment_%` (number, optional): Taxonomy-aligned activities, across turnover, CapEx and OpEx. - `taxonomy_eligible_turnover_%` (number, optional): Currently returns the same value as `taxonomy_alignment_turnover_%`. This is a known issue. - `taxonomy_alignment_turnover_%` (number, optional): Taxonomy-aligned activities, by turnover. - `taxonomy_alignment_enabling_turnover_%` (number, optional): Taxonomy-aligned enabling activities, by turnover. - `taxonomy_alignment_transitional_turnover_%` (number, optional): Taxonomy-aligned transitional activities, by turnover. - `taxonomy_eligible_capex_%` (number, optional): Currently returns the same value as `taxonomy_alignment_capex_%`. This is a known issue. - `taxonomy_alignment_capex_%` (number, optional): Taxonomy-aligned activities, by CapEx. - `taxonomy_alignment_enabling_capex_%` (number, optional): Taxonomy-aligned enabling activities, by CapEx. - `taxonomy_alignment_transitional_capex_%` (number, optional): Taxonomy-aligned transitional activities, by CapEx. - `taxonomy_eligible_opex_%` (number, optional): Currently returns the same value as `taxonomy_alignment_opex_%`. This is a known issue. - `taxonomy_alignment_opex_%` (number, optional): Taxonomy-aligned activities, by OpEx. - `taxonomy_alignment_enabling_opex_%` (number, optional): Taxonomy-aligned enabling activities, by OpEx. - `taxonomy_alignment_transitional_opex_%` (number, optional): Taxonomy-aligned transitional activities, by OpEx. - `taxonomy_alignment_enabling_%` (number, optional): Taxonomy-aligned enabling activities, across turnover, CapEx and OpEx. - `taxonomy_alignment_transitional_%` (number, optional): Taxonomy-aligned transitional activities, across turnover, CapEx and OpEx. - `taxonomy_alignment_no_gas_and_nuclear_turnover_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by turnover. - `taxonomy_alignment_no_gas_and_nuclear_capex_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by CapEx. - `taxonomy_alignment_no_gas_and_nuclear_opex_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by OpEx. - `taxonomy_alignment_fossil_gas_turnover_%` (number, optional): Taxonomy-aligned fossil gas activities, by turnover. - `taxonomy_alignment_fossil_gas_capex_%` (number, optional): Taxonomy-aligned fossil gas activities, by CapEx. - `taxonomy_alignment_fossil_gas_opex_%` (number, optional): Taxonomy-aligned fossil gas activities, by OpEx. - `taxonomy_alignment_nuclear_turnover_%` (number, optional): Taxonomy-aligned nuclear activities, by turnover. - `taxonomy_alignment_nuclear_capex_%` (number, optional): Taxonomy-aligned nuclear activities, by CapEx. - `taxonomy_alignment_nuclear_opex_%` (number, optional): Taxonomy-aligned nuclear activities, by OpEx. - `taxonomy_alignment_no_gas_and_nuclear_turnover_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by turnover, excluding sovereign bonds. - `taxonomy_alignment_no_gas_and_nuclear_capex_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by CapEx, excluding sovereign bonds. - `taxonomy_alignment_no_gas_and_nuclear_opex_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned activities, excluding fossil gas and nuclear, by OpEx, excluding sovereign bonds. - `taxonomy_alignment_fossil_gas_turnover_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned fossil gas activities, by turnover, excluding sovereign bonds. - `taxonomy_alignment_fossil_gas_capex_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned fossil gas activities, by CapEx, excluding sovereign bonds. - `taxonomy_alignment_fossil_gas_opex_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned fossil gas activities, by OpEx, excluding sovereign bonds. - `taxonomy_alignment_nuclear_turnover_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned nuclear activities, by turnover, excluding sovereign bonds. - `taxonomy_alignment_nuclear_capex_excluding_sovereign_bonds_%` (number, optional): Taxonomy-aligned nuclear activities, by CapEx, excluding sovereign bonds. ```json { "data": { "taxonomy_alignment_%": 8.6, "taxonomy_eligible_turnover_%": 6.8, "taxonomy_alignment_turnover_%": 6.8, "taxonomy_alignment_enabling_turnover_%": 3.1, "taxonomy_alignment_transitional_turnover_%": 0.9, "taxonomy_eligible_capex_%": 11.2, "taxonomy_alignment_capex_%": 11.2, "taxonomy_alignment_enabling_capex_%": 4.6, "taxonomy_alignment_transitional_capex_%": 1.4, "taxonomy_eligible_opex_%": 7.9, "taxonomy_alignment_opex_%": 7.9, "taxonomy_alignment_enabling_opex_%": 3.3, "taxonomy_alignment_transitional_opex_%": 1, "taxonomy_alignment_enabling_%": 3.7, "taxonomy_alignment_transitional_%": 1.1, "taxonomy_alignment_no_gas_and_nuclear_turnover_%": 6.5, "taxonomy_alignment_no_gas_and_nuclear_capex_%": 10.9, "taxonomy_alignment_no_gas_and_nuclear_opex_%": 7.6, "taxonomy_alignment_fossil_gas_turnover_%": 0.1, "taxonomy_alignment_fossil_gas_capex_%": 0.1, "taxonomy_alignment_fossil_gas_opex_%": 0.1, "taxonomy_alignment_nuclear_turnover_%": 0.2, "taxonomy_alignment_nuclear_capex_%": 0.2, "taxonomy_alignment_nuclear_opex_%": 0.2, "taxonomy_alignment_no_gas_and_nuclear_turnover_excluding_sovereign_bonds_%": 7.3, "taxonomy_alignment_no_gas_and_nuclear_capex_excluding_sovereign_bonds_%": 12.2, "taxonomy_alignment_no_gas_and_nuclear_opex_excluding_sovereign_bonds_%": 8.5, "taxonomy_alignment_fossil_gas_turnover_excluding_sovereign_bonds_%": 0.1, "taxonomy_alignment_fossil_gas_capex_excluding_sovereign_bonds_%": 0.1, "taxonomy_alignment_fossil_gas_opex_excluding_sovereign_bonds_%": 0.1, "taxonomy_alignment_nuclear_turnover_excluding_sovereign_bonds_%": 0.2, "taxonomy_alignment_nuclear_capex_excluding_sovereign_bonds_%": 0.2 } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, or your organization has no access to the data family this route needs. ## Response 500 Unexpected server error. # Get temperature scores (https://docs.datia.app/docs/api-reference/climate/get-temperature-scores/) POST https://eco.datia.app/temperature-score/insights Not yet available on `https://eco.datia.app`. Contact customers@connect.earth for access. Returns a temperature score for each holding, using short-term targets across scopes 1, 2 and 3. Needs access to the temperature score framework. While scores are still being calculated, `portfolio.companies` lists your holdings without score fields and `job_metadata.is_lock` is `true`. ## Request body - `holdings` (array, required): Holdings to analyze. Must contain at least one holding. - `isin` (string, required): ISIN of the instrument. - `name` (string, required): Name of the instrument. - `instrument_type` (string, one of: "stock", "bond", "etf", "mutual-fund", "cash", "option", "future", "forward-contract", "lending", "other", "warrant", "sovereign-bond", required): Type of instrument. A holding with a type outside this list is skipped, unless its ISIN is a known fund. - `currency` (string, optional): Currency of the market value, as an ISO 4217 code. Defaults to EUR. - `weight` (number, optional): Weight of the holding in the portfolio, from 0 to 100. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `market_value` (number, required): Market value of the holding, in `currency`. ETF and mutual fund holdings with a market value of 0 are skipped. Example: ```json { "holdings": [ { "name": "Apple Inc.", "isin": "US0378331005", "instrument_type": "stock", "currency": "USD", "weight": 40, "market_value": 4000000 }, { "name": "Microsoft Corp.", "isin": "US5949181045", "instrument_type": "stock", "currency": "USD", "weight": 35, "market_value": 3500000 }, { "name": "iShares Core MSCI World UCITS ETF", "isin": "IE00B4L5Y983", "instrument_type": "etf", "currency": "USD", "weight": 25, "market_value": 2500000 } ] } ``` ## Response 201 Temperature scores for the holdings. - `data` (object, optional) - `portfolio` (object, optional): The holdings with their scores. May include additional fields. - `companies` (array, optional): Holdings that are not funds. May include additional fields. - `isin` (string, optional): ISIN of the holding. - `name` (string, optional): Name of the holding. - `aum` (number | null, optional): Weight of the holding as stored. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `market_value` (number | null, optional): Market value of the holding. - `temperature_score` (number | null, optional): Temperature score in degrees Celsius, or `null` when there is no data. - `target` (number | null, optional): Average target value for the holding, or `null` when there is none. - `base_year` (integer | null, optional): Base year of the holding's targets. - `industry` (string | null, optional): Industry of the issuer. - `funds` (array, optional): Holdings that are funds. May include additional fields. - `public_isin` (string, optional): ISIN of the fund. - `name` (string, optional): Name of the fund. - `aum` (number | null, optional): Weight of the fund as stored. If any holding has no weight (or a weight of 0), weights are worked out from market values. - `market_value` (number | null, optional): Market value of the fund. - `temperature_score` (number | null, optional): Temperature score in degrees Celsius, or `null` when there is no data. - `target` (number | null, optional): Average target value for the fund, or `null` when there is none. - `base_year` (integer | null, optional): Base year of the fund's targets. - `industries` (array, optional): Industries found in the holdings. - `id` (string, optional): Industry id. - `name` (string, optional): Industry name. - `job_metadata` (object, optional): State of the calculation. May include additional fields. - `is_lock` (boolean, optional): `true` while scores are still being calculated. ```json { "data": { "portfolio": { "companies": [ { "isin": "US0378331005", "name": "Apple Inc.", "aum": 40, "market_value": 4000000, "temperature_score": 1.8, "target": 1.6, "base_year": 2019, "industry": "Technology Hardware & Equipment" }, { "isin": "US5949181045", "name": "Microsoft Corp.", "aum": 35, "market_value": 3500000, "temperature_score": 1.6, "target": 1.5, "base_year": 2020, "industry": "Software & Services" } ], "funds": [ { "public_isin": "IE00B4L5Y983", "name": "iShares Core MSCI World UCITS ETF", "aum": 25, "market_value": 2500000, "temperature_score": 2.4, "target": 2.1, "base_year": 2019 } ], "industries": [ { "id": "4f1c2e6a9b0d3e7f8a5c1b2d6e9f0a3c", "name": "Technology Hardware & Equipment" }, { "id": "9a7d3b5c1e2f4a6b8c0d2e4f6a8b0c1d", "name": "Software & Services" } ] }, "job_metadata": { "is_lock": false } } } ``` ## Response 400 The request is invalid. Usually `data.message` says why. When the request does not match the schema, `data.message` is `An error occurred while processing your request` and `data.error` lists each problem. ## Response 403 Missing, invalid or inactive API key, or your organization has no access to the data family this route needs. ## Response 500 Unexpected server error.