Skip to content
XICBOT

Settings

Deutsch
Documentation · API reference

Knowledge and assistant endpoints

App API endpoints for knowledge sources, search, probe sets, setup, assistants, acceptance checks and tools, with fields, roles and errors.

In plain language

These endpoints let the app manage knowledge and assistants. You create knowledge sources. You keep pairs of question and answer. You check how well the search finds things. You set up an assistant from your website. You manage assistants, their versions and the code to embed them. For each endpoint you must be signed in to the app.

Last updated

All documentation topics

This page covers the app API endpoints for managing knowledge sources, question-and-answer pairs, the search probe set, setup from your own website, assistants with their versions and embed code, acceptance checks and tools. Every endpoint sits under /api/v1/ and requires you to be signed in to the app. Connections that use an API key are described under Integration.

Access, roles and throttles

Every endpoint on this page requires a valid sign-in as described under Authentication, an active account and a confirmed email address. Any role may read; search and the test question are open to every role as well, since they write nothing. Any change to your data needs at least the Edit role. Deleting an assistant and replacing its public key are reserved for the Administration role.

Role in the appIdentifierRank
Readviewer10
Editeditor20
Administrationadmin30
Ownerowner40

How roles are assigned is explained under Team and roles.

Throttles

Some endpoints carry a named throttle. It counts per signed-in user and minute; above it you receive 429. The general rules are under Limits.

ThrottleRequests per minuteEndpoints
knowledge-sources20create source, re-read, restore version, rebuild vectors, start setup
knowledge-search60POST /knowledge/search
knowledge-ask30POST /knowledge/ask
knowledge-probes6POST /knowledge/probes/run
knowledge-tune2POST /knowledge/probes/tune
assistants30create and change assistants, versions, replace key, start acceptance run, create or change check questions, create and change tools

Common errors

StatusIdentifierMeaning
403email_unverifiedThe email address has not been confirmed yet.
403no_tenant, tenant_…No account, or the account is not active; the suffix states its status.
403role_too_lowYour role is not sufficient; required names the role needed.
402plan_limit_reachedThe plan limit has been reached; allowed, used and plan_name give the limit, current use and plan.
503plan_limit_unmeasuredUsage could not be measured just now; the request was not carried out.
404not_foundThe entry does not belong to your account or does not exist.
422field errorsA value breaks the rules in the tables below.
429–The throttle is used up.
500not_loggedThe audit entry could not be written, so the change was not carried out.

How many sources, documents, chunks and assistants your plan allows is listed under Plans and quotas and on the pricing page.

Knowledge sources

In the app, sources live under Knowledge (app.xicbot.de/wissen). What a source is and how answers are built from it is explained under Knowledge and Knowledge and answers.

GET /api/v1/knowledge/sources

Lists the account’s sources, newest first, up to 200. The response also carries the vector status (vectors), the enrichment status with keywords and questions (enrichment) and the limits of the input fields (limits).

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Field in limitsValueMeaning
chunk_default_chars800default Chunk size in characters
chunk_overlap_default_chars120default Overlap in characters
chunk_defaults_by_typetarget, overlap per typedefault per source type; files start at 1400 and 200
chunk_min_chars, chunk_max_chars200, 4000smallest and largest chunk size you can set
exclude_max_patterns50maximum number of Excluded paths per source
exclude_max_length300maximum length of one pattern in characters
crawl_max_pages25maximum pages one pass over a website reads
refresh_min_days, refresh_max_days1, 365allowed range for refresh_days
refresh_default_daysnumberdefault used when refresh_days is left empty
Field in vectors and enrichmentMeaning
chunkstotal number of chunks
embeddedchunks with a finished vector (vectors only)
enrichedenriched chunks (enrichment only)
pendingchunks still outstanding
modelidentifier of the method that builds the vectors (vectors) or enriches the chunks (enrichment)

Each source appears in the list with these fields:

FieldMeaning
id, type, title, createdidentifier, type, Label, creation time
originfor websites the Start address, for files the original file name
status, erroringestion status and the error, if any, see States
documents, chunksnumber of documents and chunks
version, versions_keptnumber of the version currently answering and how many versions are kept (5)
refresh_daysthe interval entered on the source; null means nothing was entered
last_checked, last_failedtime of the last confirmation (Last confirmed) and the last failure (Failed on)
fresh, fresh_measured, fresh_reasonmeasured for websites only: Current or Stale; otherwise fresh_measured is false with reason not_applicable, and never_checked for websites never confirmed
crawl_truncated, crawl_pending, crawl_measured, crawl_reasonwhether the last pass stopped at the page cap and how many links were left; reason not_applicable for other types, never_crawled before the first pass
chunk_target, chunk_overlap, exclude_patternsthe source’s own settings
pairsnumber of question-and-answer pairs in a source of type faq
pairs_matchableof these, the active pairs with an answer, i.e. those that can answer a question; like pairs, counted only in this list

Source states

statusIn the appMeaning
newnewcreated, ingestion not started yet
runningprocessingthe website is being read
readyindexedcontent is available
failednot indexedingestion failed, error gives the reason
staleoutdateda website has been marked as outdated

GET /api/v1/knowledge/sources/{id}

Returns one source (source) with its documents (documents), sorted by title, up to 200. Each document carries id, title, url, characters, is_draft, published_at and published. Drafts and documents not yet published are included here. documents_total states how many documents the source has, documents_limit the cap of the list (200); if documents_total is larger, the list is cut off.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

POST /api/v1/knowledge/sources

Creates a source. Text and file sources are ingested straight away and return 201, even if ingestion fails: the source then exists with status failed and an error. A website is read in the background; the response is 202 with the source and the job (job with id, status, task). A source of type faq is ready at once and stays empty until you add pairs. There is one per account: if one already exists, the response is 422 with faq_exists and source_id, the ID of the collection new pairs go into. Text, file and website sources are followed by a job that builds the vectors. In the app: New source, then Add source.

Authentication
Signed in, confirmed email address, Edit role or higher; plan limits for sources, documents and chunks
Rate limit
Throttle knowledge-sources: 20 requests per minute per user, see Limits
FieldRequiredRule
typeyestext, file, website or faq (Type of source)
titleyesup to 200 characters (Label)
textfor textup to 1,000,000 characters (Content)
urlfor websitevalid URL, up to 500 characters (Start address)
filefor fileuploaded file (Choose file), sent as multipart/form-data
refresh_daysnowebsite only; integer from 1 to 365
exclude_patternsnowebsite only; list of up to 50 patterns, each up to 300 characters (Excluded paths)
chunk_targetnointeger from 200 to 4000 (Chunk size)
chunk_overlapnointeger from 0 (Overlap); at most half the chunk size takes effect
draftnotext and file only; true or false
published_atnotext and file only; publication date

A website address is checked before the source is created. If it cannot be parsed, uses a scheme that is not allowed, has a name that does not resolve or points to a target that is not allowed, you get 422 with url_unreadable, scheme_not_allowed, name_unresolvable or target_not_allowed.

PUT /api/v1/knowledge/sources/{id}

Changes a source’s settings; PATCH works the same way. All fields are optional: title (up to 200 characters), refresh_days, exclude_patterns, chunk_target, chunk_overlap, with the rules used when creating; null resets refresh_days and exclude_patterns to the default, and for websites also chunk_target and chunk_overlap; title does not accept null. Nothing is ingested: new chunk sizes take effect on the next pass. On a source that is not a website, the following return 422 website_only, with field naming the field concerned, or the first of several in the order refresh_days, exclude_patterns, chunk_target, chunk_overlap: a value for refresh_days, a non-empty list in exclude_patterns that differs from the stored one, and a value for chunk_target or chunk_overlap that differs from the stored one, including null. Still accepted there are null for refresh_days, null or an empty list for exclude_patterns, and the stored list and the stored chunk sizes. Without an audit entry the source stays unchanged; the response is then 500 with not_logged. Response: source.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

DELETE /api/v1/knowledge/sources/{id}

Deletes a source; the audit entry records how many documents and chunks it had. The audit entry is written first, in the same step as the deletion; if it fails, the source stays and the response is 500 with not_logged. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

POST /api/v1/knowledge/sources/{id}/refresh

Re-reads a website (Re-read). With "rebuild": true, unchanged pages are split into chunks again as well (Rebuild completely); you need this after changing the chunk size. If an ingestion or re-read job for this source is already open, waiting or running, it is reused and already_open is true; task then names its kind, source.ingest or source.refresh. A waiting job still picks up a requested rebuild; if the job is already running without one, you get 409 refresh_running. The API also queues the vector build for the source. Source types other than websites return 422 website_only. Response: 202 with job (id, status, task) and already_open.

Authentication
Signed in, confirmed email address, Edit role or higher; plan limits for documents and chunks
Rate limit
Throttle knowledge-sources: 20 requests per minute per user, see Limits

GET /api/v1/knowledge/jobs/{id}

Shows the status of a job from this account: id, task, status, attempts, error, result and finished_at. Use it to follow ingestion, re-reading and vector building. How jobs are processed is described under Background jobs.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

Source versions

GET /api/v1/knowledge/sources/{id}/versions

Lists the versions kept for a source (Versions). current is the version currently answering (answering), kept the number of versions kept (5), and versions the list.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

POST /api/v1/knowledge/sources/{id}/versions/{number}/restore

Brings back an earlier version (Restore). Versions above the one named are discarded. A number that is not before the current one returns 422 not_a_previous_version; one that is no longer kept returns 422 version_not_kept; an open ingestion or re-read job for this source, waiting or running, returns 409 refresh_running. Response: restored, source, current, kept (how many versions are kept at most), discarded (number of discarded versions) and versions (list of versions).

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle knowledge-sources: 20 requests per minute per user, see Limits

POST /api/v1/knowledge/embed

Starts building the missing vectors, for the whole account or, with source_id, for one source. If such a job is already waiting, it is reused. Response: 202 with job, already_open, vectors and enrichment.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle knowledge-sources: 20 requests per minute per user, see Limits

Search and test question

POST /api/v1/knowledge/search

Searches for chunks matching a question without writing an answer. This shows you what an assistant finds for a question.

Authentication
Signed in, confirmed email address, any role
Rate limit
Throttle knowledge-search: 60 requests per minute per user, see Limits
FieldRequiredRule
questionyesup to 2000 characters
source_idnoidentifier of a source to limit the search to
countno1 to 20 hits, default 6
contextnotrue or false, default true: also returns the chunk’s surroundings in the document
languagenolanguage code, up to 5 characters
Hit fieldMeaning
chunk_id, source_ididentifier of the chunk and its source
document, headingdocument title and chunk heading
excerptthe first 400 characters of the chunk
keywords, questionskeywords and questions from enrichment; null means not enriched yet, an empty list means none found
contextsurroundings in the document when context is true
valuehit score, rounded to five places
pathswhich search paths found the chunk

Fields without a value are left out of the hit.

POST /api/v1/knowledge/ask

Asks the knowledge base a test question and returns an answer with citations, as the app shows under Check an answer. If the question matches an active question and answer pair, that pair's answer comes word for word without a model call. Otherwise the answer draws on up to five chunks found by search and, once their coverage is sufficient, up to twelve further chunks from text blocks. The answer is written in the language of the question if that can be identified as German or English. How an answer is produced is explained under Knowledge and answers.

Authentication
Signed in, confirmed email address, any role
Rate limit
Throttle knowledge-ask: 30 requests per minute per user, see Limits
FieldRequiredRule
questionyesup to 2000 characters (Your question)
languagenode or en; applies only if the question cannot be reliably identified as German or English, then with the default de
source_idnoidentifier of a source
Response fieldMeaning
answeredwhether an answer was produced
textanswer text or the refusal
citationscitations with number, chunk_id, document, heading, excerpt
pathmodel for a written answer, qa_pair for an answer taken from a question-and-answer pair, none for a refusal
reasonreason for the refusal, otherwise null
blocksnumber of chunks from text blocks supplied in addition to the hits, see Text blocks; null for a refusal and for an answer from a question-and-answer pair
modelidentifier of the method used

A refusal comes with these reasons and texts:

reasonText
empty_question“Please ask a question.”
nothing_found, not_covered, model_declined, without_citation“The stored knowledge base does not cover this.”
no_model“An answer is not possible right now. Please try again later.”

Question-and-answer pairs

Without source_id, a new pair goes into the oldest source of type faq; if there is none, one is created. Its title follows the locale of the signed-in person (Account and profile): “Questions and answers” for en, otherwise “Fragen und Antworten”. That new source counts against the plan limit for sources; if the limit is reached, no pair is created and the response is the same as when creating a source. With source_id you name the source yourself.

GET /api/v1/knowledge/qa-pairs

Lists the pairs, ordered by position, creation time and identifier, up to 500; with source_id, only those of one source. Each pair carries id, source_id, question, answer, variants, position, is_active and created. It also returns matching: limit states how many active pairs with an answer the answer search compares at most (300, in the order of this list), active how many such pairs exist. If active is greater than limit, the rest never match. variants states the limits for the variants of a pair: max (20) and length (500 characters per variant).

Authentication
Signed in, confirmed email address, any role
Rate limit
none

POST /api/v1/knowledge/qa-pairs

Creates a pair. A pair without an answer is stored as inactive. Duplicate variants are dropped. Without an audit entry no pair is created; the response is then 500 with not_logged. Response: 201 with pair.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none
FieldRequiredRule
questionyesup to 500 characters
answernoup to 5000 characters
variantsnoup to 20 alternative phrasings, each up to 500 characters
positionno0 to 9999
is_activenodefault true; false without an answer
source_idnoidentifier of a source in your account; an unknown one returns 404 not_found

PUT /api/v1/knowledge/qa-pairs/{id}

