curl --request POST \
--url https://api.devic.ai/v1/assistants/chats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"name": "Solar Analysis Discussion",
"archived": false,
"llm": "gpt-4.1",
"createdAfter": 1609459200000,
"createdBefore": 1640995200000,
"minInputTokens": 100,
"minOutputTokens": 50,
"tenantId": "tenant_12345",
"subtenantId": "user_67890",
"metadata": {
"promptTemplateParams": {
"userId": "123"
}
},
"tags": [
"project-alpha",
"high-priority"
]
}
'import requests
url = "https://api.devic.ai/v1/assistants/chats"
payload = {
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"name": "Solar Analysis Discussion",
"archived": False,
"llm": "gpt-4.1",
"createdAfter": 1609459200000,
"createdBefore": 1640995200000,
"minInputTokens": 100,
"minOutputTokens": 50,
"tenantId": "tenant_12345",
"subtenantId": "user_67890",
"metadata": { "promptTemplateParams": { "userId": "123" } },
"tags": ["project-alpha", "high-priority"]
}
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({
assistantSpecializationIdentifier: '550e8400-e29b-41d4-a716-446655440000',
name: 'Solar Analysis Discussion',
archived: false,
llm: 'gpt-4.1',
createdAfter: 1609459200000,
createdBefore: 1640995200000,
minInputTokens: 100,
minOutputTokens: 50,
tenantId: 'tenant_12345',
subtenantId: 'user_67890',
metadata: {promptTemplateParams: {userId: '123'}},
tags: ['project-alpha', 'high-priority']
})
};
fetch('https://api.devic.ai/v1/assistants/chats', 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.devic.ai/v1/assistants/chats",
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([
'assistantSpecializationIdentifier' => '550e8400-e29b-41d4-a716-446655440000',
'name' => 'Solar Analysis Discussion',
'archived' => false,
'llm' => 'gpt-4.1',
'createdAfter' => 1609459200000,
'createdBefore' => 1640995200000,
'minInputTokens' => 100,
'minOutputTokens' => 50,
'tenantId' => 'tenant_12345',
'subtenantId' => 'user_67890',
'metadata' => [
'promptTemplateParams' => [
'userId' => '123'
]
],
'tags' => [
'project-alpha',
'high-priority'
]
]),
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.devic.ai/v1/assistants/chats"
payload := strings.NewReader("{\n \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\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.devic.ai/v1/assistants/chats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devic.ai/v1/assistants/chats")
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 \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"histories": [
{
"chatUID": "550e8400-e29b-41d4-a716-446655440000",
"clientUID": "f9a44905-3193-4bd2-a81a-71156aa7eb66",
"userUID": "7a735eda-69e7-420b-9507-6abf80ad2e34",
"name": "Solar panel recommendations",
"archived": true,
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"chatContent": [
{
"uid": "75ecbcfc-a3be-43ba-8da6-b3e16e8d7280",
"chatUid": "550e8400-e29b-41d4-a716-446655440000",
"role": "user",
"content": {
"message": "I would recommend a 450 W monocrystalline panel.",
"data": {},
"files": [
{
"name": "invoice.pdf",
"donwloadUrl": "https://files.devic.ai/uploads/invoice.pdf",
"fileType": "DOCUMENT"
}
]
},
"timestamp": 1706000000000,
"userUID": "api-key:42",
"summary": "The user asks which panels to install on a 60 m2 roof.",
"contentSource": "finish_tool",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_user_location",
"arguments": "{}"
}
}
],
"tool_call_id": "call_abc123",
"latencyMs": 1045,
"messageTokenUsage": {
"inputTokens": 123,
"outputTokens": 123,
"inputCachedTokens": 123,
"inputCacheWriteTokens": 123,
"outputCachedTokens": 123,
"reasoningOutputTokens": 123,
"totalTokens": 123,
"provider": "<string>",
"model": "<string>"
},
"messageCost": {
"inputCost": 123,
"outputCost": 123,
"inputCachedCost": 123,
"inputCacheWriteCost": 123,
"outputCachedCost": 123,
"reasoningOutputCost": 123,
"totalCost": 123,
"currency": "USD",
"calculatedAt": 123
}
}
],
"creationTimestampMs": 1789630543006,
"lastEditTimestampMs": 1789630572077,
"llm": "gpt-4.1",
"provider": "open-ai",
"contextWindow": 1050000,
"inputTokens": 6380,
"outputTokens": 372,
"tokenUsage": {
"model": "<string>",
"provider": "<string>",
"inputTokens": 123,
"outputTokens": 123,
"inputCachedTokens": 123,
"inputCacheWriteTokens": 123,
"outputCachedTokens": 123,
"reasoningOutputTokens": 123,
"totalCachedTokens": 123,
"cost": {
"inputCost": 123,
"outputCost": 123,
"inputCachedCost": 123,
"inputCacheWriteCost": 123,
"outputCachedCost": 123,
"reasoningOutputCost": 123,
"totalCost": 123
},
"secondaryCost": 123,
"secondaryInputTokens": 123,
"secondaryOutputTokens": 123,
"secondaryByOperation": {},
"pricingTimestamp": 123
},
"metadata": {},
"tenantId": "tenant_12345",
"tags": [
"support",
"onboarding"
],
"stopReason": "max_chat_messages_reached",
"triggerSource": {},
"guardrailResults": {},
"handedOff": true,
"handedOffSubThreadId": "64f5a5b8c123456789abcdef",
"pausedUntil": 123,
"pausedReason": "<string>",
"recalledMemories": [
{}
],
"coreMemories": [
{}
],
"compactions": [
{}
]
}
],
"total": 42,
"offset": 0,
"limit": 10
}{
"error": "<string>",
"message": "<string>",
"details": {}
}Get all chat histories with filters
A page of conversations across every assistant of the account, narrowed by the filters in the body. Send {} when you want no filter. Ask for omitContent=true when you only need to list them: it leaves chatContent out, which is most of the payload.
curl --request POST \
--url https://api.devic.ai/v1/assistants/chats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"name": "Solar Analysis Discussion",
"archived": false,
"llm": "gpt-4.1",
"createdAfter": 1609459200000,
"createdBefore": 1640995200000,
"minInputTokens": 100,
"minOutputTokens": 50,
"tenantId": "tenant_12345",
"subtenantId": "user_67890",
"metadata": {
"promptTemplateParams": {
"userId": "123"
}
},
"tags": [
"project-alpha",
"high-priority"
]
}
'import requests
url = "https://api.devic.ai/v1/assistants/chats"
payload = {
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"name": "Solar Analysis Discussion",
"archived": False,
"llm": "gpt-4.1",
"createdAfter": 1609459200000,
"createdBefore": 1640995200000,
"minInputTokens": 100,
"minOutputTokens": 50,
"tenantId": "tenant_12345",
"subtenantId": "user_67890",
"metadata": { "promptTemplateParams": { "userId": "123" } },
"tags": ["project-alpha", "high-priority"]
}
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({
assistantSpecializationIdentifier: '550e8400-e29b-41d4-a716-446655440000',
name: 'Solar Analysis Discussion',
archived: false,
llm: 'gpt-4.1',
createdAfter: 1609459200000,
createdBefore: 1640995200000,
minInputTokens: 100,
minOutputTokens: 50,
tenantId: 'tenant_12345',
subtenantId: 'user_67890',
metadata: {promptTemplateParams: {userId: '123'}},
tags: ['project-alpha', 'high-priority']
})
};
fetch('https://api.devic.ai/v1/assistants/chats', 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.devic.ai/v1/assistants/chats",
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([
'assistantSpecializationIdentifier' => '550e8400-e29b-41d4-a716-446655440000',
'name' => 'Solar Analysis Discussion',
'archived' => false,
'llm' => 'gpt-4.1',
'createdAfter' => 1609459200000,
'createdBefore' => 1640995200000,
'minInputTokens' => 100,
'minOutputTokens' => 50,
'tenantId' => 'tenant_12345',
'subtenantId' => 'user_67890',
'metadata' => [
'promptTemplateParams' => [
'userId' => '123'
]
],
'tags' => [
'project-alpha',
'high-priority'
]
]),
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.devic.ai/v1/assistants/chats"
payload := strings.NewReader("{\n \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\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.devic.ai/v1/assistants/chats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.devic.ai/v1/assistants/chats")
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 \"assistantSpecializationIdentifier\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"name\": \"Solar Analysis Discussion\",\n \"archived\": false,\n \"llm\": \"gpt-4.1\",\n \"createdAfter\": 1609459200000,\n \"createdBefore\": 1640995200000,\n \"minInputTokens\": 100,\n \"minOutputTokens\": 50,\n \"tenantId\": \"tenant_12345\",\n \"subtenantId\": \"user_67890\",\n \"metadata\": {\n \"promptTemplateParams\": {\n \"userId\": \"123\"\n }\n },\n \"tags\": [\n \"project-alpha\",\n \"high-priority\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"histories": [
{
"chatUID": "550e8400-e29b-41d4-a716-446655440000",
"clientUID": "f9a44905-3193-4bd2-a81a-71156aa7eb66",
"userUID": "7a735eda-69e7-420b-9507-6abf80ad2e34",
"name": "Solar panel recommendations",
"archived": true,
"assistantSpecializationIdentifier": "550e8400-e29b-41d4-a716-446655440000",
"chatContent": [
{
"uid": "75ecbcfc-a3be-43ba-8da6-b3e16e8d7280",
"chatUid": "550e8400-e29b-41d4-a716-446655440000",
"role": "user",
"content": {
"message": "I would recommend a 450 W monocrystalline panel.",
"data": {},
"files": [
{
"name": "invoice.pdf",
"donwloadUrl": "https://files.devic.ai/uploads/invoice.pdf",
"fileType": "DOCUMENT"
}
]
},
"timestamp": 1706000000000,
"userUID": "api-key:42",
"summary": "The user asks which panels to install on a 60 m2 roof.",
"contentSource": "finish_tool",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_user_location",
"arguments": "{}"
}
}
],
"tool_call_id": "call_abc123",
"latencyMs": 1045,
"messageTokenUsage": {
"inputTokens": 123,
"outputTokens": 123,
"inputCachedTokens": 123,
"inputCacheWriteTokens": 123,
"outputCachedTokens": 123,
"reasoningOutputTokens": 123,
"totalTokens": 123,
"provider": "<string>",
"model": "<string>"
},
"messageCost": {
"inputCost": 123,
"outputCost": 123,
"inputCachedCost": 123,
"inputCacheWriteCost": 123,
"outputCachedCost": 123,
"reasoningOutputCost": 123,
"totalCost": 123,
"currency": "USD",
"calculatedAt": 123
}
}
],
"creationTimestampMs": 1789630543006,
"lastEditTimestampMs": 1789630572077,
"llm": "gpt-4.1",
"provider": "open-ai",
"contextWindow": 1050000,
"inputTokens": 6380,
"outputTokens": 372,
"tokenUsage": {
"model": "<string>",
"provider": "<string>",
"inputTokens": 123,
"outputTokens": 123,
"inputCachedTokens": 123,
"inputCacheWriteTokens": 123,
"outputCachedTokens": 123,
"reasoningOutputTokens": 123,
"totalCachedTokens": 123,
"cost": {
"inputCost": 123,
"outputCost": 123,
"inputCachedCost": 123,
"inputCacheWriteCost": 123,
"outputCachedCost": 123,
"reasoningOutputCost": 123,
"totalCost": 123
},
"secondaryCost": 123,
"secondaryInputTokens": 123,
"secondaryOutputTokens": 123,
"secondaryByOperation": {},
"pricingTimestamp": 123
},
"metadata": {},
"tenantId": "tenant_12345",
"tags": [
"support",
"onboarding"
],
"stopReason": "max_chat_messages_reached",
"triggerSource": {},
"guardrailResults": {},
"handedOff": true,
"handedOffSubThreadId": "64f5a5b8c123456789abcdef",
"pausedUntil": 123,
"pausedReason": "<string>",
"recalledMemories": [
{}
],
"coreMemories": [
{}
],
"compactions": [
{}
]
}
],
"total": 42,
"offset": 0,
"limit": 10
}{
"error": "<string>",
"message": "<string>",
"details": {}
}Authorizations
An API key from your Devic console, sent as Authorization: Bearer <key>. An embedded front end sends a tenant-session token instead, so no API key reaches the browser, and an OAuth integration sends its access token. Missing, invalid or expired credentials get a 401. See Authentication.
Query Parameters
Conversations per page. Values above 100 are capped.
1 <= x <= 100Conversations to skip
x >= 0Send true to leave chatContent out and get only what describes each conversation.
Body
The filters to apply. {} for none.
Filters to narrow the conversations. Every field is optional and they combine with AND; send {} for no filter at all.
Only conversations of this assistant
"550e8400-e29b-41d4-a716-446655440000"
Only conversations with this title
"Solar Analysis Discussion"
Archived conversations instead of the live ones
false
Only conversations answered by this model
"gpt-4.1"
Created at or after this Unix timestamp in milliseconds
1609459200000
Created at or before this Unix timestamp in milliseconds
1640995200000
At least this many input tokens
100
At least this many output tokens
50
Only conversations of this tenant
"tenant_12345"
Only conversations of this end user inside the tenant. Matches the canonical metadata.subtenantId, so it works however the subtenant was originally supplied.
"user_67890"
Only conversations whose metadata matches these fields. Nested matching is supported.
{ "promptTemplateParams": { "userId": "123" } }
Only conversations carrying ANY of these tags
["project-alpha", "high-priority"]
Response
A page of conversations. The status is 201 rather than 200 because the filters travel in the body of a POST; nothing is created.
A page of conversations.