Manage
Create DM conversation
Initiates a new direct message conversation with specified participants.
POST
/
2
/
dm_conversations
Create DM conversation
curl --request POST \
--url https://api.x.com/2/dm_conversations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"conversation_type": "Group",
"message": {
"attachments": [
{
"media_id": "<string>"
}
],
"text": "<string>"
},
"participant_ids": [
"<string>"
]
}
'import requests
url = "https://api.x.com/2/dm_conversations"
payload = {
"conversation_type": "Group",
"message": {
"attachments": [{ "media_id": "<string>" }],
"text": "<string>"
},
"participant_ids": ["<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({
conversation_type: 'Group',
message: {attachments: [{media_id: '<string>'}], text: '<string>'},
participant_ids: ['<string>']
})
};
fetch('https://api.x.com/2/dm_conversations', 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/dm_conversations",
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([
'conversation_type' => 'Group',
'message' => [
'attachments' => [
[
'media_id' => '<string>'
]
],
'text' => '<string>'
],
'participant_ids' => [
'<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/dm_conversations"
payload := strings.NewReader("{\n \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\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.x.com/2/dm_conversations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.x.com/2/dm_conversations")
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 \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"dm_conversation_id": "<string>",
"dm_event_id": "<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
users.read
View any account you can see, including protected accounts.
dm.write
Send and manage your Direct Messages.
tweet.read
View all posts you can see, including those from protected accounts.
Body
application/json
The conversation type to create. Supports Group only.
Available options:
Group The initial Direct Message to send to the conversation.
Show child attributes
Show child attributes
Participants for the conversation.
Required array length:
2 - 49 elementsPattern:
^[0-9]{1,19}$⌘I
Create DM conversation
curl --request POST \
--url https://api.x.com/2/dm_conversations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"conversation_type": "Group",
"message": {
"attachments": [
{
"media_id": "<string>"
}
],
"text": "<string>"
},
"participant_ids": [
"<string>"
]
}
'import requests
url = "https://api.x.com/2/dm_conversations"
payload = {
"conversation_type": "Group",
"message": {
"attachments": [{ "media_id": "<string>" }],
"text": "<string>"
},
"participant_ids": ["<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({
conversation_type: 'Group',
message: {attachments: [{media_id: '<string>'}], text: '<string>'},
participant_ids: ['<string>']
})
};
fetch('https://api.x.com/2/dm_conversations', 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/dm_conversations",
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([
'conversation_type' => 'Group',
'message' => [
'attachments' => [
[
'media_id' => '<string>'
]
],
'text' => '<string>'
],
'participant_ids' => [
'<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/dm_conversations"
payload := strings.NewReader("{\n \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\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.x.com/2/dm_conversations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.x.com/2/dm_conversations")
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 \"conversation_type\": \"Group\",\n \"message\": {\n \"attachments\": [\n {\n \"media_id\": \"<string>\"\n }\n ],\n \"text\": \"<string>\"\n },\n \"participant_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"dm_conversation_id": "<string>",
"dm_event_id": "<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>"
}