Changes a pair; all fields optional, same rules as for creating. If the answer ends up empty, the pair becomes inactive. variants replaces the list of variants, dropping duplicates; without variants it stays as it is. Without an audit entry the pair stays unchanged; the response is then 500 with not_logged. Response: pair.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

DELETE /api/v1/knowledge/qa-pairs/{id}

Deletes a pair. Without an audit entry it stays; the response is then 500 with not_logged. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

Probe set and weighting

The Probe set measures whether search finds the expected document for a question. A probe line consists of a Question and the Expected document. A run only queries your own search, with no model and no outside network, so it runs directly within the request. Each account can hold 100 probe lines; search looks down to position 10.

GET /api/v1/knowledge/documents

Lists the documents you choose an expected document from: id, title, source_title; up to 500, limit states the number.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

GET /api/v1/knowledge/probes

Returns the probe lines (probes), the limit (limit, 100), the search depth (depth, 10), the weighting (weights) and the last run (run with probes, hits, mrr, ran_at, or null).

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Probe line fieldMeaning
id, question, languageidentifier, question, language
expected_document_id, expected_titleexpected document and its title
last_rankposition in the last run (Position {n}); 0 means measured but not found; null means never measured
last_run_attime of the last run

POST /api/v1/knowledge/probes

Creates a probe line (Add probe line): question (required, up to 500 characters), expected_document_id (required, a document identifier), language (de or en, optional). If 100 lines already exist, you get 422 probe_limit; an unknown document returns 404. Without an audit entry no probe line is created; the response is then 500 with not_logged. Response: 201 with probe.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

DELETE /api/v1/knowledge/probes/{id}

Deletes a probe line. Without an audit entry it stays; the response is then 500 with not_logged. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

POST /api/v1/knowledge/probes/run

Measures all probe lines (Measure) and returns run with probes, hits (Found), mrr and ran_at, plus the updated lines. mrr is the Retrieval quality: the mean of one divided by the expected document’s position, rounded to three decimal places; a document that is not found counts as 0. Without probe lines you get 422 no_probe.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle knowledge-probes: 6 requests per minute per user, see Limits

Weighting

Two settings determine how search ranks hits: the Title factor (title_factor, 1.0 to 5.0, default 1.8) boosts hits in the document title, and the Keyword weight (keyword_tf, 0 to 10, default 3) boosts hits in the enriched keywords. weights contains title_factor and keyword_tf (in effect), set (your own entries), default and bounds.

PUT /api/v1/knowledge/weights

Saves the weighting (Save weighting). Both fields are optional; null resets to the default. title_factor is rounded to two places. Without an audit entry the weighting stays unchanged; the response is then 500 with not_logged. Response: weights.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

POST /api/v1/knowledge/probes/tune

On the oldest up to 20 lines of the probe set, tries first each title factor (1.0, 1.4, 1.8, 2.2, 2.6, 3.0) at the current keyword weight, then each keyword weight (0, 1, 2, 3, 5, 8) at the best title factor (Tune). Without apply, it only measures. With "apply": true (Apply best value), the best candidate is adopted, but only if it genuinely beats the current setting; on a tie nothing changes (No candidate beats the current setting.). If the audit entry for adopting it cannot be written, the current weighting stays; the response is then 500 with not_logged. Response: tuning with rows_used, rows_total, current, best, candidates, plus applied and weights.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle knowledge-tune: 2 requests per minute per user, see Limits

Setup from your website

Setup reads your website, proposes an assistant from it and creates that assistant based on your choices. In the app this is Setup (app.xicbot.de/einrichtung); the workflow is described under Setup. Starting a run counts against the same limits as a knowledge source, because it creates one.

statusMeaning
liestthe website is being read
schlaegt_vorthe proposal is being written (The proposal is being written.)
entscheidungthe Proposal is ready and waits for your choices
uebernommenthe assistant has been created (The assistant has been created.)
fehlerthe run failed; hinweis gives the reason (The run failed)
leerno content came out of the website; hinweis gives the reason (No proposal)

GET /api/v1/setup/runs

Lists the last 20 runs, newest first (Earlier runs). Response: runs.

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Run fieldMeaning
id, website, statusidentifier, address read, status
languagede or en: the proposal and first version are written in this language; de if none is stored
vorschlagthe proposal with zweck and rolle (each with text and fundstelle), name, tonfall, erster_satz, fragen (each with frage, antwort, fundstelle), schweigethemen, luecken and removed: what was removed from the proposal (Removed from the proposal), each entry with kind promise and the word in word, no_source and the field in field, or question_no_source and the question in question
angenommenthe selection you accepted
hinweisfor fehler and leer, the reason as a code: website_unreadable (for leer possibly followed by the ingestion reason after a colon), no_text, too_little_text: with the number of characters read, model_unavailable, budget_exhausted, model_failed, reply_unreadable or run_aborted; otherwise null. The app shows a sentence for it in the interface language.
assistent_idthe assistant created
erstellt, beendetstart and end
dismissed_attime the run was dismissed, otherwise null; the app no longer shows a dismissed run by itself when opened
taboo_limithow many schweigethemen accepting takes (the cap of the never-discuss list)

