# Taiwan Short Sale Volume — 融券借券賣出成交量值 API (`chamarix/taiwan-short-sale-volume`) Actor

How much of every Taiwan listed and OTC stock was actually sold short each day: margin short sale (融券) and securities borrowing (借券賣出) lots and turnover, from TWSE and TPEx, back to 2008. Flow, not balance — and every row's implied price is checked against the day's own high and low.

- **URL**: https://apify.com/chamarix/taiwan-short-sale-volume.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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Taiwan Short Sale Volume (融券借券賣出成交量值) API

How much of every Taiwan stock was **actually sold short today** — as structured JSON, for both exchanges, back to **2008**.

Taiwan publishes two separate short-selling systems and this report covers both as *turnover*, not as an outstanding balance:

- **融券 (margin short sale)** — the retail side, borrowed through the margin financing system
- **借券賣出 (borrowed-stock short sale)** — the securities borrowing and lending system used by foreign institutions, hedge funds and market makers

Every row carries lots, shares, New Taiwan dollars and the **implied price** of each, plus the security's own high, low and close for that session.

### Flow, not balance — and why you want both

This is the sister report to [taiwan-sbl-short-sale-balance](https://apify.com/chamarix/taiwan-sbl-short-sale-balance), and the difference is the whole point:

| | This Actor | taiwan-sbl-short-sale-balance |
|---|---|---|
| Question | How much was sold short **today**? | How much is **still** short? |
| Quantity | A day's turnover | An end-of-day position |
| Source report | 當日融券賣出與借券賣出成交量值 | TWT93U 融券借券餘額 |
| Unit | **Lots** (1,000 shares) | **Shares** |
| Also gives you | Turnover in NT$, so a price falls out | Next-day quota, suspension flags |

A balance that did not move can hide a day of heavy shorting met by equally heavy covering. Only the turnover series shows the activity. And because this report publishes the dollars alongside the shares, it is the one short-side dataset from which you can read *what price the shorts got* — see below.

Note the unit difference carefully: the same-looking quantity columns are counted in **lots here and in shares there**. Both are published that way by the exchange; this Actor emits both `_lots` and `_shares` on every row so you never have to remember which report you are on.

### Why this data matters

- **Short flow as a share of turnover.** On 2026-09-22, NT$34.4bn of TWSE turnover was short sales against NT$1,078.8bn traded — **3.19%** of the day. On the OTC board it was NT$10.1bn of NT$269.0bn, **3.74%**. That ratio, per stock and per day, is the cleanest short-pressure signal Taiwan publishes for free.
- **The institutional side dwarfs the retail one, and by a different factor on each board.** The same session: borrowed-stock sales ran **7.7× margin short sales** by value on TWSE and **10.7×** on TPEx. Reading only the 融券 figure — as most screeners do — means seeing about an eighth of the selling on the main board.
- **The shorts' own execution price.** Turnover ÷ shares is the volume-weighted price at which that day's short sales were done. Compare it to the close and you know whether the day's shorts are already in profit — which is exactly the input a squeeze thesis needs, and it exists in no other free Taiwan feed.
- **Concentration.** Only 515 of the 1,010 OTC securities were shorted at all on 2026-09-22. Filter with `minTotalShortValue` and the day collapses to the names that matter.
- **Eighteen years of it.** Daily, per security, both boards, since the autumn of 2008.

### Output

One record per security per session. A real row:

```json
{
  "date": "2026-09-22",
  "market": "twse",
  "stock_code": "2330",
  "stock_name": "台積電",
  "margin_short_lots": 1,
  "margin_short_shares": 1000,
  "margin_short_value": 2490000,
  "margin_short_avg_price": 2490.0,
  "sbl_short_lots": 106,
  "sbl_short_shares": 106000,
  "sbl_short_value": 264055000,
  "sbl_short_avg_price": 2491.08,
  "total_short_lots": 107,
  "total_short_shares": 107000,
  "total_short_value": 266545000,
  "total_short_avg_price": 2491.07,
  "day_high": 2510.0,
  "day_low": 2460.0,
  "day_close": 2460.0,
  "price_within_day_range": true,
  "quality_flags": []
}
```

TSMC on 2026-09-22: one lot shorted on margin, 106 out of borrowed stock, NT$266.5m in all, done at an average of NT$2,491.07 — against a 2,460–2,510 range and a 2,460 close. The day's shorts finished the session roughly NT$31 a share in front.

### Units, stated once

| Field | Unit |
|---|---|
| `*_lots` | Lots of 1,000 shares, as the exchange publishes them |
| `*_shares` | The same figure × 1,000, for joining against share-denominated reports |
| `*_value` | Whole New Taiwan dollars, as published |
| `*_avg_price` | NT$ per share — value ÷ shares |
| `day_high` / `day_low` / `day_close` | NT$ per share |

The lot unit is not taken on trust. TSMC's 106 borrowed lots against NT$264,055,000 imply NT$2,491 a share, which lands inside that session's 2,460–2,510 range; read as shares it would imply NT$2.49m a share. That check is not a one-off — it runs on every row of every day (see Verification).

### What you can ask for

| Input | Effect |
|---|---|
| `startDate` / `endDate` | Empty for the latest session with data. Archive floors **2008-09-26** (TWSE) and **2008-10-01** (TPEx) |
| `market` | `both`, `twse` or `tpex` |
| `stockCodes` | Keep only these securities, e.g. `2330`, `6488` |
| `minTotalShortValue` | Drop rows below this turnover. `1` keeps only names actually shorted |
| `verifyAgainstQuotes` | Also fetch the day's closing prices to check every implied price and fill `day_high`/`day_low`/`day_close`. On by default |
| `maxDays` | Safety cap, default 30 weekdays. `0` lifts it |

Cost is one request per market-day, two with the quote cross-check on. Weekends are skipped without a request.

Leaving both dates empty walks back from today to the **most recent session that actually published**, so a Monday-morning or holiday run returns the last trading day rather than an empty dataset.

### Verification

Two independent checks run on every fetch, and neither is a switch you can turn off to make a run pass.

**1. The rows must add up to the exchange's own total.** TWSE ends its table with a 合計 row carrying all four column totals. Every figure involved is an integer the exchange published, so this is exact arithmetic with nothing to round: if the rows do not sum to the printed totals in all four columns, a column was read out of position — the one failure mode a table with two identically-named column pairs invites — and **the run fails rather than publishing the day**. Verified exact across all 1,332 TWSE rows on 2026-09-22, and again on the first day of the archive in 2008.

**2. The implied price must land inside the day's own range.** Turnover ÷ shares has to sit between that security's high and low for the session. The two reports describe the same trades but are compiled separately, so agreement is real evidence that the lot and dollar columns are the pair they are taken for. Measured before release: **874 of 874** checks inside the range on TWSE and **515 of 515** on TPEx for 2026-09-22, and **459 of 459** and **182 of 182** on the same two boards for 2020-01-02. Nothing outside the range has ever been observed.

This one is recorded per row (`price_within_day_range`, `quality_flags`) rather than failing the run, because a legitimate row can have nothing to check against: a security absent from the price report, or one that printed `----` because it did not trade. Those are flagged `NO_QUOTE_FOR_DAY` and `NO_PRICE_RANGE_FOR_DAY` — 21 of TPEx's 1,010 securities on 2026-09-22 were in the second case.

**An empty answer is not quietly published as calm.** A run whose requests failed outright fails the Actor. A run where every weekday came back empty fails too — unless the range is short enough to be a real holiday. That threshold was measured, not guessed: the exchange's own session list for the months carrying Lunar New Year, Mid-Autumn and National Day across 2015–2026 contains one closure of eight consecutive weekdays, 2023-01-18 to 2023-01-27, so the limit sits at ten.

### TPEx stopped publishing for nearly three years

The OTC board published this report daily from 2008-10-01 to **2009-07-30**, then stopped, and did not resume until **2012-05-30**. Every trading day in between answers with a perfectly well-formed, completely empty table — which is exactly how a gap like this gets mistaken for a bug in your own code, or worse, for a market where nobody shorted anything for three years.

Both edges were found by probing month by month and then day by day. The Actor does not request those days at all: it reports them as a known publication gap and carries on. **TWSE covers the whole period without interruption**, so a backfill across it should use `market: "twse"` and expect the OTC half to be genuinely absent from the record.

### Limitations, stated plainly

- **Turnover, not balance.** This says how much was sold short, not how much is still short. For the outstanding position use [taiwan-sbl-short-sale-balance](https://apify.com/chamarix/taiwan-sbl-short-sale-balance), and for the margin *long* side [taiwan-margin-trading](https://apify.com/chamarix/taiwan-margin-trading).
- **TWSE excludes offsetting day trades.** The exchange's own note on the report states that 資券互抵 is not counted in the margin short sale figure, so intraday round-trips that never left a position are out.
- **No buy-to-cover side.** The report covers short *sales* only. Covering purchases appear only through the balance reports.
- **The security code is not always numeric.** ETFs and foreign issuers carry codes like `00400A` and `911613`, so treat it as a string.
- **Emerging-board (興櫃) securities are not in it.** Neither exchange publishes a short-sale turnover report for that board.
- **Names change, codes are stabler.** The Chinese short name is published as-is; for a time series, key on `stock_code`.

### Taiwan Market Data Suite

This Actor is part of a suite of 35 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-ipo-subscription](https://apify.com/chamarix/taiwan-ipo-subscription) — Every IPO ballot since 2006 & every competitive auction since 2016 — odds, ticket cost, reserve & bid-to-cover
- [taiwan-intraday-5sec-stats](https://apify.com/chamarix/taiwan-intraday-5sec-stats) — Market-wide order book & all sector indices every 5 seconds since 2004, 3,241 rows a session
- [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-director-compensation](https://apify.com/chamarix/taiwan-director-compensation) — Board pay for 1,950+ companies, parent vs consolidated scope, with EPS, ROE & profit on the same row
- [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-short-sale-volume](https://apify.com/chamarix/taiwan-short-sale-volume) — Daily short sale turnover per stock — margin & borrowed lots, value and implied price, since 2008
- [taiwan-day-trading-stats](https://apify.com/chamarix/taiwan-day-trading-stats) — Day-trading volume, value & ratio per stock since 2014
- [taiwan-odd-lot-trading](https://apify.com/chamarix/taiwan-odd-lot-trading) — Both odd-lot sessions per stock — intraday & after-hours, shares, turnover, OHLC & quotes since 2004
- [taiwan-broker-rankings](https://apify.com/chamarix/taiwan-broker-rankings) — Securities-firm turnover, market share & the top firms in each hot stock on the OTC board since 2007
- [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)

# Actor input Schema

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

First session to fetch. Leave both dates empty for the most recent session with data, which is what a Monday-morning or holiday run wants. TWSE's archive opens 2008-09-26 and TPEx's 2008-10-01; an earlier date simply starts there.

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

Last session to fetch, inclusive. Defaults to today when only a start date is given. Weekends are skipped without a request; weekday holidays cost one request and come back empty.

## `market` (type: `string`):

Both exchanges, or one of them. TPEx did not publish this report between 2009-07-31 and 2012-05-29; those days are skipped with a warning rather than requested, and TWSE covers the period without interruption.

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

Keep only these securities, e.g. 2330, 6488. Leave empty for the whole market — roughly 2,350 securities a day across both exchanges. Filtering happens after the fetch, so it cuts the output rather than the request count.

## `minTotalShortValue` (type: `integer`):

Drop rows whose margin plus borrowed short sale turnover falls below this. Most securities print zeros on any given day; set 1 to keep only those actually sold short, or e.g. 10000000 for the NT$10m-and-up names.

## `verifyAgainstQuotes` (type: `boolean`):

Fetches each day's closing-price report as well and checks that turnover divided by shares lands inside that security's own high and low — an independent confirmation that the lot and dollar columns are the pair they are taken for. Also fills in day\_high, day\_low and day\_close. Costs one extra request per market-day; turn it off for a long backfill.

## `maxDays` (type: `integer`):

A safety cap on how many weekdays one run will fetch, so an accidental 'since 2008' does not become a surprise bill. When a range exceeds it the most recent days are kept. Set 0 to lift it. Ignored when both dates are empty.

## Actor input object example

```json
{
  "startDate": "",
  "endDate": "",
  "market": "both",
  "stockCodes": [],
  "minTotalShortValue": 0,
  "verifyAgainstQuotes": true,
  "maxDays": 30
}
```

# Actor output Schema

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

One record per security per session — margin short sale and borrowed-stock short sale lots, shares and turnover, the implied price of each, and the day's own high, low and close to check it against.

# 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": "",
    "endDate": "",
    "market": "both",
    "stockCodes": [],
    "minTotalShortValue": 0,
    "verifyAgainstQuotes": true,
    "maxDays": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taiwan-short-sale-volume").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": "",
    "endDate": "",
    "market": "both",
    "stockCodes": [],
    "minTotalShortValue": 0,
    "verifyAgainstQuotes": True,
    "maxDays": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taiwan-short-sale-volume").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": "",
  "endDate": "",
  "market": "both",
  "stockCodes": [],
  "minTotalShortValue": 0,
  "verifyAgainstQuotes": true,
  "maxDays": 30
}' |
apify call chamarix/taiwan-short-sale-volume --silent --output-dataset

```

## MCP server setup

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

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/sQxjwQSAnoq1g2WwG/builds/iPCPZhdD74JEzuZaT/openapi.json
