レンタルサーバー/VOICE/ドキュメント
ForHosting VOICE

ドキュメント

1ページに4つの道筋。まずここから読み、真ん中の2つは電話に出る方と経営される方へ、最後の1つはコードを書く方へお渡しください。

はじめに

5分ではじめる電話システム

以下はすべて、すでにお客さまのアカウントに揃っています。インストール作業も、技術者の訪問も、買い足す機材も必要ありません。

  • 番号と内線はすでにあります。 アカウントの開設と同時に、各端末に必要なSIP認証情報とあわせて作られます。内線は人または席、番号は外の人が押すものです。
  • 番号の行き先を決めます。 「番号」タブで、その番号にかかってきた通話をどうするか決めます。内線を鳴らす、グループを鳴らす、メニューを開く、待ち行列に入れる、営業時間に従う。
  • ブラウザで出ます。 「電話」タブを開いてマイクを許可すれば、そのタブが動く電話機になります。*43のエコー確認にかければ、自分の声が返ってきます。
  • そのあとに営業時間と留守番電話を。 夜7時に通話を取りこぼさないための2つであり、新しい電話システムにいちばん足りていない2つでもあります。

お急ぎなら、開始テンプレートが5つあります。診療所、法律事務所、工場、店舗、家庭の回線です。営業時間、着信ルート、時間外の留守番電話を1回のリクエストで作ります。すでに設定済みのものを上書きすることはありません。

管理画面への入り方APIで

管理画面はVOICEのページ上にあり、セッションがあるときだけ表示されます。そのセッションを発行するのはお客さま専用ページで、ここで何かを入力することはありません。

手順何をするか
1elportaldelcliente.com のお客さま専用ページにログインします。
2アカウントメニューから「電話システムの管理」を選びます。そこからVOICEにお客さまの代理でセッションを要求し、URLのフラグメントに認証情報を付けてVOICEのページへ移動します。
3管理画面が営業用ページと入れ替わります。認証情報は画面を描く前にアドレスバーから消され、自動で期限切れになります。

そのボタンを作る方へ。契約はこれだけです:

POST /inquilinos/:inquilino/sesiones     # システム権限:発行できるのはポータルだけ
{ "minutos": 15 }
→ { "clave": "pbx_ses_…", "caduca": "…", "ambito": "sesion", "minutos_max": 60 }

/denwa-koukanki#t=<clave>&exp=<ISO>&v=<inquilino>

認証情報をクエリではなくフラグメントで運ぶのは意図的です。フラグメントはサーバーに送られないため、Refererヘッダーにも、アクセスログにも、途中の中継装置にも残りません。有効期限は数分、上限があり、恒久的な鍵を作ることはできません。

電話に出る方へ

管理画面をタブごとにAPIで

16個のセクションがあり、8言語すべてで同じ16個です。ここにあるものはすべてAPIにもあります。

タブ何をするか
概要電話システムのいまの様子。本日の通話、応答済み、通話中、ピーク、そして端末がどれだけつながっていたか。
番号自社の番号と、着信時にそれぞれが何をするか。
メニュー音声メニュー。「営業は1」、その営業の中にもう一段のメニュー。
内線人と端末、そして人ごとの規則。追っかけ、転送、応答拒否、発信できる範囲、取り次ぎ。
電話電話機そのもの。発信、応答、転送、保留、そして誰が通話中かの確認。
コールキュー待ち行列。順番、実測の待ち時間、折り返し、誰が受付中か、誰が何を担当するか。
会議室暗証番号つきの会議室と、いま誰が入っているか。
留守番電話伝言と文字起こし、応答メッセージ、暗証番号、ごみ箱、容量の上限。
ディレクトリかけた人がダイヤルで名前を打って到達する電話帳。
受付オペレーター、保留中の通話のリアルタイム表示、メンテナンス時間、コード一覧。
フィルター着信拒否リスト、非通知のふるい分け、しつこい発信元の通知、そして誰が到達できるかに関するすべて。
営業時間営業時間、祝日、昼夜の切り替え。
音楽保留音と、各フローが再生する音源。
通話すべての通話。番号、通話時間、経路、録音。
回線同時通話。保証されている数、借りている数、そしてピーク。
利用状況今月の利用状況を日ごとに。

ブラウザの中の電話機実際の通話

タブがそのまま電話機になります。アプリのインストールも、卓上電話の購入も、番号の移行も要りません。ブラウザから登録する、お客さま自身の電話システムの内線です。

  • 本物の内線です。 ブラウザは卓上電話と同じように電話システムへ登録し、音声は暗号化された経路を通ります。番号にかけてきた人はタブに到達でき、タブから外へ発信もできます。
  • タブは開いておく必要があります。 閉じたタブは電源の抜けた電話機です。それがブラウザ電話の正直な限界であり、卓上機を置き換えるのではなく補う理由でもあります。
  • 誰が通話中かがわかります。実際の通話 同僚のランプが空き・呼び出し中・通話中とリアルタイムに変わるので、転送しようとする前に転送先がいるかどうかがわかります。
  • 通話中のまま別の端末へ移せます。未実施 「出かけるのに通話中だ」というとき、切らずに携帯へ移せます。キーパッドのコードではなくボタンにしてあるのは意図的です。通話を移す人の前には画面があります。
  • 転送・保留・録音は、ほかの電話機と同じコードです。 押すのではなくダイヤルするので、ブラウザ電話で覚えたことが卓上電話でも携帯でもそのまま使えます。

ブラウザの電話機がお客さまのパソコンに録音することはありません。録音は電話システムの中で行われ、そこで誰を録音してよいか、誰に知らせるべきかの規則が適用されます。「録音と法律」をご覧ください。

電話機から押すコード

慣習があるところは慣習どおりに残しています(*72転送、*78応答拒否、*97留守番電話、*8代理応答、*69直前の着信)。キーパッドのコードの意味はそこにあります。機能はすでに管理画面にあり、コードは20年間*72を押してきた人が管理画面を信用できるようにするためのものです。

受話器を置いた状態で押す

