CJK Invoice Extractor + Tax ID Check (China, Taiwan, Japan)
Pricing
from $20.00 / 1,000 invoice extracteds
CJK Invoice Extractor + Tax ID Check (China, Taiwan, Japan)
Invoice reconciliation for CN/TW/JP invoices and receipts: extract to JSON and Excel, validate China USCC, Taiwan tax ID and Japan T-number checksums, and verify per-rate tax lines.
Pricing
from $20.00 / 1,000 invoice extracteds
Rating
0.0
(0)
Developer
Robert Wang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Turn Chinese, Taiwanese and Japanese invoices and receipts (PNG, JPEG, WEBP, TIFF or PDF) into structured JSON and an Excel file, with the seller's tax ID checked against its official check-digit algorithm and the tax math verified line by line.
Built for accounts payable, bookkeeping and expense teams that receive documents such as 发票 / 统一发票 / 電子發票 / 收據 / 請求書 / 適格請求書 (インボイス) / 領収書 and need clean data they can trust before importing it.
Need general CJK documents (contracts, forms, letters) rather than invoice reconciliation? See CJK Document Extractor.
What it does
- Reads the document with a vision AI model and returns: country, document type, invoice number, issue date (民國 and 令和 years converted to ISO dates), vendor, buyer, seller tax ID, buyer tax ID, currency, line items, subtotal, one tax line per tax rate, total tax and total amount.
- Validates the seller tax ID offline:
- 🇨🇳 China Unified Social Credit Code (统一社会信用代码, 18 characters, GB 32100-2015 mod-31 check character)
- 🇹🇼 Taiwan 統一編號 (8 digits, weighted mod-5 rule, including the special case when the 7th digit is 7)
- 🇯🇵 Japan qualified invoice registration number (登録番号,
T+ 13-digit corporate number with check digit)
- Runs 7 consistency checks on every document (see below) and sets
needsReview: truewhen any check fails. - Re-reads only what failed, once: if the tax ID fails its checksum, the header is cropped, zoomed 2x and re-read by a stronger model. If the amounts do not add up, the totals area is re-read the same way. A re-read value is kept only if it passes more checks; every re-read is logged in
reextraction. - Handles mixed tax rates: Japan 10% + 8% (reduced rate), China 13% / 9% / 6%, Taiwan 5%.
- Excel output:
invoices.xlsxwith three sheets (invoices,line_items,tax_lines). - Validate-only mode: paste a list of tax IDs and get a checksum result for each. No AI is used, so it is fast and very cheap.
The 7 checks
| Check | Meaning |
|---|---|
registrationNumberFormatAndChecksum | Seller tax ID has the right format and check digit for its country |
lineItemsSumEqualsSubtotal | Sum of line amounts = subtotal |
taxableSumEqualsSubtotal | Sum of taxable amounts across tax lines = subtotal |
taxLinesSumEqualsTotalTax | Sum of per-rate tax amounts = total tax |
eachTaxLineMatchesRate | Each tax line ≈ taxable amount × rate (±1 for rounding) |
subtotalPlusTaxEqualsTotal | Subtotal + total tax = total |
taxRatesMatchLineItems | The set of tax rates on the lines matches the tax lines |
A checksum confirms that an ID is well-formed; it does not confirm that the company is registered or active. Use the official registries (e.g. Japan's 適格請求書発行事業者公表サイト) when you need that.
How to use
- Click Start with the default input to run a free demo on 3 bundled synthetic invoices (Japanese, Traditional Chinese, Simplified Chinese). The demo is not charged.
- Add your own files under Invoice / receipt file URLs (any public link), or upload files to a key-value store and list their keys under Uploaded file keys.
- Optional: set Country if all documents come from one country, and Max pages per PDF (default 3).
- Open the Output tab: the table view shows one row per document, and
invoices.xlsxis in the run's key-value store.
Input example
{"mode": "extract","fileUrls": ["https://example.com/invoices/2026-10-001.pdf", "https://example.com/receipts/photo.jpg"],"country": "auto","outputExcel": true,"retryFailedFields": true}
Validate-only:
{ "mode": "validateOnly", "taxIds": ["T1180301018771", "04595257", "91350100M000100Y43"] }
Full-width characters, spaces and dashes are normalized before checking.
Output example
One dataset item per document (shortened):
{"source": "https://example.com/invoices/jp-001.png","status": "ok","country": "JP","documentType": "invoice","invoiceNumber": "INV-2026-0142","issueDate": "2026-10-20","vendor": "サンプル商事株式会社","registrationNumber": "T2901234567890","registrationNumberValid": true,"currency": "JPY","subtotal": 71320,"taxLines": [{"rate": 0.1, "taxable_amount": 67000, "tax_amount": 6700},{"rate": 0.08, "taxable_amount": 4320, "tax_amount": 346}],"totalTax": 7046,"totalAmount": 78366,"lineItems": [{"description": "Webサイト保守", "qty": 1, "unitPrice": 55000, "amount": 55000, "taxRate": 0.1}],"validation": {"allPassed": true, "passed": 7, "total": 7},"needsReview": false,"flags": [],"reextraction": [],"modelsUsed": ["gemini-flash-lite-latest"]}
If a file cannot be downloaded or read, you get an item with status: "error" and an error message, and it is not charged.
Pricing
Pay per event, no subscription:
| Event | Price |
|---|---|
| Invoice / receipt extracted (first page included, re-reads included) | $0.02 |
| Extra PDF page read (2nd page onwards) | $0.003 |
| Tax ID checked (validate-only mode) | $0.0005 |
Failed downloads and unreadable files are not charged. The demo run is free. You can cap spending per run with Apify's maximum cost per run setting.
Accuracy, honestly
- The bundled demo invoices are synthetic and digitally rendered; on those, all fields and all 7 checks pass. Real scans and phone photos will produce more errors. That is what the checks,
needsReviewand the targeted re-read are for: review the flagged rows, not every row. - The model reads only what is printed. Fields that are not on the document are returned as
null, not guessed. - Handwritten receipts, very low-resolution photos and multi-invoice pages are not supported well.
Privacy
Files are processed in memory and sent to a third-party AI API (Google Gemini) only to read them. Nothing is logged except counts. Turn on Delete uploaded files after the run to remove your uploads from the key-value store once processed. Do not upload documents you are not allowed to share with a cloud AI service.
FAQ
Which languages? Simplified Chinese, Traditional Chinese, Japanese, and English text on the same documents.
Does it check whether a company really exists? No, only the format and check digit. That catches most typos and OCR misreads, which is the main source of bad IDs in extracted data.
Can I use it from code or automation tools? Yes, through the Apify API, or via Make, Zapier or n8n integrations.
Something looks wrong? Open an issue on the Issues tab with the run ID. Please do not attach confidential documents.