# Taiwan IPO Subscription & Auction — 公開申購抽籤與競價拍賣 API (`chamarix/taiwan-ipo-subscription`) Actor

Every Taiwan IPO ballot since 2006 and every competitive auction since 2016, as JSON. Draw date, subscription window, offer price, lot size, valid applications and the resulting allocation odds, beside the auction that set the price — reserve, bids, and the weighted average award.

- **URL**: https://apify.com/chamarix/taiwan-ipo-subscription.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 IPO Subscription & Auction (公開申購抽籤與競價拍賣) API

Every Taiwan IPO ballot back to **2006-10-12** and every competitive auction back to **2016-01-13**, as structured JSON. **4,093 subscription lotteries and 863 auctions** — draw date, subscription window, offer price, lot size, what one application costs, how many valid applications arrived and the odds that produced, beside the institutional auction that set the price in the first place.

Taiwan's IPO ballot is the single most-participated retail event in the market: 星宇航空's 2024 listing drew **1,607,558 valid applications**. The exchange publishes it as a web table with no API. This is that table, both halves of it, normalised and cross-checked.

### Why this data matters

- **The whole retail side of an offering, on one row.** `ticket_cost_ntd` is what has to be on deposit to enter once. `allocation_rate_pct` is the chance it gets allotted. `oversubscription_x` is the same fact the readable way round — 晉弘's 2023 seasoned offering was **1,998× oversubscribed**, or one application in 1,999. `listing_date` is when the allotment can actually be sold. Nothing here needs to be assembled from three sources.
- **The auction that set the price, joined to the ballot it priced.** Taiwan prices most IPOs by sealed-bid auction first, then sells a retail tranche at a fixed price. Both are here, on the same security code. 星宇航空's auction cleared at a weighted average of **NT$23.28** against a NT$17.39 reserve; the retail tranche was then struck at **NT$20**. Across all 852 settled auctions the retail price has come in a median **1.8% below** the auction's own weighted average — the discount that makes the ballot worth entering, measurable rather than assumed.
- **Bid-to-cover and premium over reserve, for every auction since 2016.** The median auction is covered **3.55×** and clears **21.6% above** the underwriter's floor; **31 of 852** went undersubscribed. This is the cleanest public read on how the market priced an issue against the bank that brought it, and the exchange publishes none of the three figures directly.
- **One request per year, not per day.** The exchange's `date` parameter selects a whole calendar year — the same 202 rows come back for 1 January and 31 December. The complete twenty-one-year archive is **32 requests**, which is why the full backfill is an option rather than a project.
- **Both reports reconcile against their own inputs before anything is written.** The total offer value is recomputed from shares × price, and the allocation rate from lots and applications — on all 4,080 and 2,532 rows that carry them. Every auction's weighted average is verified to sit inside its own accepted-bid range and above its reserve, and the lots sold implied by the money raised is checked against the lots that were available. A run that cannot reconcile them publishes nothing.
- **Covers what the ballot actually covers.** TWSE *and* TPEx, the Innovation Board, foreign primary listings, seasoned offerings, convertible bonds on the auction side, and central government bond tranches sold over post office counters — one table, 15 issue types, each with an English label.

### Output

One record per ballot, and one per auction. An upcoming draw:

```json
{
  "record_type": "IPO_SUBSCRIPTION",
  "draw_date": "2026-09-30",
  "code": "6604",
  "name": "儒億",
  "issue_type": "初上櫃",
  "issue_type_en": "TPEx IPO",
  "subscribe_start": "2026-09-22",
  "subscribe_end": "2026-09-24",
  "listing_date": "2026-10-06",
  "underwriter": "永豐金",
  "offered_shares": 1360000,
  "lot_shares": 1000,
  "offered_lots": 1360,
  "planned_price_ntd": 24,
  "offer_price_ntd": null,
  "offer_value_ntd": null,
  "ticket_cost_ntd": null,
  "qualified_applications": null,
  "allocation_rate_pct": null,
  "oversubscription_x": null,
  "is_priced": false,
  "is_drawn": false,
  "is_upcoming": true,
  "is_cancelled": false
}
```

The auction that will price it, opening a week earlier:

```json
{
  "record_type": "IPO_AUCTION",
  "open_date": "2026-09-23",
  "code": "6604",
  "name": "儒億",
  "market": "櫃檯買賣",
  "market_en": "TPEx",
  "issue_type_en": "TPEx IPO",
  "auction_method_en": "Discriminatory (American) auction",
  "bid_start": "2026-09-17",
  "bid_end": "2026-09-21",
  "auction_lots": 5040,
  "min_bid_price_ntd": 20,
  "min_lots_per_bid": 1,
  "max_lots_per_bidder": 640,
  "margin_pct": 50,
  "bid_processing_fee_ntd": 400,
  "avg_award_price_ntd": null,
  "is_settled": false,
  "is_upcoming": true
}
```

And the same shape once it has been held — 星宇航空, October 2024:

```json
{
  "record_type": "IPO_AUCTION",
  "open_date": "2024-10-11",
  "code": "2646",
  "name": "星宇航空",
  "auction_lots": 319600,
  "min_bid_price_ntd": 17.39,
  "qualified_bids": 32011,
  "qualified_lots": 687938,
  "min_award_price_ntd": 21.63,
  "max_award_price_ntd": 100,
  "avg_award_price_ntd": 23.28,
  "awarded_value_ntd": 7440972870,
  "implied_awarded_lots": 319629.42,
  "bid_to_cover_x": 2.15,
  "award_premium_pct": 33.87,
  "final_offer_price_ntd": 20,
  "is_settled": true
}
```

### Input

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `startYear` | string | current year | First calendar year. The ballot archive begins 2006, the auction archive 2016; an earlier year starts there. |
| `endYear` | string | current year | Last year, inclusive. One request per report per year. |
| `includeSubscriptions` | boolean | `true` | The retail ballot table. |
| `includeAuctions` | boolean | `true` | The competitive auction table. |
| `onlyUpcoming` | boolean | `false` | Keep only what can still be applied or bid for. |
| `codes` | array | `[]` | Keep only these security codes. |
| `useApifyProxy` | boolean | `false` | Worth turning on only for the full backfill. |

The default — no input at all — is the current year of both tables, two requests, and every upcoming ballot in it.

```json
{ "onlyUpcoming": true }
```

```json
{ "startYear": "2006", "endYear": "2026", "includeAuctions": false }
```

### What the exchange gets up to, and what this Actor does about it

- **Two calendars in two tables.** The ballot table prints Republic-of-China years (`115/09/30`), the auction table Western ones (`2026/09/23`), and the auction table stopped zero-padding somewhere around 2019 (`2017/1/3`). All of it comes out as `YYYY-MM-DD`.
- **Four rows in the archive are silently shifted by one column.** Foreign issuers registered as *TPK Holding Co., Ltd.* arrive split across two cells, because the backend splits its rows on the comma. Every column after the name moves left by one and the last column falls off the end — while the row still has the expected number of cells, so a length check never notices, and the result parses cleanly into wrong numbers. The security code is the anchor that finds them; they are rejoined and then have to satisfy the same arithmetic as everything else.
- **"Not yet set" is not zero.** An unpriced offering carries `未訂出`, and an auction that has not been held reads 0 in every result column — including the prices. Both are published as `null`. So are the application counts on central government bond tranches, which are sold over post office counters rather than balloted, and would otherwise read as offerings that drew no applicants.
- **The auction table has been reshaped three times since 2016.** 2016 had no issue-type column at all and put what later became its contents under *market*; it measured the offer in **shares** under a column name no year since has used, where every later year uses **lots** of 1,000. Two more columns were renamed in 2018 and 2025. Every alias maps onto one key, both units are published, and a column this Actor cannot place stops the run rather than being read by position.
- **The auction year filter looks at the bidding window as well as the opening date**, so an auction bid for in December and opened in January is served by both years — once with no results and once with them. They are deduplicated on the auction, and the settled copy wins.
- **Tolerances come from the rounding, not from a constant.** A government bond priced at `97.472` was really sold at something between 97.4715 and 97.4725, and the exchange's total is built from the unrounded figure — so on a 1,590,000-unit tranche the rebuilt total is out by NT$795, exactly half an ulp per unit. The check allows precisely that and no more, which is why it passes 4,080 rows without waving through anything.
- **Zero rows is not the same as nothing to report.** A range inside the archive's own bounds where every year came back empty fails the run rather than publishing itself as a quiet decade.

