POST /query
company_query.v1 を Financial Gold と Company Search に接続する実行 API です。
このページの内容7項目
POST /api/signal-foundry/query は、agent が作った company_query.v1 を検証し、実行可能な条件だけを Company Search に渡します。
自然文をこの endpoint に直接投げるのではなく、Codex / Claude Code / 自社 backend 側で自然文を company_query.v1 に変換してから送ります。unsupported / weak / needs_human は 0 件成功に変換せず、response の query.gaps と query.warnings を読んで復旧します。
契約サマリー
| Field | Value |
|---|---|
| Method | POST |
| Path | /api/signal-foundry/query |
| Auth | production は API key 必須 |
| Usage | 実行可能な query が Company Search に到達した場合、request usage と heavy usage に count |
| Credit | Search 実行時は 1 request credit / operation credit 0 |
| CLI | sf query --file <path> --json |
| Input | company_query.v1 JSON |
| Output | company_query_result または実行不可の company_query |
この endpoint の役割は、構造化された query plan を安全に実行することです。Financial Gold で決定的な company_ids を作り、その集合を Company Search の company_ids filter として合成します。
Claude Code / Codex から使う場合は、まず company_query.v1 JSON を作り、CLI から実行します。自然文を sf company search の q に残すと、財務閾値が未検証テキストとして扱われ、0 件成功のように見えることがあります。
sf query --file company-query.json --json
リクエスト
curl -s \
-X POST \
-H "Authorization: Bearer <SIGNAL_FOUNDRY_API_KEY>" \
-H "Content-Type: application/json" \
"https://signal-foundry.app/api/signal-foundry/query" \
--data '{
"contract_version": "company_query.v1",
"raw_request": "上場企業の金融業界で売上1000億円以上",
"predicates": [
{
"type": "listing_status",
"operator": "in",
"values": ["listed"]
},
{
"type": "industry_33_code",
"operator": "in",
"values": ["7050", "7100", "7150", "7200"]
},
{
"type": "financial_metric",
"source": "biz_1738_gold_financial_dataset",
"metric": "revenue",
"operator": "gte",
"period": { "latest": true },
"value": {
"amount": 100000000000,
"currency": "JPY",
"unit": "absolute"
}
}
],
"requested_output": {
"limit": 20,
"order": "name"
},
"execution_policy": {
"allow_db_writes": false,
"allow_external_search": false,
"allow_llm_sql": false,
"allow_unvalidated_q_fallback": false
}
}'
営業利益と純利益を含む複合条件では、operating_profit を operating_income alias warning 付きで実行します。経常利益は ordinary_income、税引前利益は profit_before_tax を使います。売上総利益、売上原価、販管費、法人税等、資本金、利益剰余金、有形固定資産、無形資産も latest annual の Financial Gold filter として実行できますが、費用・税金の符号反転や指標間の派生計算はしません。
sf query --json '{
"contract_version": "company_query.v1",
"raw_request": "上場企業で営業利益と純利益が黒字、かつ売上1000億円以上",
"predicates": [
{
"type": "listing_status",
"operator": "in",
"values": ["listed"]
},
{
"type": "financial_metric",
"source": "biz_1738_gold_financial_dataset",
"metric": "operating_profit",
"operator": "positive",
"period": { "latest": true }
},
{
"type": "financial_metric",
"source": "biz_1738_gold_financial_dataset",
"metric": "net_income",
"operator": "positive",
"period": { "latest": true }
},
{
"type": "financial_metric",
"source": "biz_1738_gold_financial_dataset",
"metric": "revenue",
"operator": "gte",
"period": { "latest": true },
"value": {
"amount": 100000000000,
"currency": "JPY",
"unit": "absolute"
}
}
],
"requested_output": {
"limit": 5
},
"execution_policy": {
"allow_db_writes": false,
"allow_external_search": false,
"allow_llm_sql": false,
"allow_unvalidated_q_fallback": false
}
}'
Body
| Field | Type | Notes |
|---|---|---|
contract_version | string | company_query.v1 固定 |
raw_request | string | 元の依頼文。実行条件ではなく監査用の文脈 |
predicates[] | array | 実行する構造化条件 |
requested_output.limit | integer | 1..100 |
requested_output.offset | integer | 0..10000 |
requested_output.order | string | name / jobs / ai / construction / employees |
execution_policy | object | すべて false。DB write、外部検索、LLM SQL、未検証 q fallback は許可しない |
対応済みの主な predicate:
| Predicate | Notes |
|---|---|
listing_status | listed / delisted / private / unknown |
industry_33_code | JPX 33 業種コード |
market_segment | 市場区分 |
prefecture | 会社所在地 |
website_presence | has_website |
jobs_presence | has_jobs |
ai_jobs_presence | ai_jobs |
construction_permit | construction |
employee_count | gte / lte / eq |
semantic_tag | weak evidence として warning を返す |
financial_metric | Financial Gold adapter が対応する範囲だけ実行 |
financial_metric は現在、source: "biz_1738_gold_financial_dataset" の read-only 実行です。実行可能な hosted Gold filter は latest annual の revenue、operating_income、ordinary_income、profit_before_tax、net_income、gross_profit、cost_of_sales、selling_general_admin_expenses、income_tax_expense、total_assets、total_liabilities、current_assets、current_liabilities、noncurrent_assets、noncurrent_liabilities、trade_receivables、trade_payables、cash_and_cash_equivalents、cash_and_deposits、equity、capital_stock、retained_earnings、treasury_stock、property_plant_equipment、intangible_assets、inventories、interest_bearing_debt、operating_cash_flow、investing_cash_flow、financing_cash_flow です。operating_profit は operating_income として warning 付きで実行します。equity は Gold table 上では net_assets に写像されます。cash_and_cash_equivalents と cash_and_deposits は別定義として扱います。cost_of_sales、selling_general_admin_expenses、income_tax_expense、treasury_stock は報告値のまま扱い、符号反転や他指標からの派生はしません。inventories は棚卸資産合計の報告値を優先し、ない場合だけ相互排他的な商品・製品、仕掛品、原材料・貯蔵品 group を合算します。interest_bearing_debt は明示的な有利子負債または bonds-and-borrowings total を優先し、ない場合だけ current debt、non-current debt、lease liabilities の非重複 group を合算します。component 合算の場合は source_fact_ref.components に provenance を残します。ordinary_profit、operating_margin、roe、trend 条件などは、unsupported として止めます。
レスポンス
実行できた場合は company_query_result を返します。まず見る key:
okquery.statusquery.executors.financial_gold.statusquery.executors.financial_gold.result.matched_countquery.api.body.company_idscompanies[].company.company_idsearch.meta.returned_companiessearch.meta.coverage_warnings
以下は短縮した例です。実際の query.executors.financial_gold.result.company_ids は最大 1000 件返ります。
{
"object": "company_query_result",
"ok": true,
"status": "completed",
"query": {
"status": "supported",
"execution": {
"allowed": true,
"reason": "validated"
},
"executors": {
"financial_gold": {
"status": "ready",
"result": {
"source": "hosted_table",
"matched_count": 968,
"company_ids": ["jpx_7203", "jpx_7267"],
"truncated": false
}
}
}
},
"companies": [
{
"company": {
"company_id": "jpx_8306",
"display_name": "三菱UFJフィナンシャル・グループ"
}
}
],
"search": {
"companies": [
{
"company": {
"company_id": "jpx_8306",
"display_name": "三菱UFJフィナンシャル・グループ"
}
}
],
"meta": {
"returned_companies": 20,
"matched_companies": 62
}
}
}
companies は search.companies の convenience copy です。正本は search の Company Search response と query の validation result です。
実行不可 response
ratio / trend / ordinary profit など実行できない条件の場合も、可能な限り 200 で company_query を返します。これを 0 件成功として扱わないでください。
{
"object": "company_query",
"ok": false,
"status": "unsupported",
"error": {
"code": "financial_gold_adapter_unsupported",
"message": "company_query.v1 could not be converted into an executable Company Search request."
},
"query": {
"status": "unsupported",
"gaps": [
{
"code": "financial_gold_adapter_unsupported",
"severity": "blocking"
}
]
}
}
復旧方法
| 状態 | 復旧 |
|---|---|
400 invalid_json | JSON として読める形に直す |
400 invalid_request | company_query.v1 schema を直す |
401 invalid_api_key | CLI なら sf login をやり直す。直接 API連携 なら API key を rotate する |
404 not_found | production API key または OAuth access token を付ける |
405 method_not_allowed | POST で company_query.v1 JSON body を送る。GET では実行しない |
financial_gold_hosted_table_pending | predicate は削らず、hosted table / environment readiness を確認して再実行する。ratio / trend などの真の unsupported と混同しない |
unsupported | query.gaps[] を読み、unsupported predicate を削るか、人間に確認する |
needs_human | clarification_requests[] の質問に答えて query plan を作り直す |
weak | warnings[] を表示し、semantic tag や coverage を根拠付きで扱う |
financial_gold_result_truncated | 財務条件、業種、上場区分などを追加して対象を絞る |
| 0 件 | query.executors.financial_gold.result.matched_count と search.meta.coverage_warnings を分けて読む |
CLI equivalent
company_query.v1 は CLI から直接実行できます。agent が自然文を受け取った場合は、自然文をこの command に直接渡さず、先に company_query.v1 JSON を生成してください。
sf query --file company-query.json --json
財務閾値を正確に扱う workflow では、agent / backend が company_query.v1 を生成し、この endpoint に送ります。自然文のまま閾値を q に残すと、unsupported / weak 条件を 0 件成功と誤読しやすくなります。