クイックスタート:60秒で最初のリクエスト

ワークスペースでAPIキーを作成し、エクスポートして、会話を一覧してみてください。キーはワークスペースごとにスコープされ、読み取り専用または読み書き可能にできます。

curl https://api.inteligenciaviva.com/v1/workspaces/WORKSPACE_ID/conversations \
  -H "Authorization: Bearer sk_live_..."

すべてのレスポンスはJSONです。コレクションのエンドポイントは`data`配列を返します。エラーは`code`と`message`を持つ`error`オブジェクトと、対応するHTTPステータスを返します。

無料API ― アカウント不要、キー不要

無料の層もAPIを話します。`POST /v1/free/widget-snippet`は、無料ページのビジュアルジェネレーターが組み立てるのとまったく同じ設定を受け取り、貼り付け可能なHTMLスニペットを返します ― 認証も登録も不要です。クライアントのサイト向けにウィジェットを一括生成したり、スケジュール変更時にCIから埋め込みを再生成したり、あるいは1セントも払う前にAPIに触れてみるために使ってください。

curl -X POST https://api.inteligenciaviva.com/v1/free/widget-snippet \
  -H "Content-Type: application/json" \
  -d @widget-config.json
# → { "snippet": "<link rel=\"stylesheet\" ..." }

認証

すべてのリクエストは、`Authorization`ヘッダーにBearerトークンとしてAPIキーを載せます。キーの作成と失効はAPI自体またはダッシュボードから、ワークスペース単位で行います ― キーを失効させると、そのアクセスは即座に切断されます。

アカウントレベルのセッションエンドポイント(`/v1/auth`配下の登録、ログイン、Googleサインイン、チケット交換、プロフィール、アカウント削除)は私たち自身のアプリを支えています。サーバー間の連携では、ユーザーセッションよりも常にワークスペースのAPIキーを優先してください。

Authorization: Bearer sk_live_...

リソースリファレンス

以下のすべてのルートは、特記なき限り`https://api.inteligenciaviva.com/v1/workspaces/{workspaceId}`からぶら下がります。これは現在のバックエンドに実際にマウントされている面です ― 願望ではありません。

横断受信トレイ /inbox

GET/conversationsこの資格情報が担当するすべてのワークスペースの会話を、活動順の単一リストで返します。
GET/conversations/{id}どのワークスペースにあるかを知らずに会話を探します。workspace_id を返します。
GET/workspacesこの資格情報が担当できるワークスペースと、それぞれでの役割。
GET/visitantesすべてのワークスペースで「いま」閲覧中の訪問者と、読んでいるページ、すでに会話中かどうか。履歴ではなくその瞬間のスナップショットなので、ページングはありません。応答しないワークスペースがあってもリストは返り、`casas_sin_responder` に入ります。

会話 /conversations

