# Taiwan ESG Disclosures (TWSE + TPEx) — Emissions, Board, Water (`chamarix/taiwan-esg-disclosures`) Actor

Every ESG metric Taiwan's listed and OTC companies file with the exchanges: Scope 1/2/3 emissions, energy, water, waste, pay, board composition, climate risk and cyber incidents. 21 topics, both boards, one shape, with each row checked against the figures it states about itself.

- **URL**: https://apify.com/chamarix/taiwan-esg-disclosures.md
- **Developed by:** [chris](https://apify.com/chamarix) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Taiwan ESG Disclosures (上市櫃企業ESG資訊揭露) API

Get structured JSON access to **every ESG metric Taiwan's listed and OTC companies file with the exchanges** — greenhouse gas emissions by scope, energy, water, waste, pay and pay ratios, board composition, climate-risk governance, supply-chain audits, cyber-security incidents, occupational injuries and more.

**21 disclosure topics, both boards, one consistent shape.** Roughly **31,900 records** per full run covering **1,071 listed and 885 OTC companies** for report year 114 (2025).

### Why this data matters

- **Carbon data that costs money everywhere else.** MSCI, Sustainalytics and CDP all sell Taiwan emissions data. The companies themselves file it with the exchange for free, in 42 separate feeds nobody has stitched together. Scope 1, Scope 2 and Scope 3 come with the **data boundary** each company used and whether the figure was **third-party assured** — TSMC files 2,196,493 tCO2e Scope 1, 11,130,568 Scope 2 and 36,298,970 Scope 3, all three assured, on a consolidated-subsidiary boundary.
- **"Not disclosed" is never confused with zero.** The feeds write the literal string `N/A` where a company disclosed nothing, in the same column as real numbers. Read carelessly that becomes a zero — and **278 of 1,071 listed companies file N/A for Scope 3**, which would invent zero supply-chain emissions for a quarter of the market. Here it is `null`, always, with the filed string kept alongside in `reported`.
- **These numbers are self-reported, and this Actor tells you where they do not add up.** Unlike every price or volume feed, nobody recomputes these — companies type them into MOPS and the exchange publishes them as filed. So each row is checked against the arithmetic it states about itself, and the failures are real: **寶綠特-KY (6887) files 100 independent directors on a 4-seat remuneration committee**, 華園 (2702) files 4 independent directors on a 3-seat board, 冠德 (2520) files zero hazardous and zero non-hazardous waste against a 133,378-tonne total, and 台航 (2617) files a 257% occupational-injury rate. Across a full run **56 records of 31,866 carry a flag**; the rows are kept and marked, never silently dropped or "corrected".
- **Cross-validated against a separate official report.** Filed board composition is compared against the exchange's independent monthly 董監持股 filing. Over 1,071 companies, independent-director counts agree exactly for **982 (91.7%)** and total board seats for **929 (86.7%)**. Getting there required knowing that a legal-person director prints **twice** in that report — once as the entity (本人) and once as its named representative (之法人代表人) — so counting both double-counts every corporate seat. 台泥's 15 filed seats are 15 本人 rows plus 10 representative rows that must be ignored.
- **The two boards do not name things identically, and one of the differences changes the meaning.** TPEX labels its GHG-intensity column *per NT$ million of revenue*; TWSE's says only `噸CO2e/單位`, leaving each filer to choose a denominator it never records. The TWSE figure is therefore **not comparable across companies**, and this Actor reports it with a null unit rather than labelling it with TPEX's meaning. Six columns differ in spelling between boards (`薪酬委員會席次` vs `薪酬委員會席次(席)`, `(公噸(t))` vs `(公噸_t)`); all are mapped to identical keys so a cross-market join works.

### Output

One record per company per topic. A real greenhouse-gas record, as published:

```json
{
  "report_year": 2025,
  "report_year_roc": "114",
  "published_date": "2026-08-30",
  "market": "TWSE",
  "code": "2330",
  "name": "台積電",
  "topic_id": 1,
  "topic": "greenhouse_gas_emissions",
  "topic_zh": "溫室氣體排放",
  "metrics": {
    "scope1_emissions": {"value": 2196493.0, "kind": "number", "reported": "2196493.0000", "unit": "tCO2e"},
    "scope1_boundary": {"value": "已完成合併財務報表之母子公司", "kind": "text", "reported": "已完成合併財務報表之母子公司"},
    "scope1_assured": {"value": true, "kind": "bool", "reported": "是"},
    "scope2_emissions": {"value": 11130568.0, "kind": "number", "reported": "11130568.0000", "unit": "tCO2e"},
    "scope3_emissions": {"value": 36298970.0, "kind": "number", "reported": "36298970.0000", "unit": "tCO2e"},
    "ghg_intensity": {"value": 3.4, "kind": "number", "reported": "3.4000"}
  },
  "disclosed_field_count": 10,
  "field_count": 10,
  "quality_flags": [],
  "quality_ok": true
}
```

Every metric entry carries `value` (typed), `kind` (`number`, `percent`, `bool` or `text`), `reported` (the exact string filed) and `unit` where one is meaningful. Turn on `includeRawFields` to also get every official Chinese column verbatim.

### The 21 topics

| # | Topic | Chinese | Boards | Highlights |
|---|-------|---------|--------|-----------|
| 1 | `greenhouse_gas_emissions` | 溫室氣體排放 | both | Scope 1/2/3, boundary, assurance, intensity |
| 2 | `energy_management` | 能源管理 | both | Renewable share of total energy |
| 3 | `water_management` | 水資源管理 | both | Withdrawal, intensity and its unit |
| 4 | `waste_management` | 廢棄物管理 | both | Hazardous / non-hazardous / total, intensity |
| 5 | `human_capital` | 人力發展 | both | Mean & median non-supervisor pay, female managers |
| 6 | `board_of_directors` | 董事會 | both | Seats, independents, female seats, attendance |
| 7 | `investor_communication` | 投資人溝通 | both | Investor conferences held |
| 8 | `climate_risk_management` | 氣候相關議題管理 | both | TCFD-style governance narrative |
| 9 | `board_committees` | 功能性委員會 | both | Audit & remuneration committee size, attendance |
| 10 | `fuel_management` | 燃料管理 | TWSE | Fuel consumed, coal / gas / renewable split |
| 11 | `product_lifecycle` | 產品生命週期 | TWSE | E-waste weight and recycled share |
| 12 | `food_safety` | 食品安全 | both | Recalls, certified plants, traceability, lab spend |
| 13 | `supply_chain_management` | 供應鏈管理 | both | Suppliers audited, responsible sourcing |
| 14 | `product_quality_and_safety` | 產品品質與安全 | both | Weight sold, production facilities |
| 15 | `community_relations` | 社區關係 | both | Refineries in populated areas |
| 16 | `information_security` | 資訊安全 | TWSE | Breach incidents, customers affected |
| 17 | `financial_inclusion` | 普惠金融 | TWSE | SME lending, financial-education reach |
| 18 | `ownership_and_control` | 持股及控制力 | TWSE | Top-10 shareholder disclosure link |
| 19 | `risk_management_policy` | 風險管理政策 | both | Major-incident and key-material policies |
| 20 | `anticompetitive_litigation` | 反競爭行為法律訴訟 | both | Monetary losses from antitrust suits |
| 21 | `occupational_health_and_safety` | 職業安全衛生 | both | Injuries and rate, fire incidents and casualties |

Five topics are **TWSE-only**: TPEX does not publish them, confirmed against the TPEX swagger and by repeated requests that return a redirect. Asking for them on TPEX is not an error — those combinations are skipped and reported in the log.

### Input

```json
{
  "topics": ["greenhouse_gas_emissions", "board_of_directors"],
  "markets": ["TWSE", "TPEX"],
  "stockCodes": ["2330", "1101"],
  "onlyDisclosed": false,
  "includeRawFields": false,
  "crossCheck": true
}
```

- **topics** — any of the 21 above, by name or by number. Empty means all of them.
- **markets** — `TWSE` (上市), `TPEX` (上櫃), or both.
- **stockCodes** — optional filter; matched as text. Empty means every company.
- **onlyDisclosed** — drop rows where the company disclosed nothing on that topic. Off by default: *who did not disclose* is often the question.
- **includeRawFields** — also emit every official Chinese column verbatim.
- **crossCheck** — compare filed board composition against the separate 董監持股 report and log the agreement rate.

### Coverage and update cadence

The report is **annual**. Report year 114 (2025) is the current edition, published through 2026. The feeds carry **only the latest edition** — there is no date parameter and no archive endpoint — so history accrues from the day you start collecting. Run it once a year after the filing season, or monthly if you want to catch amendments: companies do refile, and the `published_date` stamp moves when they do.

Not every company appears under every topic. The industry-specific ones are thinner by design — food safety covers 689 listed companies, fuel management 786 — while the universal ones (emissions, board, climate, safety) cover all 1,071.

### Notes on the source

- Both feeds are public open data, no login and no key.
- TPEX intermittently answers with **HTTP 520** under load; requests are retried and this resolves on its own.
- TPEX serves this family **without** the `mopsfin_` prefix its sibling feeds use — `t187ap46_O_N`, not `mopsfin_t187ap46_O_N`, which redirects.
- Several TWSE column names carry a **trailing space** (`員工薪資平均數(仟元/人) `). Columns are matched after stripping, and a genuinely renamed or dropped column fails the run loudly rather than filling a column with silent nulls.

### Taiwan Market Data Suite

This Actor is part of a suite of 29 Taiwan market data APIs by [chamarix](https://apify.com/chamarix) — official sources only, cross-validated against independent official endpoints, clean JSON out. Code samples for the whole suite: [GitHub](https://github.com/cc77556/taiwan-market-data-actors).

**Market data:**

- [taiwan-stock-daily-quotes](https://apify.com/chamarix/taiwan-stock-daily-quotes) — Daily OHLCV, VWAP, P/E, price-to-book & dividend yield for every listed/OTC stock since 2004
- [taiwan-index-history](https://apify.com/chamarix/taiwan-index-history) — Daily TAIEX & TPEx index history since 1990 with market turnover, the total-return index & all 273 TWSE indices
- [twse-institutional-trades](https://apify.com/chamarix/twse-institutional-trades) — Daily institutional buy/sell (foreign, investment trust, dealer) per stock — TWSE listed
- [tpex-institutional-trades](https://apify.com/chamarix/tpex-institutional-trades) — Daily institutional buy/sell per stock — TPEx OTC market
- [taiwan-monthly-revenue](https://apify.com/chamarix/taiwan-monthly-revenue) — Monthly revenue of 1,900+ listed & OTC companies, MoM/YoY
- [taiwan-financial-statements](https://apify.com/chamarix/taiwan-financial-statements) — Quarterly income statement, balance sheet & cash flow back to 2013
- [taiwan-esg-disclosures](https://apify.com/chamarix/taiwan-esg-disclosures) — 21 ESG topics for 1,950+ companies — Scope 1/2/3 emissions, energy, water, waste, pay, board & climate risk
- [taiwan-dividend-calendar](https://apify.com/chamarix/taiwan-dividend-calendar) — Ex-dividend / ex-rights dates, reference prices & payouts back to 2003
- [taiwan-margin-trading](https://apify.com/chamarix/taiwan-margin-trading) — Daily margin trading & short sale balances per stock
- [taiwan-sbl-short-sale-balance](https://apify.com/chamarix/taiwan-sbl-short-sale-balance) — Securities-lending short sale balances per stock
- [taiwan-day-trading-stats](https://apify.com/chamarix/taiwan-day-trading-stats) — Day-trading volume, value & ratio per stock since 2014
- [tdcc-shareholding-dispersion](https://apify.com/chamarix/tdcc-shareholding-dispersion) — Weekly TDCC shareholding dispersion (retail vs whale structure)
- [taiwan-foreign-shareholding](https://apify.com/chamarix/taiwan-foreign-shareholding) — Foreign ownership percentage & remaining quota per stock
- [taiwan-futures-daily](https://apify.com/chamarix/taiwan-futures-daily) — Daily bars, settlement price & open interest for all 384 TAIFEX futures contracts since 1998, with the large-trader report
- [taifex-institutional-derivatives](https://apify.com/chamarix/taifex-institutional-derivatives) — Institutional futures & options positions (TAIFEX), incl. put/call ratio
- [taifex-options-chain](https://apify.com/chamarix/taifex-options-chain) — Full options chain by strike & expiry, both sessions, with the exchange's own Delta, since 2001
- [taiwan-warrants-daily](https://apify.com/chamarix/taiwan-warrants-daily) — Daily quotes, strike, expiry & moneyness for every listed/OTC warrant since 2004
- [taiwan-government-bonds](https://apify.com/chamarix/taiwan-government-bonds) — Central government bond benchmark yields, the full yield curve & issuance master, with staleness stated
- [taiwan-stock-alerts](https://apify.com/chamarix/taiwan-stock-alerts) — Watch-list, disposition & short-sale suspension alerts
- [taiwan-insider-share-transfers](https://apify.com/chamarix/taiwan-insider-share-transfers) — Insider share-transfer filings (directors, officers, 10% holders) since 2002
- [taiwan-director-shareholdings](https://apify.com/chamarix/taiwan-director-shareholdings) — Monthly director/officer shareholdings & share-pledge ratio since 1999
- [taiwan-block-trades](https://apify.com/chamarix/taiwan-block-trades) — Every block trade (鉅額交易) with price, size & basket constituents since 2005
- [taiwan-shareholder-meetings](https://apify.com/chamarix/taiwan-shareholder-meetings) — Shareholder meeting dates, book closure periods & e-voting since 2005
- [taiwan-emerging-stock-quotes](https://apify.com/chamarix/taiwan-emerging-stock-quotes) — Emerging (興櫃) board quotes, pre-IPO register & history since 2003
- [taiwan-etf-regular-investment](https://apify.com/chamarix/taiwan-etf-regular-investment) — Monthly regular savings plan (定期定額) rankings for stocks & ETFs since 2020
- [taiwan-treasury-stock-buybacks](https://apify.com/chamarix/taiwan-treasury-stock-buybacks) — Every treasury-stock buyback (庫藏股) filing, plan vs execution, since 2000

**Property market:**

- [taiwan-real-estate-transactions](https://apify.com/chamarix/taiwan-real-estate-transactions) — Actual registered sale, presale & lease prices (實價登錄) for all 22 cities since 2012

**Government & civic data:**

- [taiwan-legislator-monitor](https://apify.com/chamarix/taiwan-legislator-monitor) — Legislative Yuan bills, legislators & meetings
- [taiwan-tender-monitor](https://apify.com/chamarix/taiwan-tender-monitor) — Government e-procurement tenders (open calls, awards, failures)

### Data source

TWSE 上市公司企業ESG資訊揭露彙總資料 (`t187ap46_L_1` … `_21`) and TPEX 上櫃公司企業ESG資訊揭露彙總資料 (`t187ap46_O_1` … `_21`, 16 published), plus TWSE 董監事持股餘額明細資料 (`t187ap11_L`) used for independent verification of board composition. Public open data, no login required.

# Actor input Schema

## `topics` (type: `array`):

Which of the 21 disclosure topics to fetch. Leave empty for all of them. Each topic is one request per board and becomes one record per company, so picking a few keeps the run small. Five topics are filed on the TWSE board only — fuel management, product lifecycle, information security, financial inclusion and ownership & control — because TPEX does not publish them.

## `markets` (type: `array`):

TWSE is the listed board (上市), TPEX the over-the-counter board (上櫃). TWSE files all 21 topics; TPEX files 16.

## `stockCodes` (type: `array`):

Optional list of company codes to keep, e.g. \['2330', '1101']. Codes are matched as text, since not every code is numeric. Leave empty for every company on the selected boards.

## `onlyDisclosed` (type: `boolean`):

A company that files nothing for a topic still gets a row, with every metric at null. Turn this on to keep only rows carrying at least one disclosed value. Off by default, because knowing who did not disclose is itself the point for a good many ESG questions.

## `includeRawFields` (type: `boolean`):

Adds a `fields` object holding every column exactly as the exchange publishes it, under its original Chinese name. The normalized `metrics` object is always present either way; this is for auditing a value back to source.

## `crossCheck` (type: `boolean`):

Compares the filed board and independent-director seat counts against the exchange's separate monthly 董監持股 report, and writes the agreement rate to the log. The two reports have different as-of dates, so they are not expected to agree exactly. Costs one extra request and only runs when the board topic is included.

## Actor input object example

```json
{
  "topics": [],
  "markets": [
    "TWSE",
    "TPEX"
  ],
  "stockCodes": [],
  "onlyDisclosed": false,
  "includeRawFields": false,
  "crossCheck": true
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

One record per company per ESG topic — emissions by scope, energy, water, waste, pay, board composition, climate risk and the rest — with every metric under a stable English key and the company's own internal inconsistencies flagged.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "topics": [],
    "markets": [
        "TWSE",
        "TPEX"
    ],
    "stockCodes": [],
    "onlyDisclosed": false,
    "includeRawFields": false,
    "crossCheck": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taiwan-esg-disclosures").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "topics": [],
    "markets": [
        "TWSE",
        "TPEX",
    ],
    "stockCodes": [],
    "onlyDisclosed": False,
    "includeRawFields": False,
    "crossCheck": True,
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taiwan-esg-disclosures").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "topics": [],
  "markets": [
    "TWSE",
    "TPEX"
  ],
  "stockCodes": [],
  "onlyDisclosed": false,
  "includeRawFields": false,
  "crossCheck": true
}' |
apify call chamarix/taiwan-esg-disclosures --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chamarix/taiwan-esg-disclosures"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LNlhFo8EdX79XxFPM/builds/H9jp0nN10eAdpgpgR/openapi.json
