# Taiwan Insider Share Transfers — 內部人持股轉讓申報 (`chamarix/taiwan-insider-share-transfers`) Actor

Taiwan insider share-transfer filings from MOPS: what a director, officer or 10% shareholder must announce before selling, gifting or trusting shares — method, size, transferee, stake before and after, valid window — plus the report of what went unsold, and why. TWSE, TPEx, Emerging, from 2002.

- **URL**: https://apify.com/chamarix/taiwan-insider-share-transfers.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/platform/actors/running/actors-in-store#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 Insider Share Transfers — 內部人持股轉讓申報 (TWSE + TPEx + Emerging)

Get structured JSON access to **every share transfer a Taiwanese insider has to announce before making it** — who is selling, how much, by what method, to whom, and how much of their stake is left afterwards.

Taiwan runs one of the most transparent insider-disclosure regimes anywhere. Under 證交法 22-2, a director, supervisor, officer or 10% shareholder cannot simply sell: they must file a notice with MOPS **first**, naming the size, the method and the transferee, and that notice is public within the day. If the plan then goes unexecuted, they must file again and **say why**. This Actor turns both filings into one flat, joinable dataset — back to **August 2002**.

### What you get

| Record type | What it tells you |
|---|---|
| **TRANSFER\_PLAN** (持股轉讓事前申報) | The pre-transfer notice: method, planned shares, daily intraday cap, named transferee, holdings before and after, and the window the plan is valid for |
| **NOT\_TRANSFERRED** (持股未轉讓申報) | The follow-up filed when the window closes with part of the plan undone: how many shares were left, and the reason the insider gave |

Three boards — TWSE listed (上市), TPEx OTC (上櫃) and Emerging (興櫃) — with **24 years of history**. In July 2026 the two main boards produced 180 transfer plans and 26 non-execution reports.

### Why this data matters

- **It is forward-looking, not a post-mortem.** A US Form 4 tells you an insider already sold. A Taiwanese 事前申報 tells you they are *about to*, and gives you the window — `transfer_window_start` to `transfer_window_end` — during which it can happen. Open-market plans typically open three trading days after filing and run for a month.
- **You can tell a sale from a gift from a trust.** Most filings are not sales at all. In July 2026 the two main boards produced 74 gifts and 54 transfers into trust against just 26 open-market trades, plus 12 negotiated sales and 8 private-placement transfers. `transfer_methods` separates them, so a signal built on this data is not swamped by estate planning.
- **Size is expressed against the stake, not in a vacuum.** `planned_transfer_pct_of_holdings` is the share of their own position the insider is putting up. A director selling 5% of their holding and a director selling 100% are different events; the raw share count does not tell you which is which.
- **The non-execution report is the interesting half.** When an insider files a plan and then doesn't carry it out, they must publish a reason. The most common one, verbatim, is **股價不理想** — "the price was unsatisfactory". `executed_shares` and `execution_rate` are computed for you: plan minus leftover.
- **You see who, not just what.** `transferee` is named on every gift, trust and negotiated sale. `insider_role` is the filer's own declared capacity, and is decomposed into `insider_office` (director / supervisor / manager / 10% shareholder) and `insider_relation` (self / spouse / minor child / nominee) so you can isolate, say, only sales by sitting directors in their own name.
- **Filing volume is itself a series.** Most months bring roughly 100–200 TWSE filings. January 2026 brought 1,289, of which 1,152 were transfers into trust, and 1,120 of them landed in three days (27–29 January). Bursts like that are visible only if you have the history.

### Output

One record per filing. Every row carries the same keys regardless of board or record type, so the dataset stays tabular.