GET/会話を一覧します。状態でフィルタできます。
GET/{id}1件の会話を、その状態、チャネル、連絡先、担当割り当てとともに返します。
GET/{id}/messagesメッセージ履歴(訪問者、人間のエージェント、AI、システム)。
POST/{id}/messagesエージェントとして会話にメッセージを送信します。
POST/{id}/assign会話を人間のエージェントまたは部署に割り当てます。
POST/{id}/resolve会話をクローズします。AIが単独でクローズした場合、課金対象の解決として数えられます。
POST/ウィジェット外から会話を開きます(既存スレッドの移行など)。
GET/{id}/ai-turns「その根拠は?」— AI の各ターンの記録:根拠、モデル、所要時間、引き継ぎの理由。
GET/{id}/portal-caseこの会話がポータルのサポート板に開いた案件の状態と返信。状態は向こうで変わるため、都度取得します。
POST/{id}/readチームが既読にします(未読カウンタ)。
POST/{id}/reopenクローズした会話を履歴ごと再開します。これがないと誤操作は取り消せませんでした。
POST/{id}/archiveアーカイブ/解除。閉じることも失うこともなく受信箱から外れます。本文は {valor:true|false}。
POST/{id}/pin上部に固定/解除。固定したものは受信箱の1ページ目の先頭に並びます。本文: {valor:true|false}。
POST/{id}/muteN時間だけ通知をミュート。{horas:null} で解除します。
POST/{id}/unread未読に戻す:既読マークをお客さまの最後のメッセージの手前まで戻します。
POST/{id}/typing顧客側への「入力中…」表示。WhatsApp では Meta に、Web チャットでは訪問者のウィジェットに届きます。本文なし。常に 204(対応しないチャネルでは何もしません)。会話が存在しなければ 404。
POST/{id}/messages/{messageId}/forwardメッセージを同じワークスペースの別の会話へ転送します。添付は共有ではなくコピーされます。本文:`{to_conversation_id}`。エージェントのメッセージとして送信されます。
PUT/{id}/messages/{messageId}/reactionWhatsApp のメッセージに絵文字でリアクションします。事業者側の以前のリアクションを置き換え、`{emoji:null}` で外します。WhatsApp(Meta の API)のみ、かつ Meta が確認済みのメッセージのみ。それ以外は 400。
POST/{id}/locationWhatsApp で位置情報を送信します:`{lat, lon, name?, address?, reply_to_message_id?}`。先に Meta へ送り、Meta が拒否した場合はスレッドに何も残りません。WhatsApp のみ。
POST/{id}/contact-cardWhatsApp で連絡先カードを送信します:`{name:{formatted_name}, phones?, emails?, reply_to_message_id?}`。位置情報と同じく、先に Meta、次にスレッド。WhatsApp のみ。
GET/{id}/copilotoエージェントのコパイロット:この会話について AI が提案した内容と、AI とのやり取り。チーム専用で、顧客には表示されません。
POST/{id}/copilotoこの会話について AI に非公開で質問します(`{content}`、最大 4,000 文字)。AI は顧客ではなくエージェントに答え、チャネルには何も送られません。応答できない場合は 503 `copilot_unavailable`。
POST/{id}/copiloto/{sugerenciaId}/enviarコパイロットの提案を、そのまま、または編集して顧客に送ります(`{content}` は任意)。人間の作成者を伴うエージェントのメッセージとして送信されます。提案は一度しか送れず、2 回目は 409 `ya_enviada`。
POST/{id}/resumen会話(未解決・解決済みのどちらでも)の要約を依頼し、連絡先のプロフィールを更新します。KIT のタスク 1 件分の費用がかかりますが、新しいメッセージがないまま再依頼しても再課金されません。要約がない場合は理由(`motivo`、`codigo`)を返します。

連絡先 /contacts

GET/連絡先を一覧します。
GET/{id}1件の連絡先を、そのアイデンティティと会話履歴とともに返します。
GET/{id}/historial最近の問い合わせ内容:要約付きの最新の会話(`?limit=`、最大 25 件)、合計、連絡先のプロフィール。開いただけでは欠けているプロフィールは生成されません(費用がかかるため)。`?generar=1` で明示的に依頼します。

AIエージェント /ai-agents

GET/ワークスペースのAIエージェントを一覧します。
POST/AIエージェントを作成します:指示、部署、確信度のしきい値。
PATCH/{id}指示、しきい値、部署を更新します。
GET/{id}/knowledge-sourcesこのエージェントに接続された知識ソース。
POST/{id}/knowledge-sourcesこのエージェントに知識ソースを接続します。
GET/{aiAgentId}AI エージェント 1 件:指示、確信度のしきい値、ツール、部門。

知識(RAG) /knowledge-sources

POST/documentドキュメントを、回答の根拠となる知識としてインデックスします。
POST/urlURLをインデックスします。
GET/{id}ソースの状態とメタデータ。
DELETE/{id}ソースとそのベクトルを削除します。
POST/{id}/reindexURL のソースを削除せずに読み直します。取得に失敗した場合は何も変更されません。
GET/ナレッジソースと索引状態の一覧。

ビジネス情報シート /ficha

GET/ユニットを一覧表示(?estado= と ?tipo= で絞り込み)。帯のしきい値も返します。
POST/ユニットを作成:質問、言い換え、承認済みの回答、URL、言語。管理者または API キーは公開し、エージェントは提案します。AI が公開することはありません。
GET/{id}ユニットを取得。
PATCH/{id}ユニットを編集。質問や言い換えを変えると埋め込みを再計算します。
DELETE/{id}ユニットを削除(管理者)。
POST/{id}/aprobar提案を承認:有効になり、承認者が記録されます(管理者)。
POST/{id}/rechazar提案を却下(管理者)。
POST/probarプレビュー:質問に対して情報シートが何を答えるか、スコアと帯付きで表示(提案を含めることも可)。
POST/recalcular欠けている、またはテキストと一致しない埋め込みを再計算(管理者)。

チャネル /channels

