# Tianyancha Company Scraper 天眼查: China Company Owners & Status (`getascraper/tianyancha-company-scraper`) Actor

Look up Chinese companies on Tianyancha 天眼查 by name, credit code, link or keyword. Get one merged row each: legal representative, capital, status, emails, plus optional shareholders, investments and executives. Exact matching, watch lists for changes, no login or API key. 天眼查企业信息查询。

- **URL**: https://apify.com/getascraper/tianyancha-company-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 search rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 🏢 Tianyancha Company Scraper 天眼查: China Company Owners & Status

<table width="100%" style="margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#F1F6FB;border:1px solid #CFE0F1;border-top:4px solid #1D4E89;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">One row per Chinese company: registry facts, owners, investments and people</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Type a company name, credit code or link from Tianyancha 天眼查 and get the legal representative, capital, status and contacts in one record. Add shareholders, investments, executives and a risk summary when you need them.</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #CFE0F1;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#163A66">🔎 Name in, data out</span><br>
<span style="font-size:12px;color:#57534E">No internal ids. Names and credit codes are matched exactly, never guessed.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #CFE0F1;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#163A66">🧩 One merged row</span><br>
<span style="font-size:12px;color:#57534E">Profile, owners, investments and people in a single record per company.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #CFE0F1;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#163A66">🔔 Watch list</span><br>
<span style="font-size:12px;color:#57534E">Get told when a status, legal representative or capital changes.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #CFE0F1;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#163A66">✅ Honest data</span><br>
<span style="font-size:12px;color:#57534E">Hidden phone numbers are flagged, never invented. English labels only where certain.</span>
</td>
</tr>
</table>

Tianyancha 天眼查 is one of China's main company information sites. This Actor reads its public company pages and returns clean, structured records for due diligence, supplier checks and lead lists. It needs no login, account or API key.

### 🔍 What does Tianyancha Company Scraper do?

You give it a list of companies, or keywords, and it returns one record per company. Each record carries the registry facts: legal name, unified social credit code, legal representative, status, registered and paid-in capital, establishment date, registration authority, address, business scope, industry, staff range and tax details. Listed companies add ticker and public financial figures.

Switch on the deeper sections when you need them:

- **Shareholders** with ownership percent as a number and flags for controlling shareholder, largest shareholder, actual controller and beneficial owner.
- **Outbound investments** with stake, invested capital, status, location and industry.
- **Executives and directors** with position, term dates and a legal representative flag.
- **Risk summary** with counts of lawsuits, hearing notices, penalties, dishonest-debtor and abnormal-operation records.

Every row says which sections were read and which failed, so one unreadable section never costs you the rest.

### 👥 Why use it

- **"I check Chinese suppliers before we sign."** Paste the supplier names. You get status, legal representative, capital and owners in one table instead of clicking through pages.
- **"I run KYB and need to know who owns whom."** Turn on shareholders and investments. Ownership percentages come back as numbers you can sort and join.
- **"I keep a list of counterparties and want to know when something changes."** Name a monitor and schedule the run. Each company is marked new, updated, unchanged, closed or reopened, with the changed fields listed.
- **"I build lead lists for a region or trade."** Search a keyword, split it by province and collect hundreds of companies with address, legal representative and emails.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F1F6FB;border:1px solid #CFE0F1;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">List your companies</span><br>
<span style="font-size:12px;color:#57534E">Names, credit codes, registration numbers, links or ids, mixed in one list. Or add search keywords.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F1F6FB;border:1px solid #CFE0F1;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick the sections</span><br>
<span style="font-size:12px;color:#57534E">Shareholders, investments, executives and risk summary are optional and off by default.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F1F6FB;border:1px solid #CFE0F1;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1D4E89;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run and export</span><br>
<span style="font-size:12px;color:#57534E">Download as JSON, CSV or Excel, or schedule it with a monitor name to track changes.</span>
</td>
</tr>
</table>

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Companies | array of text | No | Company names, 18-character credit codes, 15-digit registration numbers, tianyancha.com company links or numeric ids, one per row. |
| Search keywords | array of text | No | Discovery searches such as a trade, brand or place. Each returns the site's first 20 matches. |
| Split each keyword by province | boolean | No | Runs every keyword once per province and merges the results without duplicates, to go past 20 results. |
| Provinces to split by | array of text | No | Chinese or English province names. Empty means all 31 mainland provinces, municipalities and regions. |
| Open every discovery result for the full profile | boolean | No | Off: keyword results are search-level rows. On: each result's company page is opened too and billed as a company profile. |
| Shareholders | boolean | No | Paid add-on. Adds the shareholder list with ownership percent and controller flags. |
| Outbound investments | boolean | No | Paid add-on. Adds the companies this company invests in. |
| Executives and directors | boolean | No | Paid add-on. Adds key people with position and term dates. |
| Risk summary (counts only) | boolean | No | Adds counts of lawsuits, penalties and similar records. Counts only, never the records. |
| Monitor name | text | No | Name a watch list to mark every row NEW, UPDATED, UNCHANGED, CLOSED or REOPENED between runs. |
| Output mode | enum | No | All rows, or only new and changed rows. Works together with a monitor name. |
| Maximum companies | integer | No | Upper limit on companies handled in a run. Default 10. |
| Add a row for inputs that could not be resolved | boolean | No | Gives unmatched or unreadable inputs a status row so nothing disappears silently. |
| Proxy | object | No | Defaults to a residential connection in mainland China, which the source requires. |

