curl --request POST \
--url https://app.famulor.io/api/v1/widget-connectors \
--header 'Content-Type: application/json' \
--data '
{
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": [
"<string>"
],
"voice_enabled": true,
"chat_enabled": true,
"is_active": true,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": false,
"chat_attachments_enabled": true,
"launcher_label": "none",
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"logo_url": "<string>",
"launcher_text": "<string>",
"logo_source": "assistant"
},
"phone_verification_enabled": false,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
'import requests
url = "https://app.famulor.io/api/v1/widget-connectors"
payload = {
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": ["<string>"],
"voice_enabled": True,
"chat_enabled": True,
"is_active": True,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": False,
"chat_attachments_enabled": True,
"launcher_label": "none",
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"logo_url": "<string>",
"launcher_text": "<string>",
"logo_source": "assistant"
},
"phone_verification_enabled": False,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
assistant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
allowed_origins: ['<string>'],
voice_enabled: true,
chat_enabled: true,
is_active: true,
theme: {
chat_reply_delay: {mode: 'disabled', seconds: 3},
screen_sharing_enabled: false,
chat_attachments_enabled: true,
launcher_label: 'none',
primary_color: '<string>',
title: '<string>',
greeting_text: '<string>',
logo_url: '<string>',
launcher_text: '<string>',
logo_source: 'assistant'
},
phone_verification_enabled: false,
phone_verification_accepted_credits: 123,
verification_method: 'sms'
})
};
fetch('https://app.famulor.io/api/v1/widget-connectors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.io/api/v1/widget-connectors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assistant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'allowed_origins' => [
'<string>'
],
'voice_enabled' => true,
'chat_enabled' => true,
'is_active' => true,
'theme' => [
'chat_reply_delay' => [
'mode' => 'disabled',
'seconds' => 3
],
'screen_sharing_enabled' => false,
'chat_attachments_enabled' => true,
'launcher_label' => 'none',
'primary_color' => '<string>',
'title' => '<string>',
'greeting_text' => '<string>',
'logo_url' => '<string>',
'launcher_text' => '<string>',
'logo_source' => 'assistant'
],
'phone_verification_enabled' => false,
'phone_verification_accepted_credits' => 123,
'verification_method' => 'sms'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.io/api/v1/widget-connectors"
payload := strings.NewReader("{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.famulor.io/api/v1/widget-connectors")
.header("Content-Type", "application/json")
.body("{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/widget-connectors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"public_key": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": [
"<string>"
],
"voice_enabled": true,
"chat_enabled": true,
"is_active": true,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": false,
"chat_attachments_enabled": true,
"launcher_icon": "milian",
"launcher_label": "none",
"launcher_label_i18n": {},
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"position": "bottom-right",
"display_mode": "floating",
"logo_url": "<string>",
"launcher_text": "<string>",
"presence_mode": "visualizer",
"logo_source": "assistant"
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"phone_verification_enabled": false,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Create web widget
Required scope: assistants:write. Requires the Web widget feature in the workspace plan. allowed_origins is optional (defaults to []); an empty allowlist blocks third-party hosts until origins are added. New widgets default to theme.logo_source=assistant and follow the selected assistant’s current profile picture, including future changes. An explicit logo_url defaults to the custom source; an explicit logo_source takes precedence. Existing widgets keep their saved source. Phone verification requires explicit acceptance of the current verification SMS credit price. Previously issued browser permissions expire after at most 7 days and are revoked when this widget configuration changes.
curl --request POST \
--url https://app.famulor.io/api/v1/widget-connectors \
--header 'Content-Type: application/json' \
--data '
{
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": [
"<string>"
],
"voice_enabled": true,
"chat_enabled": true,
"is_active": true,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": false,
"chat_attachments_enabled": true,
"launcher_label": "none",
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"logo_url": "<string>",
"launcher_text": "<string>",
"logo_source": "assistant"
},
"phone_verification_enabled": false,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
'import requests
url = "https://app.famulor.io/api/v1/widget-connectors"
payload = {
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": ["<string>"],
"voice_enabled": True,
"chat_enabled": True,
"is_active": True,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": False,
"chat_attachments_enabled": True,
"launcher_label": "none",
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"logo_url": "<string>",
"launcher_text": "<string>",
"logo_source": "assistant"
},
"phone_verification_enabled": False,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
assistant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
allowed_origins: ['<string>'],
voice_enabled: true,
chat_enabled: true,
is_active: true,
theme: {
chat_reply_delay: {mode: 'disabled', seconds: 3},
screen_sharing_enabled: false,
chat_attachments_enabled: true,
launcher_label: 'none',
primary_color: '<string>',
title: '<string>',
greeting_text: '<string>',
logo_url: '<string>',
launcher_text: '<string>',
logo_source: 'assistant'
},
phone_verification_enabled: false,
phone_verification_accepted_credits: 123,
verification_method: 'sms'
})
};
fetch('https://app.famulor.io/api/v1/widget-connectors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.io/api/v1/widget-connectors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assistant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'allowed_origins' => [
'<string>'
],
'voice_enabled' => true,
'chat_enabled' => true,
'is_active' => true,
'theme' => [
'chat_reply_delay' => [
'mode' => 'disabled',
'seconds' => 3
],
'screen_sharing_enabled' => false,
'chat_attachments_enabled' => true,
'launcher_label' => 'none',
'primary_color' => '<string>',
'title' => '<string>',
'greeting_text' => '<string>',
'logo_url' => '<string>',
'launcher_text' => '<string>',
'logo_source' => 'assistant'
],
'phone_verification_enabled' => false,
'phone_verification_accepted_credits' => 123,
'verification_method' => 'sms'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.io/api/v1/widget-connectors"
payload := strings.NewReader("{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.famulor.io/api/v1/widget-connectors")
.header("Content-Type", "application/json")
.body("{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/widget-connectors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"allowed_origins\": [\n \"<string>\"\n ],\n \"voice_enabled\": true,\n \"chat_enabled\": true,\n \"is_active\": true,\n \"theme\": {\n \"chat_reply_delay\": {\n \"mode\": \"disabled\",\n \"seconds\": 3\n },\n \"screen_sharing_enabled\": false,\n \"chat_attachments_enabled\": true,\n \"launcher_label\": \"none\",\n \"primary_color\": \"<string>\",\n \"title\": \"<string>\",\n \"greeting_text\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"launcher_text\": \"<string>\",\n \"logo_source\": \"assistant\"\n },\n \"phone_verification_enabled\": false,\n \"phone_verification_accepted_credits\": 123,\n \"verification_method\": \"sms\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"public_key": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"allowed_origins": [
"<string>"
],
"voice_enabled": true,
"chat_enabled": true,
"is_active": true,
"theme": {
"chat_reply_delay": {
"mode": "disabled",
"seconds": 3
},
"screen_sharing_enabled": false,
"chat_attachments_enabled": true,
"launcher_icon": "milian",
"launcher_label": "none",
"launcher_label_i18n": {},
"primary_color": "<string>",
"title": "<string>",
"greeting_text": "<string>",
"position": "bottom-right",
"display_mode": "floating",
"logo_url": "<string>",
"launcher_text": "<string>",
"presence_mode": "visualizer",
"logo_source": "assistant"
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"phone_verification_enabled": false,
"phone_verification_accepted_credits": 123,
"verification_method": "sms"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Body
Optional site origins that may embed the widget (e.g. https://example.com). Empty or omitted blocks third-party hosts.
Widget appearance. launcher_label_i18n is derived from launcher_label and is read-only — never persist client-supplied maps.
Show child attributes
Show child attributes
Require the selected email or SMS verification before chat or voice. Available in root workspaces, including a reseller’s own workspace; unavailable to reseller customer workspaces.
Explicitly accept the current per-SMS price from the widget list response. Currently 80 credits per accepted send, including resends; code checks and valid remembered visits are free.
Verify visitors by SMS or email. Email uses the platform sender without additional credits.
sms, email Response
Created widget.
Show child attributes
Show child attributes