はじめに

クイックスタート

ここでは、キーの取得、ドキュメントのアップロード、処理の開始、結果の取得までの一連の流れを、請求書を例に説明します。まだcurlをインストールしていない場合や、キーの環境変数を設定していない場合は、先に環境設定をご覧ください。

ステップ1 — APIキーを取得する

APIキーは、アカウントのプロフィール設定ページの「API Key」にあります。v1 APIを使用するには、有料プラン(Basic以上)が必要です。Freeプランのキーは認証チェックを通過しますが、その後のすべての呼び出しでplan_requiredエラーが返されます。今後生成されるキーはitt_live_<64文字の16進数>の形式になります。スクリプトにハードコードしないよう、環境変数としてエクスポートしてください。

export API_KEY="itt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ステップ2 — ドキュメントをアップロードする

POST /api/v1/documentsは、file(マルチパート)またはサーバーが取得するurlのいずれかを受け取ります。どちらか一方のみを渡してください。batch_nameはオプションです。省略するとAPIが自動生成します(レスポンスで返されます)。一緒に処理したいドキュメントはすべて同じbatch_nameを共有する必要があります。この例では、当サイトでホストされている実際のサンプル請求書に対してurlを使用しているため、ローカルファイルを必要とせず、そのまま実行できます。

curl -X POST https://imagetotable.ai/api/v1/documents \
  -H "Authorization: Bearer $API_KEY" \
  -F "url=https://imagetotable.ai/static/samples/invoice.webp"
import os
import requests

response = requests.post(
    "https://imagetotable.ai/api/v1/documents",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    data={"url": "https://imagetotable.ai/static/samples/invoice.webp"},
)
print(response.json())
const formData = new FormData();
formData.append("url", "https://imagetotable.ai/static/samples/invoice.webp");

const response = await fetch("https://imagetotable.ai/api/v1/documents", {
  method: "POST",
  headers: { "Authorization": `Bearer ${process.env.API_KEY}` },
  body: formData,
});
console.log(await response.json());

代わりにローカルファイルをお持ちですか?urlをマルチパートのfileフィールドに置き換えてください。batch_name、template_id、passwordを含む全パラメータのリストは、リファレンスのドキュメントをアップロードするをご覧ください。

レスポンスには、新しいドキュメントのIDと、それが入ったバッチが返されます。batch_nameは次の2つのステップで必要になるので、保存しておいてください。

{
  "document_id": "3f9c9e2a-1b7d-4e2b-9a3e-2f5b6c7d8e9f",
  "batch_name": "260716-4K9P",
  "remaining_batch_capacity": 199
}

マルチページのPDF、またはWord(.docx)やプレーンテキスト(.txt)ファイル(どちらもサーバー側で先にPDFに変換されます)を画像の代わりにアップロードする場合も同じように動作します。ただし、各ページが独立して処理されるため、document_idは配列として返されます(ページごとに1つのドキュメント)。

ステップ3 — 処理を開始する

POST /api/v1/batches/{batch_name}/processで抽出が開始されます。テンプレートをtemplate_idで指定することもできますし、ここで行っているように、1回限りの実行としてfieldsで抽出したいフィールドを直接宣言することもできます。

curl -X POST https://imagetotable.ai/api/v1/batches/260716-4K9P/process \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "fields": [
          {"name": "invoice_number"},
          {"name": "invoice_date"},
          {"name": "vendor_name"},
          {"name": "total_amount"}
        ]
      }'
import os
import requests

response = requests.post(
    "https://imagetotable.ai/api/v1/batches/260716-4K9P/process",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
        "fields": [
            {"name": "invoice_number"},
            {"name": "invoice_date"},
            {"name": "vendor_name"},
            {"name": "total_amount"},
        ]
    },
)
print(response.json())
const response = await fetch("https://imagetotable.ai/api/v1/batches/260716-4K9P/process", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    fields: [
      { name: "invoice_number" },
      { name: "invoice_date" },
      { name: "vendor_name" },
      { name: "total_amount" },
    ],
  }),
});
console.log(await response.json());

これにより、クレジットが即座に消費されます(ほとんどのアカウントでは、キューに入れられたドキュメント1件につき1クレジット。より高いモデルティアが割り当てられている場合はそれ以上)。その後、ドキュメントはバックグラウンド処理用のキューに入れられます。

{
  "batch_name": "260716-4K9P",
  "queued": 1,
  "quality": "fast",
  "webhook_registered": false
}

fields と template_id を完全に省略すると、APIが代わりに適切な列名を自動的に推論します。quality も省略可能です — 省略すると、処理はアカウント自身の速度/品質設定にフォールバックします(アカウント設定とAPIの動作 を参照)。ここでの webhook_registered: false は、この特定の呼び出しに webhook_url が含まれていなかったことを意味するだけで、このバッチにwebhookが登録されていないという意味ではありません。バッチリファレンス を参照してください。別途 PUT .../webhook で登録する場合も同様です。

ステップ4 — ポーリングして結果を取得する

処理は非同期です — all_done が true になるまで GET /api/v1/batches/{batch_name} をポーリングするか(単一ドキュメントなら数秒)、ポーリングの代わりにwebhookを登録します。完全なライフサイクルは非同期タスクモデルガイドで説明されています。

完了したら、整形された結果を取得します:

curl https://imagetotable.ai/api/v1/batches/260716-4K9P/results \
  -H "Authorization: Bearer $API_KEY"
import os
import requests

response = requests.get(
    "https://imagetotable.ai/api/v1/batches/260716-4K9P/results",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
)
print(response.json())
const response = await fetch("https://imagetotable.ai/api/v1/batches/260716-4K9P/results", {
  headers: { "Authorization": `Bearer ${process.env.API_KEY}` },
});
console.log(await response.json());

レスポンスJSONは言語タブで切り替わりません — どのクライアントがリクエストを送信しても、構造は変わりません:

{
  "batch_name": "260716-4K9P",
  "status": "succeeded",
  "merge_active": false,
  "created_at": "2026-07-16T09:12:03Z",
  "started_at": "2026-07-16T09:12:05Z",
  "completed_at": "2026-07-16T09:12:14Z",
  "documents": [
    {
      "document_id": "3f9c9e2a-1b7d-4e2b-9a3e-2f5b6c7d8e9f",
      "filename": "invoice.jpg",
      "status": "succeeded",
      "created_at": "2026-07-16T09:12:03Z",
      "started_at": "2026-07-16T09:12:05Z",
      "completed_at": "2026-07-16T09:12:14Z",
      "line_items": [
        {
          "invoice_number": "INV-1042",
          "invoice_date": "2026-06-30",
          "vendor_name": "Acme Supply Co.",
          "total_amount": "1,284.50"
        }
      ]
    }
  ]
}

completed_at は、ドキュメント(またはバッチレベルではバッチ内のすべてのドキュメント)が終端状態 — succeeded、failed、または canceled — に達すると設定されます。queued または processing の間は null のままで、バッチレベルでも、一部のドキュメントが先に完了していても、バッチ内のすべてのドキュメントが完了するまで null のままです。

次のステップ

ここからは、非同期タスクモデルで完全なステータスライフサイクルを、Webhooksでポーリングに代わる通知方法を、APIリファレンスですべてのエンドポイントの完全なパラメータリストをご確認ください。

📮 contact email: [email protected]