POST /api/v1/setup/runs

Starts a run with website (required, an http or https address, up to 255 characters; Address of your website, button Read website) and optionally language (de or en, Language of the assistant; if omitted, the locale of your account; any other value gives 422). The website is created as a knowledge source; that source stays yours even if you do not accept the proposal. If a run is already in progress (status liest or schlaegt_vor), you get 409 run_in_progress with that run in run. An open run whose processing is no longer active and that has not changed for more than a minute is ended as fehler with the note run_aborted before a start and before the list of runs; it then no longer blocks a new start. Response: 201 with run.

Authentication
Signed in, confirmed email address, Edit role or higher; plan limits for sources, documents and chunks
Rate limit
Throttle knowledge-sources: 20 requests per minute per user, see Limits

GET /api/v1/setup/runs/{id}

Returns one run (run). Poll it until it reaches entscheidung, fehler or leer.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

POST /api/v1/setup/runs/{id}/accept

Adopts your selection from the proposal and creates an assistant as a Draft (Create assistant). Only possible in the entscheidung state, otherwise 409 not_ready with the current status; a dismissed run can be accepted, which clears dismissed_at. If a source of type faq has to be created for the questions first and the plan limit for sources has been reached, the adoption ends without an assistant, with the same response as creating a source (402 plan_limit_reached, or 503 plan_limit_unmeasured if usage cannot be measured). Without an audit entry for the assistant or the new source, the whole adoption is not carried out; the response is then 500 with not_logged. Response: 201 with the run (run) and assistant (id, name, slug, status).

Authentication
Signed in, confirmed email address, Edit role or higher; plan limit for assistants
Rate limit
none
FieldRuleIn the appBecomes
namerequired, up to 80 charactersName of the assistantname
zweckup to 600 charactersWhat your business doesTopic boundary of the first version
rolleup to 200 charactersWho the assistant representsRole of the first version
toneneutral, friendly, concise or detailedHow it speaks with factual, friendly, brief and detailed, preselected factual; the tone sentence from the proposal is shown below only as a hintTone of the first version, factual if omitted; the tonfall sentence from the proposal is not adopted
erster_satzup to 300 charactersIts opening lineGreeting
fragenup to 50, each with required frage (500) and antwort (4000)Questions and answerspairs in the oldest source of type faq, otherwise in a new source of type faq whose title follows the locale of the person adopting (“Questions and answers” for en, otherwise “Fragen und Antworten”); questions already in your account (ignoring upper and lower case) are skipped, and duplicate questions in the selection count once
schweigethemenat most as many as taboo_limit (8), each up to 120 characters; more or longer gives 422Topics it stays silent ontaboo topics of the first version, duplicates removed

POST /api/v1/setup/runs/{id}/discard

Dismisses a run (Dismiss): dismissed_at is set, and dismissing again keeps the first time. Nothing is deleted; the run stays in the list and a dismissed proposal can still be accepted. Only in the entscheidung, leer and fehler states, otherwise 409 not_discardable with the current status; unknown ID 404 not_found. Response: 200 with run.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

The first version of an assistant created this way answers only from the knowledge base and has the language of the run (language); the handover rule and fallback answer come from the base template of that language, as do the role, topic boundary and greeting where your selection leaves them empty.

Assistants

In the app, assistants live under Assistants (app.xicbot.de/assistenten). What each building block does is explained under Assistants. An assistant has header data (name, status, fallback answer, widget settings) and versions holding the Answer building blocks. You change header data directly; a change to the building blocks creates a new version and leaves the old one untouched.

GET /api/v1/assistants/templates

Lists the templates (Template), grouped into Industries and Tasks. With ?language=en you get the English texts; the default is de. Response: templates.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

GET /api/v1/assistants

Lists the assistants by name, up to 200, each with its active version. Response: assistants.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

GET /api/v1/assistants/{id}

Returns one assistant (assistant) and its versions (versions), newest first, up to 50.

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Field of assistantMeaning
id, name, slug, templateidentifier, name, short name, template
statusdraft (Draft), active (active) or paused (paused)
fallback_replyFallback answer
versionthe active version
widgetwidget settings: is_active, title, color, position, vertical, offset_x, offset_y, width, height, scale, radius, avatar, outreach_rules, domains, consent, consent_text, attachments, base_url and key, the Public key

