Headless API
カスタムチャットインターフェースを使用すると、構築および制御する任意のアプリケーションにGenieを接続できます。 アプリケーションは、ユーザーをSlack、Microsoft Teams、またはWorkato GO経由でルーティングするのではなく、Headless APIと呼ばれるREST API経由でGenieと直接通信します。 カスタムチャットインターフェースには、会話を管理し、Genieメッセージを送受信するためのAPIエンドポイントが含まれています。 このAPIは、Genieの作成、設定、および保守を可能にするAgent Studio Developer APIとは別のものです。
HEADLESS APIエンドポイントにはカスタムチャットインターフェースが必要です
Headless APIエンドポイントは、カスタムチャットインターフェースオプションとのみ互換性があります。
プライベートベータ
Headless APIはプライベートベータ版であり、選ばれたお客様のみが利用できます。 詳しくはCustomer Success Managerにお問い合わせください。
Headless APIの前提条件
Headless APIを使用する前に、以下を確認してください:
- Agent StudioにGenieがあること。
- API keyまたはOAuth 2.0(PKCE)資格情報のいずれかを使用してGenieクライアントを作成してアタッチすることを含め、Agent Studio UIからGenieのカスタムチャットインターフェイスを設定していること。 UIからではなくプログラムでクライアントをプロビジョニングする場合は、Developer APIのGenieクライアントを参照してください。
- ワークスペースでHeadless APIが有効になっていること。 Headless APIはプライベートベータです:カスタムチャットインターフェイスオプションがGenieのチャットインターフェイス設定に表示されない場合は、Customer Success Managerに連絡してアクセスをリクエストしてください。
- ビルダーロールに、Genie buildingの下のCustom chat interface権限があること。 ビルダーロールの設定の詳細については、コラボレーター権限を参照してください。
Headless APIのベースURL
Headless APIは、Agenticがサポートされているすべてのデータセンターで利用できます。 ベースURLは、アプリホストと同じデータセンターごとのスキームに従います。 例:
| データセンター | Dev APIのベースURL | Headless APIのベースURL |
|---|---|---|
| US | https://www.workato.com | https://genie-api.workato.com |
詳細については、データセンターの概要を参照してください。
認証
Headless APIは次のアクセス方法をサポートしています。
APIキー:
Authorization: Bearer <api_key>
X-IDP-User-Id: <idp_user_id>OAuth 2.0(PKCE):
Authorization: Bearer <access_token>認可方法の比較
使用する認可方法を決定するには、次の認可方法の比較表とユースケース推奨表を参照してください。
| 比較ポイント | APIキー(トークンベース) | OAuth 2.0(PKCE) |
|---|---|---|
| 仕組み | ビルダーのバックエンドは静的APIキーを保持し、X-IDP-User-Idヘッダーを通じてユーザーIDをアサートします。 | エンドユーザーはWorkato Identityを通じて直接認証し、SAML SSOを通じて顧客のIdPに委任します。 |
| エンドユーザーへの表示 | Workatoはエンドユーザーには表示されません。 | エンドユーザーにはIdPログインステップが表示されます。 |
| 必須ヘッダー | Authorization: Bearer <api_key>およびX-IDP-User-Id: <idp_user_id> | Authorization: Bearer <access_token> |
| クライアント認証情報 | APIキーは静的で、一度だけ表示されます。 | client_idのみ、PKCEがクライアントシークレットを置き換えます。 |
| ユーザーIDの管理元 | ビルダーがユーザーIDをWorkato IdPユーザーIDにマッピングします。 | Okta、Azure AD、OneLoginなどのIdPが直接管理します。 |
| 前提条件 | IAM APIまたはWorkato UIを通じてWorkato Identityにプロビジョニングされたエンドユーザー。 | Workato Identityと顧客の既存IdP間の1回限りのSAMLフェデレーション。 Workato Identityはブローカーとして機能します。 顧客のIdPを置き換えるものではありません。 |
| 最適な用途 | サーバー側連携、QA、自動テスト、内部ツール。 | SSO、一元的なアクセスガバナンス、およびユーザーごとの権限を必要とするユーザー向けアプリ。 |
シナリオ別の推奨認可方法
| シナリオ | 推奨 |
|---|---|
| QA / 自動テスト | APIキー |
| CI/CDによるセキュリティレッドチーミング | APIキー |
| ビルダー制御の認可を使用する内部ツール | APIキー |
| Workatoを表示しないカスタムチャットUI | APIキー |
| 会社SSOを使用する従業員ポータル | OAuth 2.0 |
| 複数の組織にサービスを提供するマルチテナントアプリ | OAuth 2.0 |
| IdP管理のアクセス制御を必要とするデプロイメント | OAuth 2.0 |
| モバイルアプリ、シングルページアプリ、またはパブリッククライアント | OAuth 2.0 |
OAuth 2.0 PKCE認証フロー
OAuthクライアントは、PKCEを使用した認可コードフローにより、Workato Identity(id.workato.com)を通じてエンドユーザーを認証します。 クライアントシークレットは不要です。 OAuth Genieクライアントを作成したときに返されるoauth_client_idを使用します。
この認可フローを使用するには、次の手順を完了する必要があります:
code_verifierを生成して、43~128文字のランダムでURLセーフな文字列を作成し、code_challengeをbase64url(sha256(code_verifier))として導出します。
ユーザーを認可エンドポイントにリダイレクトします:
https://id.workato.com/oauth/authorize?response_type=code
&client_id=<oauth_client_id>
&redirect_uri=<your_redirect_url>
&scope=openid profile email
&state=<random_state>
&code_challenge=<code_challenge>
&code_challenge_method=S256Workato Identityがcodeと元のstateを含むredirect_uriにリダイレクトするときに、stateが一致することを確認します。
フォームエンコードされた本文を使用して、https://id.workato.com/oauth/tokenでコードをトークンと交換します。 クライアントシークレットは送信しないでください:
curl -X POST https://id.workato.com/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=<oauth_client_id>" \
-d "redirect_uri=<your_redirect_url>" \
-d "code=<authorization_code>" \
-d "code_verifier=<code_verifier>"返されたaccess_tokenを、Headless API呼び出しでAuthorization: Bearer <access_token>として使用します。 トークンレスポンスには、refresh_tokenとid_tokenも含まれます。
ユーザーに対話型ログインを再度強制しないように、有効期限が切れる前にアクセストークンを更新します(expires_inは3600秒です)。 https://id.workato.com/oauth/tokenでrefresh_tokenを交換し、新しいアクセストークンをサイレントに取得します:
curl -X POST https://id.workato.com/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "client_id=<oauth_client_id>" \
-d "refresh_token=<refresh_token>"更新トークンは1回限りの使用でローテーションされます。更新ごとに新しいrefresh_tokenが返されます。 次回の更新のために新しい値を保持します。 デフォルトのopenid profile emailスコープをリクエストし、Workato Identityが拒否するoffline_accessは追加しないでください。
リダイレクトURLは、クライアントに登録されているoauth_redirect_urlと一致している必要があります。 前述の手順のコード交換は、ブラウザーで直接実行するのではなく、同一オリジンのバックエンドから実行します。 これにより、フローでクロスオリジン(CORS)の懸念がなくなり、トークン処理をサーバー側に維持できます。
クイックリファレンス
会話の一覧表示
認証済みユーザーの会話のリストを取得します。 結果はcreated_atタイムスタンプの降順で一覧表示されます。
GET /api/v1/genies/:genie_handle/chat/conversationsURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
クエリパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| limit | integer 任意 | 返す会話の数。 デフォルトは50です。 |
| cursor | string 任意 | 前のレスポンスからのページネーションカーソル。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| list[] | array | 会話のリスト。 |
| list[].conversation_id | string | 会話ID。 |
| list[].topic | string | 会話のトピック。 |
| list[].last_updated_at | string | 最終更新のタイムスタンプ。 |
| list[].created_at | string | 会話が作成された時刻のタイムスタンプ。 |
| total_count | integer | 会話の合計数。 |
| cursor | string | 結果の次のページのカーソル。 |
会話を作成
Genieとの新しい会話を作成します。
POST /api/v1/genies/:genie_handle/chat/conversationsURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| conversation_id | string | 新しい会話のID。 |
会話の取得
会話の詳細と現在の状態を取得します。
GET /api/v1/genies/:genie_handle/chat/conversations/:conversation_idURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| updated_at | string | 最終更新のタイムスタンプ。 |
| state | string | 会話の現在の状態。 idle(アクティブなターンなし)、ai_running(モデルが生成中)、skill_processing(スキルを実行中、ランタイムコネクション認可でターンが一時停止している間を含む)、またはawaiting_approval(skill.confirmation_requiredで一時停止中)のいずれか。 |
| last_event | object | 会話内の最新イベント。 |
メッセージの取得
会話のメッセージ履歴を取得します。 結果はcreated_atタイムスタンプの降順で一覧表示されます。
GET /api/v1/genies/:genie_handle/chat/conversations/:conversation_id/messagesURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
クエリパラメーター
| 名前 | タイプ | 説明 |
|---|---|---|
| cursor | string 任意 | 前のレスポンスからのページネーションカーソル。 |
| limit | integer 任意 | 返すメッセージの数。 デフォルトは100です。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| conversation_id | string | 会話ID。 |
| messages[] | array | メッセージのリスト。 |
| messages[].message_id | string | メッセージID。 |
| messages[].source | string | メッセージの発信元。 userまたはgenieのいずれか。 |
| messages[].content | string | メッセージのテキストコンテンツ。 |
| messages[].genie_run_id | string | メッセージが属するリクエスト/レスポンスサイクルのID。 |
| messages[].created_at | string | RFC3339形式のメッセージのタイムスタンプ。 |
| total_count | integer | 会話内のメッセージの合計数。 |
| cursor | string | 結果の次のページのカーソル。 |
メッセージの送信
ユーザーメッセージを送信し、Genieが処理して応答する際のイベントのリアルタイムストリームを受信します。
POST /api/v1/genies/:genie_handle/chat/conversations/:conversation_id/messagesURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
ペイロード
| 名前 | タイプ | 説明 |
|---|---|---|
| message | string 必須 | ユーザーのメッセージ。 最大12 KB。 |
| file_id | string 任意 | このメッセージに添付する、以前にアップロードされたファイルのID。 |
| stream | boolean 任意 | レスポンスでSSEストリームを受信するにはtrueに設定します。 デフォルトはfalseです。 |
レスポンス
streamがfalseの場合、次の本文を含むHTTP 202を返します。
| 名前 | タイプ | 説明 |
|---|---|---|
| conversation_id | string | 会話ID。 |
| genie_run_id | string | Genie実行のID。 ストリームに再接続するにはこれを使用します。 |
streamがtrueの場合、レスポンスはServer-Sent Eventsのストリームになります。 Genieが処理を終了するとストリームが閉じます。これはprocessing.finishedイベントで示されます。
ストリームへの再接続
特定のGenie実行のSSEストリームを再度開きます。 切断後にイベントを復旧するにはこれを使用します。 最後に正常に受信したイベントのIDをLast-Event-IDヘッダーで渡します。
GET /api/v1/genies/:genie_handle/chat/conversations/:conversation_id/genie-runs/:genie_run_idURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
| genie_run_id | string 必須 | メッセージの送信によって返されるGenie実行ID。 |
ヘッダー
| 名前 | タイプ | 説明 |
|---|---|---|
| Last-Event-ID | string 任意 | 最後に正常に受信したイベントのID。 ストリームはこのポイントからイベントを再生します。 |
レスポンス
レスポンスはServer-Sent Eventsのストリームです。
イベントの取得
最近のイベントを取得します。 切断後に取りこぼしたイベントを手動で取得するためのフォールバックとして使用します。 イベントは古い順に返され、24時間利用できます。
GET /api/v1/genies/:genie_handle/chat/conversations/eventsURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
クエリパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| since_created_at | string 任意 | イベント作成時刻の下限(含む)。RFC3339タイムスタンプとして指定します(例: 2026-05-26T12:00:00.123456Z)。 前のレスポンスのnext_since_created_atを渡して次のページを取得します。 |
| conversation_id | string 任意 | 会話IDでイベントをフィルタリングします。 |
| limit | integer 任意 | ページサイズ。 デフォルトは100です。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| events[] | array | イベントの配列。古い順に並べられます。 |
| events[].conversation_id | string | 会話ID。 |
| events[].genie_handle | string | Genieハンドル(文字列識別子。例: gin-AaDX9axF-CNtgQn-B6)。 |
| events[].genie_run_id | string | このイベントが属するGenie実行のID。 |
| events[].type | string | イベントタイプ。 |
| events[].event_id | string | このイベントを識別するUUIDv7。 |
| events[].seq_num | integer | Genie実行ごとの単調増加シーケンス番号。 |
| events[].created_at | string | イベントが永続化されたときのゲートウェイ側タイムスタンプ(RFC3339形式)。 |
| next_since_created_at | string | 継続カーソル。 存在する場合、この値を次のリクエストのsince_created_atとして渡して次のページを取得します。 |
スキルの承認または拒否
スキル確認リクエストを承認または拒否します。 Genieがskill.confirmation_requiredイベントを発行したときに使用します。
POST /api/v1/genies/:genie_handle/chat/conversations/:conversation_id/skill_approval/:call_idURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
| call_id | string 必須 | skill.confirmation_requiredイベントからのCall ID。 |
ペイロード
| 名前 | タイプ | 説明 |
|---|---|---|
| resolution | string 必須 | approvedまたはrejectedのいずれか。 |
| rejection_reason | string 任意 | 拒否の理由。 resolutionがrejectedの場合にのみ使用されます。 |
ランタイムコネクションリンクの取得
ランタイムコネクションの認証リンクを取得します。 Genieがruntime_connection.auth_requiredイベントを発行したときに使用します。
POST /api/v1/genies/:genie_handle/chat/runtime_connection/:runtime_connection_attempt_id/linkURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| runtime_connection_attempt_id | string 必須 | 保留中のランタイムコネクション認可試行に対してサーバーが生成したID。runtime_connection.auth_required SSEイベントで配信されます。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| status | string | auth_requiredまたはauthorizedのいずれか。 authorizedの場合、コネクションはすでに完了しており、ユーザーのアクションは不要です。 |
| auth_link.url | string | ユーザーに提示する認証URL。 statusがauth_requiredの場合にのみ存在します。 |
| auth_link.expires_at | string | 認証URLの有効期限(RFC3339形式)。 statusがauth_requiredの場合にのみ存在します。 |
| auth_link.connector_name | string | 人が読めるコネクターラベル(例: Salesforce、Google Drive)。 statusがauth_requiredの場合にのみ存在します。 |
ランタイムコネクションの拒否
ランタイムコネクションリクエストを拒否します。
POST /api/v1/genies/:genie_handle/chat/runtime_connection/:runtime_connection_attempt_id/rejectURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| runtime_connection_attempt_id | string 必須 | 保留中のランタイムコネクション認可試行に対してサーバーが生成したID。runtime_connection.auth_required SSEイベントで配信されます。 |
ペイロード
| 名前 | タイプ | 説明 |
|---|---|---|
| reason | string 任意 | 拒否の理由。 |
ファイルのアップロード
後続のメッセージに添付するファイルをアップロードします。 メッセージの送信のfile_idパラメータで渡すfile_idを返します。 最大ファイルサイズは20 MBです。
POST /api/v1/genies/:genie_handle/chat/conversations/:conversation_id/uploadURLパラメータ
| 名前 | タイプ | 説明 |
|---|---|---|
| genie_handle | string 必須 | Genieハンドル。 |
| conversation_id | string 必須 | 会話ID。 |
ペイロード
| 名前 | タイプ | 説明 |
|---|---|---|
| file | file 必須 | ファイルデータ(multipart/form-data)。 最大サイズは20 MBです。 |
レスポンス
| 名前 | タイプ | 説明 |
|---|---|---|
| file_id | string | アップロードされたファイルのID。 |
SSEイベント
stream: trueを指定してメッセージを送信すると、Genieのレスポンスのライフサイクル全体をカバーするSSEストリームを含むレスポンスを取得できます。
イベントは24時間永続化され、イベントの取得エンドポイントを通じて取得できます。
ベースイベント形状
すべてのイベントは次の基本フィールドを共有します。
| フィールド | タイプ | 説明 |
|---|---|---|
conversation_id | string | 会話ID。 |
genie_handle | string | Genieハンドル(文字列識別子。例: gin-AaDX9axF-CNtgQn-B6)。 |
genie_run_id | string | このイベントが属するGenie実行のID。 |
type | string | イベントタイプ。 |
event_id | string | このイベントを識別するUUIDv7。 |
seq_num | integer | Genie実行ごとの単調増加シーケンス番号。 |
created_at | string | イベントが永続化されたときのゲートウェイ側タイムスタンプ(RFC3339形式)。 |
イベントタイプ
| イベント | 追加フィールド | 説明 |
|---|---|---|
processing.started | Genieがリクエストの処理を開始しました。 | |
processing.finished | Genieが処理を完了しました。 | |
agent.message |
| Genieのレスポンスメッセージ。 |
skill.running |
| スキルの実行が開始されました。 |
skill.completed |
| スキルが正常に完了しました。 |
skill.failed |
| スキルの実行に失敗しました。 |
skill.stopped |
| 一部のランタイムバージョンによってskill.completedの代わりに出力される終端バリアント。 正常な完了として扱います。 |
skill.confirmation_required |
| スキルの実行前にユーザーの確認が必要です。 call_idをスキルの承認または拒否で使用します。 |
runtime_connection.auth_required |
| スキルで、ユーザーがコネクションを認証する必要があります。 ランタイムコネクションリンクを取得でruntime_connection_attempt_idを使用します。 |
system.ping | 長時間実行中または一時停止中のターンの間、約30秒ごとに送信されるキープアライブハートビート。 無視してください。 | |
system.stream_interrupted |
| ターンが完了する前に、サーバーがストリームを閉じました(例: 長い一時停止中)。 ターンが失敗したと想定するのではなく、保持された状態から復旧します。会話タイムラインを再構築を参照してください。 |
制限事項
Headless APIエンドポイントには次の制限があります。
- Action Boardはサポートされていません
- App Eventsはサポートされていません
- Genieは、アタッチされた単一のクライアントをサポートします。 クライアントとGenieの関係は1:1です。2つ目のクライアントをアタッチすると、
409競合が返されます。 再ポイントするには、まず既存のクライアントをデタッチします。
Last updated: