space ocr
ガイド記事料金ドキュメント
OCR API

検証できるデータを返すOCR API

1回のRESTコールで、値ごとに box・quad・検証の判定が付いた構造化JSONが返ります。Bearer認証、fields の宣言または autoFields、非同期ジョブ、署名付きWebhook。

ほとんどのOCR APIは、ページ全体のテキストの塊と1つの信頼度スコアを返すだけです。請求書の合計を探し、パースし、正しい場所に入ったことを祈る——その作業は結局あなたの側に残ります。space-ocrのOCR APIは、その構造化までやります。画像と欲しいフィールドの宣言を1回POSTすれば(スキーマをAPI側に提案させたいときは autoFields)、名前付きの値がJSONで返ります。

本番で効いてくるのは、各値に何が付いてくるかです。data.cells は宣言したスキーマと同じパスで引けて、値を読み取ったボックス、その4つの角、verified の判定、そして判定の根拠となった理由が入っています。だからパイプラインはモデルの言い分を信じる必要がなく、各値を書類上の実際の位置と照らして確認し、噛み合わなかったものは data.review.flagged から順に処理できます。

その場で確認できる、実際のレスポンス

下のフィールドにマウスを合わせてみてください——請求書上のボックスが、その値を読み取った場所です。これは実際の解析結果です。請求先名 ソジュハンザン海物語様、ご請求金額 ¥84,263、合計金額 ¥46,752、各明細行——すべてが自分のボックスと照合の根拠とともに返っています。モックアップではありません。

Invoice with extracted-field bounding boxes
Verified fields
Invoice

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.

3 つの形、同じ契約
同じ 1 ページを、名前付きフィールドとして・レイアウトを保った Markdown として(POST /ocr/markdown)・読み順を直したプレーンテキストとして(POST /ocr/text)受け取れます。どれを選んでもレスポンスは values / cells / review / image という同じ形で、単位ごとに読み取り元の座標と検証の判定が付いてきます。
1コールで、ボックス付きJSON
POST /ocr/fields に画像を1枚送れば、名前付きの値が返ります。data.cells の各パスがボックスを持つので、位置を探す2回目のパスが要りません。
box・quad・review
各セルが0〜1000グリッド上の xmin/ymin/xmax/ymax、ページの傾きに沿う4点の quad、verified の判定、そして裏付けを収めた evidence を返します。
フィールドは自分で宣言
fields に値ごとの名前と型を並べ、規則が要る箇所に required・pattern・min/max・enum・label・near を添えて送ります。明細行は children を持つ array フィールドです。スキーマをAPI側に提案させたいときは autoFields を立てます。
非同期ジョブ+署名付きWebhook
POST /upload で画像をキューに入れ、ファイルごとにジョブを取得。完了は HMAC-SHA256 署名付きWebhookで通知——または GET /jobs/{jobId} でポーリング。
CSV・JSONエクスポート
REST経由のJSONに加え、保存済みシートを UTF-8 BOM付きCSV(Excel・CJK対応、明細行は展開)で書き出せます。
言語は全自動
日本語・韓国語・中国語・英語をひとつのエンジンで——言語ヒントの設定は不要、混在スクリプトや全角文字も処理します。

space-ocrでのOCR APIの仕組み

Bearerトークンで認証します——キーは spocr_ で始まり、ベースURLは https://api.space-ocr.com です。ラスター画像を1枚、URLまたはbase64で POST /ocr/fields に送ります(公開APIは画像——JPEG・PNG・GIF・BMP・TIFF・WebP——を受け付けるので、PDFならページ画像を送ります)。独自の fields を宣言するか autoFields を立てれば、{ status: 'success', data: { values, cells, review, image } } が返ります。

座標はモデルが作ったものではありません。幾何情報の出所はOCRパスだけで、モデルは値を返し、そのうえで文字マッチャーが各値をページ上で実際に検出されたシンボルと突き合わせます。その結果が data.cells[path] に入ります——位置を示す box と quad、判定である verified、噛み合わなかったときの理由を持つ review、そして text_match・match_ratio・printed_text といった evidence です。座標は値の出所を示す根拠であって、正しさの証明ではありません。2つのエンジンが同じ誤読で一致することもあるため、業務側の検算は残してください。座標はすべて0〜1000に正規化されており、ピクセル換算には data.image の width / height を使います。すべてのレスポンスに X-Request-Id ヘッダが付き、エラーは { error: { code, message, requestId } } で返ります。

画像からフィールドを抽出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.png",
    "imageType": "url",
    "fields": [
      { "name": "vendor", "type": "string", "required": true },
      { "name": "invoice_date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      { "name": "items", "type": "array", "children": [
        { "name": "description", "type": "string" },
        { "name": "amount", "type": "number" }
      ] }
    ]
  }'
同じ呼び出しをPythonで
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os, requests

