[Problem/Question]
Created Tickets but Unable to see in the UI
[SDK Version]
I am using the API
[Reproduction Steps]Try this code
import requests
import json
import os
from dotenv import load_dotenv
load_dotenv()
APPLICATION_ID = os.getenv('SENDBIRD_APP_ID')
DESK_API_TOKEN = os.getenv('SENDBIRD_DESK_API_TOKEN')
CHAT_API_TOKEN = os.getenv('SENDBIRD_API_TOKEN')
USER_ID = 'customer_123'
NICKNAME = 'Customer 123'
PROFILE_URL = 'https://example.com/avatar.png'
COMMON_CHANNEL_NAME = "Common Support Group"
COMMON_CHANNEL_URL = os.getenv('COMMON_CHANNEL_URL') # Optionally preset if exists
HEADERS_CHAT = {
'Api-Token': CHAT_API_TOKEN,
'Content-Type': 'application/json'
}
HEADERS_DESK = {
'SENDBIRDDESKAPITOKEN': DESK_API_TOKEN,
'Content-Type': 'application/json'
}
def create_chat_user_if_not_exists(user_id, nickname, profile_url):
url = f'https://api-{APPLICATION_ID}.sendbird.com/v3/users?user_ids={user_id}'
r = requests.get(url, headers=HEADERS_CHAT)
r.raise_for_status()
users = r.json().get('users', [])
if users:
print(f"User {user_id} already exists.")
return users[0]
payload = {
'user_id': user_id,
'nickname': nickname,
'profile_url': profile_url
}
url_create = f'https://api-{APPLICATION_ID}.sendbird.com/v3/users'
r_create = requests.post(url_create, headers=HEADERS_CHAT, json=payload)
r_create.raise_for_status()
print(f"User {user_id} created.")
return r_create.json()
def create_desk_customer_if_not_exists(sendbird_id):
list_url = f'https://desk-api-{APPLICATION_ID}.sendbird.com/platform/v1/customers?q={sendbird_id}'
r_list = requests.get(list_url, headers=HEADERS_DESK)
r_list.raise_for_status()
results = r_list.json().get('results', [])
if results:
print(f"Customer {sendbird_id} exists.")
return results[0]
create_url = f'https://desk-api-{APPLICATION_ID}.sendbird.com/platform/v1/customers'
payload = {'sendbirdId': sendbird_id}
r_create = requests.post(create_url, headers=HEADERS_DESK, json=payload)
r_create.raise_for_status()
print(f"Customer {sendbird_id} created.")
return r_create.json()
def get_or_create_common_group_channel():
if COMMON_CHANNEL_URL:
print(f"Using existing common channel: {COMMON_CHANNEL_URL}")
return COMMON_CHANNEL_URL
url = f"https://api-{APPLICATION_ID}.sendbird.com/v3/group_channels"
params = {
'channel_name': COMMON_CHANNEL_NAME,
'limit': 1,
'is_distinct': True
}
r = requests.get(url, headers=HEADERS_CHAT, params=params)
if r.status_code == 200 and r.json().get("channels"):
channel_url = r.json()["channels"][0]["channel_url"]
print(f"Found existing common channel: {channel_url}")
return channel_url
payload = {
"name": COMMON_CHANNEL_NAME,
"is_distinct": True,
"user_ids": []
}
r_create = requests.post(url, headers=HEADERS_CHAT, json=payload)
r_create.raise_for_status()
channel_url = r_create.json()["channel_url"]
print(f"Created common channel: {channel_url}")
return channel_url
def create_ticket_for_customer(customer_id, channel_url, title="Support Request"):
ticket_url = f'https://desk-api-{APPLICATION_ID}.sendbird.com/platform/v1/tickets'
payload = {
'channelName': title,
'priority': 'HIGH',
'status': 'open',
'customerId': customer_id,
'relatedChannelUrls': channel_url
}
r_ticket = requests.post(ticket_url, headers=HEADERS_DESK, json=payload)
try:
r_ticket.raise_for_status()
except requests.exceptions.HTTPError:
print(f"Ticket creation failed: {r_ticket.text}")
raise
print(f"Ticket created with ID {r_ticket.json()['id']}")
return r_ticket.json()
def send_message(channel_url, user_id, message):
url = f'https://api-{APPLICATION_ID}.sendbird.com/v3/group_channels/{channel_url}/messages'
payload = {
'message_type': 'MESG',
'user_id': user_id,
'message': message
}
r = requests.post(url, headers=HEADERS_CHAT, json=payload)
r.raise_for_status()
print(f"Sent message from {user_id}: \"{message}\"")
return r.json()
def get_ticket_messages(ticket_id, limit=5):
url = f'https://desk-api-{APPLICATION_ID}.sendbird.com/platform/v1/tickets/{ticket_id}/chat_messages?limit={limit}'
r = requests.get(url, headers=HEADERS_DESK)
try:
r.raise_for_status()
except requests.exceptions.HTTPError:
print(f"Failed to fetch messages: {r.text}")
raise
data = r.json()
messages = data.get('results', [])
print(f"Last {len(messages)} messages for ticket {ticket_id}:")
for msg in messages:
sender = msg.get('userSendbirdId', 'Unknown')
print(f"{sender} said: {msg.get('message', '')}")
def reply_to_message(channel_url, user_id, message, parent_message_id):
url = f'https://api-{APPLICATION_ID}.sendbird.com/v3/group_channels/{channel_url}/messages'
payload = {
'message_type': 'MESG',
'user_id': user_id,
'message': message,
'parent_message_id': parent_message_id
}
r = requests.post(url, headers=HEADERS_CHAT, json=payload)
r.raise_for_status()
print(f"User {user_id} replied to message {parent_message_id} with \"{message}\"")
return r.json()
def get_channel_messages(channel_url, limit=10):
url = f'https://api-{APPLICATION_ID}.sendbird.com/v3/group_channels/{channel_url}/messages'
params = {
'message_ts': 0, # get recent messages before now
'prev_limit': limit,
'include_replies': True # include reply messages
}
r = requests.get(url, headers=HEADERS_CHAT, params=params)
r.raise_for_status()
messages = r.json().get('messages', [])
print(f"Last {len(messages)} messages in channel {channel_url}:")
for msg in messages:
sender = msg.get('user', {}).get('user_id', 'Unknown')
text = msg.get('message', '')
msg_id = msg.get('message_id')
parent_id = msg.get('parent_message_id')
if parent_id:
print(f" [Reply to {parent_id}] {sender}: {text} (msg_id: {msg_id})")
else:
print(f"{sender}: {text} (msg_id: {msg_id})")
return messages
def main():
user = create_chat_user_if_not_exists(USER_ID, NICKNAME, PROFILE_URL)
customer = create_desk_customer_if_not_exists(USER_ID)
customer_id = customer['id']
channel_url = get_or_create_common_group_channel()
ticket = create_ticket_for_customer(customer_id, channel_url)
sent_message = send_message(channel_url, USER_ID, "Hello everyone, I need assistance.")
# Fetch messages to get the ID of a message to reply to
messages = get_channel_messages(channel_url)
if messages:
parent_message_id = messages[0]['message_id']
reply_to_message(channel_url, USER_ID, "Thanks for your help!", parent_message_id)
# Fetch messages again to see the reply
get_channel_messages(channel_url)
if __name__ == "__main__":
main()
**[Frequency]**
Everytime
[Current impact]
High
Based on this we are planning for chat transfer from our bot to agents