Sie können Ihre Daten aus Bitrix24 mithilfe von KI-Agenten für Entwickler analysieren, z. B. mit Codex oder Claude Code. Es genügt, die Aufgabe zu beschreiben: Der Agent ruft die Daten über den BI-Connector ab, wendet Filter an und bereitet die Ergebnisse auf.
Wenn Sie beispielsweise erfolgreiche Aufträge der letzten sechs Monate analysieren möchten, übergeben Sie dem Agenten Ihre Bitrix24-Adresse, den Verschlüsselungsschlüssel und einen Link zur Dokumentation und formulieren Sie die Aufgabe. Der Agent ruft die Daten über den BI-Connector ab, filtert die erfolgreichen Aufträge und gibt die Ergebnisse zurück.
Eine manuelle Analyse der Anfrageparameter ist nicht erforderlich. Es genügt, die Aufgabe zu beschreiben, das Ergebnis zu prüfen und die Anfrage bei Bedarf zu präzisieren.
In diesem Beitrag erfahren Sie, wie Sie:
Daten für die Arbeit mit einem KI-Agenten vorbereiten
Für die Arbeit benötigen Sie:
Bitrix24-Adresse. Sie wird benötigt, damit der KI-Agent weiß, an welches Bitrix24 die Anfragen gesendet werden sollen. Beispiel: https://example.bitrix24.de.
BI-Analyseschlüssel. Er wird für den Zugriff auf die Daten benötigt. Den Schlüssel finden Sie unter CRM > Analytics > Echtzeit-Analytik > BI-Analytik > Einstellungen der BI-Analytik > Schlüssel verwalten.
Link zur Dokumentation oder zum Skill. Er hilft dem Agenten zu verstehen, welche Anfragen ausgeführt werden sollen. Ein vorgefertigter Skill beschreibt, wie die Liste der verfügbaren Daten abgerufen, Felder eingesehen und Zeilen über den BI-Connector angefordert werden.
Beispiel-Skill für den KI-Agenten
| name | bitrix-bi-connector |
|---|---|
| description | Querying the Bitrix24 BI-connector HTTP API — listing tables (gds.php?show_tables), describing columns (gds.php?desc), and fetching rows (pbi.php) with dateRange and dimensionsFilters predicate filtering (operators EQUALS, CONTAINS, IN_LIST, BETWEEN, IS_NULL, NUMERIC_GREATER_THAN/LESS_THAN with optional EXCLUDE negation). Use this skill whenever the user mentions Bitrix24, bi-connector, biconnector, bi-token, gds.php, pbi.php, or asks how to query, count, or filter leads (crm_lead), deals (crm_deal), tasks (task), contacts, companies, or smart-process entities (crm_dynamic_items_*) from a Bitrix24 portal via its BI-analytics endpoints. Also use when the user is constructing a dimensionsFilters JSON body, debugging EMPTY_SELECT_FIELDS_LIST errors, or seeing unexpected empty results from a Bitrix BI request (often a UTF-8 encoding issue or an unknown-operator silent-failure). |
Bitrix24 BI-connector protocol
This skill captures the HTTP protocol for the Bitrix24 BI-analytics connector — the API that powers Power BI / Google Data Studio integrations and any custom client that reads CRM data from a Bitrix24 portal. Use it when constructing requests, helping users count/filter CRM entities, or implementing a BI client.
Endpoints overview
All three endpoints live on the client's Bitrix24 portal. Every request is HTTP POST and every body MUST include a key field — the client's bi-token. Only the path and query string vary: gds.php for metadata (list/describe), pbi.php for actual data rows.
Where the bi-token comes from: the BI-analytics key-management page of the client's own Bitrix24 portal (path varies by portal locale; on a fresh portal navigate via CRM → Analytics → BI-analytics → BI-analytics settings → Key management, or open {portal}/biconnector/key_list.php directly). Always ask the user for their own portal URL — never hardcode a reference portal (e.g. smith.bitrix24.com from sample docs) in production code.
Endpoint 1 — list tables
POST {portal}/bitrix/tools/biconnector/gds.php?show_tables
Body:
{"key": "<bi-token>"}
Returns [[table_name, table_description], ...].
Endpoint 2 — describe a table's columns
POST {portal}/bitrix/tools/biconnector/gds.php?desc&table=<table_name>
Body:
{"key": "<bi-token>"}
Returns an array of column objects. Key fields per column:
CONCEPT_TYPE—DIMENSIONorMETRIC. METRICs are typically aggregated and grouped by DIMENSIONs — preserve this distinction in any UI or query-builder code.ID— the identifier to use when referencing the column in subsequent requests (this is thenameyou pass in endpoint 3'sfields).NAME— human-readable label.TYPE— data type (e.g.NUMBER,STRING,YEAR_MONTH_DAY_SECOND).AGGREGATION_TYPE,GROUP_KEY,GROUP_CONCAT,GROUP_COUNT,IS_VALUE_SPLITABLE— aggregation/grouping hints, oftennull.
Endpoint 3 — fetch table rows
POST {portal}/bitrix/tools/biconnector/pbi.php?table=<table_name>
Body:
{"key": "<bi-token>", "fields": [{"name": "<column_id>"}, ...]}
fields lists which columns to return; use the ID values from endpoint 2. Response is a 2D array where the first row is the header (column names in request order) and the rest are data rows aligned to that header. Empty cells come back as null or "" — don't treat absence as an error.
Silent-failure traps
The BI-connector has several behaviours where bad requests succeed with HTTP 200 but return misleading results. These cause real bugs because they look indistinguishable from "no data matched":
Unknown fields are silently dropped. If you request fields that don't exist on the table, the API silently drops them. If all requested fields are unknown, you get {"error":"EMPTY_SELECT_FIELDS_LIST"} with HTTP 200 — it does not name which field was wrong. Always cross-check field IDs against endpoint 2 before querying.
Unknown operators are silently ignored. Spelling an operator wrong, or guessing one that doesn't exist (e.g. IS_NOT_NULL, STARTS_WITH), causes the server to return the unfiltered set — which looks like a successful query. Never assume an operator exists without testing it on a column with known distribution. Confirmed operators are listed below; treat everything else as unproven.
Request bodies must be UTF-8 encoded. If a filter value or URL parameter contains any non-ASCII character (in dimensionsFilters values, in a non-Latin table name, etc.), the body MUST be sent as UTF-8 bytes. A mismatched encoding does NOT produce an error — the API returns an empty result set (Rows: 0), which is indistinguishable from a legitimate "no matches". PowerShell Invoke-RestMethod -Body $stringWithNonAscii is a known offender on Windows because its default body encoding is not UTF-8: pass [Text.Encoding]::UTF8.GetBytes($json) and Content-Type: application/json; charset=utf-8 instead. In any language, set the HTTP client's body encoding to UTF-8 explicitly when sending non-ASCII filter values.
Date-range filtering
Add dateRange and optionally configParams.timeFilterColumn to the pbi.php body:
{ "key": "bi-token", "dateRange": {"startDate": "2018-07-19", "endDate": "2018-08-02"}, "configParams": {"timeFilterColumn": "DATE_CREATE"}, "fields": [{"name": "DATE_CREATE"}, {"name": "STATUS_SEMANTIC_ID"}] }
startDateis treated as00:00:00of that day;endDateas23:59:59.999(inclusive).- For a single day, set
startDate = endDate. timeFilterColumnis the column ID to filter on. If omitted, the API uses the first date/datetime column in the table — usually safe but explicit is better.
Rule — always filter: always pass a dateRange when calling pbi.php, even if the user didn't ask. Without it, unfiltered tables can return thousands or millions of rows on real portals. Default to "last 3 months" (endDate = today, startDate = today − 90 days) unless the user specifies otherwise. The metadata endpoints (show_tables, desc) don't accept dateRange — only pbi.php does. Exception: if you're using dimensionsFilters (below) and it sufficiently narrows the result (e.g. filtering by a specific ID), dateRange is optional.
Predicate filtering with dimensionsFilters
Add to the pbi.php body a key dimensionsFilters whose value is an array of arrays of condition objects. Outer arrays are joined by AND; inner conditions within one array are joined by OR. Any number of inner conditions and any number of outer groups is allowed.
{ "key": "bi-token", "fields": [{"name": "ID"}, {"name": "CREATED_BY_ID"}], "dimensionsFilters": [ [ {"fieldName": "ID", "values": ["2"], "type": "INCLUDE", "operator": "EQUALS"}, {"fieldName": "ID", "values": ["12706"], "type": "INCLUDE", "operator": "EQUALS"} ], [ {"fieldName": "CREATED_BY_ID", "values": ["1"], "type": "INCLUDE", "operator": "EQUALS"} ] ] }
Above: (ID=2 OR ID=12706) AND CREATED_BY_ID=1.
Condition object fields
fieldName— column ID from endpoint 2.values— always a list of strings, even for numeric columns (e.g."1", not1).type—"INCLUDE"(apply the operator) or"EXCLUDE"(invert it).EXCLUDEworks as a universal negator on top of any operator:EXCLUDE + EQUALS= "not equal",EXCLUDE + CONTAINS= "doesn't contain",EXCLUDE + IN_LIST= "not in list",EXCLUDE + IS_NULL= "not null" (the stand-in for the missingIS_NOT_NULL).operator— confirmed values:"EQUALS"— exact match;valuesis a single-element list, e.g.["1"]."CONTAINS"— substring match, e.g.{"fieldName":"TITLE","values":["CRM:"],"operator":"CONTAINS"}."IN_LIST"— field value is any of the listed strings, e.g.{"fieldName":"ID","values":["1","2"],"operator":"IN_LIST"}. Prefer this over OR-ing multipleEQUALSconditions for the same field — cleaner and one condition object instead of N."IS_NULL"— null check;valuesMUST be an empty list ([]). For non-null, useEXCLUDE + IS_NULL(there is no standaloneIS_NOT_NULLoperator — the server silently ignores it and returns all rows unfiltered). Caveat: thedescmetadata does NOT expose which fields are nullable, so there's no way to verify at runtime. Only use this when you already know from data inspection or domain context that the field can hold null."BETWEEN"— value in range, both endpoints inclusive.valuesMUST be a 2-element list[low, high](as strings, like all other operators). Behaviour on non-numeric columns is unspecified — treat it as numeric/date-only and test before applying to strings."NUMERIC_GREATER_THAN"/"NUMERIC_GREATER_THAN_OR_EQUAL"/"NUMERIC_LESS_THAN"/"NUMERIC_LESS_THAN_OR_EQUAL"—>,>=,<,<=. Single-elementvalues, e.g.["2"]. Behaviour on non-numeric columns is unspecified — use on numeric/date columns and verify before applying to strings.- Anything else (e.g.
STARTS_WITH,ENDS_WITH,REGEX) is unproven. Per "Silent-failure traps" above, an unknown operator returns the full unfiltered table — which looks like a wide-open match. Test on a known-distribution column before relying on it.
Useful pattern — fetch a single row by ID
"dimensionsFilters": [[{"fieldName":"ID","values":["19244"],"type":"INCLUDE","operator":"EQUALS"}]] Success/failure semantics in CRM entities
Bitrix24 uses a one-letter "semantic" code to indicate where an entity sits in its lifecycle. Same codes, different field names across entities — easy to mix up:
P— in progress (non-terminal)S— successful terminal stateF— failed terminal state
| Entity (BI table) | Lifecycle concept | Semantic field |
|---|---|---|
| crm_lead | Status |
STATUS_SEMANTIC_ID (raw) / STATUS_SEMANTIC (label)
|
| crm_deal | Stage |
STAGE_SEMANTIC_ID (raw) / STAGE_SEMANTIC (label)
|
To count "successful" leads or deals, filter on the _SEMANTIC_ID field equal to S. To count "completed" (any terminal state), include both S and F. The text-label variants (STATUS_SEMANTIC, STAGE_SEMANTIC) come back as localized strings in the portal's UI language — use them for display, not for filtering. The single-letter _ID codes are stable across locales and should always be the key you filter on. Smart-process entities (crm_dynamic_items_*) likely follow the deal convention (stages) — verify via endpoint 2 before assuming.
Non-CRM entities like task may use a completely different schema (e.g. a raw STATUS column holding a localized human-readable string, with no semantic code at all). Always check endpoint 2 before generalizing — don't assume STATUS_SEMANTIC_ID exists outside the CRM tables documented above.
Credential handling
The bi-token is a credential. Treat it as you would any API key: never log it, never commit it to source control, never echo it back in error messages or stack traces. When building configuration scaffolding for an implementation, read the token from an environment variable or a gitignored config file — never a hardcoded constant in committed code.
Eine Aufgabe für den KI-Agenten stellen
Um eine Aufgabe zu stellen, senden Sie eine Anfrage im Chat mit dem KI-Agenten. Eine vollständige Anfrage enthält alle erforderlichen Angaben: die Bitrix24-Adresse, den BI-Analyseschlüssel, einen Link zur Dokumentation und die Aufgabenbeschreibung.
Beispielanfrage:
Mein Bitrix24: https://example.bitrix24.de Mein BI-Token: ihr_BI_analyseschlüssel Dokumentation: Link. Zeige mir erfolgreiche Aufträge der letzten 6 Monate.
In der Anfrage können Sie dem Agenten einen Link zu einem vorgefertigten Skill übergeben. Dieser beschreibt, wie mit dem BI-Connector gearbeitet wird: verfügbare Daten abrufen, Felder des gewünschten Datensatzes einsehen und Zeilen mit Datums- und Bedingungsfiltern anfordern.
Anschließend führt der Agent die Aufgabe aus und liefert eine Tabelle mit den ausgewählten Daten sowie deren Auswertung. Das dargestellte Beispiel zeigt lediglich ein mögliches Antwortformat. Die tatsächlichen Ergebnisse hängen von den in Bitrix24 verfügbaren Daten und den über den BI-Connector zugänglichen Feldern ab.
Anfrage präzisieren
Die erste Antwort kann zu allgemein ausfallen. In diesem Fall können Sie die Aufgabe direkt im Chat präzisieren. Sie können beispielsweise darum bitten, nur bestimmte Kennzahlen anzuzeigen, Daten zu gruppieren oder eine kompakte Auswertung zu erstellen.
Mögliche Folgeanfragen:
- Gesamtbetrag erfolgreicher Aufträge anzeigen – „Zeige nur den Gesamtbetrag der erfolgreichen Aufträge der letzten 6 Monate sowie die Anzahl der Aufträge.“
- Aufträge gruppieren – „Gruppiere die erfolgreichen Aufträge nach verantwortlicher Person. Zeige die Anzahl der Aufträge und den Gesamtbetrag je Mitarbeiter.“
- Aufträge nach Monaten aufschlüsseln – „Schlüssele die erfolgreichen Aufträge nach Monaten auf. Zeige für jeden Monat die Anzahl der Aufträge und den Gesamtbetrag.“
- Daten auswerten – „Erstelle eine kurze Auswertung: In welchem Monat gab es die meisten erfolgreichen Aufträge und welcher Mitarbeiter hat den höchsten Gesamtbetrag erzielt?“
Durch die Präzisierung der Anfrage erhalten Sie die Ergebnisse im gewünschten Format. Der KI-Agent gibt nicht nur Rohdaten zurück, sondern bereitet die Ergebnisse entsprechend der jeweiligen Aufgabe auf.
Wie verarbeitet der KI-Agent Daten?
Der KI-Agent kommuniziert mit dem BI-Connector nach denselben Prinzipien wie eine reguläre Anwendung. Er sendet HTTP-Anfragen an Bitrix24 und erhält Antworten im JSON-Format. Der BI-Connector liefert die Daten nicht in einer einzelnen Anfrage. Die Verarbeitung erfolgt schrittweise:
1. Zunächst ermittelt der Agent, welche Daten über den BI-Connector verfügbar sind.
BI-Builder: Datensätze
Beispielanfrage zum Abrufen der verfügbaren Datensätze
Anfrage-URL:
POST https://example.bitrix24.de/bitrix/tools/biconnector/gds.php?show_tables
Anfrage-Body:
{ "key": "ihr_Schlüssel_der_BI-Analytik" }
Beispielantwort:
[ [ "crm_lead", "Leads" ], [ "crm_deal", "Aufträge" ], [ "task", "Aufgaben" ] ]
2. Anschließend prüft der KI-Agent, welche Felder im gewünschten Datensatz verfügbar sind. Die Antwort enthält eine Beschreibung der Felder: technischen Namen, lesbare Bezeichnung, Datentyp und weitere Parameter.
Beispielanfrage zum Abrufen der Feldbeschreibung
Anfrage-URL:
POST https://example.bitrix24.de/bitrix/tools/biconnector/gds.php?desc&amp;table=crm_lead
Anfrage-Body:
{ "key": "ihr_Schlüssel_der_BI-Analytik" }
Beispielantwort:
[ { "ID": "ID", "NAME": "Eindeutiger Schlüssel", "TYPE": "NUMBER" }, { "ID": "TITLE", "NAME": "Lead-Bezeichnung", "TYPE": "STRING" }, { "ID": "DATE_CREATE", "NAME": "Erstellungsdatum", "TYPE": "DATETIME" }, { "ID": "STATUS_ID", "NAME": "Status", "TYPE": "STRING" }, { "ID": "ASSIGNED_BY_ID", "NAME": "Verantwortliche Person", "TYPE": "NUMBER" } ] 3. Sobald der KI-Agent die gewünschten Felder ausgewählt hat, fordert er die Datenzeilen an.
Beispielanfrage zum Abrufen der Daten
Anfrage-URL:
POST https://example.bitrix24.de/bitrix/tools/biconnector/pbi.php?table=crm_lead
Anfrage-Body:
{ "key": "ihr_Schlüssel_der_BI-Analytik", "fields": [ { "Name": "ID" }, { "name": "TITLE" }, { "name": "DATE_CREATE" }, { "name": "STATUS_ID" }, { "name": "ASSIGNED_BY_ID" } ] }
Beispielantwort:
[ [ "ID", "TITLE", "DATE_CREATE", "STATUS_ID", "ASSIGNED_BY_ID" ], [ "125", "Beratungsanfrage", "2026-05-12 10:15:32", "NEW", "17" ], [ "126", "Gerätebestellung", "2026-05-13 14:42:10", "IN_PROCESS", "21" ] ]
Welche Ergebnisse sollten geprüft werden?
Der KI-Agent unterstützt beim Abrufen und Verarbeiten von Daten. Die Ergebnisse sollten jedoch stets überprüft werden. Kontrollieren Sie:
- ob der richtige Zeitraum ausgewählt wurde,
- ob die gewünschten Daten in der Auswahl enthalten sind,
- ob die Filter korrekt angewendet wurden,
- ob keine unnötigen Felder enthalten sind,
- ob die Auswertung mit den zugrunde liegenden Daten übereinstimmt.
Haben Sie beispielsweise erfolgreiche Aufträge der letzten 6 Monate angefordert, prüfen Sie, ob die Antwort keine laufenden oder verlorenen Aufträge enthält. Wenn ausschließlich erfolgreich abgeschlossene Aufträge berücksichtigt werden sollen, präzisieren Sie dies in der Anfrage.
Zusammenfassung
- Sie können Ihre Daten aus Bitrix24 mithilfe von KI-Agenten für Entwickler analysieren, z. B. mit Codex oder Claude Code.
- Es genügt, die Aufgabe zu beschreiben: Der Agent ruft die Daten über den BI-Connector ab, wendet Filter an und bereitet die Ergebnisse auf.
- Für die Arbeit werden die Bitrix24-Adresse, der Schlüssel der BI-Analytik sowie ein Link zur Dokumentation oder ein vorgefertigter Skill benötigt.
- Der Schlüssel der BI-Analytik darf nicht veröffentlicht oder öffentlich gespeichert werden. Er gewährt Zugriff auf die Daten in Bitrix24.