GET/チャネルを一覧します。今日稼働しているのはウェブチャットとAPI。追加のチャネルは提供され次第つながります。
PUT/{id}/credentialsチャネルの認証情報を設定します。
PUT/{id}/statusチャネルを有効化または無効化します。
POST/チャネルを作成します。
GET/{channelId}チャネル 1 件(種別・状態・設定)。
GET/{channelId}/snippet顧客がサイトに貼る 1 行。それ以外はすべてここで設定します。
GET/{channelId}/configチャット設定:公開中のもの(`config`)と、このチャネルが上書きするもの(`settings`)。別物です。
PUT/{channelId}/config設定を保存します。保存と公開は同一の手順:CDN が失敗すれば PUT も失敗します。
POST/{channelId}/config/publish設定を変更せずに CDN へ再公開します。
POST/{channelId}/avatarアシスタントの顔画像をアップロード(512 KB 以下)。R2 に保存し CDN が配信します。
POST/republicar-todosワークスペースの全チャネルを再公開します。文言パック変更時は cron が行いますが、待たずに実行できます。
PUT/{channelId}/modoチャネルの対応モード:`{modo:"humano"|"hibrido"|"ia"}`。AI が顧客と話すかどうかを決めます。WhatsApp・Telegram・メール・ウィジェットなど全種類のチャネルで有効。管理者のみ。
PUT/{channelId}/autoチャネルの自動メッセージ:`{bienvenida, fueraDeHorario}`(各最大 1,000 文字、`null` で削除)。営業時間外のメッセージはチャネルの営業時間を使います。管理者のみ。
PUT/{channelId}/tarjetaこのチャネルからエージェントが送れる連絡先カード:`{tarjetaContacto:{name:{formatted_name}, phones?, emails?}}`。電話番号かメールを少なくとも 1 つ含めます。`null` で削除。WhatsApp のみ。管理者のみ。
PUT/{channelId}/horario対応時間:`{officeHours:{tz, dias:{lun:[["09:00","17:00"]], …}, festivos:["MM-DD" または "YYYY-MM-DD"]}}`。`null` で削除(24 時間対応)。解釈できない内容は、何が誤っているかを示して 400 で拒否されます。サーバーが計算した `abiertoAhora` を返します。管理者のみ。

人間のエージェントと部署 /agents · /departments

GET/agentsワークスペース内の人間のエージェントを一覧します。
POST/agents/{userId}/departmentsエージェントを部署に所属させます。
GET/departments部署を一覧します。
PUT/departments/{id}/routing-rules受信する会話のルーティングルールを設定します。
POST/agentsワークスペースに人を招待します(役割と部門つき)。
GET/agents/{userId}チームメンバー 1 名。
POST/departments部門をルーティング規則つきで作成します。
GET/departments/{id}部門 1 件。

Webhook・キー・課金・アナリティクス /webhooks · /api-keys · /billing · /analytics

POST/webhooksエンドポイントを登録します。署名用シークレットは一度だけ受け取れます。
DELETE/webhooks/{id}エンドポイントを削除します。
POST/api-keysキーを作成します(読み取り専用または読み書き)。
DELETE/api-keys/{id}キーを即座に失効させます。
GET/billing/subscriptionプラン、含まれるAI解決件数、今期の利用量。
GET/analyticsワークスペースの集計メトリクス。
GET/webhooksWebhook のエンドポイント一覧。
GET/webhooks/{id}/deliveriesWebhook の配信履歴(再試行を含む)。失敗の原因がどちら側かを示します。
GET/api-keysキー一覧。秘密値は返しません(接頭辞のみ)。

エージェント用ツール /conversations/{id} · /canned-responses · /tags · /presence

GET/conversations/{id}/notes会話の内部メモ。訪問者には決して表示されません。
POST/conversations/{id}/notes内部メモを追加します。
DELETE/conversations/{id}/notes/{noteId}内部メモを削除します。
GET/canned-responsesワークスペースの定型返信(ショートカット付き)。
POST/canned-responses定型返信を作成します。
PATCH/canned-responses/{cannedId}定型返信を編集します。
DELETE/canned-responses/{cannedId}定型返信を削除します。
POST/presence在席のハートビート。人が対応可能であることを示します。セッション専用 — API キーによる送信は画面を見ている人ではないため、400 で拒否されます。
GET/presence現在オンラインの担当者がいるか。引き継ぎが待つか転送されるかを決めます。
GET/ai-usageワークスペースの日次推論使用量と、消費の多い会話。
GET/tagsワークスペースのタグ。
GET/conversations/{id}/tags会話に付いたタグ。
POST/conversations/{id}/tags会話にタグを付けます。存在しない場合は作成します。
DELETE/conversations/{id}/tags/{tagId}会話からタグを外します。
POST/conversations/{id}/transfer会話を部門へ転送します。ルーティング規則より優先され、手動の転送は自動で取り消されません。
POST/contacts/{contactId}/block連絡先をブロックします。詳細なしの 403 を返します — 悪用者に検知方法は説明しません。
GET/canned-responses/categories定型返信ですでに使われているカテゴリ(自由入力)。オートコンプリート用です。
POST/canned-responses/{cannedId}/use定型返信が使われたことを記録します(使用回数と最終使用日時)。存在してもしなくても常に 204。操作ではなく利用状況の計測です。

