以下は オープンソース版 VtigerCRM v8系(例:8.4) を外部システム連携するために、開発エンジニアがそのまま着手できるレベルを狙った API仕様書+開発手引き(実装ガイド) です。
※Vtiger OSS の標準APIは、基本的に webservice.php を叩く “REST(Webservices)” です。公式Developer Guide(Community)に操作仕様がまとまっています。 (community.vtiger.com)
1. 全体像(何ができるか/どう繋ぐか)
1.1 APIの位置づけ
- Vtiger OSS v8系は Webservices(REST APIs) を提供し、HTTP(S)経由でレコードの 作成・取得・更新・削除・検索・差分同期 ができます。 (community.vtiger.com)
- 典型的な連携パターン
- 双方向同期:相手側のID(外部ID)をVtigerのカスタム項目に保持し相互参照
- 片方向取り込み:Vtigerに集約(営業・サポート・請求など)
- 差分同期(sync)+補完取得(retrieve/query):更新時刻を基準に追跡
1.2 ベースURL・エンドポイント
- 基本エンドポイント:
https://<your-vtiger-host>/webservice.php(community.vtiger.com) - リクエスト形式:
- HTTP:GET / POST
- Content-Type:
application/x-www-form-urlencoded(community.vtiger.com) - レスポンス形式(共通):
- 成功:
{ success: true, result: {...} } - 失敗:
{ success: false, error: { message: String, code: String } }(community.vtiger.com)
2. 認証方式(ログイン手順/セッション)
Vtiger Webservices のログインは 2段階です。 (community.vtiger.com)
2.1 事前準備:Access Key の取得
- Vtiger画面の My Preferences でユーザーごとの Access Key を確認します。 (community.vtiger.com)
- これはパスワードではなく、APIログインに使うキーです(漏洩しないように保護)。
2.2 Step1:Challenge取得(GET)
Request
GET /webservice.php?operation=getchallenge&username=<USERNAME>
Response(例)
{
"success": true,
"result": {
"token": "TOKENSTRING",
"serverTime": 1700000000,
"expireTime": 1700018000
}
}
仕様:token / serverTime / expireTime (community.vtiger.com)
2.3 Step2:Login(POST)
accessKeyパラメータはmd5(token + <ACCESSKEY>)(連結してMD5) (community.vtiger.com)
Request
POST /webservice.php
Content-Type: application/x-www-form-urlencoded
operation=login
username=<USERNAME>
accessKey=<MD5(token + access_key)>
Response(例)
{
"success": true,
"result": {
"sessionName": "xxxxxxxxxxxx",
"userId": "19x1",
"version": "0.22",
"vtigerVersion": "8.4.0"
}
}
sessionName を以降のAPI呼び出しに使用 (community.vtiger.com)
2.4 ログアウト(POST)
POST /webservice.php
operation=logout
sessionName=<sessionName>
3. データモデルの把握(listtypes / describe)
3.1 利用可能モジュール一覧(GET)
GET /webservice.php?operation=listtypes&sessionName=<sessionName>
3.2 モジュールのフィールド仕様取得(GET)
GET /webservice.php?operation=describe&sessionName=<sessionName>&elementType=<TYPE>
describe の活用ポイント
- 必須項目(mandatory)・型(datatype)・選択肢(picklist)・参照関係(reference)などを取得し、連携側のマッピング定義に反映
- UIでフィールド追加した場合も describe で追随できるため、マッピング定義の生成に便利
4. CRUD(作成・取得・更新・削除)
ここからが連携実装の主戦場です。
“element” は基本的に JSONをURLエンコードして渡す 形です。 (community.vtiger.com)
4.1 Create(POST)
POST /webservice.php
operation=create
sessionName=<sessionName>
element=<URLENCODED(JSON)>
elementType=<TYPE>
element(例:Contacts 作成)
{
"firstname": "Taro",
"lastname": "Yamada",
"email": "taro@example.com",
"assigned_user_id": "19x1"
}
4.2 Retrieve(GET)
GET /webservice.php?operation=retrieve&sessionName=<sessionName>&id=<WEBSERVICE_ID>
4.3 Update(POST)
POST /webservice.php
operation=update
sessionName=<sessionName>
element=<URLENCODED(JSON)>
重要(事故りやすい点)
- Updateは「部分更新」に見えて、実装/運用によっては 未指定フィールドが空扱いになる 事故が起きがちです。安全策として retrieve → 差分反映 → update を推奨、という説明が広く共有されています(フォーク/実装差もあるため保守的に)。 (blog.crm-now.de)
4.4 Delete(POST)
POST /webservice.php
operation=delete
sessionName=<sessionName>
id=<WEBSERVICE_ID>
5. 検索・抽出(query)
5.1 Query(GET)
GET /webservice.php?operation=query&sessionName=<sessionName>&query=<QUERY>
クエリ構文: (community.vtiger.com)
SELECT * | <column_list> | <count(*)>
FROM <object>
[WHERE <conditionals>]
[ORDER BY <column_list>]
[LIMIT [<m>, ] <n>]
制約(必読)
- 単一モジュールのみ(JOIN不可)
- Query結果は 最大100件に制限(limitでページング) (community.vtiger.com)
例:Contacts から email, firstname を20件
SELECT firstname,lastname,email FROM Contacts ORDER BY modifiedtime DESC LIMIT 0,20;
6. 差分同期(sync)— 外部連携の要
6.1 Sync(GET)
GET /webservice.php?operation=sync
&sessionName=<sessionName>
&modifiedTime=<TIMESTAMP>
[&elementType=<TYPE>]
設計指針(おすすめ)
- 外部連携側で
lastSyncedTimeを保持 sync(modifiedTime=lastSyncedTime)で変更一覧を取得- 変更されたIDを
retrieveで詳細取得(必要なら) - 成功したら
lastSyncedTimeを更新(サーバ時刻基準が安全)
7. Webservice ID の扱い(ID形式と変換)
VtigerのWebservicesではレコードIDがしばしば "<moduleId>x<recordId>" 形式になります。
例:18x61900 のように、モジュールの内部IDとレコードIDを結合する、という説明が一般に共有されています。 (Stack Overflow)
連携での実務ポイント
- 外部システムのIDは、Vtiger側のカスタム項目(例:
external_id)に保存して相互参照に使う - 逆にVtigerのWebservice IDも外部側に保存し、更新時のキーにする
8. エラー設計(code / message)と典型トラブル
8.1 レスポンス上の基本形式
失敗時:success:false かつ error.code / error.message が返る (community.vtiger.com)
8.2 よくある落とし穴
- getchallenge は GET:誤ってPOSTすると認証エラーになる事例がよくあります。 (Stack Overflow)
- 権限不足:ユーザーのプロファイル/ロールで対象モジュールやフィールドが見えないと
ACCESS_DENIED系になりがち - query構文エラー:括弧や演算子の制約で
QUERY_SYNTAX_ERRORが出ることがあります(JOIN不可・括弧のグルーピング不可などの影響) (community.vtiger.com)
9. 実装手引き(推奨アーキテクチャ/開発ステップ)
9.1 開発開始チェックリスト
- 接続先URL確認:
/webservice.phpが到達できる - API用ユーザー作成(管理者を使い回さない)
- My Preferences から Access Key を取得 (community.vtiger.com)
- listtypes / describe で連携対象モジュール・必須項目・型を確定 (community.vtiger.com)
- 最小CRUD疎通(例:Contacts 1件を create→retrieve→update→delete)
- 本番データ同期は sync を軸に設計 (community.vtiger.com)
9.2 マッピング設計のコツ
- describeの結果を“正”にして、外部→Vtiger変換を自動生成できる構造にする
- picklist は外部の値をVtiger側選択肢へマップ(不正値はエラー/保留)
- reference 型(担当者・組織など)は、先に参照先を解決してIDをセット
9.3 更新戦略(安全運用)
- 原則:
retrieve → 差分反映 → update(空更新事故を避ける) (blog.crm-now.de) - 衝突解決:
- 「外部が正」/「Vtigerが正」/「modifiedtimeで新しい方」などルールを決める
- 双方向なら外部ID項目+modifiedtimeで整合を取りやすい
9.4 運用・セキュリティ
- 必ずHTTPS(証明書・TLS)
- Access Key はVault等で安全に保管、ログに出さない
- API用ユーザーは 必要最小権限(参照だけ、作成だけ等)
- 監査:誰がAPIで作った/更新したかを追えるように、assigned_user_idや更新ログを運用で確認
10. 参考:クイックサンプル(擬似コード)
10.1 ログインして sessionName を得る
1) GET /webservice.php?operation=getchallenge&username=admin
2) token を取得
3) md5(token + access_key) を計算
4) POST /webservice.php (operation=login, username, accessKey)
5) result.sessionName を保持
(手順・パラメータ仕様は公式の通り) (community.vtiger.com)
10.2 Contacts を作成
POST /webservice.php
operation=create
sessionName=...
elementType=Contacts
element=<urlencoded json>
11. 補足:クライアントライブラリ
- Vtiger側公式ガイドでは、Webservices用クライアントとして vtwsclib の存在に言及があります(言語別で叩ける、という位置づけ)。 (community.vtiger.com)