resp = requests.post(
    "https://api.space-ocr.com/ocr/fields",
    headers={"Authorization": f"Bearer {os.environ['SPACE_OCR_API_KEY']}"},
    json={
        "image": "https://example.com/invoice.png",
        "imageType": "url",
        "fields": [
            {"name": "vendor", "type": "string", "required": True},
            {"name": "invoice_date", "type": "date", "required": True},
            {"name": "total", "type": "number", "required": True, "min": 0},
        ],
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]

print(data["values"])              # business data, in the schema you declared
print(data.get("normalized"))      # deterministic parse of the declared date and number

for item in data["review"]["flagged"]:
    cell = data["cells"].get(item["path"])   # a missing or nobox flag has no cell
    print(item["path"], item["reasons"], cell["box"] if cell else None)

OCR APIを呼び出す手順

  1. APIキーを取得
    サインインしてキーを作成します——spocr_ で始まります。https://api.space-ocr.com への毎リクエストに Authorization: Bearer <key> として送ります。
  2. 画像を送る
    POST /ocr/fields に image(URLまたは純粋なbase64)と imageType を送ります。PDFはページ画像を送ってください——APIはラスター形式(JPEG・PNG・GIF・BMP・TIFF・WebP)を受け付けます。
  3. フィールドを宣言する
    fields に値ごとの名前と型を並べ、規則が要る箇所に required・pattern・min/max・enum・label・near を添えます。明細行テーブルには children を持つ array フィールドを使います。スキーマをAPI側に提案させたいときは、代わりに autoFields を立てます。
  4. 構造化された結果を読む
    { status: 'success', data: { values, cells, review, image } } が返ります。values に業務データ、cells[path] にその値の box・quad・verified の判定と evidence、review.flagged に理由付きの要確認パス一覧が入ります。
  5. スケールとクエリ
    POST /upload で多数の画像をキューに入れ(ファイルごとにジョブ、署名付きWebhookまたは GET /jobs/{jobId})、保存済みシートを GET /view で where・sort・select を使って読みます——OCR再実行も追加料金もありません。

シンプルで予測できる料金

1枚あたり¥10($0.05 / ₩100)、クレジットカード不要・月100クレジットの無料枠付き。保存済みシートを GET /view で読み直すのはOCR再実行ではなく無課金です。定額プランは月間クレジット数・シート数・ストレージを追加します。

Free
¥0
  • 100 クレジット/月
  • 3 シート
  • 1 GB ストレージ
無料 — カード不要
Starter
¥3,980/月
  • 500 クレジット/月
  • 15 シート
  • 10 GB ストレージ
無料で始める
おすすめ
Pro
¥8,980/月
  • 1,100 クレジット/月
  • シート無制限
  • 100 GB ストレージ
無料で始める
OCR APIの認証はどうしますか?
毎リクエストにHTTP Bearerトークンを送ります——Authorization: Bearer <key>。キーは spocr_ で始まります。ベースURLは https://api.space-ocr.com でバージョンパスはありません。ヘッダ欠落や無効なキーは401、そのキーの範囲外にあるリソースへの要求は403、すべてのレスポンスに支援用の X-Request-Id ヘッダが付きます。
OCR APIは各フィールドに何を返しますか?
値は宣言したスキーマのまま data.values に入ります。data.cells は同じパスで引けて、box(0〜1000正規化グリッド上の xmin/ymin/xmax/ymax、ピクセルではありません)、書類の傾きに沿う4点の quad、verified(判定——何か指摘が立てば false、照合が走って何も立たなければ true、照合する対象がなければ null)、理由を持つ review、そして text_match・match_ratio・printed_text といった evidence を返します。ピクセル換算の基準は data.image です。
OCR APIでPDFを読めますか?
公開APIはラスター画像——JPEG・PNG・GIF・BMP・TIFF・WebP——を受け付けるので、PDFはページ画像を送ります。Webアプリは PDF を直接受け付け、各ページを画像にレンダリングしてからOCRします。どちらでも構造化結果は同じです。
OCR APIは大量・バッチ処理に対応しますか?
はい。POST /upload は1リクエストにつき最大20枚の画像を受け付け、ファイルごとに status 'pending' のジョブを返します。完了は HMAC-SHA256 署名付きWebhook(X-Spaceocr-Signature)で届くか、GET /jobs/{jobId} でポーリングできます。POST /ocr/fields は1枚分の同期処理のままです。
レートリミットやエラーコードはありますか?
上限はキーあたり毎分60リクエスト、アカウントあたり毎分600リクエストです。超過すると429・code 'rate_limited' が返り、待機秒数は Retry-After ヘッダで届きます(同じ値が本文の details.retryAfterSec にも併記されます)。すべてのエラーは 400・401・402・403・404・413・429・500・502・504 を通じて { error: { code, message, requestId } } の封筒を共有します。
OCR APIの料金はいくらですか?
1枚あたり$0.05(¥10 / ₩100)で、クレジットカード不要・月100クレジットの無料枠があります。POST /ocr/fields と POST /upload の各画像は1クレジット、GET /space・/view・/amount は無課金です。定額プラン(StarterとPro)は月間クレジット数・シート数・ストレージを追加します——上の料金表をご覧ください。

確認できるデータを返すOCRを実装

無料枠——月100クレジット、クレジットカード不要。すべてのフィールドがボックスとマッチ率とともに返ります。

関連