Widget settings
Every chat window setting in the app: fields with limits and defaults, roles, saving, preview, embedding status and generating a new key.
In plain language
Every assistant has its own chat window. This page describes all of its settings. For each field it names the limits and the default. It says who may change what. It explains what happens when you save. It also says when a change reaches your website. In the preview you see the window first.
All documentation topics
Every assistant comes with its own chat window. This page covers all of its settings in the section Chat window on your website: each field with its limits and default, who may change what, what happens when you save, when a change reaches your website, what the preview and the embedding status show, and how to generate a new key. How the line of code gets onto your website is explained under Embed the widget.
Where the settings are
Open Work › Assistants (app.xicbot.de/assistenten) and click Edit next to the assistant you want; with the Read role the button is labelled View. The panel that opens contains the section Chat window on your website with the note “The chat window runs in its own frame. It can neither read nor change the page it sits on.” Close collapses the panel again.
The section has four parts: at the top the form with every setting and the Save button, below it the embed codes for copying, then the Embedding on your website display with the preview, and at the end the Public key part. The settings apply per assistant: each assistant has its own chat window with its own key and its own embed code.
Who may change what
| Role | Allowed | What the app shows |
|---|---|---|
| Read | View all settings, copy the embed code, open the preview. | Above the panel it says “With the Read role this area is view-only. Changes need at least the Edit role.” All fields and Save are locked, and Choose file is missing. |
| Edit | In addition, change and save every field. | Below the key it says “Generating a new key needs the Administration or Owner role.” instead of showing the Generate a new key button. |
| Administration, Owner | In addition, generate a new key and delete the assistant. | All fields and the Generate a new key button. |
The service checks the role itself, not only the app. It refuses a save without the Edit role, and the app reports “With the Read role this area is view-only. Changes need at least the Edit role.” A new key without the Administration role ends with “This needs at least the Administration role.” Everything on this page also requires being signed in, an active account and a confirmed email address. How roles are assigned is covered under Team and roles.
All fields at a glance
None of the fields is required. The browser already rejects values outside the limits when you save, and the service checks them a second time. The table lists each label as it appears in the app, in the order of the form, together with what is allowed and what applies as long as you change nothing. Numbers are whole numbers.
| Field | Values and limits | Default |
|---|---|---|
| Enable chat window | on or off | off |
| Heading in the window | text, at most 80 characters | empty, the assistant's name applies |
| Window corner | bottom right, bottom left, top right, top left | bottom right |
| Distance from the side edge (px) | 0 to 400 | 20 |
| Distance from the top or bottom edge (px) | 0 to 400 | 20 |
| Window width (px) | 280 to 720 | 384 |
| Window height (px) | 320 to 1200 | 620 |
| Scale (%) | 80 to 150 | 100 |
| Corner radius (px) | 0 to 40 | 18 |
| Image in the title bar | PNG, JPEG or WebP, stored as a square of 96 pixels per edge | no image |
| Colour | colour picker, stored as #RRGGBB | #4f46e5 |
| Proactive outreach | up to 5 rules, each an event and a sentence; the sentence has at most 200 characters, a path filter starts with / and has at most 120 characters | no rule |
| Accept files from visitors | on or off | off |
| Consent before the first conversation | on or off | off |
| Consent wording | text, at most 500 characters, editable only while consent is switched on | empty, the default wording applies |
| Allowed domains | text, at most 500 characters | empty, any website may embed |
| Your own path on your domain | address with http:// or https://, at most 200 characters, without ? and # | empty, no own path |
A number field you clear is saved with its default. An empty text field counts as not set, so the default from the table applies.
Enabling the chat window
The Enable chat window switch carries the note “Only with this setting does the snippet answer on other sites. Without it, it stays inert.” In addition, the assistant's Status under Basics must be active. If either is missing, the service answers the embed code as if the assistant did not exist, and the loader removes the trigger from the screen. The same happens when the account is not active or a demo has expired.
Switching it off leaves the other settings, the key and the embed code untouched. Once you switch it back on, the existing code on your pages works again. To take the chat window offline for a while, use this switch or the Status, not a new key. More on the two switches is under Assistants and Embed the widget.
If you delete the assistant (Administration or Owner role), all settings in this section and the key go with it, and the embed code no longer finds an assistant. Deleting is described under Assistants.
Heading, colour and image
Heading in the window
Heading in the window takes up to 80 characters. If it stays empty, the window shows the assistant's name, and the app displays that name as a placeholder in the empty field. Screen readers use the same heading as the name of the window and, while it is closed, of the trigger.
Colour
Colour opens the browser's colour picker, and the chosen value is shown next to it as #RRGGBB. The service accepts only this six-digit hexadecimal form. The colour fills the trigger and the brand areas inside the window. The field comes with the note “The text colour inside the window is derived from this colour so contrast holds up on light tones as well.” Text on the colour is set to either black or white; there is no separate text colour setting.
If the embed code carries its own data-farbe, it only applies until the window has loaded the settings from the service; after that the colour from the app wins. The same goes for data-platz and data-senkrecht versus Window corner. The precedence is described under Script attributes.
Image in the title bar
Use Choose file to load a PNG, JPEG or WebP image; Remove image clears the field. Both only take effect with Save. The image appears in the title bar of the window and on the trigger. Cropping, limits, messages and display are covered under Image in the title bar.
Position and size
Window corner offers bottom right, bottom left, top right and top left. That is where the trigger sits and where the window opens. Distance from the side edge (px) and Distance from the top or bottom edge (px) come with the note “Measured from the trigger to the respective window edge. On devices with a rounded screen the protected margin is added on top.” Which edge is meant follows from the chosen corner.
Window width (px) and Window height (px) carry the note “A target size. On a small screen less applies so the window stays in view; up to 560 pixels of width it fills the whole area.” Precisely: the width is at most the browser window width minus the side distance and 16 pixels. The height is at most the browser window height minus 32 pixels and minus the distance the chat window keeps from the edge; that distance is the edge distance plus the trigger size plus 12 pixels. If an element of your page covers the trigger’s spot, such as a consent banner, the trigger moves vertically away from it. The window moves by the same amount, and its maximum height shrinks accordingly. If the browser window is 560 pixels wide or less, the chat window fills the whole area.
Scale (%) carries the note “Affects the trigger and the text size inside the window. 100 means unchanged.” At 100 the trigger measures 56 pixels and the base text 16 pixels, at 150 they are 84 and 24 pixels, and at 80 they are 45 and 12.8 pixels. Scaling leaves the width and height of the window unchanged.
Corner radius (px) rounds the corners of the window and of the trigger; 0 gives sharp corners. On the trigger the radius goes up to half of its edge length at most, which makes a circle. With the defaults (radius 18, trigger 56 pixels) it is a square with rounded corners. When the window fills the whole area on a narrow screen, its corners are square.
Proactive outreach
The note on this field reads “One event and one sentence per rule. The first rule that applies speaks; after that the widget stays quiet for this visit. Without a rule nothing appears unasked.” Add rule adds another rule, up to five; a counter such as 2/5 shows how many there are, and at five rules the button disappears. The app drops rules without a sentence when you save. The sentence of a rule has at most 200 characters; a path filter starts with / and has at most 120 characters, otherwise the service refuses to save. Events, path filters and order are covered under Proactive outreach.
Files from visitors
Accept files from visitors names the limits in its note: “Images and PDF, at most 5 MB and five files per conversation.” Allowed are PNG, JPEG, WebP and PDF, recognised by the file content; SVG, Office formats and archives are excluded. The window offers a file picker only while the switch is on, and not in the preview.
While the switch is off, the service refuses every file. A page still open with the old setting then reports “Files are not enabled here.” How visitors send files is covered under Chat in the widget.
Consent before the first conversation
The Consent before the first conversation switch carries the note “The window then shows a gate: without agreement nothing can be typed and nothing can be sent. Whoever declines closes the window without a conversation coming into being.” The Consent wording field can only be edited while the switch is on and takes up to 500 characters. Its note: “Leaving it empty means our default wording applies, in the language of the window.” The default wording is:
| Window language | Default wording |
|---|---|
| German | Ich bin damit einverstanden, dass mein Gespräch gespeichert und zur Beantwortung meiner Frage verarbeitet wird. |
| English | I agree that my conversation is stored and processed in order to answer my question. |
The window language follows data-sprache in the embed code (de or en), otherwise the language of the active version, otherwise German. Your own wording is shown exactly as written, whatever the window language.
After saving, the embed code also carries data-einwilligung="erforderlich". Replace the code on your pages: without this attribute the loader loads the window and its settings as soon as your page has loaded, that is, before any consent. The service itself requires consent from that moment on and refuses to start a conversation without it. Along with the consent it stores the time and a SHA-256 fingerprint of the wording the visitor agreed to, the privacy policy version and the page. That wording is your Consent wording, or, if the field is empty, the default text in the language of the window. More under Script attributes and Consent and visitor rights.
Allowed domains
The note on this field reads “One per line. Subdomains are included. Empty means any website may embed the window.” The field takes up to 500 characters. Besides line breaks, commas also separate entries; surrounding spaces and upper or lower case make no difference. Enter domain names only, without https:// and without a path: the comparison uses the domain name of the page. An entry example.com allows example.com and shop.example.com.
The check happens when a conversation starts: the page the window runs on has to match an entry or be a subdomain of one. If the list has entries and no page is known, the service refuses as well. The window then shows “This chat is not enabled for this website.” The list does not affect loading and displaying the window, nor the Embedding on your website display. More under Embed the widget.
Your own path on your domain
With Your own path on your domain, the window and its requests run through an address on your domain, such as https://example.com/chat. A full address with http:// or https:// and a host name is allowed, at most 200 characters, without ? and without #. Trailing slashes are removed on saving. The browser already rejects an incomplete address; if the address breaks one of the other rules, the service rejects it. The app then states the reason below the field, for example “The address of your own path must not contain “?” or “#”.”, and also reports “Please check the marked fields.” The note on the field ends with “Empty means no own path is set up.”
The matching Embed code via your own address only appears once the path has been saved. Until then its place shows “As soon as an own path is entered above and saved, the matching embed code appears here.” What your server has to forward for this is described under Embed the widget.
Saving
Save applies every field in the section at once. While the request runs the button reads “Saving …”, then the app reports “Saved.” The settings belong to the assistant, not to a version: they take effect without publishing, and restoring an older version leaves them unchanged.
- Empty text fields are saved as not set, so the respective default applies.
- Cleared number fields are saved with their defaults: 20, 20, 384, 620, 100 and 18.
- Proactive outreach rules without a sentence are dropped.
- Afterwards the app reloads the embed codes and the embedding display. If only this step fails, the settings are still saved; the app then reports “Saved. The embed code for “…” could not be reloaded afterwards. Open that assistant again to see it.” and, instead of the codes, shows “The current state could not be loaded.”
- Each signed-in person has 30 actions per minute. Besides this Save, they include Save under Basics, creating assistants, publishing and restoring versions, Generate a new key, creating and changing tools, and creating and changing check questions and starting runs in Acceptance. Beyond that the app reports “Too many attempts. Please wait a moment.”
When changes reach your website
Every page that loads after you save receives all settings. A page that is already open checks back at most once a minute, namely when the visitor opens the window or returns to the tab. If that check fails, everything stays as it is.
| Setting | On a page that is already open |
|---|---|
| Heading, colour, corner, distances, width, height, scale, corner radius, image | Change at the next check, without the page reloading. |
| Proactive outreach, files, consent | Apply in the window after the page next loads. The service does, however, refuse files at once when the switch is off, and once consent is switched on it is required at once: for new conversations and for every further message in conversations that began without it. An open window then shows the consent prompt; the previous conversation disappears from the window, and a new one begins after consent. If you change the Consent wording while an open window still shows the consent prompt with the previous wording, agreeing to it starts no conversation (422 consent_changed): the window shows the current wording and asks for consent again. |
| Enablement off, status not active, new key, assistant deleted | The service refuses every further request at once. On an open page the trigger disappears as soon as a visitor opens the window to start a new conversation, and at the latest on the next page load. The regular check for changed settings does not remove it. |
| Allowed domains | Apply from the next conversation start. |
| Own path | Only takes effect through the new embed code you put on your pages. |
Copying the embed code
Below the form there are up to two embed codes in read-only fields, each with a Copy embed code button. First Embed code via your own address with the note “The recommended route: window and requests run through your domain, the visitor talks to no external address.”, then Embed code via our address with the note “This line belongs in the head of every page the window should appear on. The visitor loads the window from our address.” Every role can view and copy them.
If no own path has been saved yet, the first position reads “As soon as an own path is entered above and saved, the matching embed code appears here.” After copying, the app reports “Embed code copied.” If the browser refuses access to the clipboard, you see “Copying was not possible. Please select the text by hand.” While the codes are loading it says “Loading …”, and if they could not be loaded, “The current state could not be loaded.” This is what an embed code via the own path https://example.com/chat looks like with consent switched on, where … stands for your key:
index.html html
<script src="https://example.com/chat/einbetten.js" data-xicbot="…" data-basis="https://example.com/chat" data-einwilligung="erforderlich" defer></script>Where the line goes and how the two routes differ is covered under Embed the widget, and every attribute of the line under Script attributes.
Embedding and preview
The Embedding on your website display shows when and on which page the window last loaded on an external page, for example “Last loaded: 28/09/2026, 14:05:00” and “Page: www.example.com”. If that has not happened yet, it says “The window has never loaded on your website.” When an entry is written, when it changes and what it does not tell you is covered under Check the embedding.
Show preview opens the window below the display, and Close preview closes it again; every role can open the preview. What it shows and what it does not is covered under Preview in the app.
Public key
At the end of the section, Public key shows the key itself, the same value as data-xicbot in the embed code. With Generate a new key the Administration and Owner roles replace it, and the current embed code stops working at once. How the exchange works, what the app reports and what to have ready beforehand is covered under Public key. To switch off temporarily, Enable chat window is the better choice.
Messages
| Message | When |
|---|---|
| Saved. | Saving succeeded. |
| Saved. The embed code for “…” could not be reloaded afterwards. Open that assistant again to see it. | Saving succeeded; only reloading the embed codes failed. Instead of the codes the panel shows “The current state could not be loaded.” |
| Saving … | On the button while saving is in progress. |
| This file could not be read as an image. | The chosen file is not a readable image; the previous image stays. |
| Embed code copied. | Copying worked. |
| Copying was not possible. Please select the text by hand. | The browser does not allow access to the clipboard. |
| Loading … | The embed codes and the embedding display are still loading. |
| The current state could not be loaded. | The embed codes and the embedding display could not be loaded. |
| The delivered widget file could not be read. The embed code is shown, but the delivery itself should be checked. | While putting the embed codes together, the service could not read the delivered widget file. |
| The window has never loaded on your website. | No external page has loaded the window yet. |
| The new key is active. Please replace the embed code everywhere. | A new key was generated. As a rule the new embed code has then already loaded; if the assistant was collapsed and expanded again during the rotation, the view loads it itself and shows Loading … until then. |
| The new key is active and the previous embed code no longer loads. The new embed code could not be loaded. Open the assistant again to see it, then replace it everywhere. | A new key was generated, only the new embed code did not arrive afterwards. The new key is already valid; instead of the codes the panel shows “The current state could not be loaded.” |
| The new key for “…” is active and the previous embed code no longer loads. Open that assistant to see the new embed code, then replace it everywhere. | A new key was generated, and the assistant was no longer open when the rotation finished, for example because another one has been opened in the meantime. The ellipsis stands for its name. |
| With the Read role this area is view-only. Changes need at least the Edit role. | In the open panel with the Read role, or the service refused a save without the Edit role. |
| This needs at least the Administration role. | The service refused a new key without the Administration role. |
| Too many attempts. Please wait a moment. | More than 30 of the actions listed above in the Saving section within one minute. |
| Please check the marked fields. | On Save the service rejected entries, and the app states the reason for each at the field concerned. |
| The image could not be used. Choose a PNG, JPEG or WebP file. | Under Image in the title bar: the service rejected the image, for example because it is too large. |
| The path of a rule must start with “/” and be no longer than 120 characters, for example /contact. | Under Proactive outreach: a path filter does not start with / or is longer than 120 characters. |
| A proactive outreach rule is not valid. Check the event, value, path and sentence of each rule. | Under Proactive outreach: the service rejected a rule for another reason. |
| Enter the full address of your own path, with http:// or https:// and your domain, for example https://example.com/chat. | Under Your own path on your domain: the address lacks the scheme or the domain. |
| The address of your own path must start with http:// or https://. | Under Your own path on your domain: the address starts with a different scheme. |
| The address of your own path must not contain “?” or “#”. | Under Your own path on your domain: the address contains ? or #. |
| This entry no longer exists. Reload the page to see the current state. | On Save or with a new key, if the assistant no longer exists, for example because it was deleted in another window. |
| That did not work. Please check your entries. | On Save the service rejected at least one entry whose reason the app does not show at any field. Marked fields still state their reason. |
| Not saved: the entry in the audit log could not be written. Please try again. | On Save or for a new key the audit log entry could not be written. The change has not been applied; after a failed key change the old key stays valid. |
| The service is not responding right now. | No connection to the service. |
| The service reported an error. Please try again later. | An error on the service side. |
| This area stays locked until the email address is confirmed. | The service refused a request because the email address of your login has not been confirmed yet. |
| This account is locked. Please write to mail@xicbot.de. | The account is not active; the service refuses requests from the app. |
| This chat is not enabled for this website. | In the window on your page when a conversation starts, for example because the page matches no entry under Allowed domains. |
| This chat is not available. | In the window or the preview: chat window not enabled, assistant not active, key unknown or account not active. |
| This assistant is not ready yet. | In the window or the preview: chat window enabled and assistant active, but no version published yet. |
| Please give your consent first. A new conversation will then begin. | In the window, if consent has been switched on but has not yet reached the window or the conversation: when a conversation starts, when the history reloads or at the next message. The previous conversation disappears from the window and the consent prompt appears; a question just typed stays in the field. |
| Consent is required before the chat can start. | In the window after the previous message, if the current settings could not be fetched, so the consent prompt cannot appear. |
| Files are not enabled here. | In the window: a file arrived while Accept files from visitors is off. |
Via the API
The same settings can be set through the API. The fields are named as follows:
| Field in the app | API field |
|---|---|
| Enable chat window | widget_enabled, true or false |
| Heading in the window | widget_title |
| Window corner | widget_position (right, left) and widget_vertical (bottom, top) |
| Distance from the side edge (px), Distance from the top or bottom edge (px) | widget_offset_x, widget_offset_y |
| Window width (px), Window height (px) | widget_width, widget_height |
| Scale (%), Corner radius (px) | widget_scale, widget_radius |
| Image in the title bar | widget_avatar, a data: address of at most 70000 characters, or null |
| Colour | widget_color |
| Proactive outreach | widget_outreach_rules |
| Accept files from visitors | widget_attachments |
| Consent before the first conversation, Consent wording | widget_consent, widget_consent_text |
| Allowed domains | widget_domains, a single text |
| Your own path on your domain | widget_base_url |
PUT /api/v1/assistants/{id}
Updates the settings. Only the fields in the request change; a rejected value returns 422. Without an audit log entry the service answers 500 with not_logged, and nothing changes.
- Authentication
- Signed in, confirmed email address, Edit role or higher
- Rate limit
- 30 per minute per person, shared with the actions listed under Saving
GET /api/v1/assistants/{id}/embed
Returns, among other things, the embed codes (snippet, snippet_first_party), the key (key) and the embedding status (seen_at, seen_host; null means not loaded yet).
- Authentication
- Signed in, confirmed email address, any role
POST /api/v1/assistants/{id}/key
Generates a new key and returns it as key. The old one stops being valid at once. Without an audit log entry the service answers 500 with not_logged, and the old key remains.
- Authentication
- Signed in, confirmed email address, Administration role or higher
- Rate limit
- 30 per minute per person, shared with the actions listed under Saving
All assistant endpoints are described under Knowledge and assistant endpoints, the public window endpoints under Widget endpoints and the rate limits under API limits.
Further reading
- Embed the widget: embedding routes, domain list, own path and checking the embedding.
- Script attributes: every attribute of the embed line and their precedence.
- Appearance and accessibility: how the window looks and works for visitors.
- Proactive outreach: rules, events and the speech bubble.
- Consent and visitor rights: the gate, withdrawal and access requests.
- JavaScript and storage: what the window stores in the browser.
- Widget delivery: where the window's files come from.
- Assistants: basics, status, versions and deleting.
Frequent questions
Why don't I see a change on my website?
First check that the message “Saved.” appeared after Save. A page that is already open picks up heading, colour, position, size and image only when the visitor opens the window or returns to the tab, at most once a minute; everything else after the next page load. If the embed code contains data-farbe, data-platz or data-senkrecht, the value from the app still wins once the settings have loaded. A change to the own path needs the new embed code. A changed Consent wording reaches a window that already shows the consent prompt at the next agreement: the visitor then sees the new wording and agrees again.
How do I switch the chat window off for a while?
Switch off Enable chat window and save, or set the Status under Basics to paused. The service then refuses every request. The trigger disappears from your pages on the next page load, and on a page that is already open as soon as a visitor tries to start a new conversation there; you do not need to remove the line from the embed code. Settings, key and embed code stay unchanged, and once you switch back on, the existing code works again. A new key is the wrong tool here, because it invalidates the existing code for good.
Why doesn't the preview show my change?
The preview shows the saved state. Save first, then close the preview with Close preview and open it again with Show preview.
Why does the embedding display show a page that is not on my domain list?
The display records where the window loaded, regardless of Allowed domains. The list only applies when a conversation starts: on a page outside the list the window loads, but no conversation can be started there. If it shows a page you do not know, your embed code is running there as well. Enter your domains; if the code should not load there at all, generate a new key and replace it on your own pages.
Can I set the text colour myself?
No. It is derived from the Colour: black on light tones, white on dark ones, so that the contrast holds. Choose a different Colour if you do not like the result.
Ask it yourself, Assistant of this website
Automated assistant