NetSuite RESTコネクター
APIドキュメント
Section titled “APIドキュメント”NetSuite REST APIブラウザーにレコードのエンドポイントが記載されています。また、SuiteQLリファレンスに、このコネクターが表形式のデータを取得するために使用するクエリ言語が記載されています。
認証の仕組み
Section titled “認証の仕組み”このコネクターは、PS256のJWTクライアントアサーションを使用したOAuth 2.0クライアント資格情報でサインインします。対話型のログインはなく、リフレッシュトークンもありません。RSAキーペアを生成し、公開証明書をNetSuiteにアップロードして、対応する秘密鍵と3つのIDをPlaidCloudに渡します。取得のたびに、PlaidCloudは有効期間の短いアサーションを作成して署名し、アクセストークンに交換してREST APIを呼び出します。
NetSuite側のセットアップ
Section titled “NetSuite側のセットアップ”PlaidCloudの接続を作成する前に、NetSuiteで次の手順を行ってください。管理者権限が必要で、全体の作業のクリティカルパスになります。
1. 機能を有効にする
Section titled “1. 機能を有効にする”Setup > Company > Enable Features > SuiteCloudで、OAuth 2.0とSuiteTalk (SOAP and REST Web Services) を有効にします。
2. RSAキーペアを作成する
Section titled “2. RSAキーペアを作成する”PS256に対応したダイジェストで、2048ビット以上のRSAキーペアを生成します。たとえばOpenSSLでは次のようにします。
openssl genrsa -out plaidcloud_netsuite.pem 2048openssl rsa -in plaidcloud_netsuite.pem -pubout -out plaidcloud_netsuite_public.pem秘密鍵(plaidcloud_netsuite.pem)は機密として保管してください。PlaidCloudに登録するもので、NetSuiteには登録しません。
3. 公開証明書をアップロードする → 証明書ID
Section titled “3. 公開証明書をアップロードする → 証明書ID”Setup > Integration > OAuth 2.0 Client Credentials (M2M) Setupで、公開証明書をインテグレーション、エンティティ、ロールにマッピングします。NetSuiteは、アップロードした公開鍵に対する証明書IDを返します。これはJWTのkidであり、シークレットではありません。控えておいてください。
4. インテグレーションレコードを作成する → クライアントID
Section titled “4. インテグレーションレコードを作成する → クライアントID”Setup > Integration > Manage Integrations > Newで、OAuth 2.0を有効にし、Client Credentialsグラントを選択したインテグレーションを作成します。NetSuiteがクライアントID(コンシューマーキー)を発行します。控えておいてください。クライアント資格情報とアサーションのフローには、クライアントシークレットはありません。
5. ロールと権限
Section titled “5. ロールと権限”M2Mマッピングで使用するロールに、読み取る対象をカバーする権限のセットを割り当てます。
- REST Web Services(Setup) — REST呼び出しには必ず必要です。
- SuiteAnalytics Workbook — SuiteQLが分析/ワークブックのデータにアクセスする場合に必要です。
- Log in using OAuth 2.0 Access Tokens — トークン交換に必要です。
- クエリが読み取るすべてのレコードタイプ(トランザクション、勘定科目、エンティティなど)に対するレコードレベルの表示権限。
6. アカウントID
Section titled “6. アカウントID”アカウントIDは、Setup > Company > Company InformationのAccount IDフィールドで確認できます。これによってAPIホストが決まります。
| 環境 | アカウントIDの形式 | APIホスト |
|---|---|---|
| 本番 | 1234567 |
1234567.suitetalk.api.netsuite.com |
| サンドボックス | 1234567_SB1 |
1234567-sb1.suitetalk.api.netsuite.com |
PlaidCloudは、アカウントIDからホストを自動的に導出します(小文字に変換し、_を-に置き換えます)。アカウントIDは、サンドボックスの_SB1サフィックスを含め、NetSuiteが表示するとおりに入力してください。
NetSuiteの接続タイプで接続を作成します(汎用のRESTタイプではありません。ホストの導出とSuiteQLのページング動作の挿入を行うのはNetSuiteの種類だけです)。フォームには次のフィールドが表示されます。
| フィールド | タイプ | 説明 |
|---|---|---|
| 名前 | テキスト | この接続の表示名。 |
| エイリアス | テキスト(複数行) | 接続に関する任意のエイリアスまたはメモ。 |
| 有効 | トグル | 接続を有効にするかどうか。削除せずに一時停止するには無効にします。 |
| DB読み取り専用 | トグル | 接続を読み取り専用の操作に制限します。 |
| アクセスタイプ | 選択 | この接続の読み取り専用、書き込み専用、読み取り/書き込みのいずれかのアクセスレベル。 |
NetSuite資格情報
Section titled “NetSuite資格情報”| フィールド | タイプ | 説明 |
|---|---|---|
| クライアントID | テキスト | インテグレーションレコードのクライアントID(手順4)。 |
| 証明書ID | テキスト | 公開証明書をアップロードしたときに返された証明書ID(JWTのkid)(手順3)。シークレットではありません。 |
| NetSuiteアカウントID | テキスト | アカウントID(手順6)。たとえば1234567や1234567_SB1。 |
| NetSuite秘密証明書 | テキスト(PEM) | 秘密鍵(手順2)。複数行のPEMブロック全体として貼り付けます。暗号化して保存され、平文で返されることはありません。 |
SuiteQLでデータを取得する
Section titled “SuiteQLでデータを取得する”NetSuiteのレコードAPIは、行ごとに{id, links}のみを返します。そのため、PlaidCloudはRESTリクエストステップでSuiteQLを使用して、表形式のデータを取得します。NetSuite接続に対して、ステップを次のように設定します。
- メソッド —
POST - エンドポイント —
/services/rest/query/v1/suiteql(このとおりのパス。ホストは接続から取得されます) - 本文 — JSONとしてのクエリ:
{"q": "SELECT ... FROM ... ORDER BY internalid"}
ページングやヘッダーを手動で設定しない
Section titled “ページングやヘッダーを手動で設定しない”NetSuite接続では、ステップがSuiteQL固有の設定を自動的に挿入します。
Prefer: transientおよびContent-Type: application/jsonヘッダー。- レスポンスの
items/hasMoreフィールドに基づく、サービスで固定されたページサイズでのオフセットページング。
ページングと解析のコントロールとこれらのヘッダーには触れないでください。接続が設定します。設定するのは、エンドポイント、本文、および(後述の)列のみです。
金額列と日付列に型を指定する
Section titled “金額列と日付列に型を指定する”SuiteQLはすべての値をJSON文字列("1234.56"、"2026-01-15"、"T")として返します。出力列は実際の型で手動定義してください。金額にはCurrency/Decimal、日付にはDate/Datetime、"T"/"F"のフラグにはBooleanを指定します。PlaidCloudは、テーブルに取り込む際に文字列を型付きの列に変換します。空文字列はnullにマッピングされます。(自動スキーマ推測は接続のサービス設定を適用しないため、この処理はできません。列は自分で定義してください。)
既知の制限事項
Section titled “既知の制限事項”| 制限事項 | 意味 |
|---|---|
| 列の手動定義が必要 | スキーマの自動推測はNetSuiteのサービス設定を適用しないため、金額/日付/ブール値の列とその型を手動で定義してください。 |
| ページングはサービスで固定 | ページングモード、パス、ページサイズは接続によって設定され、ステップでは調整できません。 |
| テーブル全体の置き換えのみ | 取得のたびに結果全体を再抽出します。増分/差分のパスはありません。スケジュールされた取得では実行のたびにテーブル全体を再読み取りするため、WHERE句は必要な範囲に絞ってください。 |
| マルチ通貨/子会社 | transaction/transactionlineでは、amountはトランザクション自身の通貨です。子会社をまたいだ単純なSUM(amount)は連結として誤りです。子会社をまたいで合計する場合は、連結済みまたは為替レート換算済みのフィールドを選択してください。 |
| 約100,000行のSuiteQL上限 | NetSuiteは、SuiteAnalytics Connectがない場合、1回のクエリを約100,000行に制限しています。この上限を超える手書きのクエリは、黙って切り捨てられるのではなく、日付範囲の絞り込みなどのフィルター追加を求めるメッセージとともに明示的に失敗します。標準のNetSuite: Import Balances / GL Detailステップは、この上限を下回るように日付範囲を自動的にウィンドウ分割します。 |
| マルチブック会計 | マルチブック会計のアカウントでは、TransactionAccountingLineにはトランザクション明細行ごと、ブックごとに1行が含まれます。ブックをまたいでフィルターなしでSUMすると、二重(またはN重)にカウントされます。標準のインポートステップはデフォルトでプライマリブックを対象とします。手書きのクエリでは、ブックをまたいだ合計が本当に必要な場合を除き、accountingbook = 1(または選択したブック)を明示的にフィルターしてください。 |
| レスポンスエンベロープ | 正確なレスポンスエンベロープと、受け付けられるスコープ/ロールは本番切り替え時に確認されます。このコネクターは、NetSuiteの文書化された仕様に合わせて作られています。 |
財務 — 期間内の総勘定元帳トランザクション明細行(型指定と並べ替え済み):
SELECT tl.transaction AS transaction_id, t.trandate AS tran_date, a.acctnumber AS account_number, tl.subsidiary AS subsidiary_id, tl.foreignamount AS amountFROM transactionline tlJOIN transaction t ON t.id = tl.transactionJOIN account a ON a.id = tl.expenseaccountWHERE t.trandate BETWEEN TO_DATE('2026-01-01', 'YYYY-MM-DD') AND TO_DATE('2026-01-31', 'YYYY-MM-DD')ORDER BY tl.transaction, tl.id業務 — 顧客別の未処理の販売注文:
SELECT so.tranid AS order_number, so.entity AS customer_id, so.trandate AS order_date, so.status AS order_statusFROM transaction soWHERE so.type = 'SalesOrd' AND so.status = 'SalesOrd:B'ORDER BY so.id