POST /api/v1/assistants

Creates an assistant as a Draft (New assistant, Create assistant), together with version 1. Fields: name (required, up to 120 characters), template (template identifier, up to 40 characters; omitted means no template), language (de or en). The short name is derived from the name, up to 50 characters; if it is already taken in your account, -2, -3 and so on is appended. The first version answers only from the knowledge base. An unknown template returns 422 unknown_template. Without an audit entry neither the assistant nor the version is created; the response is then 500 with not_logged. Response: 201 with assistant.

Authentication
Signed in, confirmed email address, Edit role or higher; plan limit for assistants
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

PUT /api/v1/assistants/{id}

Changes the header data; all fields are optional. The widget fields are described in detail under Widget settings. Response: assistant.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits
FieldRule
nameup to 120 characters
statusdraft, active or paused (Status)
fallback_reply5 to 500 characters (Fallback answer)
widget_enabledtrue or false
widget_titleup to 80 characters
widget_colorcolour as #rrggbb
widget_position, widget_verticalright or left; bottom or top
widget_offset_x, widget_offset_y0 to 400
widget_width, widget_height280 to 720; 320 to 1200
widget_scale, widget_radius80 to 150; 0 to 40
widget_avatarPNG, JPEG or WebP image in a data: URL; errors widget_avatar_format, widget_avatar_too_large, widget_avatar_not_an_image
widget_domainsup to 500 characters
widget_consent, widget_consent_texttrue or false; up to 500 characters
widget_outreach_rules, widget_attachmentssee Outreach rules and Widget settings
widget_base_urlup to 200 characters, absolute http or https address without a query part or fragment; a trailing slash is removed; errors widget_base_url_not_absolute, widget_base_url_scheme, widget_base_url_has_query

Versions

POST /api/v1/assistants/{id}/version

Publishes a new version (Publish new version). It gets the next number and becomes active straight away. Send the required fields from the table every time. taboos, facts, master_data, escalation_topics, escalation_threshold, escalation_words and handoff_email are carried over from the active version if you do not send them; knowledge_only is true if omitted. Without an audit entry no new version is created and the previously active one stays active; the response is then 500 with not_logged. Response: 201 with version.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits
FieldRequiredRuleIn the app
personayesup to 200 charactersRole
toneyesneutral, friendly, concise or detailedTone: factual, friendly, brief, detailed
topic_scopeyesup to 600 charactersTopic boundary
handoff_ruleyesup to 400 charactersHandover rule
greetingyesup to 500 charactersGreeting
languageyesde or en–
knowledge_onlynotrue or false, default trueAnswer only from the knowledge base
taboosnoup to 8 entries of up to 120 characterstaboo topics
factsnoup to 12 entries of up to 200 charactersfixed facts
master_datanosee Business detailsbusiness details
escalation_topicsnoidentifiers of known topics; unknown ones return 422 unknown_topic with topicshandover topics
escalation_thresholdno1 to 20, default 3handover threshold
escalation_wordsnoper topic up to 20 words of 3 to 40 characterssignal words
handoff_emailnoemail address, up to 190 characters; only the Owner may change ithandover address

Anyone who changes the handover address without being the Owner receives 403 role_too_low with required owner and field handoff_email. Sending the existing address unchanged is not a change and is not rejected.

Business details

Part of master_dataRule
opening_hoursup to 14 entries with day (mon to sun), from, to (time HH:MM)
locationsup to 5 with name (required), street, postal_code, city
service_areaup to 20 entries of up to 80 characters
contactsup to 5 with role (required), name, email, phone
price_rangesup to 10 with item, from_cents (required, from 0), to_cents, unit, currency (three letters)

Any other field in master_data returns 422 unknown_master_field with fields.

A version in a response (version) carries, besides these fields, id, number, restored_from, published_at and the limits the app needs for its form, such as taboo_limit, fact_limit, master_data_limits, escalation_threshold_min and escalation_threshold_max.

POST /api/v1/assistants/{id}/versions/{number}/restore

Brings back an earlier version by creating a new version with its content; restored_from names the source. The versions in between are kept. An unknown number returns 404 version_not_found, the version already active 422 already_active. If the old version carries a different handover address, the owner rule above applies. Without an audit entry no new version is created and the previously active one stays active; the response is then 500 with not_logged. Response: 201 with restored, from and version.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

Deletion, embed code and key

DELETE /api/v1/assistants/{id}

Deletes an assistant with its versions and all of its conversations. The audit entry is written first; if that fails, everything stays and the response is 500 with not_logged. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Administration role or higher
Rate limit
none

GET /api/v1/assistants/{id}/embed