```json
{
  "record_type": "TRANSFER_PLAN",
  "market": "TWSE",
  "filing_date": "2026-07-31",
  "stock_code": "2330",
  "company_name": "台積電",
  "insider_role": "董事本人",
  "insider_office": "DIRECTOR",
  "insider_relation": "SELF",
  "is_subsidiary_insider": false,
  "insider_name": "曾繁城",
  "amendment_note": null,
  "transfer_methods": ["贈與"],
  "transfer_methods_en": ["Gift"],
  "transfer_shares_by_method": [null],
  "transfer_shares": null,
  "max_daily_intraday_shares": null,
  "transferee": "陳韓",
  "holdings_own": 29472675,
  "holdings_trust": 0,
  "holdings_total": 29472675,
  "planned_transfer_own": 5000000,
  "planned_transfer_trust": 0,
  "planned_transfer_total": 5000000,
  "planned_transfer_pct_of_holdings": 16.9649,
  "holdings_after_own": 24472675,
  "holdings_after_trust": 0,
  "holdings_after_total": 24472675,
  "transfer_window_start": "2026-07-31",
  "transfer_window_end": "2026-08-02",
  "non_execution_reported": false,
  "not_transferred_own": null,
  "not_transferred_trust": null,
  "not_transferred_total": null,
  "not_transferred_reason": null,
  "executed_shares": null,
  "execution_rate": null,
  "identity_ok": true,
  "source_url": "https://mops.twse.com.tw/mops/#/web/t56sb21_q3"
}
```

A NOT\_TRANSFERRED row fills the other half of the schema instead:

```json
{
  "record_type": "NOT_TRANSFERRED",
  "market": "TWSE",
  "filing_date": "2026-08-06",
  "stock_code": "2429",
  "company_name": "銘旺科",
  "insider_role": "法人董事代表人配偶",
  "insider_name": "周維昆之配偶",
  "holdings_total": 1690458,
  "planned_transfer_total": 390000,
  "not_transferred_total": 290000,
  "not_transferred_reason": "股價不理想",
  "executed_shares": 100000,
  "execution_rate": 25.641
}
```

That pair is the whole story of one filing: on 3 July the spouse of a corporate director's representative announced a plan to sell 390,000 shares of 銘旺科 out of a 1,790,458-share holding, in the window 6 July – 5 August. On 6 August they reported 290,000 still unsold because the price was unsatisfactory — so 100,000 shares, a quarter of the plan, actually moved.

### Input

| Field | What it does |
|---|---|
| `startDate` / `endDate` | Filing-date range, `YYYY-MM-DD`. History starts 2002-08-01 |
| `markets` | `TWSE`, `TPEX`, `EMERGING` — any combination |
| `recordTypes` | `TRANSFER_PLAN`, `NOT_TRANSFERRED` |
| `stockCodes` | Keep only these security codes |
| `insiderOffices` | `DIRECTOR` / `SUPERVISOR` / `MANAGER` / `MAJOR_SHAREHOLDER` / `OTHER` |
| `transferMethods` | Keep only filings using a given method, e.g. `["一般交易"]` for genuine sales |
| `minPlannedShares` | Drop the long tail of small gifts |
| `crossCheck` | Verify the parse against the exchanges' own open-data mirrors (on by default) |

MOPS accepts a calendar month as its finest granularity, so a range is fetched by month and then trimmed to the days you asked for. Cost is one request per board per record type per month touched.

### Reading the numbers correctly

**`planned_transfer_total` is the size of the filing, not `transfer_shares`.** MOPS publishes two share counts. `轉讓股數`, which becomes `transfer_shares`, is filled in only for trade-based methods; a gift or a transfer into trust leaves it blank and states its size in `預定轉讓總股數` instead. Reading only the first column would make every gift look like zero shares.

**A filing may name more than one method.** When it does, `transfer_methods` holds each one as its own element and `transfer_shares_by_method` stays the same length, element for element, with `null` in the slots that carry no count. It is never collapsed into one string.

**"Own account" and "trust" are two separate pools.** 保留運用決定權信託股數 is stock the insider placed in trust while keeping the decision to dispose of it — legally still theirs, which is why the regime counts it. Every holdings figure is published as a pair, and this Actor carries both plus their sum.

**The transferee tells you the nature of the transfer.** Open-market sales leave `transferee` empty, because the buyer is whoever was on the other side. Gifts, trusts and negotiated sales name them — a family member, a foundation, a bank's trust account, a named investment company.

**Insider names are published as relations.** A spouse's filing appears as 周維昆之配偶 — "the spouse of Chou Wei-kun" — not under their own name. Corporate holders appear under the company name.

### Data integrity

Numbers are checked against other official numbers before anything is published:

- **The published identity must hold on every row.** MOPS publishes current holdings, planned transfer and post-transfer holdings as three independent columns, on each of the two share pools. `holdings − planned = holdings after` must therefore hold exactly. It did on **all 1,943 rows sampled across 2002–2026 and all three boards**, so every run re-checks it, flags the row through `identity_ok` and logs any failure.
- **Every run is cross-checked against a second official publication.** TWSE and TPEx each mirror the same two reports through their open-data APIs (`t187ap12_L` / `t187ap13_L` and the TPEx equivalents), covering the latest publication date only. The Actor fetches whichever day the mirror names and confirms row for row that this dataset reproduces it. It never uses the mirror as a source — only as a witness.
- **Spot-checked against the per-company report.** MOPS serves the same filings through a separate single-company query. TSMC's July 2026 filings read through that path — 曾繁城, gift, 5,000,000 shares to 陳韓, 29,472,675 → 24,472,675 — match this dataset field for field.
- **A moved column stops the run.** The report is read by position, so the header is verified before any row is parsed. If MOPS reshuffles it, the run fails loudly rather than publishing one insider's holdings under another's heading.
- **A month MOPS refuses is never passed off as an empty month.** If a request trips the server's row cap, the run fails and names the month, because a calendar month cannot be split any further.

Known limits, stated rather than papered over:

- **公開發行 companies are not covered.** MOPS publishes that fourth board without a security code and with two fewer columns. A row that cannot be joined to a tradable security was judged not worth a second parser.
- **History begins 2002-08-01.** Every board and both report types answer 「無持股轉讓之情形」 for July 2002 and earlier; August 2002 is the first month with filings.
- **A plan is an intention.** `planned_transfer_total` is what the insider said they would do. Only the matching NOT\_TRANSFERRED row tells you what they didn't — and it exists only when part of the plan lapsed.

### Sources

Official, free, no API key:

| Feed | Endpoint |
|---|---|
| Transfer plans, all boards | MOPS `t56sb21` 持股轉讓日報表 |
| Non-execution reports, all boards | MOPS `t56sb21` 持股未轉讓日報表 |
| Cross-check mirror (TWSE) | `openapi.twse.com.tw/v1/opendata/t187ap12_L`, `t187ap13_L` |
| Cross-check mirror (TPEx) | `www.tpex.org.tw/openapi/v1/mopsfin_t187ap12_O`, `mopsfin_t187ap13_O` |

### Related Actors

Same publisher, same market, designed to join on `stock_code` and date:

- **[TDCC Shareholding Dispersion](https://apify.com/chamarix/tdcc-shareholding-dispersion)** — 集保戶股權分散. Where the shares an insider sells end up: the weekly split between large and retail holders.
- **[Taiwan Margin Trading](https://apify.com/chamarix/taiwan-margin-trading)** — 融資融券 balances, the leveraged crowd on the other side.
- **[Taiwan SBL & Short Sale Balance](https://apify.com/chamarix/taiwan-sbl-short-sale-balance)** — borrow and short balances, for reading insider selling against short interest.
- **[Taiwan Stock Alerts](https://apify.com/chamarix/taiwan-stock-alerts)** — 注意股/處置股 warnings and disposition measures.
- **[Taiwan Dividend Calendar](https://apify.com/chamarix/taiwan-dividend-calendar)** — 除權息 dates and dividend policy.
- **[TWSE Institutional Trades](https://apify.com/chamarix/twse-institutional-trades)** / **[TPEx Institutional Trades](https://apify.com/chamarix/tpex-institutional-trades)** — foreign, trust and dealer net buying.

***

### Taiwan Market Data Suite

This Actor is part of a suite of 19 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:**

- [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-dividend-calendar](https://apify.com/chamarix/taiwan-dividend-calendar) — Ex-dividend / ex-rights dates, reference prices & payouts back to 2003
- [taiwan-shareholder-meetings](https://apify.com/chamarix/taiwan-shareholder-meetings) — Shareholder meeting dates, book closure periods, board elections & e-voting since 2005
- [taiwan-emerging-stock-quotes](https://apify.com/chamarix/taiwan-emerging-stock-quotes) — Emerging Stock Board (興櫃) quotes, pre-IPO company register & listing-application status
- [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
- [taifex-institutional-derivatives](https://apify.com/chamarix/taifex-institutional-derivatives) — Institutional futures & options positions (TAIFEX), incl. put/call ratio
- [taiwan-stock-alerts](https://apify.com/chamarix/taiwan-stock-alerts) — Watch-list, disposition & short-sale suspension alerts
- [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

**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)

# Actor input Schema

## `startDate` (type: `string`):

Start date in YYYY-MM-DD format, matched against the filing date (申報日期). MOPS publishes these filings from 2002-08-01 onwards and earlier dates are moved up to it. The report is fetched a calendar month at a time — the finest granularity MOPS accepts — and then trimmed to your range.

## `endDate` (type: `string`):

End date in YYYY-MM-DD format (inclusive). Leave empty to query only the start date. Cost is one request per board per record type per calendar month touched, so a whole year of both boards is roughly 48 requests.

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

Which boards to cover. Leave empty for all three. 公開發行 (registered but untraded) companies are not covered — MOPS publishes them without a security code, in a different column layout.

## `recordTypes` (type: `array`):

TRANSFER\_PLAN is the pre-transfer notice an insider files before disposing of shares. NOT\_TRANSFERRED is the follow-up filed when the window closes with part of the plan unexecuted, and carries the stated reason. Leave empty for both.

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

Optional list of security codes to keep (e.g., \['2330', '2454']). Leave empty for every company that filed.

## `insiderOffices` (type: `array`):

Keep only filings by a given class of insider. The office is derived from the filer's own 申報人身分 string, so 法人董事代表人配偶 (the spouse of a corporate director's representative) counts as DIRECTOR. Leave empty for all.

## `transferMethods` (type: `array`):

Keep only TRANSFER\_PLAN rows using at least one of these methods, written exactly as MOPS publishes them: 一般交易, 贈與, 信託, 洽特定人, 鉅額逐筆交易, 盤後定價交易, 轉讓私募股票, 辦理過額配售. Setting this drops every NOT\_TRANSFERRED row, which carries no method.

## `minPlannedShares` (type: `integer`):

Keep only filings where the total planned transfer is at least this many shares. Useful for cutting the long tail of small gifts. Leave at 0 for everything.

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

Compare the day covered by TWSE's and TPEx's open-data mirrors of the same two reports against what was parsed here, and log the result. Costs up to four extra requests and never changes the output — it only tells you in the log whether the two publications agree.

## Actor input object example

```json
{
  "startDate": "2026-07-01",
  "endDate": "2026-07-31",
  "markets": [
    "TWSE",
    "TPEX"
  ],
  "recordTypes": [
    "TRANSFER_PLAN",
    "NOT_TRANSFERRED"
  ],
  "stockCodes": [],
  "insiderOffices": [],
  "transferMethods": [],
  "minPlannedShares": 0,
  "crossCheck": true
}
```

# 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 = {
    "startDate": "2026-07-01",
    "endDate": "2026-07-31",
    "markets": [
        "TWSE",
        "TPEX"
    ],
    "recordTypes": [
        "TRANSFER_PLAN",
        "NOT_TRANSFERRED"
    ],
    "stockCodes": [],
    "insiderOffices": [],
    "transferMethods": [],
    "minPlannedShares": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taiwan-insider-share-transfers").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 = {
    "startDate": "2026-07-01",
    "endDate": "2026-07-31",
    "markets": [
        "TWSE",
        "TPEX",
    ],
    "recordTypes": [
        "TRANSFER_PLAN",
        "NOT_TRANSFERRED",
    ],
    "stockCodes": [],
    "insiderOffices": [],
    "transferMethods": [],
    "minPlannedShares": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taiwan-insider-share-transfers").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 '{
  "startDate": "2026-07-01",
  "endDate": "2026-07-31",
  "markets": [
    "TWSE",
    "TPEX"
  ],
  "recordTypes": [
    "TRANSFER_PLAN",
    "NOT_TRANSFERRED"
  ],
  "stockCodes": [],
  "insiderOffices": [],
  "transferMethods": [],
  "minPlannedShares": 0
}' |
apify call chamarix/taiwan-insider-share-transfers --silent --output-dataset

```

## MCP server setup

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

```

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/GObpDxtuPbgHhAJV9/builds/8Ib0HbTmcLO48UJzl/openapi.json