添付・デバイス・ワークスペース /conversations/{id}/attachments · /devices · /workspaces

POST/conversations/{id}/attachmentsエージェントとして添付をアップロード。厳格な許可リストと 10 MB 制限:ブラウザが実行できるものは通しません。
GET/conversations/{id}/attachments会話の添付一覧。
GET/attachments/{attachmentId}添付をダウンロード。厳格なヘッダーと `nosniff` 付き。インライン表示は画像と音声のみ。
POST/devices/registerデバイスのプッシュトークンを登録します(AI 引き継ぎ時の通知用)。ワークスペース接頭辞の外:`/v1/devices/register`。
POST/workspacesワークスペースを作成します。接頭辞の外:`/v1/workspaces`。
GET/workspaces/{workspaceId}/retencion/ensayo削除の予行演習:保持期間の設定で削除される会話・添付の件数(とバイト数)を、何も削除せずに返します。`?days=` でまだ保存していない期間を試せます。管理者かつ `analytics:read` が必要。完全なルート:`/v1/workspaces/{workspaceId}/retencion/ensayo`。

ライブ訪問者とリアルタイム /visitantes · /stream-ticket

GET/visitantesこのワークスペースのサイトをいま閲覧中の訪問者:ページ、言語、閲覧開始時刻、チャットを開いているか・会話中か。
POST/visitantes/{visitorId}/invitar訪問者をチャットに招待します。`{mensaje}` は任意(省略時は訪問者の言語でのウィジェットの挨拶)。会話は作らず AI も消費しません。会話は訪問者が返信したときに始まります。離脱済みなら 404 `no_esta`、すでに会話中なら 409 `ya_conversa`。
POST/stream-ticketトークンを URL に含めずに `?ticket=` でストリームの WebSocket を開くためのチケット。有効期間 60 秒、使用は 1 回限り。セッションでも API キーでも使えます。

KIT の機能 /conversations/{id}/kit

GET/この会話で実行した KIT のタスクとその状態。一覧を取得すると保留中のタスクも確認されます。
GET/catalogo添付(`?attachment_id=`)またはスレッドに対して実行できる KIT の機能を検索付き(`?q=`、`?lang=`)で返します。読み取り専用で費用はかかりません。
POST/添付またはスレッドに対して KIT の機能を実行します(`{action, attachment_id?, params?}`)。結果は顧客ではなく「内部メモ」として戻ります。KIT のウォレットから費用がかかりますが、同じ依頼が二重に課金されることはありません。タスクをキューに入れて 202。

電話(VOICE) /voice

GET/llamadasワークスペースの電話システムの通話履歴(`?limite=` 最大 200、ページングは `?antes_de=`)。スコープ `voice:read`。電話システムのないワークスペースでは 404。
GET/llamadas-en-cursoいま進行中の通話。
GET/aparcadas保留(パーク)中で、誰かが取るのを待っている通話。
GET/grabaciones/{id}/audio録音の音声。API 経由で配信され(公開リンクなし)、キャッシュされません。誰が聞いたかを電話システムが記録します。
GET/extensionesパネルが電話として使える内線(予約済みの内線は表示されません)。
POST/webphone-sesionブラウザを内線の電話として登録します(`{extension_id}`)。電話システムが毎回ローテーションする短期の SIP 資格情報を返します。スコープ `voice:write`。電話システムのキーはサーバーの外に出ません。

本物の例

エージェントのメッセージを送信する(curl)

curl -X POST \
  https://api.inteligenciaviva.com/v1/workspaces/$WS/conversations/$CONV/messages \
  -H "Authorization: Bearer $IV_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content": "Hi! I checked your order — it ships tomorrow."}'

会話を一覧する(JavaScript)

const res = await fetch(
  `https://api.inteligenciaviva.com/v1/workspaces/${WS}/conversations`,
  { headers: { Authorization: `Bearer ${process.env.IV_KEY}` } }
);
const { data } = await res.json();

Webhookの署名を検証する(Node)

