space ocr
GuidesArticlesPricingDocs
Japanese OCR

Japanese OCR that returns data you can check

Read Japanese receipts, invoices, and delivery notes with space-ocr: mixed scripts, full-width and vertical text, CJK-safe CSV, every value located with a box and a review list of what to check.

Japanese is where ordinary OCR quietly falls apart. A single receipt mixes kanji, kana, half-width katakana, full-width digits, and a stray run of English, and the totals might sit in a vertical column down the right edge. Most tools either force you to pick a language first or hand back a flat blob of text that loses the layout. Japanese OCR that actually helps has to read all of that at once and tell you where each number came from.

space-ocr does both. It reads JP documents and returns structured fields in data.values, and it returns every value with the exact spot on the page it was read from — data.cells[path] carries a box, a quad, the verdict, and the evidence behind it. Whatever did not check out comes back as a work list in data.review.flagged, so you look at a short queue instead of re-reading the page. There is no language setting to choose; one engine handles Japanese, Korean, Chinese, and English together.

See a real Japanese extraction you can check

Hover any field below. The two receipts read here are real — a KINSHO 布施店 slip totalling 2,045 and a ライフ 国分店 slip totalling 4,286, both dated August 2019. Every value and box comes straight from a parsed result, not a mockup, and the boxes follow each line of mixed kanji-kana-digit text. The character-match figure beside a row is supporting evidence, not a pass mark.

Receipts with extracted-field bounding boxes
Verified fields
KINSHO · 合計 2,045
ライフ · 合計 4,286

Each value with a box carries a verified on-page location — in data.cells[path], that is box + 4-point quad + evidence.match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.

Three shapes, one envelope
Take the page as named fields (POST /ocr/fields), as layout-preserving Markdown (POST /ocr/markdown), or as plain text in reading order (POST /ocr/text). All three answer with the same shape — data.values, data.cells, data.review, data.image — so the review step is written once and reused.
No language setting
There is no language hint or selector to pick. Japanese, Korean, Chinese, and English go through one engine, including pages that mix them in the same line, and nothing has to be declared in the request.
Full-width, vertical, mixed scripts
Kanji, hiragana, katakana, half-width katakana, full-width digits, and English on one line are read together. A declared pattern is matched against the width-folded value, so a plain ASCII pattern still applies to a number printed as T12….
CJK-safe CSV, no mojibake
Exports are CSV with a UTF-8 BOM, so Excel opens 店舗名, 合計, and product names correctly instead of garbled characters. Line items unfold into sub-rows.
Every value located, line items included
data.cells[path] returns box (xmin/ymin/xmax/ymax on a 0–1000 grid) and quad (four points that follow the page's tilt), with data.image as the frame they are measured against. A repeating row per line item is addressed as items[0].amount in both values and cells.
Declarations that fit JP paperwork
type: "date" parses 令和8年8月16日 into 2026-08-16 in data.normalized while data.values keeps what is printed; type: "number" turns ¥13,220 into 13220. pattern checks a registration number, and near / not_near speak to the 御中 versus 登録番号 mix-up.
Phone photos welcome
EXIF rotation is already baked into the page as read, and there is no deskew step, so a slip photographed at an angle keeps its tilt and the quad follows it.

How Japanese OCR works in space-ocr

The model never produces coordinates. It reads the document and returns the values; a character matcher then compares those characters against the symbols the OCR pass actually detected on the page, and that comparison produces the box, the quad, and the evidence stored beside each cell. verified is the verdict that mirrors review: false when any reason is attached, true when a check ran and nothing was flagged, null when there was nothing to check. The character comparison itself is evidence.text_match, and evidence.match_ratio reports character coverage as supporting evidence rather than a pass mark. Two engines can still agree on the same misread, so read the queue as what to look at first, not as a guarantee.

Drop a PDF into the app and each page is rendered to an image first, then read — handy for multi-page invoices and delivery notes. Calling the API directly, send raster page images by URL or base64 and the structured result is the same. Declare the fields you want, or send autoFields: true and let the response propose them; an array field with children describes one line-item row, addressed as items[0].amount.

Declarations are checked after extraction and never reach the model, so they change the review signal rather than the reading. type: "date" adds a deterministic data.normalized leaf — 令和8年8月16日 parses to 2026-08-16 while data.values keeps what is printed — and type: "number" turns ¥13,220 into 13220. pattern runs against the width-folded value, so ^T[0-9]{13}$ still matches a registration number printed in full width. For the party mix-up that JP forms invite, declare 御中 or 様 as near vocabulary for the addressee and 登録番号 / TEL / 〒 as not_near: a wrong pick then surfaces as near_mismatch or near_conflict instead of passing quietly. Leave a column that legitimately prints 一式 or 翌月末払い as a string — declaring a type there puts a correct document in the review list on every run.

declare fields for a Japanese invoice
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
curl -s https://api.space-ocr.com/ocr/fields \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://example.com/invoice-jp.jpg",
    "imageType": "url",
    "fields": [
      { "name": "issuer", "type": "string", "required": true,
        "near": ["登録番号", "TEL", "〒"] },
      { "name": "bill_to", "type": "string",
        "near": { "terms": ["御中", "様"], "match": "suffix" },
        "not_near": ["登録番号", "TEL"] },
      { "name": "registration_no", "type": "string", "pattern": "^T[0-9]{13}$" },
      { "name": "issue_date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      { "name": "items", "type": "array", "children": [
        { "name": "name", "type": "string" },
        { "name": "qty", "type": "string" },
        { "name": "amount", "type": "number" }
      ] }
    ]
  }'