Returns the embed code and its parts. How to place it on your site is described under Embed the widget and Script attributes.

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Response fieldMeaning
snippetthe embed code
url, api, keyaddress of the embed file, API address, public key
base, snippet_first_partyyour own base address and the embed code for it, when widget_base_url is set
sri, reasonchecksum of the delivered embed file or, if missing, the reason (file_missing, file_unreadable); neither goes into the embed code
seen_at, seen_hostwhen and on which site the embed was last reported

Source code html

<script src="{url}/einbetten.js" data-xicbot="{key}" data-api="{api}" defer></script>

If consent is switched on for the assistant, the embed code also carries data-einwilligung="erforderlich".

POST /api/v1/assistants/{id}/key

Replaces the public key (Generate a new key). After that, no existing embed loads any more; the app reports: *The new key is active. Please replace the embed code everywhere.* The audit entry is written first; if that fails, the previous key stays valid and the response is 500 with not_logged. An unknown assistant gives 404 not_found. Response: key, the new key of 32 hexadecimal characters.

Authentication
Signed in, confirmed email address, Administration role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

GET /api/v1/usage

Shows the quota for the current month (Quota this month). From 80 percent use, level is warning; once the quota is used up, exhausted; otherwise ok. Without an account you get 403 no_tenant. Plan quotas are listed under Plans and quotas.

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Field in usageMeaning
monthmonth
used, budget, remainingused, available, left
messagesnumber of messages
shareshare used
warn_atwarning threshold
warning, throttled, exhaustedwarning, throttled, used up
reply_tokens, tool_roundscaps per answer, lower from the warning threshold
levelok, warning or exhausted

Acceptance checks

An acceptance run puts fixed check questions to an assistant’s active version and compares the answers with a Model answer. The workflow in the app is described under Test and acceptance. Each assistant can hold 50 check questions.

GET /api/v1/assistants/{id}/checks

Lists the check questions (checks), each with last_result and last_run_at, plus limit (50), terms_limit (10 terms per list) and the last run (last_run).

Authentication
Signed in, confirmed email address, any role
Rate limit
none

POST /api/v1/assistants/{id}/checks

Creates a check question (Add check question); it is appended at the end. If 50 already exist, you get 422 limit_reached. Response: 201 with check.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits
FieldRequired on createRuleIn the app
questionyes3 to 500 charactersQuestion
expectedyes3 to 4000 charactersModel answer
must_containnoup to 10 terms of up to 80 charactersMust contain
must_not_containnoup to 10 terms of up to 80 charactersMust not contain
min_overlapno0 to 1, default 0.5Minimum coverage
languagenode or en–
positionno0 to 9999–
is_activenotrue or falseRuns along

PUT /api/v1/assistants/{id}/checks/{check}

Changes a check question; all fields are optional. Response: check.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

DELETE /api/v1/assistants/{id}/checks/{check}

Deletes a check question. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

POST /api/v1/assistants/{id}/checks/run

Starts an acceptance run (Start acceptance run) with every check question set to run along. The run works in the background; if one is already waiting or running, it is reused. Without an active version you get 422 no_version, without a check question that runs along 422 no_check, and with the quota used up 422 quota_exhausted. Response: 202 with run.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

GET /api/v1/assistants/{id}/check-runs

Lists the last 30 runs, newest first. Response: runs.

Authentication
Signed in, confirmed email address, any role
Rate limit
none

GET /api/v1/assistants/{id}/check-runs/{run}

Returns one run (run) with the result for each check question (results).

Authentication
Signed in, confirmed email address, any role
Rate limit
none
FieldMeaning
statuspending (queued), running (running), done (finished), failed (stopped)
checks, passed, failed, errorednumber of check questions, Passed, Failed, Not measurable
rateRate: passed divided by passed plus failed, to three places; null while nothing has been scored
version_idthe version checked
started_at, finished_at, duration_ms, reason, created_attimes, duration and reason for stopping

A result (result) is pass (passed), fail (failed) or error (not measurable). An answer passes when every term from Must contain appears, none from Must not contain does, and its coverage of the model answer reaches the Minimum coverage; if the minimum is 0 or coverage cannot be measured, that last part is skipped. Upper and lower case do not matter. Each result gives answer, missing, forbidden, overlap, reason, conversation_id and duration_ms.

Tools

Tools give an assistant actions, such as taking a request or searching a catalogue. What each type does is explained under Tools and Tool kit. Creating, changing and deleting needs the Edit role; Interface address, Access token and Minimum role additionally need the Administration role.

Type (type)KindDefault Approval
leadwriteconfirm
appointmentwriteconfirm
handoffwriteconfirm
product_searchreadautomatic
cartirreversibleconfirm
httpreadconfirm
form_fillwriteconfirm