### 📦 Data table

| Field | Type | Description |
| --- | --- | --- |
| id | integer | Tianyancha company id, stable across runs. |
| name, nameEn, shortName, formerNames | text | Legal name in Chinese, English name when the source has one, short name and earlier names. |
| creditCode, regNumber, orgCode, taxNumber | text | Unified social credit code and other registry numbers. |
| legalRepresentative | text | Legal representative as registered. |
| status, statusEn, registryClosed | text, boolean | Registry status in Chinese, an English label where the mapping is certain, and a flag for cancelled or revoked companies. |
| registeredCapital, registeredCapitalAmount, registeredCapitalCurrencyCode | text, number | Capital as written, as a number, and the currency code. Paid-in capital follows the same pattern. |
| establishedDate, approvedDate | text | Dates in YYYY-MM-DD. |
| companyType, orgType, orgTypeEn, registrationAuthority | text | Company form and registering authority. |
| address, province, provinceEn, city | text | Registered address and, for search-based rows, province and city. |
| businessScope, industry, industryNational | text, object | Registered scope and industry, with the national four-level classification and an English top level. |
| staffRange, insuredStaffCount, taxpayerType, taxPhone | text, number | Size and tax details. |
| emails, emailDetails, websites | array | Full emails with the report year they came from, and websites. |
| phones, contactsMasked, maskedPhoneCount | array, boolean, number | Only complete phone numbers. When the source hides digits, the number is left out and the flag says so. |
| isListed, listings, financials | boolean, array, object | Ticker and exchange for listed companies and public revenue, profit and asset figures. |
| counts | object | How many shareholders, investments, branches, change records, trademarks and patents the site lists. |
| riskSummary | object | Counts of lawsuits, hearing notices, penalties and similar records, plus the site's own risk totals. |
| shareholders, outboundInvestments, executives | array | The optional sections. |
| inputQuery, inputType, matchType, matchedOn, matchAlternatives | text, array | What you entered, how it was matched (exact, closest or none) and nearby candidates. |
| dataLevel, lookupStatus, message | text | Whether the row is a full profile, search-level or a status row, and why. |
| sectionsOk, sectionsFailed, sectionErrors | array, object | Which sections were read and which were not. |
| lifecycleStatus, changedFields, firstSeenAt, lastSeenAt, closedReason | text, array | Monitor fields, present when a monitor name is set. |
| scrapedAt | text | When the row was collected. |

Example (shortened):

```json
{
  "id": 26891031,
  "name": "贵州茅台酒股份有限公司",
  "nameEn": "Kweichow Moutai Co.,Ltd.",
  "creditCode": "9152000071430580XT",
  "legalRepresentative": "陈华",
  "status": "存续",
  "statusEn": "Active (in existence)",
  "registeredCapital": "125227.0215万人民币",
  "registeredCapitalAmount": 1252270215,
  "registeredCapitalCurrencyCode": "CNY",
  "establishedDate": "1999-11-20",
  "isListed": true,
  "contactsMasked": true,
  "matchType": "exact",
  "dataLevel": "profile",
  "sectionsOk": ["profile", "shareholders"],
  "sectionsFailed": []
}
```

### 🚫 What is not included

Some information on Tianyancha is only visible to logged-in users. This Actor never logs in, so these are not included:

- Risk detail lists such as individual lawsuits, penalties or dishonest-debtor records. You get counts only.
- Change records, branch lists and annual reports. You get the counts only.
- Actual controller detail and full unmasked phone numbers.
- Paged or filtered search. One search returns the site's first 20 matches, which is why the province split exists.

Names of legal representatives and executives are personal information. Use them only for a lawful purpose and follow the data protection rules that apply to you.

### 💰 Pricing

Pricing is pay per event, with no subscription. Every row you receive has a small base charge. A full company profile adds a second charge, and the deeper sections (shareholders, investments, executives) add a third only on rows where they returned data. Search-level rows, rows with no match and sections that could not be read never carry the extra charges. The pricing tab shows the exact rates.

Free-plan runs are limited to 25 companies per run, 3 runs per day, and a 30-minute wait between runs.

### ⭐ Enjoying Tianyancha Company Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#F1F6FB;border:1px solid #CFE0F1;border-left:5px solid #1D4E89;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">One run replaces a day of copying company facts by hand.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other compliance and sourcing teams find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#1D4E89;border:1px solid #CFE0F1;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/tianyancha-company-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

#### 天眼查怎么批量查询企业工商信息？

Paste the company names, credit codes or links into the Companies list and run the Actor. Each company comes back as one row with the registry facts. Names and codes are matched exactly against the site search.

#### 天眼查的股东信息可以导出吗？

Yes. Turn on Shareholders and the owners come back inside each company row, with ownership percent as a number and flags for controlling shareholder and beneficial owner. Export the dataset as JSON, CSV or Excel.

#### What happens when a name does not match any company?

You get a status row that says no company matched, with the nearest candidates listed. Nothing is guessed. A name that is only a close match is marked "closest" so you can check it.

#### Why are some phone numbers missing?

The source hides part of many phone numbers. Those are left out and the row sets a flag, instead of showing a partial or invented number. Emails are returned in full with the report year they came from.

#### Do I need an account or an API key?

No. The Actor uses only public company pages. It needs no login, cookie or key from you.

### 🔗 Other actors