コード何をするか検証
*43エコー確認。話した内容を録音して返します。「何も届きませんでした」と言うこともできます。未実施
*44同じものを遅らせて返します。抜け落ちている語がわかります。未実施
*45ダイヤル確認。押したキーを読み上げます。未実施
*46回線の状態。登録、コーデック、アドレス、遅延。未実施
*60時刻と日付を、正しい読み方で。テストベンチ
*62今月の利用(通話数と分数。金額は課金が有効になってから)。APIで
*69最後にかけてきた相手を読み上げます。不在着信も含みます。そのあと1を押せば折り返せます。未実施
*72無条件転送。番号を読み上げて確認します。APIで
*73すべての転送を解除。APIで
*74並行転送。内線と転送先が同時に鳴ります。APIで
*75話し中のときの転送。APIで
*76応答がないときの転送。APIで
*78応答拒否を設定。音声で確認します。APIで
*79応答拒否を解除。APIで
*80自分のすべての待ち行列で受付を開始。APIで
*81自分のすべての待ち行列で受付を終了。APIで
*90番号を着信拒否(#だけを押すと直前の着信を拒否)。未実施
*91拒否を解除。未実施
*97留守番電話。暗証番号が必要です。テストベンチ
*98応答メッセージを録音。テストベンチ
*99名前を録音。電話帳と会議室で使います。テストベンチ
*8隣の席で鳴っている電話を代わりに取る。APIで
*66モード。通常・昼休み・閉店・祝日・自動。APIで
*411名前でさがす電話帳。テストベンチ
*57いま受けた通話について、迷惑電話の記録を作ります。録音は期限切れにならなくなり、時刻・経路・音声が通報用に保管されます。相手を着信拒否にはしません。それを決めるのはお客さまです。未実施
*85その内線が空いたら知らせてもらいます。未実施
*86その通知を取り消します。未実施
*82自社内の通話を傍らで聞きます。どちらの相手にも聞こえません。未実施
*83ささやき。同僚にだけ聞こえ、お客さまには聞こえません。未実施
*84通話に加わります。双方に聞こえます。未実施
*88誰も折り返していない通話を読み上げます。そのあと1を押せば、いちばん古いものに折り返します。未実施
*47電話システムが自分で説明します。自分のコードを読み上げ、9で次へ、0で終了。未実施
70NN番に保留した通話を取り出す。APIで

通話中に押す

コード何をするか検証
*1この通話をいま録音する。双方に通知します。APIで
*7保留に預ける。相手には保留音が流れ、預けた番号が読み上げられます。APIで
##<ext>#そのまま転送。渡して自分は切ります。実際の通話
#<ext>#種類を選ばずに転送。相手がいるかどうかを電話システムが確かめ、いなければそのまま転送に切り替えます。未実施
*2<ext>#取り次ぎ転送。まず同僚と話します。未実施

取り次ぎ転送の相談中に押す

コード何をするか検証
*1転送を完了する。未実施
*0取り消して、かけてきた相手に戻る。未実施
*33人を同じ通話にする。未実施

会議室の中で押す

コード何をするか検証
*6全員:自分のマイクをミュート/解除。APIで
*7全員:いま何人いるか。APIで
*9全員:退出。APIで
*1主催者:暗証番号を変えずに部屋を閉じる。APIで
*2主催者:もう一度開ける。APIで
*3主催者:録音の開始/停止。APIで

2つの意味を持つコードがありますが、衝突はしません。*1は通常の通話では「いま録音する」、相談中は「転送を完了する」、会議室の中では「部屋を閉じる」です。同じ電話機の別の状態であり、処理するコードも別です。

新しい電話機を信用する前に: 卓上電話機やアダプターは自前のスターコードを自分で処理してしまい、こちらへは送りません。コードを押して無音のあとに発信音が戻ったら、それは電話機が飲み込んだのであって、電話システムには何も届いていません。新しい機種を配る前に、現在の一覧と突き合わせる確認をご依頼ください。

どの電話機からでも使える留守番電話テストベンチ

*97を押して暗証番号を入れれば、留守番電話のすべてがそこにあります。アプリもブラウザも要りません。借りた電話からかける経営者のために書かれた仕組みです。

メインメニュー

キー何をするか
1新しい伝言。
2保存した伝言。
4応答メッセージと録音した名前。
5暗証番号の変更。
0オペレーターにつなぐ。
9終了。

伝言の再生中

キー何をするか
1もう一度。
2保存する。
3削除する。そのあと5秒以内に8で取り消せます。
4その相手に折り返す。
6次へ。この伝言は新着のまま残します。
7自分のひと言を先に録音して、同僚に転送する。

応答メッセージのメニュー

キー何をするか
1通常の応答メッセージを録音。
2名前を録音。
3休暇用の応答メッセージを設定。
4解除する。

通話そのものを受ける

鳴らすグループができるのは「複数の場所で鳴らす」ことだけです。この一覧にあるものは、いずれもグループにはできないことをします。

  • 待ち行列。APIで 待ち行列は前に何人いるか、ふだんどれくらいかかるかを知っているので、それを伝えられます。待ち時間は自社の直近の通話から実測しており、作り出すことはありません。標本が3件未満なら何も言いません。受付中の人が誰もいなければ、誰も待たせません。
  • 待ち行列からの折り返し。APIで しばらく待ったところで提案し、まもなく応答できる見込みなら提案しません。要求は再起動しても残ります。頼んだ人は電話を切るからです。折り返しは列の先頭に入ります。それが約束したことだからです。
  • 会議室。APIで 番号と2つの暗証番号を持つ部屋。1つは入室用、もう1つは進行役用です。どこにもアカウントは要りません。入退室は各自が録音した名前で読み上げられます。
  • 名前でさがす電話帳。テストベンチ かけた人がキーパッドで名前を打つとつながります。名前は語ごとに別々に索引しています。こちらでは姓が2つあるのが普通で、最初の姓だけで探すと会社の半分が出てきてしまうからです。アクセント記号とñは同一視するので、「Muñoz」は686で見つかります。
  • オペレーターへの0。APIで 電話に対するもっとも普遍的な期待は、たぶん「人につながること」です。0はオペレーターから全体の留守番電話へ、さらに音声での案内へと順に降りていきます。黙って切れることはありません。
  • 保留と代理応答。APIで 通話を預けると、番号のついた場所で保留音とともに待ちます。その間に別の席まで歩けます。誰でもその番号を押せば取り出せます。隣で鳴っている電話を取るのは*8です。

経営される方へ

チャネル:保証・貸出・返却APIで

固定の上限では実現できない部分です。プランを選ぶ前に理解しておく価値があります。

  • 保証分。 プランが販売する同時通話数です。電話システムが何をしていても必ず通り、誰にも取り上げられません。
  • 貸出分。 保証を超えた分は、電話システムに空きがあればそれを使います。ふだんはここに収まり、追加費用はかかりません。
  • 予備。 誰にも貸し出さないチャネルの余裕分です。誰もがいつでも自分の保証分に到達できるようにするためにあります。
  • 返却。 電話システムが混み合ったとき、貸出分の通話は他社の保証を守るために返却されることがあります。これを有効にしたアカウントだけが対象で、保証の範囲内の通話は対象外、緊急通報も対象外、そして無言では行いません。手放す前に必ず音声で知らせます。
  • 二重に売ることはできません。 すべての保証の合計に予備を足したものが、収まらなければなりません。契約時に検査し、収まらないプランは拒否されます。それが「保証」という言葉に意味を与えています。
  • いつ効いたかも見えます。 混雑は月間の合計ではなく、時刻つきの出来事として報告します。「30日で12件の拒否」は雑音にしか読めませんが、「先週の火曜、10時から11時のあいだに5人が話中を聞いた」なら手を打てます。

何かが壊れたときに起きること

電話システムの真価が問われるのは停電した日であって、すべてが動いている日ではありません。

  • 出口は1つではありません。 電話システムは複数の独立した回線で外の世界とつながり、そのあいだを自分で選びます。お客さまが設定することも、切り替わるのを目にすることもありません。
  • 「動いている」を正しい基準で測ります。 回線が候補になるのは、インターネットと電話網の両方に届いているときだけです。前者だけを見るのが、すべてのランプが緑のまま回線が使えなくなる原因です。
  • 停電のあとは自分で復旧します。 電気が戻ると、電話システムとネットワーク機器が同時に起動し、順番は毎回同じとは限りません。その順番を信じるかわりに、実際に持っているものとあるべきものを比べ続け、自分で直します。再試行の回数には上限があり、本当の故障は堂々巡りにせず報告に回します。
  • 自分を直すために通話を切ることはありません。 会話を中断してしまう修復は、通話が1件もなくなるまで待ちます。

録音と留守番電話の伝言は電話システムの外に保存しているので、機械そのものより長く残ります。

プランと通話料

プランは5種類、年額$100から$300まで。1ライセンスにつき1番号です。コスタリカの番号への着信は1分$0.00です。

プラン同時通話、最大うち保証内線保管(日)年額
VOICE I3133$100
VOICE II4244$150
VOICE III6366$200
VOICE IV8488$250
VOICE V105無制限28$300

通話料

あて先1分あたり
着信$0.00
コスタリカ · 固定$0.03
コスタリカ · 携帯$0.08
中米$0.45
カリブ$0.55
その他の地域$2.30

米ドル表示、税込みです。携帯あては提携事業者が秒単位で計測します。1ライセンスにつき1番号を含みます。追加した番号は同じ電話システム、同じ通話フロー、同じ管理画面を共有します。

録音と法律APIで

録音された音声は他人の声です。コスタリカ法8968がこれを規律しており、設計は都合の良さではなくそこから導かれています。

  • 何を録音するかはお客さまが決めます。APIで すべて、特定の内線だけ、特定の番号への着信だけ。あるいは何も録音しない。それも正しい答えです。
  • 保管期間はプランに含まれます。 録音は期限が来ると自動で消えます。期限はプランのとおりですが、通話中に(*1で)依頼した録音と会議室の録音は90日です。唯一の例外は迷惑電話の記録に紐づいた録音で、記録を閉じるまで期限切れになりません。閉じると通常の期限に戻ります。「いますぐ削除」にはなりません。
  • 共有はアクセス権の付与ではありません。 署名つきのリンクは1件の録音だけを再生し、自動で期限切れになり、取り消せます。送った相手がお客さまのアカウントを見ることはありません。
  • 再生はすべて記録されます。 誰がどの録音をいつ再生したか。他人の声である以上、誰が聞いたかを知っていることは、預かることの一部です。
  • 分類できます。 顧客、見込み客、社内。既定値はあえて置いていません。未分類は正直であり、機械が推測したラベルは、あとから人が選んだラベルと区別がつかなくなるからです。

双方に必ず通知します。 電話システムに録音を頼むと、告知の義務も一緒に返ってきます。この2つは切り離せません。切り離すことこそ、知らないまま録音される人が生まれる仕組みだからです。会議室では、入室する人ごとに告知します。

上限・保護・取り消し

悪い一日がどこまで悪くなるかを決めるもの。盗まれた認証情報、経路の設定ミス、鳴りやまない番号です。

  • 1日あたり・1か月あたりの利用上限。テストベンチ 盗まれた認証情報が金額になるのを止めるのがこれです。上限に達すると発信は止まります。
  • 内線ごとに、どこへかけられるか。APIで 内線のみ、国内、携帯、あるいはすべて。倉庫の電話が有料ダイヤルにかけられる理由はありません。緊急通報がこれに妨げられることはありません。
  • かける前の料金。APIで その番号にかけるといくらかを尋ねると、実際に通話をつなぐのと同じ仕組みが計算して答えます。適用されるとは限らない料金表からではありません。
  • ふるまいを見る不正検知。未実施 不自然な速さ、かけたことのない国、誰も働いていない時間帯。知らせはしますが、切りません。ここでの誤検知は煩わしい通知ではなく、成立しなかった通話だからです。何かを言うまでに2つの兆候を必要とします。毎日鳴る警報は無視されるようになるからです。
  • しつこい発信元には印を付けます。未実施 同じ番号から2分で5回は、しつこいお客さまではなく自動発信装置です。初期状態では知らせるだけです。自動で拒否するかはお客さまが選びます。誤検知は、二度とかけられなくなったお客さまを1人失うことだからです。
  • 迷惑電話の記録。未実施 時刻、経路、音声を通報用にまとめて保管します。記録を作っても相手を拒否はしません。新しい着信は証拠が1つ増えることであり、決めるのはお客さまであってこちらではありません。
  • 端末がどれだけつながっていたか。APIで こちらの稼働率ではなく、お客さまのものです。そして期間のうち実際に測れた割合を必ず表示します。誰も見ていなかった時間を黙って除いた百分率は、いつも都合のよい側に外れるからです。
  • 何が変わり、誰が変え、どう戻すか。APIで 「昨日は動いていた」は答えのある問いです。設定の変更はすべて記録され、元に戻せます。戻すときは、そのあいだに誰かが同じ項目を触っていないかを確かめます。黙って上書きはしません。

停止しているものと、その理由

動くところだけを書いた手引きは、残りをご自分で見つけさせることになり、それはいつも最悪のタイミングで見つかります。この一覧はスイッチそのものから生成しているので、すでに有効になったものを停止中と書くことはできません。

何をするか理由
留守番電話のメール転送電話をかけずに音声を添付で受け取る機能です。メールボックス用の認証情報が必要で、それがまだありません。
分単位の自動課金計測は動作しており、通話は1件ずつ測っています。有効になっていないのは前払い残高からの引き落としです。それまでは請求書でのお支払いです。
端末用の予備アドレス電話機が2つの入口のあいだで自分で切り替えられるようにするものです。ドメインへの書き込み権限を持つ認証情報が必要で、現在あるものは読み取り専用です。
ファクス受信トーンを検出して知らせる部分は作ってあり、意図的に停止しています。検出はすべての着信を聞くため、誤検出は本物の音声通話を切ってしまいます。実際のファクスで測れるようになるまで停止のままです。

組み込む方へ

APIAPIで

管理画面はこのAPIの利用者の一つにすぎません。手で変えられることはすべてプログラムからも変えられます。鍵はお客さまのアカウントのものです。

curl -H "authorization: Bearer <clave>" \
  https://api.voice.forhosting.com/inquilinos/<cuenta>/numeros

権限の範囲

権限の範囲何をするか
sistemaアカウントをまたぐ運用管理用。これがお客さまに発行されることはありません。
inquilino自社アカウントの読み書き。組み込みに使う鍵です。
lectura自社アカウントのGETのみ。何も変更させたくないダッシュボード向けです。
sesionアカウント鍵と同じ範囲ですが、数分で期限切れになります。管理画面が使うもので、ブラウザに恒久的な認証情報を置かないためのものです。
dispositivo1つの内線の1台の端末だけに有効で、数分で期限切れになります。電話アプリが持つ鍵で、電話に必要な操作だけを、その端末の内線についてのみ行えます。

うまくいかなかったとき

コード何をするか
400リクエストの形式が誤っているか、受け付けられない値です。どれかはメッセージが伝えます。
401鍵がない、知らない鍵、または期限切れのセッションです。
403鍵は本物ですが、これはできません。他のアカウントのデータ、運用管理専用の経路、または読み取り専用の鍵での書き込みです。
404お客さまのアカウントにそれはありません。
405その経路はありますが、そのメソッドはありません。404と区別しているのは意図的で、1時間の節約になります。
503 · 504電話システムに到達できなかったか、時間内に応答しませんでした。「何もありません」とは決して答えません。見に行けないことと、そこに何もないことは違うからです。

APIが断るときに返しうるすべてのメッセージ

交換機のソースから読み取った、APIが error フィールドで返す文字列そのものです。スペイン語で返るため、ここでも意図的にそのまま載せています。照合すべきは実際に届く文字列であって、その訳ではありません。… は値が差し込まれる位置を示します。

すべてのエラーに安定したコードが付きます。 メッセージではなく codigo で分岐してください。必ず入っています。固有のコードを宣言しないものには、HTTPステータスから導いたクラスのコードが入ります。error の文章は人が読むためのもので書き換わることがありますが、コードは変わりません。

{ "error": "…", "codigo": "de_otra_cuenta" }
コードHTTP返る場面
mala_peticion400リクエストの形式が不正か、受け付けない値が含まれています。どれかはメッセージが示します。
no_autorizado401鍵がない、未知の鍵、または期限切れのセッションです。
prohibido403鍵は有効ですが、この操作は許可されていません。
no_existe404操作の対象が存在しません。
metodo_no_permitido405パスは存在しますが、そのメソッドは受け付けません。存在しないパスと意図的に区別しています — これで一時間は浮きます。
conflicto409いまのアカウントの状態では実行できません。
precondicion_fallida412リクエストの条件(If-Match)はもう満たされていません。読み込んだ後に、変更しようとした内容が変わりました。
ambito_insuficienteその経路にはお客様の鍵は届きません。プロビジョニングはポータルのものです。
audio_ilegible音声は届きましたが、読み取れませんでした。破損しているか、途中で切れています。理由はメッセージが示します。
audio_no_valido音声の連結指定が不正です。使えるのはこの交換機自身の音声だけで、パスは使えず、1000文字以内で改行なしです。受け付けない部分はメッセージが示します。
cambio_de_sistemaその変更は提供元が行ったものか、提供元だけが変更できる項目に関わるものです。お客様の鍵では元に戻せません。
canales_por_troncal登録時に送られたチャネルの割り当ては受け付けられず、一部も保存されません。何が問題かは詳細に書かれています。これは登録(プロビジョニング)側の話で、お客様のアカウントの問題ではありません。
cedula_mal_formada身分番号がその種類の形になっていません。cédula física は 9 桁、cédula jurídica は 10 桁です。
central_no_disponibleいま交換機に到達できません。間隔を空けて再試行してください。リクエスト自体に問題はありません。
central_suspendida交換機は停止中です。停止している間は新しい電話を許可しません。
clase_de_servicio内線に設定できる発信権限の値ではありません。
clave_sin_cuentaその鍵はどのアカウントにも紐づいていません。
consulta_no_validaクエリのパラメーターに受け付けない値があります。たとえば、1/0 でも true/false でもない「はい/いいえ」の値です。
cuenta_distintaその購入は別のポータルアカウントのものです。購入の持ち主は変わりません。
cuenta_invalidaポータルのアカウントがないか、想定した形式ではありません。
cuenta_portal_en_usoそのポータルアカウントは既に別のライセンスまたは交換機に結び付いています。それぞれに専用のものがあります。
cuenta_suspendidaアカウントは停止中です。参照はできますが、再開されるまで変更はできません。
cupo_llenoこのプランでは内線をこれ以上追加できません。一つ空けるか、上位のプランに移ってください。
cursor_no_validoこのページ送りのカーソルはここでは使えません。別の交換機、別の一覧、または別の絞り込み条件のものです。同じ条件で最初のページから取得してください。
de_otra_cuenta別のアカウントのもの、またはお客様のアカウントに存在しません。両者を意図的に同じコードにしています — 区別すると存在の有無が漏れるからです。
demasiado_grande音声が最大サイズを超えています(HTTP 413)。上限はメッセージが示します。
duracionあいさつ音声が短すぎるか長すぎます。長さと上限はメッセージが示します。
es_titularそれは所有者のインストールです。取り消しも停止もできません。停止するのは交換機の方です。
estado_invalidoその状態は受け付けていません。有効な値はメッセージに書かれています。
extension_ajenaその内線はあなたのシステムのものではありません。
extension_de_la_tiendaその内線はストア経由で許可された席(ライセンス、所有者、またはメンバー)です。ここでは削除できません。アプリから取り消してください。
falta_confirmarアカウントの削除は元に戻せません。リクエストに confirmar: 'suprimir' を含めてください。
falta_credencial鍵がまったく送られていません。
formato_no_soportado対応していない音声形式です(HTTP 415)。使えるのは MP4 の AAC(m4a)、MP3、WAV、Ogg です。
garantia_no_cabe要求された分の保証容量が残っていません。故障ではありません。同じチャネルを二重に販売しないための仕組みです。残りの量はメッセージに書かれています。
identidad_ajena許可を求められるのは、ご自身のアカウントの番号からだけです。
identidad_de_otroその身分番号はすでに別のライセンスに割り当てられています。移すには mover: true を送ってください。
instalacion_invalidaインストールの識別子が想定した形式ではありません。8〜128文字の英字、数字、ピリオド、ハイフン、コロン、アンダースコアです。
instalacion_sin_licenciaそのインストールは、このライセンスやこの席のものではありません。ライセンスも、ストアで購入した交換機の各席も、一台の電話にだけ使えます。
licencia_solo_appアプリのライセンスには、そのインストールの電話しかありません。ほかの端末は追加できません。
mensaje_con_enlace許可リクエストのメッセージにリンクは入れられません。
mensaje_largo許可リクエストのメッセージは最大 140 文字です。
misma_casaその番号はご自身のアカウントのものです。ご自身の回線どうしに許可は要りません。
nacional国の祝日は変更も削除もできません。その日に営業するには、cerrado:false の例外を作成してください。
no_editableその項目は提供元が変更します。ここからは変えられません。
no_es_de_la_tiendaそのアカウントはストアで購入されたものではありません。解約は別の手続きになります。
no_es_de_tiendaその交換機はストアで購入されたものではありません。ポータルから管理します。
no_existe操作の対象が存在しません。
no_pude_mirar診断ではなく、見えていない状態です。交換機に問い合わせられませんでした(ARI 停止、データベース、コンテナ)。正常という意味ではなく、わからないという意味です。
permiso_no_existeその番号には発信の許可がありません。取り消すものはありません。
plan_desconocidoそのプランは販売していません。有効なのは公開しているプランです。
plan_legadoこの交換機は販売時のプランを保持しています。現在の料金体系に移すには、明示的に依頼する必要があります。
prueba_distintaテスト用の交換機は本番用にならず、本番用の交換機もテスト用にはなりません。本番の購入には専用の参照があります。
reconfigurando交換機が回線を切り替え中で、自らそう告げています。数秒で終わる正常な動作であり、障害ではありません。この状態は 3 分で自動的に解除されます。消し忘れた通知が本物の警報を黙らせないためです。
ref_de_otro_tipoその参照はライセンスのものなのに交換機として求められたか、その逆です。
ref_invalidaポータルの参照が想定した形式ではありません。
sesion_vieja_para_gastarセッションが 15 分を超えています。発信や通話の結合など残高を使う操作には、新しいセッションを取得してください。
sin_numero_voice今は VOICE 番号を割り当てられませんでした。数秒後に再試行してください。
sin_registrar本当の障害です。事業者側に登録されておらず、その経路では着信しません。これは人を起こす価値があります。
solicitud_cerradaその許可リクエストはもう保留中ではありません。承認、拒否、取り下げ、または期限切れになっています。
solicitud_no_existeその許可リクエストは存在しないか、あなたのアカウントのものではありません。
solo_la_titular複数人で使うシステムでは、これを決めるのは名義人です。メンバーにはできません。
solo_lectura読み取り専用の鍵で、この操作は書き込みになります。
tope_aparatosその内線には許容される数の端末がすでにあります。追加する前に一台の連携を解除してください。
tunel_retiradoそのアドレスは2026年9月25日に廃止されたトンネルのものです。API は交換機へ直接つながります。通常の経路を呼び出してください。経路の状態は /_directo/salud で確認できます。
url_no_permitidaそのアドレスは Webhook に使えません。https の公開アドレスである必要があり、プライベートネットワークは不可です。
version_distinta読み込んだ後にその設定が変更されました。もう一度読み込み、現在の内容で判断してから新しいバージョンで書き込んでください。詳細に現在のバージョンと値が含まれます。
ya_existeその名前または番号のものが既にあります。同じ内容ではなく、別の値で再試行してください。
コード件数メッセージ
400218
  • 'desde' tiene que ser una fecha ISO
  • 'dispositivo_id' va con 'extension_id'
  • 'en' tiene que ser una fecha ISO (la hora del portal)
  • 'extension_id' y 'numero' son excluyentes
  • 'hasta' como mucho a 30 días
  • 'hasta' es una fecha ISO-8601
  • 'hasta' es una fecha ISO-8601 futura
  • 'hasta' tiene que ser posterior a 'desde' (o al momento de abrirlo)
  • 'limite' es un entero de 1 a …
  • 'minutos' es un entero de 1 a …
  • 'minutos' y 'hasta' se excluyen: manda uno
  • 'modos' es un objeto {modo: {tipo, id}}
  • 'modos' no es un JSON válido
  • 'modos': '…' no lleva destino propio (…)
  • 'modos.…' necesita {tipo, id}
  • 'musica' es el nombre de una clase de música en espera (letras, cifras, - y _)
  • 'numero' no parece un número
  • 'paginar' es 1 o true
  • 'segmentos' lleva caracteres que no acepto
  • 'zona' es una zona horaria IANA (p. ej. America/Costa_Rica)
  • '…' es el desplazamiento de antes: al paginar, el cursor dice dónde seguir
  • '…' es sí o no (1/0 o true/false)
  • '…' es una fecha ISO-8601
  • '…' no es una clave de audio de la central
  • '…': como mucho 1000 caracteres y sin saltos de línea
  • '…': piezas de audio que no acepto —solo audios de la central, sin rutas—:
  • alert_info: máximo 200 caracteres
  • alert_info: no puede llevar saltos de línea
  • ambito: …
  • antelacion_horas: número de horas
  • avisar_el es posterior a la cita: no se puede recordar algo que ya pasó
  • bloque de más de 10.000: cárgalo en trozos
  • borrar una cuenta no se puede deshacer: mande confirmar: 'suprimir'
  • cada miembro necesita extension_id o externo
  • canales_garantizados y canales_max van los dos como mapa por troncal, o los dos como número: no se mezclan
  • canales_troncal no se escribe directo: mande canales_garantizados y canales_max como mapa por troncal
  • capacidad: falta 'tipo_cap' (p. ej. 'text.summarize')
  • categoria: …
  • categoría: …
  • cid_saliente: ese número no es de esta cuenta
  • clase_servicio: …
  • condicion: el caso … no dice qué variable mira
  • condicion: el caso … va a '…', que no es un destino
  • condicion: hace falta al menos un caso en 'casos'
  • consulta: 'url' debe empezar por http:// o https://
  • consulta: espera.aviso_cada_s no baja de 5 segundos
  • contesta: hace falta decir quién atiende ({tipo, id})
  • cuando: fecha ISO de la cita
  • cuenta_portal: la fila de central del portal (4 a 128 caracteres)
  • demasiadas piezas (máx. 24)
  • desde/hasta con formato 'HH:MM'
  • destino externo: número inválido
  • destino: …
  • dia: 0 (domingo) a 6 (sábado)
  • el alias debe tener al menos 3 dígitos
  • el alta ya no acepta canales como número suelto: mande canales_garantizados y canales_max como mapa por troncal {"trk_…": N} (las troncales las publica GET /sistema/canales)
  • el aviso de buzón admite hasta 5 teléfonos
  • el bloque debe tener números de la misma longitud
  • el cuerpo va vacío: manda los bytes del audio
  • el destino '…' necesita el id de un paso
  • el destino '…' necesita un id
  • el destino es de otro inquilino
  • el destino es el mismo número que se está retirando: quien oiga esto acaba de marcarlo
  • el disco no tiene ninguna pista activa con audio
  • el final del bloque es menor que el inicio
  • el guion necesita un nombre
  • el mapa de canales está vacío
  • el mensaje no puede llevar enlaces
  • el mensaje tiene como mucho 140 caracteres
  • el modo de aviso es 'tras' (uno detrás de otro) o 'a_la_vez'
  • el motor de llamadas no está listo
  • el número interno debe tener 3 o 4 dígitos
  • el número … está '…', no asignado
  • el precio (…) está por debajo del coste (…)
  • el saludo dura … s: como mucho … s
  • el saludo dura … s: como mínimo … s
  • el ámbito 'dispositivo' necesita extensión y dispositivo
  • el ámbito '…' necesita inquilino
  • el … no es de esta cuenta
  • el … no está asignado a este inquilino
  • entrada inválida
  • entrada.verificar: 'url' debe empezar por http:// o https://
  • entrada: exito.dest_tipo debe ser uno de …
  • entrada: falta 'exito.dest_tipo' (a dónde va cuando la entrada es válida)
  • entrada: falta 'texto' (lo que se le pide a quien llama)
  • entrada: max no pasa de 32 dígitos
  • es un feriado nacional: crea una excepción con cerrado:false
  • es un mantenimiento global: lo cierra quien opera la central
  • esa extensión es de otro inquilino
  • esa extensión no es de ese inquilino
  • esa extensión no es de este inquilino
  • esa extensión no es de su central
  • esa llamada no es de este inquilino
  • ese apunte no cambió ninguna columna: no hay nada que deshacer
  • ese dispositivo no es de esa extensión, o esa extensión no es de esta cuenta
  • ese guion lo usan …: …
  • ese número es de su propia cuenta: no hace falta permiso
  • ese turno lo usan: …
  • estado: 'activo' o 'suspendido'
  • estado: activa|suspendida
  • estado: …
  • estos campos los cambia su proveedor: …
  • estrategia: …
  • evento desconocido: …. Válidos: …
  • extensión inexistente o de otro inquilino
  • falta 'extension_id' o 'miembro_id'
  • falta 'extension_id' o 'numero'
  • falta 'inquilino'
  • falta 'modo' (null vuelve al automático)
  • falta 'motivo'
  • falta 'nombre'
  • falta 'numero'
  • falta 'prepago' (true o false)
  • falta 'q'
  • falta 'segmentos' o 'decir'
  • falta 'teclas' (los dígitos marcados)
  • falta 'texto'
  • falta 'titulo'
  • falta 'valor'
  • falta dispositivo_id: a qué aparato se mueve
  • falta el nombre
  • falta el número
  • falta el número nuevo (destino)
  • falta extension_id
  • falta inquilino, extensión o quién lo pide
  • falta la instalacion que rechaza
  • fecha: 'AAAA-MM-DD' (una vez) o '--MM-DD' (todos los años)
  • hace falta audio_clave o texto
  • hace falta extension_id o externo
  • hace falta la llamada o el número
  • hace falta miembro_id o extension_id
  • hacen falta 'de' (su número) y 'para' (el número al que quiere llamar)
  • hacen falta 'fecha' y 'nombre'
  • hay varias troncales nacionales con la misma prioridad y ninguna es la de por defecto:
  • hay … ruta(s) apuntando a este disco (…): cámbialas primero
  • horario inexistente o de otro inquilino
  • instalacion: el identificador de la instalación de la app, de 8 a 128 caracteres (letras, dígitos, . _ : -)
  • la búsqueda necesita al menos 2 caracteres
  • la clave de la sala y la del organizador no pueden ser la misma
  • la extensión que contesta no es de este inquilino
  • la extensión «…» es de otro inquilino
  • la extensión «…» no existe
  • la extensión … no existe
  • la garantía (…) no puede pasar del techo (…)
  • la garantía de este inquilino está repartida en … troncales:
  • la pausa «…» debe ir de 1 a 30 segundos
  • la referencia del portal: de 4 a 128 caracteres (letras, dígitos, . _ : -)
  • la tecla … no estaba definida
  • la troncal '…' no existe o no está activa
  • los días van de 0 (domingo) a 6 (sábado)
  • mapa de canales por troncal inválido
  • minutos: un número mayor que cero
  • modo: …
  • modo: … o null para volver al automático
  • modo_presion: firme|elastica|cede
  • nada que cambiar: campos aceptados = categoria, notas, troncal_id
  • no caben … canales garantizados en …: quedan …
  • no caben … canales garantizados: quedan … libres
  • no está archivada: no hay audio que analizar
  • no hay motor de audio
  • no pude leer ese audio: …
  • no pude originar la prueba: …
  • no se puede esperar a uno mismo
  • no sé marcar '…'
  • no sé marcar '…': para llamar fuera del país, ponga + o 00 delante
  • nombre: no puede quedar vacío
  • numero: 1..99
  • numero: hace falta el número que se quiere marcar
  • numero: hace falta un número marcable
  • número de sígueme inválido: …
  • número externo inválido
  • número externo inválido: …
  • número inválido: …
  • número no válido para devolver la llamada
  • número vacío
  • orden: …
  • paises debe ser una lista de prefijos
  • para '…' el rango es …-… (o usa 4 dígitos)
  • para ambito '…' hace falta ambito_id
  • patrón inválido
  • patrón inválido: …
  • plan desconocido: …
  • plan: … (la escalera publicada)
  • plantilla: …
  • prueba: true|false
  • rol: visitante|agente|sistema
  • se espera 'filas': el CDR del operador
  • se esperaba una lista de contactos
  • sólo el ámbito 'dispositivo' se ata a una extensión y a un dispositivo
  • sólo las consultas tienen secreto
  • sólo los ámbitos 'sesion' y 'dispositivo' admiten 'minutos'
  • tecla inválida: …
  • timbrado_s: un entero de 5 a 120
  • tipo: 'cedula_fisica' (9 dígitos) o 'cedula_juridica' (10)
  • tipo: …
  • transporte: …
  • un IVR sin saludo deja al llamante en silencio: pon saludo_texto o saludo_audio
  • una troncal sin host no puede activarse
  • una … no tiene esa forma
  • url debe empezar por http:// o https://
  • url inválida
  • vence: fecha ISO 8601 con zona (UTC)
  • «…» no es una frase que un guion pueda sustituir
  • «…» no es una hora válida
  • «…» no es una hora: se escribe HH:MM
  • «…» no parece un teléfono
  • «…» no vale como habilidad: letras, números, guion o guion bajo
  • «…» no vale: sólo dígitos, asterisco, almohadilla o una pausa tipo P2
  • … es un paso de tipo '…', no '…'
  • …: '…' no es posterior a '…'
  • …: '…-…' se solapa con '…'
  • …: de 4 a 8 dígitos
  • …: demasiado fácil de adivinar
  • …: el identificador de la instalación de la app, de 8 a 128 caracteres (letras, dígitos, . _ : -)
  • …: falta 'respaldo.dest_tipo'. Un paso sin respaldo cuelga al que llama
  • …: número inválido
  • …: respaldo.dest_tipo debe ser uno de …
  • …: texto de 1 a 120 caracteres
4011
  • falta la clave de API
40316
  • clave de chat inválida
  • enlace agotado
  • esa cuenta no es tuya
  • esa extensión está suspendida
  • esa extensión no es la de este aparato
  • ese aparato está suspendido: se reactiva desde el panel
  • ese cambio lo hizo su proveedor (o toca algo que sólo cambia su proveedor): no se puede deshacer desde la cuenta
  • ese cambio no es de esta cuenta
  • ese número no es suyo: solo puede pedir permiso con un número de su cuenta
  • esta clave es de solo lectura
  • esta clave no está atada a ninguna cuenta
  • esta cuenta está suspendida: solo se puede consultar
  • esta operación necesita una clave de sistema
  • esta operación no está abierta a la credencial de un aparato
  • esta sesión tiene más de 15 minutos: para gastar, pida una nueva
  • esto lo decide la titular de la central
40458
  • agente: no está en esta cola
  • agente: no existe en esta cuenta
  • audio_clave: no es un audio de esta cuenta (uno nuevo se sube con PUT …/saludos/:tipo/audio)
  • buzón: no existe en esta cuenta
  • dispositivo
  • el audio de ese saludo no está en la central
  • el audio no está disponible
  • el destino …:… no existe
  • el número … no es de esta central
  • el … no tiene ruta de entrada
  • el … no tiene ruta en esta cuenta
  • enlace
  • enlace caducado
  • enlace no válido o caducado
  • enlace revocado
  • esa central de la tienda no existe
  • esa central no existe
  • esa cita no existe en esta cuenta
  • esa extensión no existe en esta cuenta
  • esa frase no existe en este disco
  • esa grabación aún no está archivada
  • esa licencia no existe
  • esa pista no existe en este disco
  • esa solicitud no existe
  • ese disco no existe en esta cuenta
  • ese dispositivo no existe en esta cuenta
  • ese guion no existe
  • ese inquilino no existe
  • ese mensaje aún no está archivado
  • ese miembro no existe
  • ese número no tiene permiso
  • ese saludo es de texto: no tiene audio
  • ese timbre no existe o ya terminó
  • extensión
  • feriado
  • guion: no existe en esta cuenta
  • horario: no existe en esta cuenta
  • la central no está lista
  • la grabación ya no existe
  • llamada
  • mantenimiento
  • mensaje
  • mensaje: no es de este buzón
  • miembro: no está en esta rota
  • miembro: no está en este grupo
  • no está en la lista
  • no existe en esta cuenta
  • no existe … …
  • no pude traer el audio del archivo
  • provisión no válida
  • recurso desconocido
  • regla
  • saludo: no es de este buzón
  • sesión
  • … '…': no existe en esta cuenta
  • …: '…' no existe
  • …: no existe
  • …: no existe en esta cuenta
40943
  • a la titular no se la revoca: la central es suya
  • a la titular no se la suspende: se suspende la central
  • demasiados dispositivos en la extensión …
  • el menú se muerde la cola: …
  • el plan '…' permite … extensiones
  • el usuario SIP '…' ya existe
  • el … está asignado a …: libéralo primero
  • el … está enfriando hasta …: reasignarlo antes hace que el cliente nuevo reciba las llamadas del anterior. Usa forzar:true si asumes eso.
  • el … está retirado del servicio
  • el … tiene … llamada(s) en el CDR: retíralo, no lo borres
  • el … ya es marcable en este inquilino
  • el … ya está asignado a …
  • el … ya está en uso en este inquilino
  • el … ya tiene otra ruta: edita ésa en vez de duplicarla
  • el … ya tiene ruta: edítala en vez de crear otra
  • esa central es de otra cuenta del portal
  • esa central no es de la tienda
  • esa cuenta_portal es de una central del portal, no de una compra de la tienda: su baja es otro proceso
  • esa cédula ya es de otra licencia (mover: true para moverla)
  • esa extensión es un puesto autorizado desde la tienda: se revoca desde la app, no se borra aquí
  • esa licencia es de otra cuenta del portal: una compra no se cambia de dueño
  • esa provisión ya se usó
  • esa referencia es de una central, no de una licencia
  • esa referencia es de una licencia, no de una central
  • esa solicitud está …
  • ese mensaje no está en la papelera
  • ese número ya está en el inventario
  • esta central conserva la escalera con la que se vendió (plan '…' anterior al 18-oct):
  • esta extensión ya tiene … aparato(s) y su techo es …: desvincule uno antes
  • esto ya no es lo que dejó ese cambio: … se tocó después.
  • la central está suspendida: no se autorizan miembros
  • la cuenta_portal '…' ya es del inquilino …: cada licencia y cada central llevan su propia fila del portal
  • la fila …:… ya no existe. Deshacer un cambio no resucita lo borrado:
  • la troncal tiene garantías vendidas en … inquilino(s):
  • no quedan números libres en el rango …-…
  • no se pudo descifrar la provisión
  • no se puede borrar: le apuntan ….
  • provisión caducada
  • referencia inexistente
  • una licencia de la app sólo tiene el teléfono de su instalación: no admite aparatos SIP sueltos
  • ya existe
  • ya existe otro con ese valor
  • ya hay un feriado de esta cuenta el …: edítalo con PATCH

交換機のソース 407 か所にある 336 種類のメッセージ。ビルドのたびに導出されます — 向こうで変われば、ここでも変わります。

現在、レート制限はほとんどありません。 唯一あるのは、ブラウザの電話機を開こうとする試行のあいだに置く数秒の待ち時間です。全体的な上限はありません。推測の上に作ってから気づかれるより、先に申し上げます。常識の範囲でお使いください。重い処理をお考えなら、事前にお知らせください。あとからではなく、ご一緒に測ります。

到達できる範囲

領域エンドポイント例
留守番電話15GET /buzones POST /buzones DELETE /buzones/:buz
内線13GET /extensiones POST /extensiones DELETE /extensiones/:ext
ネットワークから無料で発信できる相手13GET /red/bloqueos DELETE /red/bloqueos/:numero PUT /red/bloqueos/:numero
待ち行列12GET /colas POST /colas DELETE /colas/:cola
保留音12GET /discos POST /discos DELETE /discos/:disco
録音9GET /grabaciones PUT /grabaciones/:grabacion/categoria DELETE /grabaciones/:grb
鳴らすグループ8GET /grupos POST /grupos DELETE /grupos/:grp
音声メニュー8GET /ivrs POST /ivrs DELETE /ivrs/:ivr
当番の交代8GET /turnos POST /turnos DELETE /turnos/:turno
会議室7GET /conferencias POST /conferencias DELETE /conferencias/:sala
営業時間7GET /horarios POST /horarios DELETE /horarios/:hor
Webhook7GET /webhooks POST /webhooks DELETE /webhooks/:whk
プログラム可能なフローの手順6GET /pasos POST /pasos DELETE /pasos/:pso
祝日5GET /feriados POST /feriados DELETE /feriados/:fer
各回線が話す内容5GET /guiones POST /guiones DELETE /guiones/:gui
伝言5GET /mensajes DELETE /mensajes/:msg GET /mensajes/:msg
着信ルート5GET /rutas POST /rutas DELETE /rutas/:ruta
ダイヤルできる別名4GET /alias POST /alias DELETE /alias/:als
予約のリマインド4GET /citas POST /citas DELETE /citas/:cita
連絡先4GET /contactos POST /contactos DELETE /contactos/:con
音声とつながったチャット4GET /conversaciones GET /conversaciones/:cnv POST /conversaciones/:cnv/cerrar
端末4DELETE /dispositivos/:disp POST /dispositivos/:disp/estado POST /dispositivos/:disp/provision
迷惑電話の記録4GET /expedientes POST /expedientes GET /expedientes/:exp
録音の規則4GET /grabacion/decidir GET /grabacion/reglas PUT /grabacion/reglas
通話履歴4GET /llamadas GET /llamadas/:llamada GET /llamadas/csv
番号4GET /numeros DELETE /numeros/:numero/aviso-cambio GET /numeros/:numero/aviso-cambio
同時通話3GET /canales GET /canales/episodios PUT /canales/modo
変更履歴と取り消し3GET /historial GET /historial/:cambio POST /historial/:cambio/revertir
着信拒否リスト3GET /lista-negra POST /lista-negra DELETE /lista-negra/:neg
メンテナンス時間3GET /mantenimientos POST /mantenimientos POST /mantenimientos/:mnt/cerrar
アカウントと状態2GET / PATCH /
電話帳2GET /directorio GET /directorio/buscar
共有リンク2GET /enlaces DELETE /enlaces/:token
アプリの着信通知2GET /timbres/:timbre POST /timbres/:timbre/rechazar
その他1GET /guiones/claves
保留中の通話1GET /aparcadas
キーでできること1GET /capacidades
誰が、何の用件でかけているか1GET /contexto
通話にかかる料金1GET /cotizar-llamada
通話を送れる先1GET /destinos
端末のつながりやすさ1GET /disponibilidad
利用明細1GET /estado-cuenta
ライブチャネル1POST /eventos/ticket
アプリのインストール1DELETE /instalaciones/:instalacion
通話中の呼1GET /llamadas-en-curso
クリックで発信1POST /llamar
オペレーター1PUT /operadora
この会社がかける国1GET /paises
開始テンプレート1POST /plantilla
発信できる範囲1GET /politica-salida
在席状況1GET /presencia
電話システムから電話をかけて音声を流す1POST /probar-audio
着信の行き先を試す1GET /probar-entrada
発信せずに発信を試す1GET /probar-salida
残高1GET /saldo
誰も折り返していない通話1GET /sin-devolver
外部の2番号をつなぐ1POST /unir
優先する発信者1GET /vips
ブラウザの中の電話機1POST /webphone/sesion

合計304件のエンドポイント。2026-10-21に電話システム自身から読み取りました。

この表は要約です。古くならない一覧は、電話システムが自分自身について生成するものです: GET /api.

エンドポイント一覧

交換機のルーター自身から読み取っているため、存在しない経路を載せることも、存在する経路を落とすこともありません。ここに載るのはお客様のアカウントの範囲だけです。プロビジョニングの経路はポータルのものであり、そこへ届く鍵はお渡ししません。

何をするかできること例
GET /guiones/clavesQué frases admite un guion
GET /APIで
PATCH /Editar la ficha (el cliente, sus datos; plan y límites, el portal). Parcial; If-Match → 412APIで
GET /aliasAPIで
POST /aliasAPIで
DELETE /alias/:alsAPIで
PATCH /alias/:alsAPIで
GET /aparcadasLas llamadas aparcadas ahora mismo (#60)APIで見る
GET /buzones実際の通話
POST /buzones実際の通話
DELETE /buzones/:buzBorrar un buzón. If-Match opcional → 412実際の通話
GET /buzones/:buz実際の通話
PATCH /buzones/:buzSaludo, correo, transcripción, duración máxima. Parcial; If-Match → 412APIで
GET /buzones/:buz/mensajesMensajes de un buzón. ?paginar=1 / ?cursor= → {elementos, siguiente}APIで
PUT /buzones/:buzon/clavePoner o quitar la clave del buzón (#10)テストベンチ
GET /buzones/:buzon/ocupacionCuántos mensajes hay y cuántos caben (#14)テストベンチ
GET /buzones/:buzon/papeleraLo borrado que todavía se puede recuperar (#15)テストベンチ
POST /buzones/:buzon/papelera/:mensaje/recuperarDeshacer un borrado (#15)テストベンチ
GET /buzones/:buzon/saludosLos saludos del buzón, por motivo (con su audio: duración, bytes, huella)テストベンチ
POST /buzones/:buzon/saludosPoner el saludo de un motivo (normal, ocupado, vacaciones…): de texto, o volver a un audio de la cuentaテストベンチ
DELETE /buzones/:buzon/saludos/:saludoテストベンチ
GET /buzones/:buzon/saludos/:saludo/audioEscuchar un saludo: WAV o MP3 (Accept), con Range y ETagテストベンチ
PUT /buzones/:buzon/saludos/:tipo/audioSubir el saludo de un motivo con la voz del cliente (bytes: m4a, mp3, wav u ogg; 1-90 s)テストベンチ
GET /canalesAPIで
GET /canales/episodiosAPIで
PUT /canales/modoAPIで
GET /capacidadesQué puede esta llave, qué campos edita cada ajuste y con qué límites, y qué hay en cada áreaAPIで
GET /citasAPIで
POST /citasProgramar un recordatorio de cita por teléfonoAPIで見る
DELETE /citas/:citaAPIで見る
GET /citas/:citaAPIで見る
GET /colasAPIで見る
POST /colasCrear una cola de espera con agentesAPIで見る
DELETE /colas/:colaBorrar una cola. If-Match opcional → 412APIで
GET /colas/:colaAPIで見る
PUT /colas/:colaEstrategia, tiempos, anuncios, música y destinos. PUT PARCIAL; If-Match → 412APIで見る
GET /colas/:cola/callbacksLas devoluciones de llamada pedidasAPIで見る
GET /colas/:cola/estadoCuánta gente espera, quién está de turno y cuánto se tardaAPIで
GET /colas/:cola/habilidadesQué habilidades existen hoy en esta cola
POST /colas/:cola/miembrosAñadir un agente (extensión o número de fuera)APIで
DELETE /colas/:cola/miembros/:miembroAPIで
PUT /colas/:cola/miembros/:miembro/habilidadesLas etiquetas de un agente (#70)
POST /colas/turnoEntrar o salir de turno (lo mismo que *80 / *81)APIで
GET /conferenciasAPIで
POST /conferenciasCrear una sala con número y claveAPIで見る
DELETE /conferencias/:salaAPIで
GET /conferencias/:salaAPIで見る
PUT /conferencias/:salaCambiar la sala (las claves se cambian, no se leen)APIで
GET /conferencias/:sala/historialQuién estuvo y cuántoAPIで
POST /conferencias/:sala/invitarLlamar a alguien y meterlo en la salaAPIで
GET /contactosAPIで
POST /contactosAlta o importación masivaAPIで
DELETE /contactos/:conAPIで
PUT /contactos/:contacto/vipMarcar o quitar el VIP de un contacto
GET /contextoQuién llama y de qué habló la última vezAPIで
GET /conversacionesテストベンチ
GET /conversaciones/:cnvテストベンチ
POST /conversaciones/:cnv/cerrarテストベンチ
POST /conversaciones/:cnv/turnosテストベンチ
GET /cotizar-llamadaCuánto costaría llamar a ese número, antes de marcarloAPIで
GET /destinosQué destinos se pueden elegir en esta cuenta実際の通話
GET /directorioQuién sale en el directorio por nombreテストベンチ
GET /directorio/buscarA quién encontraría el directorio con esas teclasテストベンチ
GET /discosAPIで
POST /discosAPIで
DELETE /discos/:discoAPIで
GET /discos/:discoAPIで
PATCH /discos/:discoAPIで
GET /discos/:disco/estadisticasAPIで
GET /discos/:disco/frasesAPIで
PUT /discos/:disco/frasesAPIで
DELETE /discos/:disco/frases/:fraseAPIで
PUT /discos/:disco/pistasAPIで
DELETE /discos/:disco/pistas/:pistaAPIで
GET /discos/:disco/probarAPIで
GET /disponibilidadCuánto tiempo estuvo arriba cada extensiónAPIで
DELETE /dispositivos/:dispRevocar una credencial (y colgar lo que ese aparato tenga en curso)実機の電話
POST /dispositivos/:disp/estadoSuspender o reactivar un dispositivo実機の電話
POST /dispositivos/:disp/provisionEmitir un token para configurar la app sin teclear la claveAPIで
POST /dispositivos/:disp/rotarCambiar la clave de un dispositivo実機の電話
GET /enlacesテストベンチ
DELETE /enlaces/:tokenRevocar un enlace compartido por errorテストベンチ
GET /estado-cuentaEstado de cuenta: movimientos, consumo y lo pendiente de reportar, con su semántica (el disponible es del portal)APIで
POST /eventos/ticketTicket para mirar el canal de eventos en vivo (sin teléfono)APIで見る
GET /expedientesLos expedientes abiertos (#64)
POST /expedientesAbrir expediente sobre una llamada
GET /expedientes/:expUn expediente, con su llamada y su grabación
POST /expedientes/:exp/cerrarCerrar un expediente (la fila NUNCA se borra)
GET /extensionesAPIで見る
POST /extensionesAlta de extensión (crea buzón y credencial)APIで見る
DELETE /extensiones/:extBorrar una extensión. If-Match opcional → 412APIで
GET /extensiones/:extAPIで
PATCH /extensiones/:extEditar una extensión. Parcial; If-Match → 412APIで
POST /extensiones/:ext/dispositivosAñadir un dispositivo (celular, computadora…)APIで
POST /extensiones/:ext/no-molestarAPIで
GET /extensiones/:ext/reglas実際の通話
PUT /extensiones/:ext/reglasSígueme, desvío, no molestar y destino de fallo. PUT PARCIAL; If-Match → 412APIで
GET /extensiones/:extension/campLos avisos de desocupado que pidió esta extensión (#58)
DELETE /extensiones/:extension/camp/:objetivoCancelar un aviso de desocupado
POST /extensiones/:extension/moverMover la llamada en curso a otro aparato de la misma extensión (#57)
GET /extensiones/siguiente-libreAPIで見る
GET /feriadosAPIで
POST /feriadosFeriado propio o excepción a uno nacional (idempotente por fecha)APIで
DELETE /feriados/:ferBorrar un feriado de la cuenta. If-Match opcional → 412APIで
GET /feriados/:ferUn feriado de la cuenta o nacional, con su versión (ETag)APIで
PATCH /feriados/:ferNombre y cerrado de un feriado de la cuenta (la fecha ES el feriado). If-Match → 412APIで
GET /grabacion/decidir¿Se grabaría esta llamada? Y con qué avisoAPIで
GET /grabacion/reglasAPIで
PUT /grabacion/reglasQué se graba y cuánto se guardaAPIで
DELETE /grabacion/reglas/:reglaAPIで
GET /grabacionesGrabaciones; desde/hasta son fechas. ?paginar=1 / ?cursor= → {elementos, siguiente}テストベンチ
PUT /grabaciones/:grabacion/categoriacliente | prospecto | interno, o nada (#68)
DELETE /grabaciones/:grbテストベンチ
GET /grabaciones/:grbFicha: transcripción, resumen, acuerdos y hablantes未実施
GET /grabaciones/:grb/accesosQuién ha escuchado esta grabaciónテストベンチ
POST /grabaciones/:grb/analizarVolver a transcribir y resumir未実施
GET /grabaciones/:grb/audioEl audio (queda auditado)テストベンチ
POST /grabaciones/:grb/enlaceEnlace firmado para compartir sin dar acceso a la cuentaテストベンチ
GET /grabaciones/buscarBuscar por lo que se dijo dentro de las llamadasテストベンチ
GET /gruposAPIで
POST /gruposAPIで
DELETE /grupos/:grpBorrar un grupo. If-Match opcional → 412APIで
GET /grupos/:grpAPIで
PUT /grupos/:grpEstrategia, timbrado, fallo y miembros (si vienen, reemplazan la lista). Parcial; If-Match → 412APIで
POST /grupos/:grp/miembrosAPIで
DELETE /grupos/:grp/miembros/:miembroAPIで
GET /grupos/:grp/ordenEn qué orden sonaría ahora mismoAPIで
GET /guiones実際の通話
POST /guionesLos textos que dice una línea実際の通話
DELETE /guiones/:gui実際の通話
GET /guiones/:gui実際の通話
PATCH /guiones/:guiCambiar textos, nombre o voz declarada実際の通話
GET /historialQué cambió en esta cuenta, quién y cuándoAPIで見る
GET /historial/:cambioAPIで見る
POST /historial/:cambio/revertirDeshacer un cambio de configuraciónAPIで見る
GET /horariosAPIで
POST /horariosAPIで
DELETE /horarios/:horBorrar un horario. If-Match opcional → 412APIで
GET /horarios/:horAPIで
PUT /horarios/:horNombre, zona y tramos (si vienen, reemplazan la lista). Parcial; If-Match → 412APIで
GET /horarios/:hor/estado¿Abierto ahora? Y por quéAPIで
POST /horarios/:hor/manualInterruptor: abierto, cerrado, almuerzo o feriado, con caducidad; null vuelve al automáticoAPIで
DELETE /instalaciones/:instalacionDesvincular el teléfono de una instalación de la app (borra sus aparatos y cuelga sus llamadas)APIで
GET /ivrs実際の通話
POST /ivrsCrear un menú (detecta bucles al guardar)実際の通話
DELETE /ivrs/:ivrBorrar un menú. If-Match opcional → 412実際の通話
GET /ivrs/:ivr実際の通話
PUT /ivrs/:ivrSaludo, espera, reintentos, agotado y opciones (si vienen, reemplazan la lista). Parcial; If-Match → 412; ciclo → 409実際の通話
GET /ivrs/:ivr/guionEl texto exacto que se va a decirAPIで
DELETE /ivrs/:ivr/opciones/:tecla実際の通話
PUT /ivrs/:ivr/opciones/:tecla実際の通話
GET /lista-negraAPIで
POST /lista-negraBloquear un número entranteAPIで
DELETE /lista-negra/:negAPIで
GET /llamadasRegistro de llamadas; desde/hasta son fechas (con la llave de un aparato, las de su extensión). ?paginar=1 / ?cursor= → {elementos, siguiente}実際の通話
GET /llamadas-en-cursoLas llamadas del inquilino ahora mismo (vista de operadora)APIで見る
GET /llamadas/:llamada実際の通話
GET /llamadas/csvExportar el CDR実際の通話
GET /llamadas/resumenTotales, atención y reparto実際の通話
POST /llamarTimbrar a la extensión y conectarla con un destino実際の通話
GET /mantenimientosAPIで見る
POST /mantenimientosAvisar a quien llame de que hay un mantenimiento en cursoAPIで見る
POST /mantenimientos/:mnt/cerrarAPIで見る
GET /mensajesBandeja de toda la cuenta (con la llave de un aparato, la de su extensión). ?paginar=1 / ?cursor= → {elementos, siguiente}APIで
DELETE /mensajes/:msgAPIで
GET /mensajes/:msgAPIで
GET /mensajes/:msg/audioEl audio del mensaje: WAV o MP3 (Accept), con Range y ETag; no lo marca leído y queda auditadoAPIで
POST /mensajes/:msg/leidoAPIで
GET /numerosAPIで見る
DELETE /numeros/:numero/aviso-cambioApagar el aviso de cambio y devolver la línea a su destino未実施
GET /numeros/:numero/aviso-cambioEstado del aviso de cambio de número未実施
POST /numeros/:numero/aviso-cambioAnunciar que este número cambió y decir el nuevo未実施
PUT /operadoraA dónde va el cero (#109)APIで見る
GET /paisesLa memoria del cortafuegos de fraude: a dónde llama esta casa (#65)
GET /pasosPasos de flujo del cliente
POST /pasosAlta de un paso de flujo
DELETE /pasos/:pso
GET /pasos/:pso
PUT /pasos/:pso
POST /pasos/:pso/rotar-secretoRotar el secreto con el que se firma la consulta
POST /plantillaAplicar una plantilla de arranque (horario + ruta + buzón)APIで
GET /politica-salidaAPIで
GET /presenciaPresencia de las extensiones de la cuenta, agregada por extensiónAPIで
POST /probar-audioLlamarte y reproducirte una cadena de audio — la prueba de verdad実際の通話
GET /probar-entradaA dónde iría una llamada ahora mismo実際の通話
GET /probar-salidaSimular una salida sin cursarla実際の通話
GET /red/bloqueosLos números bloqueadosAPIで
DELETE /red/bloqueos/:numeroDesbloquear un númeroAPIで
PUT /red/bloqueos/:numeroBloquear un número (cuelga sus llamadas de red en curso)APIで
GET /red/enviadasLas solicitudes que envié (pendiente | aprobada | no_aprobada)APIで
POST /red/enviadasPedir permiso para llamar gratis (202 siempre igual)APIで
DELETE /red/enviadas/:solRetirar una solicitud, o renunciar a un permiso concedidoAPIで
GET /red/permisosQuién me puede llamar gratisAPIで
DELETE /red/permisos/:numeroRevocar un permiso (la llamada en curso sigue; la siguiente ya no es gratis)APIで
GET /red/solicitudesLas solicitudes de llamada gratis que le llegaron (estado=pendiente)APIで
POST /red/solicitudes/:sol/aprobarAceptar: ese número llama gratis (en una central, la titular; extension_id = dónde suena)APIで
POST /red/solicitudes/:sol/bloquearRechazar y bloquear ese númeroAPIで
POST /red/solicitudes/:sol/rechazarRechazar (a quien pidió no se le avisa)APIで
GET /red/veredictoAntes de llamar: gratis | pago (con su tarifa) | solicitud | no_disponibleAPIで
GET /rutas実際の通話
POST /rutasQué hace una llamada que entra por un número実際の通話
DELETE /rutas/:rutaBorrar una ruta de entrada. If-Match opcional → 412実際の通話
GET /rutas/:ruta実際の通話
PATCH /rutas/:rutaDestino, horario, modos, saludo y grabación. Parcial; If-Match → 412実際の通話
GET /saldoSaldo: el espejo local, los topes y el gasto, con su semántica (el disponible es del portal)テストベンチ
GET /sin-devolverLas perdidas que nadie ha devuelto, agrupadas por número (#67)
GET /timbres/:timbreEstado de un timbre de la app (conciliar al despertar)APIで
POST /timbres/:timbre/rechazarRechazar un timbre desde la app (antes o después de registrarse)APIで
GET /turnosLas rotas de guardia (#66)
POST /turnosCrear una rota de guardia
DELETE /turnos/:turnoBorrar una rota (falla si una ruta apunta a ella)
GET /turnos/:turnoUna rota, con quién está de guardia AHORA
PUT /turnos/:turnoCambiar una rota
POST /turnos/:turno/miembrosMeter a alguien en la rota, con su franja
DELETE /turnos/:turno/miembros/:miembroSacar a alguien de la rota
PUT /turnos/:turno/miembros/:miembroCambiar la franja de alguien
POST /unirLlamar a dos números externos y unirlos実際の通話
GET /vipsQuién se salta la fila de la cola (#61)
GET /webhooksAPIで
POST /webhooksAPIで
DELETE /webhooks/:whkAPIで
PATCH /webhooks/:whkAPIで
GET /webhooks/:whk/entregasAPIで
POST /webhooks/:whk/probarMandar un evento de pruebaAPIで
POST /webhooks/:whk/rotarAPIで
POST /webphone/sesionRegistrar el navegador o la app como teléfono de una extensión (la app manda su instalacion)APIで

記録された実例

手で書いたものではありません。使い捨てアカウントでこのAPIに対して実際に実行し、その通信を記録したものです(アカウントは実行後に削除しました)。リクエスト・ステータス・レスポンスを、流れたとおりに掲載しています。アカウントとオブジェクトの識別子だけを記号に置き換え、ほかは手を加えていません。書かれた例は書き手の思い込みを示しますが、記録された例は交換機が実際に行ったことを示します。

226 経路のうち 24 経路に、2026-10-16 の実行で記録した実例があります。残りは上の表に載っていますが、この方法ではまだ動かしていません — すべて揃っているとご想像いただくより、数をお見せするほうがよいと考えます。

GET /inquilinos/:inquilino/aparcadas 200

レスポンス

{
  "plazas": []
}

DELETE /inquilinos/:inquilino/citas/:id 200

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "numero": "50688889999",
  "nombre": null,
  "cuando": "2026-10-16T22:44:57.219Z",
  "avisar_el": "2026-10-15T22:44:57.219Z",
  "guion": null,
  "estado": "cancelada",
  "intentos": 0,
  "ultimo_intento": null,
  "respondido_el": null,
  "nota": null,
  "creado": "2026-10-16T21:44:58.732Z",
  "actualizado": "2026-10-16T21:44:58.942Z"
}

GET /inquilinos/:inquilino/citas/:id 200

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "numero": "50688889999",
  "nombre": null,
  "cuando": "2026-10-16T22:44:57.219Z",
  "avisar_el": "2026-10-15T22:44:57.219Z",
  "guion": null,
  "estado": "pendiente",
  "intentos": 0,
  "ultimo_intento": null,
  "respondido_el": null,
  "nota": null,
  "creado": "2026-10-16T21:44:58.732Z",
  "actualizado": "2026-10-16T21:44:58.732Z"
}

POST /inquilinos/:inquilino/citas 201

リクエスト

{
  "numero": "50688889999",
  "cuando": "2026-10-16T22:44:57.219Z",
  "texto": "ensayo"
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "numero": "50688889999",
  "nombre": null,
  "cuando": "2026-10-16T22:44:57.219Z",
  "avisar_el": "2026-10-15T22:44:57.219Z",
  "guion": null,
  "estado": "pendiente",
  "intentos": 0,
  "ultimo_intento": null,
  "respondido_el": null,
  "nota": null,
  "creado": "2026-10-16T21:44:58.732Z",
  "actualizado": "2026-10-16T21:44:58.732Z"
}

GET /inquilinos/:inquilino/colas/:id/callbacks 200

レスポンス

[]

GET /inquilinos/:inquilino/colas/:id 200

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "nombre": "Soporte",
  "numero": null,
  "estrategia": "todos",
  "timbrado_s": 20,
  "espera_max_s": 600,
  "decir_posicion": 1,
  "decir_espera": 1,
  "anuncio_cada_s": 30,
  "musica": "default",
  "callback": 1,
  "callback_min_espera_s": 45,
  "agotada_tipo": "buzon",
  "agotada_id": "<id>",
  "vacia_tipo": null,
  "vacia_id": null,
  "creado": "2026-10-16T21:44:57.230Z",
  "actualizado": "2026-10-16T21:44:57.230Z",
  "miembros": [],
  "estado": {
    "de_turno": 0,
    "miembros": 0,
    "espera_estimada_s": null,
    "callbacks_pendientes": 0,
    "atendidas_hoy": 0,
    "abandonos_hoy": 0
  }
}

PUT /inquilinos/:inquilino/colas/:id 200

リクエスト

{
  "nombre": "Ya editada"
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "nombre": "Ya editada",
  "numero": null,
  "estrategia": "todos",
  "timbrado_s": 20,
  "espera_max_s": 600,
  "decir_posicion": 1,
  "decir_espera": 1,
  "anuncio_cada_s": 30,
  "musica": "default",
  "callback": 1,
  "callback_min_espera_s": 45,
  "agotada_tipo": "buzon",
  "agotada_id": "<id>",
  "vacia_tipo": null,
  "vacia_id": null,
  "creado": "2026-10-16T21:44:59.058Z",
  "actualizado": "2026-10-16T21:44:59.287Z",
  "miembros": [],
  "estado": {
    "de_turno": 0,
    "miembros": 0,
    "espera_estimada_s": null,
    "callbacks_pendientes": 0,
    "atendidas_hoy": 0,
    "abandonos_hoy": 0
  }
}

GET /inquilinos/:inquilino/colas 200

レスポンス

[
  {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "nombre": "Soporte",
    "numero": null,
    "estrategia": "todos",
    "timbrado_s": 20,
    "espera_max_s": 600,
    "decir_posicion": 1,
    "decir_espera": 1,
    "anuncio_cada_s": 30,
    "musica": "default",
    "callback": 1,
    "callback_min_espera_s": 45,
    "agotada_tipo": "buzon",
    "agotada_id": "<id>",
    "vacia_tipo": null,
    "vacia_id": null,
    "creado": "2026-10-16T21:44:57.230Z",
    "actualizado": "2026-10-16T21:44:57.230Z",
    "version": "\"v1-73d179cfb86c534a9bfccc\""
  }
]

POST /inquilinos/:inquilino/colas 201

リクエスト

{
  "nombre": "Soporte",
  "estrategia": "todos"
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "nombre": "Soporte",
  "numero": null,
  "estrategia": "todos",
  "timbrado_s": 20,
  "espera_max_s": 600,
  "decir_posicion": 1,
  "decir_espera": 1,
  "anuncio_cada_s": 30,
  "musica": "default",
  "callback": 1,
  "callback_min_espera_s": 45,
  "agotada_tipo": "buzon",
  "agotada_id": "<id>",
  "vacia_tipo": null,
  "vacia_id": null,
  "creado": "2026-10-16T21:44:57.230Z",
  "actualizado": "2026-10-16T21:44:57.230Z",
  "miembros": [],
  "estado": {
    "de_turno": 0,
    "miembros": 0,
    "espera_estimada_s": null,
    "callbacks_pendientes": 0,
    "atendidas_hoy": 0,
    "abandonos_hoy": 0
  }
}

GET /inquilinos/:inquilino/conferencias/:id 200

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "nombre": "Sala 1",
  "numero": null,
  "max_personas": 10,
  "esperar_organizador": 0,
  "anunciar_entradas": 1,
  "pedir_nombre": 1,
  "bloqueada": 0,
  "grabar": 0,
  "musica": "default",
  "activa": 1,
  "creado": "2026-10-16T21:44:57.733Z",
  "actualizado": "2026-10-16T21:44:57.733Z",
  "tiene_pin": false,
  "tiene_pin_organizador": false,
  "dentro": 0,
  "grabando": false
}

POST /inquilinos/:inquilino/conferencias 201

リクエスト

{
  "nombre": "Sala 1",
  "clave": "<secreto>"
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "nombre": "Sala 1",
  "numero": null,
  "max_personas": 10,
  "esperar_organizador": 0,
  "anunciar_entradas": 1,
  "pedir_nombre": 1,
  "bloqueada": 0,
  "grabar": 0,
  "musica": "default",
  "activa": 1,
  "creado": "2026-10-16T21:44:57.733Z",
  "actualizado": "2026-10-16T21:44:57.733Z",
  "tiene_pin": false,
  "tiene_pin_organizador": false
}

POST /inquilinos/:inquilino/eventos/ticket 201

リクエスト

{}

レスポンス

{
  "ticket": "<secreto>",
  "eventos": [
    "wss://<puerta>:<puerto>/eventos",
    "wss://<puerta>:<puerto>/eventos",
    "wss://<puerta>:<puerto>/eventos"
  ],
  "inquilino": "<cuenta>"
}

POST /inquilinos/:inquilino/extensiones/:id/credencial-dispositivo 201

リクエスト

{
  "instalacion": "ejercicio-api-ventana-tranquila"
}

レスポンス

{
  "id": "<id>",
  "clave": "<secreto>",
  "caduca": "2026-10-16T22:00:02.449Z",
  "segundos": 900,
  "ambito": "dispositivo",
  "vinculo": {
    "inquilino": "<cuenta>",
    "extension": "<id>",
    "dispositivo": "<id>"
  },
  "extension": {
    "id": "<id>",
    "numero": "100",
    "nombre": "Ejercicio API"
  },
  "dispositivo_nuevo": true,
  "minutos_max": 60,
  "resumen": "credencial de UN aparato de UNA extensión, que caduca; para la app móvil"
}

GET /inquilinos/:inquilino/extensiones/siguiente-libre 200

レスポンス

{
  "numero": "100"
}

GET /inquilinos/:inquilino/extensiones 200

レスポンス

[
  {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "numero": "100",
    "nombre": "Ejercicio API",
    "correo": null,
    "cid_saliente": null,
    "timbrado_s": 25,
    "estado": "activa",
    "creado": "2026-10-16T21:45:00.167Z",
    "actualizado": "2026-10-16T21:45:00.167Z",
    "nombre_audio": null,
    "en_directorio": 1,
    "departamento": null,
    "version": "\"v1-a1a25e330e8bc32c8289ab\""
  }
]

POST /inquilinos/:inquilino/extensiones 201

リクエスト

{
  "nombre": "Ejercicio API",
  "numero": "100"
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "numero": "100",
  "nombre": "Ejercicio API",
  "correo": null,
  "cid_saliente": null,
  "timbrado_s": 25,
  "estado": "activa",
  "creado": "2026-10-16T21:45:00.167Z",
  "actualizado": "2026-10-16T21:45:00.167Z",
  "nombre_audio": null,
  "en_directorio": 1,
  "departamento": null,
  "reglas": {
    "extension_id": "<id>",
    "dnd": 0,
    "dnd_hasta": null,
    "sigueme": 0,
    "sigueme_numeros": [],
    "sigueme_modo": "tras",
    "sigueme_confirmar": 1,
    "sigueme_s": 20,
    "desvio_siempre": null,
    "desvio_ocupado": null,
    "desvio_nocontesta": null,
    "fallo_tipo": "buzon",
    "fallo_id": "<id>",
    "actualizado": "2026-10-16T21:45:00.168Z",
    "desvio_confirmar": 1,
    "screening": 0,
    "clase_servicio": "todo",
    "supervisar": 0,
    "transferencia_retorno": 0
  },
  "dispositivos": [
    {
      "id": "<id>",
      "etiqueta": "principal",
      "usuario_sip": "tf3zfmm96cfq100",
      "transporte": "udp",
      "estado": "activo",
      "ultimo_registro": null,
      "ultima_ip": null,
      "creado": "2026-10-16T21:45:00.168Z",
      "rotado": null,
      "instalacion": null
    }
  ],
  "buzon": {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "extension_id": "<id>",
    "nombre": "Buzón de Ejercicio API",
    "saludo_texto": "Ha llamado a Ejercicio API. Deje su mensaje después del tono.",
    "saludo_audio": null,
    "correo": null,
    "enviar_correo": 1,
    "adjuntar": 1,
    "transcribir": 1,
    "max_s": 120,
    "creado": "2026-10-16T21:45:00.168Z",
    "actualizado": "2026-10-16T21:45:00.168Z",
    "max_mensajes": 50,
    "aviso_activo": 0,
    "aviso_numero": null,
    "revisar": 0,
    "ofrecer_operadora": 1,
    "guion": null,
    "aviso_numeros": null,
    "aviso_modo": "tras",
    "reintentar": 0,
    "reintentos_max": 2,
    "compartido": 0,
    "extensiones_acceso": null,
    "abrir_caso": 1,
    "tiene_pin": false
  },
  "credencial": {
    "id": "<id>",
    "usuario_sip": "tf3zfmm96cfq100",
    "clave": "<secreto>",
    "realm": "pbx.forhosting.com",
    "transporte": "udp"
  }
}

POST /inquilinos/:inquilino/historial/:id/revertir 201

リクエスト

{}

レスポンス

{
  "revertido": "<id>",
  "tabla": "colas",
  "fila_id": "<id>",
  "columnas": [
    "nombre"
  ],
  "fila": {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "nombre": "Para editar",
    "numero": null,
    "estrategia": "todos",
    "timbrado_s": 20,
    "espera_max_s": 600,
    "decir_posicion": 1,
    "decir_espera": 1,
    "anuncio_cada_s": 30,
    "musica": "default",
    "callback": 1,
    "callback_min_espera_s": 45,
    "agotada_tipo": "buzon",
    "agotada_id": "<id>",
    "vacia_tipo": null,
    "vacia_id": null,
    "creado": "2026-10-16T21:44:59.058Z",
    "actualizado": "2026-10-16T21:44:59.671Z"
  }
}

GET /inquilinos/:inquilino/historial/:id 200

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "tabla": "colas",
  "fila_id": "<id>",
  "columna_clave": "id",
  "antes": {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "nombre": "Para editar",
    "numero": null,
    "estrategia": "todos",
    "timbrado_s": 20,
    "espera_max_s": 600,
    "decir_posicion": 1,
    "decir_espera": 1,
    "anuncio_cada_s": 30,
    "musica": "default",
    "callback": 1,
    "callback_min_espera_s": 45,
    "agotada_tipo": "buzon",
    "agotada_id": "<id>",
    "vacia_tipo": null,
    "vacia_id": null,
    "creado": "2026-10-16T21:44:59.058Z",
    "actualizado": "2026-10-16T21:44:59.058Z"
  },
  "despues": {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "nombre": "Ya editada",
    "numero": null,
    "estrategia": "todos",
    "timbrado_s": 20,
    "espera_max_s": 600,
    "decir_posicion": 1,
    "decir_espera": 1,
    "anuncio_cada_s": 30,
    "musica": "default",
    "callback": 1,
    "callback_min_espera_s": 45,
    "agotada_tipo": "buzon",
    "agotada_id": "<id>",
    "vacia_tipo": null,
    "vacia_id": null,
    "creado": "2026-10-16T21:44:59.058Z",
    "actualizado": "2026-10-16T21:44:59.287Z"
  },
  "actor": "apikey:<id> primera clave de sistema (sistema)",
  "origen": "api",
  "revertido_de": null,
  "creado": "2026-10-16T21:44:59.287Z",
  "cambios": {
    "nombre": {
      "antes": "Para editar",
      "despues": "Ya editada"
    }
  }
}

GET /inquilinos/:inquilino/historial 200

レスポンス

{
  "inquilino": "<cuenta>",
  "cambios": [
    {
      "id": "<id>",
      "tabla": "colas",
      "fila_id": "<id>",
      "actor": "apikey:<id> primera clave de sistema (sistema)",
      "origen": "api",
      "revertido_de": null,
      "creado": "2026-10-16T21:44:59.287Z",
      "cambios": {
        "nombre": {
          "antes": "Para editar",
          "despues": "Ya editada"
        }
      }
    }
  ]
}

GET /inquilinos/:inquilino/llamadas-en-curso 200

レスポンス

{
  "activas": []
}

POST /inquilinos/:inquilino/mantenimientos/:id/cerrar 201

リクエスト

{}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "motivo": "ensayo",
  "desde": "2026-10-16T21:44:58.365Z",
  "hasta": "2026-10-16T21:44:58.588Z",
  "avisar": 1,
  "activo": 0,
  "creado": "2026-10-16T21:44:58.365Z"
}

GET /inquilinos/:inquilino/mantenimientos 200

レスポンス

[
  {
    "id": "<id>",
    "inquilino": "<cuenta>",
    "motivo": "ensayo",
    "desde": "2026-10-16T21:44:58.365Z",
    "hasta": null,
    "avisar": 1,
    "activo": 1,
    "creado": "2026-10-16T21:44:58.365Z"
  }
]

POST /inquilinos/:inquilino/mantenimientos 201

リクエスト

{
  "motivo": "ensayo",
  "minutos": 5
}

レスポンス

{
  "id": "<id>",
  "inquilino": "<cuenta>",
  "motivo": "ensayo",
  "desde": "2026-10-16T21:44:58.365Z",
  "hasta": null,
  "avisar": 1,
  "activo": 1,
  "creado": "2026-10-16T21:44:58.365Z"
}

GET /inquilinos/:inquilino/numeros 200

レスポンス

[]

PUT /inquilinos/:inquilino/operadora 200

リクエスト

{
  "destino": "buzon"
}

レスポンス

{
  "operadora": null
}

DELETE /inquilinos/:inquilino 200

レスポンス

{
  "borrado": "<cuenta>"
}

POST /inquilinos 201

リクエスト

{
  "nombre": "Ejercicio API 2026-10-16T21:44:54"
}

レスポンス

{
  "id": "<cuenta>",
  "nombre": "Ejercicio API 2026-10-16T21:44:54",
  "cuenta_portal": null,
  "cedula": null,
  "correo": null,
  "telefono": null,
  "plan": "zero",
  "zona": "America/Costa_Rica",
  "idioma": "es",
  "estado": "activo",
  "canales_max": 4,
  "notas": null,
  "creado": "2026-10-16T21:44:56.852Z",
  "actualizado": "2026-10-16T21:44:56.852Z",
  "canales_garantizados": 2,
  "modo_presion": "firme",
  "presion_canales": 1,
  "duracion_max_s": null,
  "operadora_tipo": null,
  "operadora_id": null,
  "filtro_anonimas": 0,
  "cdr_retencion_dias": null,
  "codigo_asunto_digitos": 0,
  "supervision_activa": 0,
  "canales_troncal": null,
  "limites": {
    "canales": 2,
    "canales_max": 4,
    "extensiones": 3,
    "retencion": 30,
    "tope_diario": 3,
    "tope_mensual": 25
  },
  "canales": {
    "existe": true,
    "garantizados": 2,
    "max": 4,
    "modo": "firme",
    "presion_canales": 1,
    "por_troncal": null
  }
}

セッション:ブラウザは恒久的な鍵を持ちません

上限60分の短命な認証情報で、恒久的な鍵を作ることはできません。ボタンを作る側にとっては、これが契約のすべてです。

  • 発行できるのはポータルだけです。 セッションの発行には運用管理用の鍵が必要です。リクエストの背後にログイン済みのお客さまがいると言えるのはポータルだけだからです。VOICEはお客さまのパスワードを知りませんし、知る必要もありません。
  • 期限なしで生まれることはありません。 期間の指定がなければ、こちらで付けます。期限切れになるために存在する権限が永遠に生まれうるなら、持たないほうがましです。人はそれを信用してしまうからです。
  • 長く要求しても通りません。 上限は固定です。呼び出し側が8時間と頼んでも、認証情報が安全になるわけではありません。
  • 自分を昇格させることはできません。 鍵の管理はすべて運用管理の権限の内側にあるので、セッションが恒久的な鍵を作ることはできません。これはハンドラーが動く前、ルーターの段階で適用されます。
  • 早めに終わらせられます。 発行時に識別子が返るのは、まさに期限前に取り消せるようにするためです。

WebhookAPIで

数秒おきに問い合わせるのではなく、起きたことをお客さまのシステムにお知らせします。31種類のイベント、署名つき、再試行あり、黙って落とすことはありません。

x-pbx-evento: llamada.entrante
x-pbx-marca:  1755300000
x-pbx-firma:  <hex>

{ "evento": "llamada.entrante", "inquilino": "…", "cuando": "…", "datos": { … } }

配信にはすべて署名が付きます。署名はタイムスタンプと受け取った本文そのものを対象にしているので、再度シリアライズしたものではなく生のバイト列に対して検証してください。秘密鍵は購読を作るときに一度だけ表示され、配信を止めずに入れ替えられます。

失敗した配信は10 · 30 · 60 · 300 · 900 · 3600秒後に再試行し、1回の試行に10秒を与えます。失敗が続く購読は20回連続で一時停止します。黙って捨てることはありません。すべての試行は確認できます。

イベント一覧

イベント発生するとき
llamada.entrante着信が入ります。番号、経路、向かう先つき。
llamada.contestada誰かが応答しました。
llamada.terminada終了しました。通話時間と終わり方つき。
llamada.perdida鳴りましたが、誰も出ませんでした。
buzon.mensaje伝言が残されました。文字起こしつき。
grabacion.lista録音の処理が終わり、ダウンロードできます。
grabacion.analizada文字起こし、話者、要約が揃いました。
saldo.bajo残高が少なくなっています。
tope.alcanzado利用上限に達し、発信が止まりました。
registro.anomalo端末の登録に不審な点があります。たとえば同じ場所からの複数の認証情報。
canales.al_limite同時通話の上限に近づいています。
cita.confirmada予約がキーパッドで確認されました。
cita.reagendar別の日時を希望されました。人が対応する依頼であり、電話システムが自分で解決するものではありません。
cita.cancelada予約が取り消されました。
desvio.activado転送が有効になりました。
desvio.recordatorio転送がまだ有効のままです。切り忘れた転送は、電話システムでもっともよくある幽霊障害です。
buzon.lleno留守番電話がいっぱいです。これ以降の伝言は失われます。
buzon.casi_lleno留守番電話が満杯に近づいています。まだ手を打てるうちに。
cola.vacia待ち行列に受付中の人がいません。
cola.callback待たずに折り返しを希望した人がいます。
conferencia.entra会議室に入室がありました。
conferencia.sale会議室から退出がありました。
canales.desalojo誰かの保証を守るため、借りていた回線を返しました。
emergencia.marcada内線から緊急番号がダイヤルされました。これによって通話が遅れることはありません。
fax.entrante着信でファクスのトーンを検出しました。
supervision.iniciada誰かが通話を傍らで聞くか、ささやくか、参加しました。「この通話を誰がいつ聞いたか」に答えられることが、監督の道具と盗聴を分けます。
fraude.sospecha不正に見えるふるまいの型です。知らせはしますが、切りません。
filtro.insistenciaある番号の発信回数が多すぎます。
red.solicitud.nuevaネットワーク上の別の回線が、無料で発信する許可を求めています。
red.solicitud.respondidaあなたのアカウントが許可リクエストを承認または拒否しました。
red.permiso.revocadoあなたのアカウントが、ある番号の無料発信の許可を取り消しました。

ライブチャネル実際の通話

Webhookはまとめて送られ、数秒で届きます。ただし、いま画面に出ていなければ意味のないものもあります。同僚が通話中だと示すランプが15秒遅れては役に立ちません。

  • 何が流れるか。 起きたままの通話、新しい伝言、そして各内線のランプの状態。画面上の在席ランプが本当に生きているのはこれのおかげです。
  • 読み取り専用です。APIで 電話機を渡さずにチャネルの利用券を発行できます。何が起きているかを見るために、変更もできてしまう認証情報が必要であってはなりません。
  • Webhookの代わりにはなりません。 ライブチャネルは誰かが見ている画面のためのものです。お客さまのシステムが確実に知る必要があるならWebhookを使ってください。再試行があり、ソケットが開いていることに依存しません。

リファレンス

バッジの読み方

このページの機能にはすべて、どのように確認したかを示すバッジが付いています。まだ実行していないものも、そう明記したうえで掲載します。お客さまがご自分で気づくほうが悪いからです。

バッジ何をするか件数
実際の通話実際に通話を行い、ここに書いてあるとおりに動きました。14
テスト通話稼働中の電話システムに対する本物の通話で、キーも実際に押しています。ただし音声はなく、聞いている人もいません。かけた人が話すことに依存するものは、まだ試していません。3
実機の電話実機の電話が登録して確認しました。1
APIで公開APIで実行しました。47
テストベンチテストベンチで、使い捨てのデータベースに対して実行しました。13
未実施コードは存在して読み込まれますが、まだ誰も動かしていません。36

114件の機能。2026-09-19に電話システムから数えました。

バッジは機能単位のもので、1行単位ではありません。1つの機能が複数のコードにまたがる場合、そのすべてにグループの水準を表示します。つまりバッジは実際に試した範囲より控えめに出ることはあっても、大きく出ることはありません。約束として読まれるページで間違えてよいのは、その方向だけです。

用語集

電話システムだけが使う言葉。

用語何をするか
内線社内の人または席で、ほかの人がダイヤルする短い番号を持ちます。電話機のことではありません。1つの内線が複数の端末を持てます。
番号(DID)外の人がお客さまに到達するために押すものです。番号は内線やグループ、メニューなど何かを指し、その先を決めるのはお客さまです。
鳴らすグループ同じ通話で複数の内線が鳴る仕組み。単純で、誰がどれだけ待っているかは知りません。
待ち行列(キュー)列も管理するグループ。順番、実測の待ち時間、受付中の人を把握し、折り返しを提案できます。
音声メニュー(IVR)「営業は1」。メニューの中にメニューを置けますし、かけた人はいつでも戻るか、人に到達できます。
同時通話(チャネル)進行中の会話1件。10チャネルなら、電話機の台数にかかわらず同時に10件です。
通話明細(CDR)通話1件につき1行。誰が、いつ、どれだけ、どの経路で、どう終わったか。請求はここから組み立てます。
在席ランプ同僚が空いているか、呼び出し中か、通話中かを、かけて確かめずに示す表示。
キーパッドのトーン(DTMF)キーを押したときに電話機が出す音。メニューも、留守番電話も、このページのすべてのコードも、これで聞き取っています。
追っかけ(フォローミー)内線と一緒に、あるいは内線の代わりに携帯を鳴らします。小規模な電話システムでもっとも使われる機能です。
保留(パーク)番号のついた場所に通話を置いて、誰でも、どの電話機からでも、その番号を押して取り出せるようにすること。
取り次ぎ転送通話を渡す前に同僚と話すこと。戻して自分で受け直すこともできます。

VOICEに戻る