### Field notes

`allocation_rate_pct` is capped at 100 — that is what the exchange prints when an offering drew fewer applications than it had lots to give away, and the recomputation matches it. `implied_awarded_lots` is derived, not published: the exchange gives no awarded-quantity column, so it is recovered from the money raised and the average price, and it falls short of `auction_lots` when bids were rejected or the book went uncovered. `market` is null on 2016 auction rows because the table had no market column that year — guessing one from the issue type would have made 初上櫃 look like a venue.

### Source

- TWSE 公開申購公告-抽籤日程表 — `twse.com.tw/rwd/zh/announcement/publicForm`
- TWSE 競價拍賣公告-投標日程表 — `twse.com.tw/rwd/zh/announcement/auction`

Both are official Taiwan Stock Exchange announcement tables, free and public. The exchange updates them as offerings are announced, priced and drawn; a ballot row appears with its price still 未訂出 and fills in over the following fortnight.

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

## `startYear` (type: `string`):

Leave both years empty for the current year, which is where every upcoming ballot lives. The exchange's date parameter selects a whole calendar year, so a year is the smallest unit there is — and the whole archive is only 32 requests. The ballot table begins in 2006 and the auction table in 2016; an earlier year simply starts there.

## `endYear` (type: `string`):

Inclusive. Defaults to the current year. One request per report per year.

## `includeSubscriptions` (type: `boolean`):

The 公開申購公告-抽籤日程表 table: every offering a retail investor could ballot for since 2006-10-12, with the draw date, the subscription window, the strike price, the lot size, how many valid applications arrived and the odds that produced. Covers TWSE, TPEx, the Innovation Board and central government bonds in one table.

## `includeAuctions` (type: `boolean`):

The 競價拍賣公告-投標日程表 table, back to 2016-01-13: the institutional auction that sets the price the ballot is then struck at. Reserve price, bidding window, lots offered, per-bidder cap, margin, and once it is held the lowest, highest and weighted-average accepted bid.

## `onlyUpcoming` (type: `boolean`):

Keeps ballots whose draw date and auctions whose opening date are today or later, and that have not been cancelled. This is the whole of the retail use case — what can still be applied for — and with the default year range it is two requests.

## `codes` (type: `array`):

Keep only these securities, e.g. 2330 for a listed company, 84223 for a convertible bond or A151AO for a government bond tranche. Leave empty for everything. Filtering happens after the fetch, because the exchange only serves whole years.

## `useApifyProxy` (type: `boolean`):

Worth turning on only for the full 2006-to-now backfill. TWSE's firewall refuses by address and, once tripped, refuses every report for that address for minutes at a time; with this on, requests take a different exit address each time they are refused. Off by default because any ordinary range is a handful of requests.

## Actor input object example

```json
{
  "startYear": "",
  "endYear": "",
  "includeSubscriptions": true,
  "includeAuctions": true,
  "onlyUpcoming": false,
  "codes": [],
  "useApifyProxy": false
}
```

# Actor output Schema

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

One record per retail subscription ballot and one per competitive auction — draw and subscription dates, offer price, lot size, cost of one application, valid applications and allocation odds, beside the auction's reserve, bid-to-cover and weighted average award.

# 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 = {
    "startYear": "",
    "endYear": "",
    "includeSubscriptions": true,
    "includeAuctions": true,
    "onlyUpcoming": false,
    "codes": [],
    "useApifyProxy": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taiwan-ipo-subscription").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 = {
    "startYear": "",
    "endYear": "",
    "includeSubscriptions": True,
    "includeAuctions": True,
    "onlyUpcoming": False,
    "codes": [],
    "useApifyProxy": False,
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taiwan-ipo-subscription").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 '{
  "startYear": "",
  "endYear": "",
  "includeSubscriptions": true,
  "includeAuctions": true,
  "onlyUpcoming": false,
  "codes": [],
  "useApifyProxy": false
}' |
apify call chamarix/taiwan-ipo-subscription --silent --output-dataset

```

## MCP server setup

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

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/y0toVjmTLt5YVUPhr/builds/bvsS2w9zHizrEZm67/openapi.json
