クイックスタート
ここでは、キーの取得、ドキュメントのアップロード、処理の開始、結果の取得までの一連の流れを、請求書を例に説明します。まだ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をアップロードする場合も同様に動作します。ただし、各ページは独立して処理されるため、document_idは配列(ページごとに1つのドキュメント)として返されます。
ステップ3 — 処理を開始する
POST /api/v1/batches/{batch_name}/processで抽出を開始します。保存済みのテンプレートをtemplate_idで指定するか、今回のようにfieldsで抽出したいフィールドを直接宣言して1回限りの実行も可能です。
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 — 結果を取得する
処理は非同期で行われます。GET /api/v1/batches/{batch_name} をポーリングして all_done が true になるまで待つか(単一ドキュメントなら数秒)、ポーリングの代わりに webhook を登録してください。完全なライフサイクルは Async Task Model ガイドで説明しています。
完了したら、整形された結果を取得します。
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",
"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リファレンスですべてのエンドポイントの完全なパラメータリストをご確認ください。