- [Made-in-China Scraper 中国制造网](https://apify.com/getascraper/made-in-china-catalog-scraper) ↗ - China products, suppliers and price changes.
- [Toocle Scraper 生意宝](https://apify.com/getascraper/toocle-b2b-sourcing-scraper) ↗ - China B2B products, suppliers and prices.
- [GYS Scraper 供应商网](https://apify.com/getascraper/gys-supplier-catalog-scraper) ↗ - China suppliers with prices, MOQ and phone contacts.
- [Poland KRS Scraper](https://apify.com/getascraper/poland-krs-company-registry-scraper) ↗ - Polish company register data with a feed and monitor.
- [Albania QKB Scraper](https://apify.com/getascraper/albania-qkb-scraper) ↗ - Albanian company registry and beneficial owner data.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/tianyancha-company-scraper/changelog.md

# Actor input Schema

## `companies` (type: `array`):

Companies to look up, one per row. Mix freely: company name, unified social credit code (18 characters), registration number (15 digits), a tianyancha.com company link, or the numeric company id. Names and codes are matched exactly against the site search; if nothing matches, the row says so instead of guessing. No internal id is needed.

## `searchKeywords` (type: `array`):

Optional discovery searches such as a brand, trade or place (for example 白酒 or 新能源 深圳). Each keyword returns the site's first 20 matches as rows with registry basics. The site does not page or filter further, so use the province split below to reach more.

## `splitByProvince` (type: `boolean`):

Runs every keyword once per province (keyword plus province name) and merges the results without duplicates, to get past the 20 results a single search returns. Uses one search request per province, so keep Maximum companies in mind.

## `provinces` (type: `array`):

Only used when the province split is on. Chinese or English province names, for example Sichuan or 四川. Leave empty to use all 31 mainland provinces, municipalities and regions.

## `enrichSearchResults` (type: `boolean`):

Off: keyword results are search-level rows (registry basics, address, emails). On: each result's company page is opened too, adding staff, tax, listing, financial figures, section counts and any sections chosen below. Each opened company is billed as a company profile and costs about one extra page.

## `includeShareholders` (type: `boolean`):

Paid add-on, charged per row where it returns data. Adds the shareholder list with ownership percent as a number, share type, holder type and flags for controlling shareholder, largest shareholder, actual controller and beneficial owner. One extra page per company.

## `includeInvestments` (type: `boolean`):

Paid add-on, charged per row where it returns data. Adds the companies this company invests in, with stake percent, invested capital, status, location and industry. One extra page per company.

## `includeExecutives` (type: `boolean`):

Paid add-on, charged per row where it returns data. Adds key people with position, term dates, education and a flag for the legal representative. Names are personal data: use them only for a lawful purpose. One extra page per company.

## `includeRiskSummary` (type: `boolean`):

Adds a plain summary of how many lawsuits, hearing notices, penalties, dishonest-debtor and abnormal-operation records the site lists, plus its own-risk, related-party, historical and warning totals. Counts only, never the underlying records. Uses data already on the company page, so no extra request.

## `monitorScope` (type: `string`):

Give a name to track these companies over time. Each run then marks every row NEW, UPDATED, UNCHANGED, CLOSED or REOPENED and lists changedFields for status, legal representative, registered capital, address, name, business scope and (when fetched) shareholders. A company is CLOSED only when the registry shows it cancelled or its page is confirmed gone. Use the same name on every scheduled run. Leave empty for a one-off run.

## `outputMode` (type: `string`):

All rows, or only rows that are new, changed, closed or reopened since the last run. Only has an effect when a monitor name is set.

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

Upper limit on companies processed in this run, across company lookups and keyword results. Start small: each company costs one to four page reads through a mainland China residential connection.

## `includeStatusRows` (type: `boolean`):

When on, an input with no match, a missing page or a failed read gets a row with lookupStatus and a short message so nothing silently disappears. Turn off to receive data rows only; unresolved inputs are still listed in the run summary.

## `proxyConfiguration` (type: `object`):

The source only serves visitors from mainland China, so the default is Apify Residential proxy with country China (CN). Keep it unless you supply your own mainland China proxy. Other countries are refused by the source and the run ends with a clear message.

## Actor input object example

```json
{
  "companies": [
    "贵州茅台酒股份有限公司"
  ],
  "searchKeywords": [],
  "splitByProvince": false,
  "provinces": [],
  "enrichSearchResults": false,
  "includeShareholders": false,
  "includeInvestments": false,
  "includeExecutives": false,
  "includeRiskSummary": false,
  "monitorScope": "",
  "outputMode": "all",
  "maxResults": 10,
  "includeStatusRows": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CN"
  }
}
```

# Actor output Schema

## `companies` (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 = {
    "companies": [
        "贵州茅台酒股份有限公司"
    ],
    "searchKeywords": [],
    "splitByProvince": false,
    "provinces": [],
    "enrichSearchResults": false,
    "includeShareholders": false,
    "includeInvestments": false,
    "includeExecutives": false,
    "includeRiskSummary": false,
    "monitorScope": "",
    "outputMode": "all",
    "maxResults": 10,
    "includeStatusRows": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/tianyancha-company-scraper").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 = {
    "companies": ["贵州茅台酒股份有限公司"],
    "searchKeywords": [],
    "splitByProvince": False,
    "provinces": [],
    "enrichSearchResults": False,
    "includeShareholders": False,
    "includeInvestments": False,
    "includeExecutives": False,
    "includeRiskSummary": False,
    "monitorScope": "",
    "outputMode": "all",
    "maxResults": 10,
    "includeStatusRows": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/tianyancha-company-scraper").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 '{
  "companies": [
    "贵州茅台酒股份有限公司"
  ],
  "searchKeywords": [],
  "splitByProvince": false,
  "provinces": [],
  "enrichSearchResults": false,
  "includeShareholders": false,
  "includeInvestments": false,
  "includeExecutives": false,
  "includeRiskSummary": false,
  "monitorScope": "",
  "outputMode": "all",
  "maxResults": 10,
  "includeStatusRows": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CN"
  }
}' |
apify call getascraper/tianyancha-company-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/tianyancha-company-scraper"
        }
    }
}
```

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/Z2TCoNW5yza9wYm4A/builds/PwAjYl791PEv8C4Li/openapi.json
