Import API
ユーザー持ち込み CSV を Import として作成し、行を resolve / review / select / save する API の入出力 です。
このページの内容18項目
Import API は、CSV などの持ち込みデータを account-scoped Import として保存し、行を canonical company_id に解決するための grouped 入出力 です。
手順全体を進める場合は 持ち込みImport を使ってください。このページは HTTP API と CLI JSON の返り値 の確認用です。
契約サマリー
| Step | Method / Path | Credit | CLI equivalent |
|---|---|---|---|
| create | POST /api/signal-foundry/imports | 消費しない | sf import csv ./companies.csv --name "<name>" --json |
| show 行 | GET /api/signal-foundry/imports/{importId}/rows | 消費しない | sf import rows <importId> --json |
| map | POST /api/signal-foundry/imports/{importId}/map | 消費しない | API only |
| resolve | POST /api/signal-foundry/imports/{importId}/resolve | matched 行に Basic クレジット | sf import resolve <importId> --max-credits <n> --json |
| select | POST /api/signal-foundry/imports/{importId}/select | 新規確定行に 1 Basic クレジット | sf import select <importId> --row <rowId> --company <companyId> --max-credits 1 --json |
| save | POST /api/signal-foundry/imports/{importId}/save | 消費しない | sf import save <importId> --name "<name>" --json |
production は API key 必須です。Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY> か x-api-key: <SIGNAL_FOUNDRY_API_KEY> を使います。通常 accountId / account_id は送りません。
resolve と select は クレジットを使う書き込みなので、HTTP では Idempotency-Key と maxCredits、CLI では --max-credits <n> --json を必ず付けます。
リクエスト
Create
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports" \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: import-create-20260501-001" \
-d '{
"name": "展示会リード",
"originalFilename": "companies.csv",
"contentSha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"headers": ["会社名", "法人番号", "URL"],
"rows": [
{
"会社名": "株式会社サンプル",
"法人番号": "1234567890123",
"URL": "https://example.com"
}
]
}'
行
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/rows" \ -H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>"
Map
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/map" \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"entity": "company",
"columns": {
"name": "会社名",
"corporate_number": "法人番号",
"domain": "URL"
}
}'
columns の key は corporate_number domain name ticker です。entity は現時点では company のみです。
Resolve
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/resolve" \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: import-resolve-<importId>-001" \
-d '{
"execute": true,
"maxCredits": 100
}'
行 needing review
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/rows?status=multiple_candidates&limit=50" \ -H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>"
status は repeated または comma separated で送れます。主な値は matched multiple_candidates not_found invalid unresolved です。
Select
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/select" \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: import-select-<importRowId>-001" \
-d '{
"row": "<importRowId>",
"companyId": "jpx_1234",
"maxCredits": 1
}'
companyId は、その 行の resolve_candidates[] に含まれる候補だけ指定できます。
Save
curl -s "$SIGNAL_FOUNDRY_BASE_URL/api/signal-foundry/imports/<importId>/save" \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "展示会リード"
}'
save は、解決済み Import を 保存済みリストにします。解決できなかった 行 も Import 行 として保持され、黙って捨てられません。
レスポンス
共通 envelope
Import endpoint は成功時に次の共通 key を返します。
{
"ok": true,
"command": "import.resolve",
"object": "import",
"status": "completed",
"import": {
"import_id": "<importId>",
"status": "resolved",
"row_count": 3,
"headers": ["会社名", "法人番号", "URL"],
"mapping": {
"entity": "company",
"columns": {
"name": "会社名"
}
},
"resolve_summary": {
"matched": 2,
"multiple_candidates": 1,
"not_found": 0,
"invalid": 0,
"total": 3
}
},
"next_actions": [
"sf import rows <importId> --status multiple_candidates --json"
]
}
Create / 行 / map
見る key:
import.import_idimport.row_countimport.headersimport.detected_identifier_columnsimport.mappingimport.sample_rowsdeduplicatednext_actions[]
Resolve
見る key:
import.resolve_summary.matchedimport.resolve_summary.multiple_candidatesimport.resolve_summary.not_foundresolution.matchedresolution.multiple_candidatesresolution.not_foundresolution.resolved_countresolution.multiple_candidates_countresolution.not_found_countresolution.review_required_countrun.resolved_countrun.multiple_candidates_countrun.not_found_countrun.review_required_countbilling.credits_usedbilling.max_creditsnext_actions[]
run.*_count は エージェント向けの stable count 入出力 です。resolution.*_count は同じ値の互換 alias です。run.resolved_count は matched 行数、run.review_required_count は multiple_candidates / not_found / invalid / unresolved の合計です。件数は billing から推測しないでください。
行
見る key:
review.statusesreview.total_reviewable_rowsreview.unresolved_rows_remainingrows[].import_row_idrows[].resolve_statusrows[].resolve_candidatesrows[].candidate_countrows[].needs_human
multiple_candidates は canonical data へ自動昇格しません。エージェントは rows[].resolve_candidates を人間に見せ、明示された候補だけ select します。
Select
見る key:
selected.import_row_idselected.company_idselected.candidatebilling.credits_usedbilling.deduplicatedreview.multiple_candidates_remainingnext_actions[]
同じ行 / 会社 / idempotency key の再試行では二重消費しません。
行 status lifecycle
| Status | Meaning | Next |
|---|---|---|
unresolved | import 済みだが resolve 前 | map 後に resolve |
matched | canonical company_id に確定済み | 保存済みリスト作成へ進める |
multiple_candidates | 候補が複数あり人間確認が必要 | review して select |
not_found | identifier から候補が見つからない | import 列を増やして map / resolve |
invalid | 行 shape や mapping value が不正 | import 行を修正して再 import |
復旧方法
| Error code | Where | 復旧 |
|---|---|---|
invalid_source_headers / duplicate_source_headers | import | headers を空・重複なしに直して再 import |
source_row_limit_exceeded | import | CSV を分割して import |
empty_source_mapping | map | --column <field>=<header> を少なくとも 1 つ指定 |
source_mapping_required | resolve | map endpoint を先に実行 |
execute_required | resolve | body に execute: true を付ける |
idempotency_key_required | resolve / select | Idempotency-Key header を付けて再試行 |
max_credits_required | resolve | maxCredits または --max-credits <n> を付ける |
max_credits_exceeded | resolve / select | 行を分割するか、見積もり以上の maxCredits にする |
source_row_not_selectable | select | multiple_candidates の 行だけ select する |
candidate_not_found | select | resolve_candidates[] に含まれる company_id を指定する |
account_scope_conflict | all | API key account と body / 検索条件 の account 指定を一致させる。通常は account を送らない |
credit_balance_insufficient が出た場合は、sf credits balance --json または GET /credits/balance で今実行できるかを確認してください。
Next
- 手順全体を確認する: 持ち込みImport
- 保存済みリスト化後の API を確認する: リストAPI
- クレジット台帳 を確認する: GET /credits