How to OCR a Japanese document

  1. Add your document
    In the app, drop a receipt, invoice, or PDF — each page is rendered to an image and queued for OCR. Calling the API, send raster page images (url or base64) to /ocr/fields. There is no language setting.
  2. Declare your fields
    List the fields you need, or send autoFields: true and let the response propose a schema. Use an array field with children for line-item tables, and add type, pattern, near, or not_near where the document supports the rule.
  3. Read the structured result
    Business data stays in data.values. data.cells[path] carries box, quad, verified, review, and evidence; data.image is the frame those coordinates are measured against; data.normalized holds the parsed dates and numbers for declared scalar fields.
  4. Work the review queue
    Iterate data.review.flagged. Each entry has a path and a rank-ordered reasons array whose first item is the primary one, and flagged.length is how many values need attention. Open the matching cell to highlight the region the value was read from.
  5. Export or query
    Download CSV (UTF-8 BOM so Japanese opens cleanly, line items unfolded), or read a stored sheet with GET /view using where, sort, and select — reading stored rows runs no new OCR and GET /view is not charged.

Simple, predictable pricing

One credit is one page: $0.05, tax included, with 100 credits free every month and no credit card. Failed scans are never charged. Flat plans add monthly credits, more sheets, and storage.

Free
$0
  • 100 credits / month
  • 3 sheets
  • 1 GB storage
Free — no card
Starter
$19/mo
  • 500 credits / month
  • 15 sheets
  • 10 GB storage
Start free
Most popular
Pro
$39/mo
  • 1,100 credits / month
  • Unlimited sheets
  • 100 GB storage
Start free
Do I have to tell it the document is in Japanese?
No. There is no language hint or selector to set. Japanese, Korean, Chinese, and English all go through one engine, including documents that mix them in the same line.
Does it handle full-width characters and vertical text?
Yes. Kanji, hiragana, katakana, half-width katakana, full-width digits, and English on one line are read together, and the returned box and quad follow each line whatever its direction. A declared pattern is matched against the width-folded value, so a plain ASCII pattern still applies to a number printed in full width.
Will Japanese text survive the CSV export, or turn into mojibake?
It survives. The CSV is written with a UTF-8 BOM so Excel opens 店舗名, 合計, and product names correctly instead of garbled characters, and line items unfold into sub-rows. Over the REST API the same values arrive in data.values, and evidence.printed_text holds the raw OCR glyphs under the box when you need an exact comparison.
Does Japanese OCR keep the location of each value?
Yes. data.cells[path] returns a box (xmin/ymin/xmax/ymax on a 0–1000 normalized grid) and a quad (four points that follow the document's tilt), and data.image gives the width and height those coordinates are measured against. The same paths appear in data.review.flagged, so the values worth checking arrive as a list instead of a score you have to threshold yourself.
Which Japanese documents can it read?
Raster images of receipts, invoices, delivery notes, business cards, IDs, and free-form documents. Declare the fields you need, or send autoFields: true, and use an array field with children for line-item tables. Declarations map closely onto Japanese paperwork: type "date" parses 令和8年8月16日 to 2026-08-16 in data.normalized, pattern checks a registration number on the width-folded value, and near or not_near address the 御中 versus 登録番号 mix-up.
How much does Japanese OCR cost?
One credit is one page at $0.05, tax included, with 100 credits free every month and no credit card. Failed scans are never charged. Starter and Pro add monthly credits, more sheets, and storage — see the plans above.

Turn your own Japanese documents into checkable data

Free tier — 100 credits a month, no credit card. Every value comes back with its on-page location.

Related