import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, rawBody, header, toleranceSec = 300) {
  const { t, v1 } = Object.fromEntries(
    header.split(",").map((p) => p.split("="))
  );
  if (Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false;
  const expected = createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest("hex");
  return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Webhook

HTTPSエンドポイントを登録すると、すべてのイベントを署名付きでPOSTします。ヘッダーは`iv-signature: t=<unix>,v1=<hex>`で、`v1`はエンドポイントのシークレットによる`<timestamp>.<raw body>`のHMAC-SHA256です ― 5分より古いものは拒否してください(リプレイ対策)。配信に失敗した場合は、新しい署名で最大5回まで自動的に再試行されます。

conversation.createdいずれかのチャネルで新しい会話が始まりました。
message.createdメッセージが届きました(訪問者、人間、AI、システム)。
handoff.requestedAIが人間を必要と判断しました ― まさにその瞬間に、要約付きで。
conversation.resolved会話がクローズされました。AIが単独でクローズしたかどうかも伝えます。

すべての配信とそのステータスは記録されます ― 信頼できないWebhookは、無いよりも悪いからです。

リアルタイムストリーミング

ライブUIのためには、ワークスペースのストリームに対してWebSocketを開き、会話イベントを発生と同時に受信してください ― 私たち自身のエージェント向けアプリが使っているのと同じチャネルです。

wss://api.inteligenciaviva.com/v1/workspaces/{workspaceId}/stream

エラーと制限

エラーは慣例どおりのHTTPです: `400`不正なリクエスト、`401`キーの欠落または無効、`403`スコープのないキー、`404`このワークスペースにないリソース、`429`レート制限(ジッターを入れてバックオフし再試行)、`5xx`私たちの責任 ― 冪等なリクエストは再試行してください。ボディには常に`error.code`と、人間向けの`error.message`が含まれます。レート制限はキー単位で、実際の連携には十分に寛大です。

よくある質問

このドキュメントは願望ですか、それとも実際の面ですか?

実際のものです。現在のバックエンドにマウントされているルートに対して書かれています。ここで「近日公開」とあるものは、まだ存在しません ― 私たちは実体のないものをドキュメント化しません。

APIを使うには有料プランが必要ですか?

はい ― APIは有料プラットフォームの一部です(Proに含まれます)。無料のウィジェットとWordPressプラグインはクライアントサイドで動作し、APIをまったく必要としません。

読み取り専用キーと読み書きキーの違いは?

読み取り専用キーは一覧と取得はできますが、変更は決してできません ― ダッシュボードやBIに最適です。読み書きキーはメッセージ、連絡先、AIエージェント、設定を作成できます。

新着メッセージの通知はポーリングとWebhookのどちらで受け取るべきですか?

サーバーにはWebhook(`message.created`)、ライブUIにはWebSocketストリームです。ポーリングも動作しますが、リアルタイムに到達する前にレート制限に当たるでしょう。

Webhookがあなたたちから来たことを、正確にはどう検証しますか?

エンドポイントのシークレットで`<t>.<raw body>`のHMAC-SHA256を再計算し、`iv-signature`ヘッダーの`v1`値と一定時間比較で照合してください。`t`が300秒より古ければ拒否します。動作するコードがこのページにあります。

自分のWebhookエンドポイントがダウンしていたら?

失敗した配信を記録し、新しいタイムスタンプと署名で最大5回まで自動的に再試行します。その間にエンドポイントが削除または無効化されていれば、再試行はきれいに停止します。

AIから自前のエスカレーションシステムへ引き継げますか?

はい ― そのために`handoff.requested`があります。会話が担当者に渡った瞬間(訪問者が求めた、危機や苛立ちの兆候があった、または回答がナレッジに基づいていなかった)に、会話の要約とともに発火するので、誰かに知らせたり、別のシステムでチケットを作成したりできます。

今日、APIで操作できるチャネルはどれですか?

ウェブチャットは端から端まで稼働しており、このリファレンスのすべてが今日動きます。Telegramと以降のメッセージングチャネルは、提供され次第、同じ会話モデルに接続されます ― あなたの連携コードは変わりません。

SDKはありますか?

Flutter SDKが私たち自身のエージェント向けアプリを支えており、EnterpriseのホワイトラベルSDKの基盤でもあります。サーバー向けには、RESTの面を意図的にプレーンにしています ― どんなHTTPクライアントでもラッパーなしで動きます。

APIのバグや、このドキュメントの欠落はどこに報告すればいいですか?

l@inteligenciaviva.comへお書きください。嘘をつくドキュメントもバグです ― 同じ深刻度で扱います。