Documentation Index Fetch the complete documentation index at: https://timelines.ai/docs/llms.txt
Use this file to discover all available pages before exploring further.
Managing Chats
Learn how to list, filter, assign, and organize your WhatsApp chats programmatically.
Listing chats
Get all chats in your workspace:
curl -X GET "https://app.timelines.ai/integrations/api/chats" \
-H "Authorization: Bearer YOUR_TOKEN"
Response:
{
"status" : "ok" ,
"data" : {
"has_more_pages" : true ,
"chats" : [
{
"id" : 123456 ,
"name" : "John Doe" ,
"phone" : "+14155551234" ,
"is_group" : false ,
"whatsapp_account_id" : "15559876543@s.whatsapp.net" ,
"responsible" : "agent@company.com" ,
"closed" : false ,
"read" : true
}
]
}
}
Filtering chats
Combine filters to find specific chats. Multiple filters use AND logic.
By label
Find chats with specific labels:
# Chats with "vip" OR "enterprise" label
curl -X GET "https://app.timelines.ai/integrations/api/chats?label=vip,enterprise" \
-H "Authorization: Bearer YOUR_TOKEN"
By assigned agent
# Chats assigned to specific team member
curl -X GET "https://app.timelines.ai/integrations/api/chats?responsible=agent@company.com" \
-H "Authorization: Bearer YOUR_TOKEN"
By read/unread status
# Unread chats only
curl -X GET "https://app.timelines.ai/integrations/api/chats?read=false" \
-H "Authorization: Bearer YOUR_TOKEN"
By chat type
# Group chats only
curl -X GET "https://app.timelines.ai/integrations/api/chats?group=true" \
-H "Authorization: Bearer YOUR_TOKEN"
# Direct chats only
curl -X GET "https://app.timelines.ai/integrations/api/chats?group=false" \
-H "Authorization: Bearer YOUR_TOKEN"
By name
# Chats containing "acme" in the name
curl -X GET "https://app.timelines.ai/integrations/api/chats?name=acme" \
-H "Authorization: Bearer YOUR_TOKEN"
By date range
# Chats created after January 1, 2024
curl -X GET "https://app.timelines.ai/integrations/api/chats?created_after=2024-01-01T00:00:00Z" \
-H "Authorization: Bearer YOUR_TOKEN"
Combined filters
# Unread VIP chats assigned to a specific agent
curl -X GET "https://app.timelines.ai/integrations/api/chats?read=false&label=vip&responsible=agent@company.com" \
-H "Authorization: Bearer YOUR_TOKEN"
Results are paginated with 50 chats per page.
# Get page 2
curl -X GET "https://app.timelines.ai/integrations/api/chats?page=2" \
-H "Authorization: Bearer YOUR_TOKEN"
Check has_more_pages in the response to know if more pages exist.
Getting chat details
Retrieve full details for a specific chat:
curl -X GET "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN"
Updating chats
Assign to team member
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "responsible": "agent@company.com" }'
Unassign
Set responsible to an empty string:
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "responsible": "" }'
Close/reopen chat
# Close chat
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "closed": true }'
# Reopen chat
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "closed": false }'
Mark as read/unread
# Mark as read
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "read": true }'
Rename chat
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "John Doe - VIP Customer" }'
Chat names must be unique within your workspace.
Enable/disable AI auto-response
curl -X PATCH "https://app.timelines.ai/integrations/api/chats/123456" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "chatgpt_autoresponse_enabled": true }'
Working with labels
Get chat labels
curl -X GET "https://app.timelines.ai/integrations/api/chats/123456/labels" \
-H "Authorization: Bearer YOUR_TOKEN"
Add labels
Add labels without removing existing ones:
curl -X PUT "https://app.timelines.ai/integrations/api/chats/123456/labels" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "labels": ["follow-up", "high-priority"] }'
Replace labels
Replace all labels with a new set:
curl -X POST "https://app.timelines.ai/integrations/api/chats/123456/labels" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "labels": ["vip", "enterprise"] }'
Labels are created automatically if they don’t exist.
Adding notes
Add internal notes visible only to your team:
curl -X POST "https://app.timelines.ai/integrations/api/chats/123456/notes" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "text": "Customer prefers email for follow-ups. Next call scheduled for Monday." }'
Notes are not sent to WhatsApp—they’re internal annotations for your team.
Common workflows
Route new chats to agents
import requests
def route_chat ( chat_id , labels ):
"""Assign chat to agent based on labels"""
# Get chat labels
response = requests.get(
f 'https://app.timelines.ai/integrations/api/chats/ { chat_id } /labels' ,
headers = { 'Authorization' : 'Bearer YOUR_TOKEN' }
)
chat_labels = response.json()[ 'data' ][ 'labels' ]
# Route based on labels
if 'enterprise' in chat_labels:
agent = 'senior@company.com'
elif 'support' in chat_labels:
agent = 'support@company.com'
else :
agent = 'sales@company.com'
# Assign chat
requests.patch(
f 'https://app.timelines.ai/integrations/api/chats/ { chat_id } ' ,
headers = {
'Authorization' : 'Bearer YOUR_TOKEN' ,
'Content-Type' : 'application/json'
},
json = { 'responsible' : agent}
)
Close inactive chats
from datetime import datetime, timedelta
def close_inactive_chats ( days_inactive = 30 ):
"""Close chats with no activity in X days"""
cutoff = datetime.utcnow() - timedelta( days = days_inactive)
response = requests.get(
f 'https://app.timelines.ai/integrations/api/chats?closed=false' ,
headers = { 'Authorization' : 'Bearer YOUR_TOKEN' }
)
for chat in response.json()[ 'data' ][ 'chats' ]:
# Check last message date (you'd need to fetch messages)
# If inactive, close
requests.patch(
f 'https://app.timelines.ai/integrations/api/chats/ { chat[ "id" ] } ' ,
headers = {
'Authorization' : 'Bearer YOUR_TOKEN' ,
'Content-Type' : 'application/json'
},
json = { 'closed' : True }
)
Next steps
Send messages Send messages to your chats
Set up webhooks Get notified of new messages