curl --request POST \
--url https://api.twitterapi.io/twitter/user_login_v2 \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"user_name": "<string>",
"email": "<string>",
"password": "<string>",
"proxy": "<string>",
"totp_secret": "<string>"
}
'import requests
url = "https://api.twitterapi.io/twitter/user_login_v2"
payload = {
"user_name": "<string>",
"email": "<string>",
"password": "<string>",
"proxy": "<string>",
"totp_secret": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_name: '<string>',
email: '<string>',
password: '<string>',
proxy: '<string>',
totp_secret: '<string>'
})
};
fetch('https://api.twitterapi.io/twitter/user_login_v2', 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.twitterapi.io/twitter/user_login_v2",
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([
'user_name' => '<string>',
'email' => '<string>',
'password' => '<string>',
'proxy' => '<string>',
'totp_secret' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.twitterapi.io/twitter/user_login_v2"
payload := strings.NewReader("{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.twitterapi.io/twitter/user_login_v2")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.twitterapi.io/twitter/user_login_v2")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"login_cookies": "<string>",
"status": "<string>",
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Log in
Log in to an X account with email, username, password and 2FA secret to get login cookies for the v2 posting endpoints. 10,000 credits per login.
curl --request POST \
--url https://api.twitterapi.io/twitter/user_login_v2 \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"user_name": "<string>",
"email": "<string>",
"password": "<string>",
"proxy": "<string>",
"totp_secret": "<string>"
}
'import requests
url = "https://api.twitterapi.io/twitter/user_login_v2"
payload = {
"user_name": "<string>",
"email": "<string>",
"password": "<string>",
"proxy": "<string>",
"totp_secret": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_name: '<string>',
email: '<string>',
password: '<string>',
proxy: '<string>',
totp_secret: '<string>'
})
};
fetch('https://api.twitterapi.io/twitter/user_login_v2', 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.twitterapi.io/twitter/user_login_v2",
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([
'user_name' => '<string>',
'email' => '<string>',
'password' => '<string>',
'proxy' => '<string>',
'totp_secret' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.twitterapi.io/twitter/user_login_v2"
payload := strings.NewReader("{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.twitterapi.io/twitter/user_login_v2")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.twitterapi.io/twitter/user_login_v2")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_name\": \"<string>\",\n \"email\": \"<string>\",\n \"password\": \"<string>\",\n \"proxy\": \"<string>\",\n \"totp_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"login_cookies": "<string>",
"status": "<string>",
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Authorizations
Body
User name.Must be set
Email.Must be set
The password of the user
The proxy to use.Please use high-quality residential proxies and avoid free proxies.Required.Example: http://username:password@ip:port [blocked] . You can get proxy from: https://www.webshare.io/?referral_code=4e0q1n00a504
TOTP/2FA secret (base32 seed, not a 6-digit code). Optional, but strongly recommended — accounts without 2FA may yield a login_cookie that gets flagged and can't post. To obtain: on X, enable 2FA, choose "can't scan the QR code", and X shows a 10+ character string — that's the TOTP secret.
Response
Login response
The login cookie of the user.Use this cookie to post tweets, etc.You can only call v2 APIs with this cookie.If your account is in good standing and you're using residential proxies, the cookies will generally remain valid indefinitely.
Status of the request.success or error
Message of the request.error message