API リファレンス:アーキテクチャ、フィールド、ステータスコード
すべての操作に共通する構成要素:リクエストフロー、共通 JSON フィールド、テンプレートタイプ、ステータスコード、ポート、ペイロード暗号化。
API リファレンス
API アーキテクチャ
| 項目 | コールバック API | RESTful API |
|---|---|---|
| 開始側 | 機器 / Biometric Gateway | お客様のサーバー |
| 方向 | 機器 → お客様のサーバー | お客様のサーバー → 機器 |
| レイテンシ | リアルタイム(ミリ秒) | 約 15 秒 |
| トリガー | 機器上の生体認証イベント | お客様のコードからの HTTP POST |
| お客様の役割 | 受信して応答する | コマンドを送信し、応答をポーリング/待機する |
| レスポンスボディ | {"status":"done"} | {"Status":"done","OperationID":"…","StatusCode":0} |
| オフライン時の動作 | エンジンがキャッシュし、サーバーの復旧後に配信 | エンジンがキューに保持し、機器の再接続後に配信 |
API リファレンス
共通フィールド
コールバックと RESTful のすべてのリクエストは、次のトップレベルフィールドを共通で使用します。
AuthTokenString。特定の機器からのリクエストを識別・認証する 32 文字のトークンです。API Monitor ポータルで設定します。受信するすべてのコールバックで検証してください。
OperationIDString。この操作インスタンスを一意に識別する ID です(例:
"j95xfejt3vr1")。RESTful のレスポンスは同じ OperationID を返すため、リクエストとレスポンスを対応付けられます。TimeString。イベントが処理された時刻の UTC タイムスタンプで、形式は
YYYY-MM-DD HH:mm:ss GMT +0000 です。ペイロード内の機器ローカルのタイムスタンプは、異なるタイムゾーンオフセットを使用する場合があります。stgid (クエリパラメータ)String。Service Tag ID — RESTful API 呼び出しの対象機器を識別します。API Monitor アカウントに記載のエンドポイントに URL クエリパラメータとして渡します:
POST https://<your-endpoint>?stgid=YOUR_TAG_ID。テンプレートタイプ
生体データと認証情報は Template 配列で運ばれます。各項目には Type フィールドがあります:
テンプレートのマージ動作 — コールバックハンドラー実装時の重要事項
機器からユーザーデータがプッシュされる場合(コールバック操作 #3~#9)、テンプレートは複数のコールバックに分かれて、1 件ずつまたはグループで届くことがあります。各コールバックにはユーザーのテンプレート一式が含まれるわけではなく、追加または変更されたテンプレートのみが含まれます。
サーバーは、受信したテンプレートをそのユーザーの保存済みテンプレートとマージする必要があります。各テンプレートの一意キーは
• コールバック 1 が
• コールバック 2 が
• コールバック 3 が
コールバックですべてのテンプレートを置き換えないでください。必ず
機器からユーザーデータがプッシュされる場合(コールバック操作 #3~#9)、テンプレートは複数のコールバックに分かれて、1 件ずつまたはグループで届くことがあります。各コールバックにはユーザーのテンプレート一式が含まれるわけではなく、追加または変更されたテンプレートのみが含まれます。
サーバーは、受信したテンプレートをそのユーザーの保存済みテンプレートとマージする必要があります。各テンプレートの一意キーは
Type + Index です。例:• コールバック 1 が
Fingerprint Index 0 を送信 → 保存• コールバック 2 が
Face Index 0 + Card を送信 → マージし、指紋は上書きしない• コールバック 3 が
Fingerprint Index 0(新しいデータ)を送信 → Index 0 の既存の指紋を更新コールバックですべてのテンプレートを置き換えないでください。必ず
Type + Index でアップサート(upsert)してください。
| タイプ | 説明 | 主な追加フィールド |
|---|---|---|
Card | RFID / 近接カード番号 | Data(カード番号の文字列) |
Password | 数字の PIN | Data(PIN 文字列) |
Fingerprint | 指紋テンプレート — Base64 エンコードされたバイナリ | Index(指のインデックス 0~9)、Size、Data |
Face | 顔テンプレート — Base64 エンコードされた JPEG またはバイナリ | Index, Size, Data |
Palm | 手のひら静脈テンプレート — Base64 エンコードされたバイナリ | Index, Data |
UserPhoto | ユーザーのプロフィール写真 — Base64 エンコードされた JPEG | Data |
API リファレンス
レスポンスステータスコード
RESTful API のレスポンスには数値の StatusCode が含まれます。コールバック API のレスポンスは、結果にかかわらず常にシンプルな {"status":"done"} 形式です。
| コード | ステータス | 説明 |
|---|---|---|
0 | 成功 | 操作が正常に完了しました。 |
1 | リクエストデータが無効 | JSON ボディの形式が不正、または無効な値が含まれています。 |
2 | Service Tag ID が無効 | stgid クエリパラメータが、登録済みのどの機器とも一致しません。 |
3 | リクエストが無効 | リクエストの構造が、期待される操作の形式と一致しません。 |
4 | 暗号化が無効 | ペイロードの暗号化(AES-256)を復号できませんでした。暗号化キーをご確認ください。 |
5 | 機器オフライン | 対象の機器は現在 Biometric Gateway に接続されていません。 |
6 | 操作タイムアウト | 機器がタイムアウト時間内にコマンドに応答しませんでした。 |
7 | 認証トークンが無効 | リクエスト内の AuthToken が、機器に設定されたトークンと一致しません。 |
8 | ユーザーが既に存在 | 機器に既に存在する UserID に対して追加操作が試行されました。 |
9 | ユーザーが見つかりません | 指定された UserID は機器に存在しません。 |
10 | テンプレートエラー | 生体テンプレートデータが破損しているか、未対応の形式です。 |
11 | 機器のメモリ不足 | 機器がユーザー数またはテンプレート数の上限に達しています。 |
13 | セキュリティキーが無効 | API Monitor に設定されたセキュリティキーが一致しません。 |
15 | 機能非対応 | 要求された操作は、この機器モデルまたは通信モードではサポートされていません。 |
999 | 不明なエラー | 予期しないエラーが発生しました。OperationID を添えて Cams サポートまでお問い合わせください。 |
補足情報
対応ポート
リアルタイムの勤怠情報を受信するには、サーバーで Cams Protocol Engine から到達可能な HTTP(S) エンドポイントを公開する必要があります。
| ポート | プロトコル | 用途 |
|---|---|---|
80 | HTTP | 本番環境。コールバック URL をポート 80 にバインドします。API Monitor で設定し、打刻時に自動的に呼び出されます。 |
443 | HTTPS | 本番環境(セキュア)。有効な SSL 証明書を使用した HTTPS。本番環境での利用を推奨します。 |
8123 | HTTP | テスト専用。開発中に一時的に利用できる非標準ポートです。 |
HTTPS を推奨します。本番環境では有効な SSL 証明書を使用した HTTPS をご利用ください。サーバーの再起動なしで自動更新されるようにしてください。
補足情報
サンプルデータ
全 38 操作のサンプルのリクエスト/レスポンスペイロードは、上記の各操作セクションに記載されています。まとめて確認する場合:
このページ上記の各操作セクションには、コピーしてそのまま使えるサンプルデータ付きのリクエスト/レスポンス JSON が含まれています。
旧サンプルページbiometric-web-api-sample-request-response.html — 操作ごとのドロップダウンセレクター付き。106 給与計算
補足情報
暗号化
オプションの AES-256 暗号化を有効にすると、Cams Protocol Engine とお客様のサーバー間でやり取りするすべてのデータを暗号化できます。
アルゴリズムAES-256、ECB モード、PKCS5 パディング(
AES/ECB/PKCS5PADDING)。キーの設定API Monitor で、キーを Security Key として設定します。設定すると、すべての raw JSON ペイロードが暗号化されます。
エンコード暗号化されたペイロードは、HTTP で安全に転送するため Base64 エンコードされます。
Java の例
暗号化 / 復号(Java)
// Encryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec keySpec = new SecretKeySpec(securityKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
String encrypted = Base64.getEncoder().encodeToString(cipher.doFinal(rawJson.getBytes("UTF-8")));
// Decryption
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = Base64.getDecoder().decode(encryptedPayload);
String decrypted = new String(cipher.doFinal(decoded), "UTF-8");重要:暗号化を有効にした場合は、受信したコールバックのペイロードを復号し、送信する RESTful リクエストボディを同じキーで暗号化してください。