# Taiwan Factory & Supplier Search (`japan_signal_lab/taiwan-factory-supplier-search`) Actor

Search 100,000+ official Taiwan factory records by registered product, industry and city. Export factory/company IDs and source-backed English categories as JSON. Free 10-record preview; bulk search and pagination. No inferred CNC or OEM capabilities.

- **URL**: https://apify.com/japan\_signal\_lab/taiwan-factory-supplier-search.md
- **Developed by:** [Japan Signal Lab](https://apify.com/japan_signal_lab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 factory records

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 Factory & Supplier Search

Search **100,000+ official Taiwan factory records** by registered product class, manufacturing category, industry and city. Get factory registration IDs, company IDs and source-backed English product labels as JSON for procurement research, supplier shortlists and AI workflows.

The unit is a **registered factory**, not a company profile. One company can have several factories. Start with a free **10-record preview**, then use search mode for bulk records and pagination. No Taiwan account or source API key is required.

### Try it

```json
{"mode":"preview","city":"Taichung","manufacturingCategory":"machinery","maxResults":10}
```

```json
{"mode":"search","city":"Changhua","mainProduct":"253","maxResults":1000,"offset":0}
```

`253` is the official broad metal-container product class. It does not establish food packaging suitability. For paper containers, use `manufacturingCategory: "packaging"` (code 152).

### What you receive

- Factory registration ID and company unified business number, preserved as strings.
- Official Chinese factory name and address; English city/county.
- Original industry/product codes and labels plus our English translations.
- Conservative, rule-based manufacturing categories and an evidence summary.
- Production status, official source URL, license, source timestamp and snapshot hash.

`factory_name_en` is null: this source does not provide official English names. Names are not translated or invented. `confidence.classification` is a mapping status (`mapped`, `ambiguous`, `unclassified`), not a probability of supplier quality.

Example output (selected fields from the official snapshot):

```json
{
  "factory_id": "06000011",
  "company_id": "16513603",
  "factory_name_zh": "陸豪科技有限公司工廠",
  "factory_name_en": null,
  "city": "Taichung",
  "industry_code": [
    "27",
    "29",
    "33"
  ],
  "main_products_raw": "273視聽電子產品、292其他專用機械設備、331育樂用品  ",
  "manufacturing_categories": [
    "electronics",
    "machinery",
    "other manufacturing"
  ],
  "source_updated_at": "2026-09-18T02:36:30.000Z",
  "source_license": "Open Government Data License, version 1.0"
}
```

### Search behavior

All supplied fields combine with **AND**. Keyword words combine with AND over names, locations and broad product/industry/category labels; matching is case-insensitive. Chinese text is also supported. `mainProduct` accepts an exact code or a substring of its translated or original label. `industryCode`, `companyId` and `factoryId` match exactly.

Use `city` for English or Chinese cities/counties, such as Taichung, Changhua, Hsinchu City or Hsinchu County. `county` is an API alias. `limit` is an API alias of `maxResults`; conflicting aliases fail validation. Results sort by factory ID. Default search size is 100, with up to 150,000 results per run.

Categories: metal processing; electronics; semiconductor; machinery; automotive parts; plastics; chemicals / materials; food manufacturing; textiles; packaging; other manufacturing. These group registered product classes. Metal processing includes basic metals and fabricated products; it is **not proof of machining capability**. Electronics excludes electrical equipment and optical/medical instruments. Food excludes animal feed. Packaging is limited to paper containers. Use product codes/text for goods in the broad other-manufacturing group.

**CNC, precision, sheet metal, casting, forging, OEM/ODM, export readiness and certifications are not inferred.** A CNC query may return zero because the source does not describe machines. A factory matching machinery and paper containers is not necessarily a packaging-machine manufacturer. Contact, commercial readiness, MOQ, capacity and actual capabilities require separate verification.

### Pagination and summary

The default Dataset contains only factory records. The `OUTPUT` key-value record contains `totalMatches`, `emitted`, `nextOffset`, `snapshotId`, source details and billing counts.

For the next page, set `mode: "search"`, `offset` to `nextOffset`, and `snapshotId` to the previous value. If the source changed, the Actor stops before emitting/charging records; restart at offset 0. Preview is capped at 10 and does not support nonzero offsets. `includeInactive` defaults to false; set it true only if you also want suspended or partly suspended records.

### API and AI agents

Run this Actor through the Apify API or MCP, then read the default Dataset in JSON/CSV and the OUTPUT summary. Use the synchronous run-and-get-dataset-items endpoint for smaller jobs; use asynchronous runs and Dataset pagination for bulk exports. This is a batch Actor: cold source download and startup add latency. It is not a permanently running low-latency API.

Useful workflows include regional supplier longlists, factory/company entity resolution, industrial location screening, and source-cited AI procurement research. Taiwan OEM/ODM sourcing is a use case for initial candidate discovery, not a supported capability filter.

### Source, freshness and rights

Source: Taiwan Ministry of Economic Affairs registered factory open data, [catalog 6569](https://data.gov.tw/dataset/6569), [official download index](https://www.ida.gov.tw/opendata/02/SDD6569.csv). The Actor downloads the current official GCIS ZIP directly. No commercial directory is scraped.

[Open Government Data License v1](https://data.gov.tw/license) permits commercial reproduction, adaptation and redistribution with attribution. Each output preserves attribution and the license URL. English translations/categories are by Japan Signal Lab. No government endorsement is implied; trademark and third-party rights are not granted by the license.

The audited 2026-09-18 file contains 101,032 rows, 101,031 unique factory IDs and 101,023 in-production factories. Counts can change. `source_updated_at` is the HTTP Last-Modified timestamp of the whole file, **not** the individual factory update date. The catalog has no reliable weekly freshness guarantee. This product provides current published snapshots, not new/changed-factory signals.

### Pricing

Preview: up to 10 records, no factory-record charge. Search: **$5 per 1,000 emitted factory records** ($0.005 each), with one `factory-record` event per emitted record. 100 records cost $0.50; 1,000 cost $5. No charge for scanned or nonmatching factories. No start or synthetic Dataset event. The Actor checks the configured PPE contract and respects your maximum charge; an OUTPUT summary records budget truncation. Platform usage is included. Development cost measurements and final price are recorded in the release report.

### FAQ

**Is this different from Taiwantrade?** Taiwantrade is useful for English product catalogs and contacting suppliers. This Actor supplies a reproducible factory-level registry slice, IDs, filters and bulk JSON. It does not replace supplier qualification or offer Taiwantrade's richer commercial listings.

**Does every result export or accept OEM work?** No. Registry presence and product classification establish neither.

**Can I get every factory?** Use search mode with maxResults 150000, or paginate with the snapshot hash. By default suspended factories are excluded. Prefer filtered queries when you only need a shortlist.

**Why can the same company appear repeatedly?** Different factory IDs are separate plants. Only exact duplicate factory rows are removed.

**What happens when the source fails?** Bounded timeouts and retries handle transient errors. Authentication/rate-limit failures are not bypassed. Invalid archives, unexpected row counts, changed required headers and conflicting duplicate IDs fail rather than silently returning incomplete data.

**How often is the source downloaded?** Once per run. The compressed source is about 6.3 MB. The MVP deliberately avoids a cross-user persistent cache so permissions and freshness stay simple. Rows are emitted in bounded batches.

### Development

Node 20+; `npm install`, `npm test`, `npm run build`, `npm run verify:live`. Source files are TypeScript. Docker uses the official Apify Node image. `reports/` contains measurement and classification-audit evidence. Never commit credentials or raw bulk files.

# Actor input Schema

## `mode` (type: `string`):

Preview returns at most 10 records without a factory-record event. Search supports bulk output and pagination.

## `keyword` (type: `string`):

Case-insensitive text in Chinese name/address or translated broad product/industry/category labels. Space-separated words use AND. CNC/OEM capabilities are not supplied.

## `manufacturingCategory` (type: `string`):

Broad registered product category. Packaging covers paper containers only; electronics excludes electrical equipment and optical instruments.

## `mainProduct` (type: `string`):

Exact product code (e.g. 253) or substring of Chinese/translated English registered class label.

## `city` (type: `string`):

English or Chinese region, e.g. Taichung, Changhua, Hsinchu City, Hsinchu County.

## `county` (type: `string`):

Optional API alias of city; do not supply conflicting values.

## `industryCode` (type: `string`):

Two-digit registered industry code, e.g. 29 machinery.

## `companyId` (type: `string`):

Exact eight-digit string, preserving leading zeros.

## `factoryId` (type: `string`):

Exact factory-level registration identifier, including leading zeros or letters.

## `maxResults` (type: `integer`):

Search output ceiling. Preview is always capped at 10. Each emitted search record triggers one factory-record event.

## `offset` (type: `integer`):

Zero-based matching result offset. Only search mode supports nonzero offsets.

## `snapshotId` (type: `string`):

For page 2+, copy snapshotId from OUTPUT. Fails without output/record charges if the source changes.

## `includeInactive` (type: `boolean`):

By default only source status 生產中 is included. Opt in to include suspended/partially suspended records.

## `limit` (type: `integer`):

Optional alias of maxResults. Omit maxResults or use the same value. Prefer maxResults in the form.

## Actor input object example

```json
{
  "mode": "preview",
  "maxResults": 100,
  "offset": 0,
  "includeInactive": false
}
```

# Actor output Schema

## `factories` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("japan_signal_lab/taiwan-factory-supplier-search").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("japan_signal_lab/taiwan-factory-supplier-search").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 '{}' |
apify call japan_signal_lab/taiwan-factory-supplier-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,japan_signal_lab/taiwan-factory-supplier-search"
        }
    }
}
```

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/YW466WA504PMPcvl4/builds/tefHXgQm7J3kgQ494/openapi.json