The types from the Tool kit come on top; each brings its own kind and default approval. Only read tools may be set to automatic; for all others the API sets confirm, whatever you send.

GET /api/v1/assistants/{assistant}/tools

Lists an assistant’s tools.

Authentication
Signed in, confirmed email address, any role
Rate limit
none
Tool fieldMeaning
id, key, title, descriptionidentifier, Key, Label, When should the assistant use it?
adapter, kindtype and kind
approval, min_roleApproval, Minimum role
required_fields, required_effectiveentered and actually applied Required fields
schemaInput fields
settingssettings; a stored Access token appears as __set__
is_activeActive
timezone_validfor type appointment, whether the time zone in settings is valid (true or false), judged the same way as when saving; null for all other types

POST /api/v1/assistants/{assistant}/tools

Creates a tool (Add tool). Response: 201 with tool.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits
FieldRequiredRule
typeyesone of the types above or from the tool kit (Type)
keyyeslower-case letter first, then lower-case letters, digits or _, 3 to 64 characters; unique per assistant
titleyesup to 120 characters
descriptionyesup to 600 characters
approvalnoautomatic or confirm
min_rolenopublic, member, admin or owner; default public
required_fieldsnoup to 20 names of up to 40 characters
settingsnotype-specific settings, for http with address and access token
schemanocustom input fields, see below
is_activenotrue or false
StatusIdentifierMeaning
422key_takenThis key already exists for this assistant.
422shape_unknownunknown type
422url_requiredtype http without an address
422url_unreadable, scheme_not_allowed, name_unresolvable, target_not_allowedthe address fails the address check
422settings check codes, for example appointment_timezone_invalidthe settings of type appointment, cart or form_fill fail the check; appointment_timezone_invalid means an unknown time zone in settings, an empty value counts as the default
403role_too_low with field min_rolethe chosen minimum role is above your own (You can choose levels up to your own role.)
403role_too_low with required admin and fieldaddress, access token or minimum role changed without the Administration role
402plan_feature_missingthe type is not part of the plan; feature, plan, plan_name and available_in name the feature, plan and the plans that include it

Custom input fields

For the http type you define under Input fields which values the assistant passes on. schema is a list of fields with Field name, Type, Description and Required. These rules apply: at most 20 fields; a name starts with a lower-case letter followed by up to 39 lower-case letters, digits or _; the names tenant_id, mandant, mandant_id and konto_id are blocked; types are string, integer, number and boolean, and any other type becomes string; the description is cut to 200 characters and defaults to the field name. The service refuses a schema that breaks these rules with 422: schema_field_name_invalid or schema_field_name_reserved with the field name under field, schema_fields_too_many with max, schema_required_unknown for a required name without a field. Nothing is saved in that case.

PUT /api/v1/tools/{id}

Changes a tool. The type stays as it is; title and description are required again, the other fields optional. If you send __set__ as the access token, the stored one is kept. Response: tool.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
Throttle assistants: 30 requests per minute per user, see Limits

DELETE /api/v1/tools/{id}

Deletes a tool. If the audit entry fails, the tool stays and the response is 500 with not_logged. Response: {"deleted": true}.

Authentication
Signed in, confirmed email address, Edit role or higher
Rate limit
none

Frequent questions

Why does creating a website source return 202 instead of 201?

A website is read in the background. The response contains the job; check its status with GET /api/v1/knowledge/jobs/{id} and the source’s status with GET /api/v1/knowledge/sources/{id}.

How do I check whether search finds the right document?

Create probe lines with a question and the expected document and measure with POST /api/v1/knowledge/probes/run. POST /api/v1/knowledge/probes/tune then tries other weightings and, with "apply": true, adopts only a genuine improvement.

Do I lose newer versions when I restore?

For a knowledge source, yes: versions above the restored one are discarded. For an assistant, no: restoring creates a new version with the old content.

Why do I get 403 when changing the handover address?

Only the account owner may change the handover address. The response states required owner and field handoff_email.

What happens to embedding pages when I replace the key?

They stop loading the widget until the new embed code is in place. Fetch it with GET /api/v1/assistants/{id}/embed.

Something still unclear?

Tell us which page and which step you mean. We reply personally.

Enquiry in three steps

  1. 1. Topic
  2. 2. Your case
  3. 3. Contact

What is this about?

One click is enough, everything else is optional.

Tell us briefly about your case

Everything in this step is optional. It helps us reply with something concrete straight away instead of asking back.

Enquiries per month, roughly (optional)
When should it start? (optional)
How can we reach you?

Name and email address are enough. We reply personally.

We use your details to handle your enquiry. More on this in the privacy policy.