Conversations and messages
Send Chat Message
Sends an encrypted message to a specific Chat conversation. For 1:1 conversations, provide the recipient’s user ID; the server constructs the canonical conversation ID from the authenticated user and recipient. A recipient who cannot be messaged (closed inbox, system/notification account, or a 1:1 block) returns HTTP 403 with type https://api.x.com/2/problems/recipient-not-messageable.
POST
/
2
/
chat
/
conversations
/
{id}
/
messages
Send Chat Message
curl --request POST \
--url https://api.x.com/2/chat/conversations/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"encoded_message_create_event": "<string>",
"message_id": "<string>",
"conversation_token": "<string>",
"encoded_message_event_signature": "<string>"
}
'import requests
url = "https://api.x.com/2/chat/conversations/{id}/messages"
payload = {
"encoded_message_create_event": "<string>",
"message_id": "<string>",
"conversation_token": "<string>",
"encoded_message_event_signature": "<string>"
}
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({
encoded_message_create_event: '<string>',
message_id: '<string>',
conversation_token: '<string>',
encoded_message_event_signature: '<string>'
})
};
fetch('https://api.x.com/2/chat/conversations/{id}/messages', 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.x.com/2/chat/conversations/{id}/messages",
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([
'encoded_message_create_event' => '<string>',
'message_id' => '<string>',
'conversation_token' => '<string>',
'encoded_message_event_signature' => '<string>'
]),
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.x.com/2/chat/conversations/{id}/messages"
payload := strings.NewReader("{\n \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\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.x.com/2/chat/conversations/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.x.com/2/chat/conversations/{id}/messages")
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 \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"encoded_message_event": "<string>"
},
"errors": [
{
"detail": "<string>",
"resource_type": "<string>",
"title": "<string>",
"type": "https://api.x.com/2/problems/resource-not-found",
"parameter": "<string>",
"resource_id": "<string>",
"status": 123,
"value": "<string>"
}
]
}{
"code": 123,
"message": "<string>"
}Authorizations
OAuth2UserTokenUserToken
The access token received from the authorization server in the OAuth 2.0 flow.
FlowAuthorization Code
- Authorization URL
- https://api.x.com/2/oauth2/authorize
- Token URL
- https://api.x.com/2/oauth2/token
Scopes3
dm.write
Send and manage your Direct Messages.
tweet.read
View all posts you can see, including those from protected accounts.
users.read
View any account you can see, including protected accounts.
Path Parameters
Pattern:
^([0-9]{1,19}|[0-9]{1,19}-[0-9]{1,19}|g[0-9]{1,19})$Body
application/json
Base64-encoded Thrift MessageCreateEvent containing encrypted message contents.
Unique identifier for this message.
Optional conversation token.
Base64-encoded Thrift MessageEventSignature for message verification.
⌘I
Send Chat Message
curl --request POST \
--url https://api.x.com/2/chat/conversations/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"encoded_message_create_event": "<string>",
"message_id": "<string>",
"conversation_token": "<string>",
"encoded_message_event_signature": "<string>"
}
'import requests
url = "https://api.x.com/2/chat/conversations/{id}/messages"
payload = {
"encoded_message_create_event": "<string>",
"message_id": "<string>",
"conversation_token": "<string>",
"encoded_message_event_signature": "<string>"
}
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({
encoded_message_create_event: '<string>',
message_id: '<string>',
conversation_token: '<string>',
encoded_message_event_signature: '<string>'
})
};
fetch('https://api.x.com/2/chat/conversations/{id}/messages', 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.x.com/2/chat/conversations/{id}/messages",
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([
'encoded_message_create_event' => '<string>',
'message_id' => '<string>',
'conversation_token' => '<string>',
'encoded_message_event_signature' => '<string>'
]),
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.x.com/2/chat/conversations/{id}/messages"
payload := strings.NewReader("{\n \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\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.x.com/2/chat/conversations/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.x.com/2/chat/conversations/{id}/messages")
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 \"encoded_message_create_event\": \"<string>\",\n \"message_id\": \"<string>\",\n \"conversation_token\": \"<string>\",\n \"encoded_message_event_signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"encoded_message_event": "<string>"
},
"errors": [
{
"detail": "<string>",
"resource_type": "<string>",
"title": "<string>",
"type": "https://api.x.com/2/problems/resource-not-found",
"parameter": "<string>",
"resource_id": "<string>",
"status": 123,
"value": "<string>"
}
]
}{
"code": 123,
"message": "<string>"
}