Export user usage data
curl --request POST \
--url https://api.langdock.com/export/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": {
"date": "2024-01-01T00:00:00.000Z",
"timezone": "UTC"
},
"to": {
"date": "2024-01-31T23:59:59.999Z",
"timezone": "UTC"
}
}
'import requests
url = "https://api.langdock.com/export/users"
payload = {
"from": {
"date": "2024-01-01T00:00:00.000Z",
"timezone": "UTC"
},
"to": {
"date": "2024-01-31T23:59:59.999Z",
"timezone": "UTC"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from: {date: '2024-01-01T00:00:00.000Z', timezone: 'UTC'},
to: {date: '2024-01-31T23:59:59.999Z', timezone: 'UTC'}
})
};
fetch('https://api.langdock.com/export/users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.langdock.com/export/users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => [
'date' => '2024-01-01T00:00:00.000Z',
'timezone' => 'UTC'
],
'to' => [
'date' => '2024-01-31T23:59:59.999Z',
'timezone' => 'UTC'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.langdock.com/export/users"
payload := strings.NewReader("{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.langdock.com/export/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.langdock.com/export/users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"filePath": "agents-usage/workspace-id/agents-usage-2024-01-01-2024-01-31-abc12345.csv",
"downloadUrl": "https://storage.example.com/signed-url",
"dataType": "assistants",
"recordCount": 1250,
"dateRange": {
"from": "2024-01-01T00:00:00.000Z",
"to": "2024-01-31T23:59:59.999Z"
}
}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}Usage Export API
Nutzer-Nutzung exportieren
API-Endpunkt zum Exportieren von Nutzeraktivität, Nachrichten und Nutzungsmetriken.
POST
/
export
/
users
Export user usage data
curl --request POST \
--url https://api.langdock.com/export/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": {
"date": "2024-01-01T00:00:00.000Z",
"timezone": "UTC"
},
"to": {
"date": "2024-01-31T23:59:59.999Z",
"timezone": "UTC"
}
}
'import requests
url = "https://api.langdock.com/export/users"
payload = {
"from": {
"date": "2024-01-01T00:00:00.000Z",
"timezone": "UTC"
},
"to": {
"date": "2024-01-31T23:59:59.999Z",
"timezone": "UTC"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from: {date: '2024-01-01T00:00:00.000Z', timezone: 'UTC'},
to: {date: '2024-01-31T23:59:59.999Z', timezone: 'UTC'}
})
};
fetch('https://api.langdock.com/export/users', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.langdock.com/export/users",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => [
'date' => '2024-01-01T00:00:00.000Z',
'timezone' => 'UTC'
],
'to' => [
'date' => '2024-01-31T23:59:59.999Z',
'timezone' => 'UTC'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.langdock.com/export/users"
payload := strings.NewReader("{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.langdock.com/export/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.langdock.com/export/users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": {\n \"date\": \"2024-01-01T00:00:00.000Z\",\n \"timezone\": \"UTC\"\n },\n \"to\": {\n \"date\": \"2024-01-31T23:59:59.999Z\",\n \"timezone\": \"UTC\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"filePath": "agents-usage/workspace-id/agents-usage-2024-01-01-2024-01-31-abc12345.csv",
"downloadUrl": "https://storage.example.com/signed-url",
"dataType": "assistants",
"recordCount": 1250,
"dateRange": {
"from": "2024-01-01T00:00:00.000Z",
"to": "2024-01-31T23:59:59.999Z"
}
}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}{
"message": "No usage data found for the selected period",
"code": "NOT_FOUND",
"details": {}
}Dieser Endpunkt exportiert Nutzeraktivitätsdaten. Welche identifizierenden Daten enthalten sind, hängt von den Datenschutzeinstellungen deines Workspaces ab.
Ein unbegrenztes
Bevor du startest
- Voraussetzungen und Rate Limits: Details findest du in der Übersicht zur Usage Export API.
- Browser-Anfragen: Langdock blockiert bewusst Browser-basierte Anfragen, um deinen API-Schlüssel zu schützen. Verwende API-Schlüssel serverseitig und speichere sie sicher. Mehr dazu unter Best Practices für API-Schlüssel.
Basis-URL
https://api.langdock.com/export/users
Dedicated DeploymentsErsetze
api.langdock.com durch <your-deployment-url>/api/public in allen Anfragen.Datenschutzhinweis
Die Einstellung Daten auf User-Ebene steuert, ob nutzerbezogene Detailspalten im Standard-Export enthalten sind. Wenn sie deaktiviert ist, werden die unten gekennzeichneten Spalten ausgelassen, daruntername und email. Zeilen mit group_by=department oder group_by=company_name enthalten den Gruppierungsschlüssel trotzdem und keine Nutzeridentität.
Enthaltene Daten
Standardmäßig gibt der Nutzer-Export eine Zeile pro Nutzer zurück.| Spalte | Beschreibung |
|---|---|
period_start | Startdatum des Berichts |
period_end | Enddatum des Berichts |
org_id | ID des Workspaces |
user_id | ID des Nutzers; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
name | Name des Nutzers; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
email | E-Mail des Nutzers; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
role | Rolle des Nutzers; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
joined_at | Datum des Workspace-Beitritts; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
department | Abteilung; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
company_name | Firmenname; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
license_type | Aktuelle Lizenzstufe; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
payg_limit_current | Aktuelles Extra-Nutzungslimit; null, wenn unbegrenzt; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
payg_consumption_in_period | Ausgabe im Zeitraum; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
payg_utilization_pct_current | payg_consumption_in_period / payg_limit_current; null, wenn das Limit unbegrenzt, 0 oder negativ ist; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
payg_limit_source | plan, user, group oder workspace; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
payg_limit_group_name | Gruppenname, wenn die Quelle group ist; sonst null; nur enthalten, wenn Daten auf User-Ebene aktiviert sind |
messages_total | Gesamtzahl der Nachrichten |
messages_total_rank | Rang nach Gesamtnachrichten |
messages_chat | Nachrichten im Chat ohne Agenten |
messages_chat_rank | Rang nach Chat-Nachrichten |
messages_assistants | Nachrichten an Agenten |
messages_assistants_rank | Rang nach Agenten-Nachrichten |
assistants_messaged | Anzahl unterschiedlicher Agenten |
assistants_to_messages | JSON-Zuordnung von Agent-ID zu Nachrichtenanzahl |
messages_projects | Nachrichten in Projekten |
messages_projects_rank | Rang nach Projekt-Nachrichten |
projects_messaged | Anzahl unterschiedlicher Projekte |
projects_to_messages | JSON-Zuordnung von Projekt-ID zu Nachrichtenanzahl |
model_to_messages_total | JSON-Zuordnung von Modellname zu Nachrichtenanzahl |
action_messages | Durch Aktionen erzeugte Nachrichten |
action_messaged | Anzahl unterschiedlicher ausgelöster Aktionen |
action_to_messages | JSON-Zuordnung von Aktionsname zu Nachrichtenanzahl |
payg_limit_current, ein payg_utilization_pct_current ohne positives Limit und ein leeres payg_limit_group_name sind in der JSON-Antwort null. In der CSV bleiben diese Zellen leer.
payg_limit_current ist das Extra-Nutzungslimit zum Zeitpunkt des Exports: in EUR in Langdock Cloud Workspaces ohne BYOK, in USD bei BYOK und Dedicated Deployments. payg_consumption_in_period ist die Ausgabe im Zeitraum, gerundet auf zwei Dezimalstellen. Ohne BYOK ist das die Extra-Nutzung in EUR. Ausgaben, die auf das eigene Nutzungslimit eines Agenten gebucht werden, fehlen in diesem Betrag. Bei BYOK und Dedicated Deployments ist es der USD-Betrag jeder Zeile, die auf Nutzungslimits angerechnet wird, auch Ausgaben auf dem eigenen Nutzungslimit eines Agenten.
payg_utilization_pct_current ist dieser Verbrauch geteilt durch das aktuelle Limit, gerundet auf vier Dezimalstellen. Das ist ein Verhältnis, kein Prozentwert von 0 bis 100, und der Wert kann größer als 1 sein. Der Wert ist null, wenn das Limit unbegrenzt, 0 oder negativ ist. Bei einem positiven Limit ohne Verbrauch im Zeitraum steht 0.
payg_limit_source ist plan, user, group oder workspace. Unter Nutzung und Limits erscheinen sie als Individuell, Workspace sowie Plan oder Gruppe mit dem Namen des Plans oder der Gruppe. Ohne BYOK und mit aktiver Extra-Nutzung gilt standardmäßig das höchste anwendbare Plan- oder Gruppenlimit. Unbegrenzt zählt als höchstes Limit. Bei Gleichstand, auch zwischen zwei unbegrenzten Limits, gewinnt eine Gruppe vor dem Plan und die alphabetisch erste Gruppe vor anderen Gruppen. Ein individuelles Limit mit Individuell oder Unbegrenzt überschreibt es, auch ein Betrag von 0. payg_limit_group_name ist der Name der Gruppe, deren Limit gilt, sonst null. Pro Nutzer gibt es einen Verbrauch, nicht einen pro Gruppe.
Ist Extra-Nutzung in Langdock Cloud Workspaces ohne BYOK aus, ist payg_limit_current 0 und payg_limit_source workspace. Bei BYOK und Dedicated Deployments kommt das Limit nur aus der individuellen Extra-Nutzung. Ohne Individuell und ohne Unbegrenzt sind Betrag 0 und Quelle user.
Zusätzliche Spalten für BYOK-Workspaces
| Spalte | Beschreibung |
|---|---|
total_input_tokens | Gesamte Input-Tokens |
total_output_tokens | Gesamte Output-Tokens |
cached_prompt_tokens | Cache-Read-Input-Tokens |
cache_creation_tokens | Cache-Write-Input-Tokens |
no_cache_tokens | Input-Tokens, die nicht aus dem Cache kamen |
total_cost_usd | Geschätzte Provider-Kosten in USD |
Gruppierter Export
Mitgroup_by=model erhältst du eine Zeile pro Nutzer und Modell. payg_consumption_in_period und payg_utilization_pct_current gelten dann nur für dieses Modell. payg_limit_current, payg_limit_source und payg_limit_group_name wiederholen auf jeder Modellzeile das aktuelle Limit des Nutzers. Zähle payg_limit_current nicht über die Modellzeilen zusammen.
Mit group_by=department oder group_by=company_name erhältst du eine Zeile pro Abteilung oder Firmenname. Langdock erfasst Abteilung und Firmenname aus dem Profil, wenn sich ein Nutzer im Workspace anmeldet. Jedes Nutzungsereignis bekommt den zuletzt erfassten Wert zu diesem Zeitpunkt oder davor. Eine Profiländerung, etwa über SCIM, zählt also erst ab der nächsten Anmeldung des Nutzers. Wechselt der Wert später, bleiben der alte und der neue Wert in getrennten Zeilen. Diese Zeilen enthalten keine Nutzeridentität, auch wenn Daten auf User-Ebene aktiviert sind.
Eine erfasste leere Abteilung oder ein erfasster leerer Firmenname kommt als No department oder No company zurück, mit attribution_status attributed, sofern sie nicht wie unten beschrieben zusammengefasst wird. Nutzung vor dem ersten erfassten Wert hat einen leeren Gruppierungsschlüssel und attribution_status pre_cutoff. Das gilt auch für aktuelle Nutzung von Nutzern, die sich seit Beginn der Erfassung nicht angemeldet haben.
Ohne breakdown enthalten gruppierte Zeilen period_start, period_end, org_id, den Gruppierungsschlüssel, attribution_status, messages_total, messages_chat, messages_assistants, assistants_messaged, messages_projects und active_users. active_users zählt unterschiedliche Nutzer mit einem Prompt im Zeitraum, API-Nutzung eingeschlossen. Cloud-Workspaces ohne BYOK enthalten zusätzlich payg_consumption_in_period, auch wenn Daten auf User-Ebene deaktiviert sind. BYOK-Workspaces und Dedicated Deployments enthalten stattdessen total_input_tokens, total_output_tokens, cached_prompt_tokens, cache_creation_tokens, no_cache_tokens und total_cost_usd.
Wenn Daten auf User-Ebene deaktiviert sind, werden zugeordnete Abteilungen oder Firmen mit weniger als 5 aktiven Nutzern zu Combined departments oder Combined companies zusammengefasst. Zeilen mit pre_cutoff bleiben getrennt.
Mit breakdown=agent oder breakdown=model zusammen mit group_by=department oder group_by=company_name teilst du jede Gruppe nach Agent oder Modell. Diese Zeilen nutzen messages und active_users statt der Nachrichtenspalten oben, dazu agent_id und agent_name oder model und dieselben Kostenspalten. Agenten-Zeilen umfassen nur Agenten, keine Chats oder Projekte, und Modell-Zeilen zählen auch Bildgenerierung. Die Summe von messages entspricht daher nicht messages_total. Wenn Daten auf User-Ebene deaktiviert sind, werden Agenten oder Modelle mit weniger als 5 aktiven Nutzern in dieser Gruppe zu Combined agents oder Combined models zusammengefasst. Die zusammengefasste Agenten-Zeile hat eine leere agent_id.Autorisierungen
API key as Bearer token. Format "Bearer YOUR_API_KEY"
Body
application/json
Request body for usage export endpoints
Start date and timezone for the export
Show child attributes
Show child attributes
End date and timezone for the export
Show child attributes
Show child attributes
Optional aggregation dimension. department and company_name group usage without user identity.
Verfügbare Optionen:
model, department, company_name Optional split of a department or company group by agent or model. Valid only when group_by is department or company_name.
Verfügbare Optionen:
agent, model War diese Seite hilfreich?