curl --request GET \
--url https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search \
--header 'X-API-Key: <api-key>'import requests
url = "https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search', 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://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"bookmark_count": 34,
"content_type": "original",
"conversation_id": "1799123456789",
"display_name": "Cathie Wood",
"entity_mentions": {
"people": [
{
"confidence": 123,
"mention_method": "<string>",
"person_id": 123
}
],
"tickers": [
{
"confidence": 123,
"mention_method": "<string>",
"ticker": "<string>"
}
],
"topics": [
{
"matched_keywords": [
"<string>"
],
"topic_id": "<string>"
}
]
},
"first_observed_at": "2025-04-25T12:00:00Z",
"full_text": "Disruptive innovation will continue.",
"hashtags": [
"AI",
"ETF"
],
"in_reply_to_user_id": "44196397",
"last_edited_at": "2025-04-25T12:40:00Z",
"last_observed_at": "2025-04-25T12:40:00Z",
"like_count": 1234,
"media": [
{
"alt_text": "<string>",
"duration_ms": 15000,
"height": 800,
"media_key": "3_1234",
"preview_image_url": "<string>",
"type": "photo",
"url": "https://pbs.twimg.com/media/foo.jpg",
"variants": [
{
"bit_rate": 123,
"content_type": "video/mp4",
"url": "<string>"
}
],
"width": 1200
}
],
"media_json": "<string>",
"mentions": [
"elonmusk"
],
"meta_json": "<string>",
"platform_id": "1799123456789",
"profile_image_url": "https://pbs.twimg.com/profile_images/1234/avatar_normal.jpg",
"published_at": "2025-04-25T12:34:56Z",
"quote_count": 12,
"referenced_tweet_id": "1799000000001",
"referenced_tweet_type": "quoted",
"referenced_tweets": [
{
"author_display_name": "Elon Musk",
"author_external_id": "44196397",
"author_handle": "elonmusk",
"id": "1799000000001",
"published_at": "2025-04-25T12:34:56Z",
"text": "<string>",
"text_status": "ok",
"type": "quoted"
}
],
"reply_count": 78,
"retweet_count": 56,
"source": "<unknown>",
"twitter_handle": "CathieDWood",
"updated_at": "2025-04-25T12:40:00.123456Z",
"url": "https://x.com/CathieDWood/status/1799123456789",
"view_count": 90000
}
],
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}Search all of X live
OpenAPI JSON Spec Searches every public post on X at request time, through X’s own search (twitterapi.io advanced_search). Use it for accounts and topics Arrays does not track: /social-feeds/x/search only reads tweets Arrays has already stored.
q takes X advanced-search syntax: words, “exact phrase”, OR, -exclude,
from:user, to:user, @user, #tag, CASHTAG,lang:en,minfaves:N,minretweets:N,filter:media,−filter:replies,url:domain.Nativeretweetsareleftoutunlessqcontainsinclude:nativeretweets.Example:‘NVDA (earnings OR guidance) min_faves:50 -filter:replies`. The query sent
to X, since/until included, must fit in 500 bytes; since and until add 22
bytes each.
Each call returns one page of at most 20 tweets. To get the next page,
send pagination.cursor back as cursor with the same q, sort, since and
until, and stop when has_more is false. A page can hold fewer than 20
tweets, or none, while has_more is still true.
sort=latest (default) lists matches newest first; sort=top is X’s Top
tab. since / until (Unix seconds) bound published_at, and tweets outside
them are dropped even when X returns them.
Results are what X search shows: it leaves out some replies, accounts X
filters for quality and older posts, and the same query can return
different pages minutes apart. A retweet comes back with empty text and zero
counts and the original tweet in source; a quote has the quoted tweet in
source. An X Article tweet carries only its link; fetch the article body
with /social-feeds/x/by-url. Results are not stored by Arrays, so they do
not show up in /social-feeds/x/search or /by-handle.
Returns 503 when X search is unavailable or the daily live-search budget is spent (it resets at 00:00 UTC).
curl --request GET \
--url https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search \
--header 'X-API-Key: <api-key>'import requests
url = "https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search', 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://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-tools.prd.arrays.org/api/v1/social-feeds/x/live-search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"bookmark_count": 34,
"content_type": "original",
"conversation_id": "1799123456789",
"display_name": "Cathie Wood",
"entity_mentions": {
"people": [
{
"confidence": 123,
"mention_method": "<string>",
"person_id": 123
}
],
"tickers": [
{
"confidence": 123,
"mention_method": "<string>",
"ticker": "<string>"
}
],
"topics": [
{
"matched_keywords": [
"<string>"
],
"topic_id": "<string>"
}
]
},
"first_observed_at": "2025-04-25T12:00:00Z",
"full_text": "Disruptive innovation will continue.",
"hashtags": [
"AI",
"ETF"
],
"in_reply_to_user_id": "44196397",
"last_edited_at": "2025-04-25T12:40:00Z",
"last_observed_at": "2025-04-25T12:40:00Z",
"like_count": 1234,
"media": [
{
"alt_text": "<string>",
"duration_ms": 15000,
"height": 800,
"media_key": "3_1234",
"preview_image_url": "<string>",
"type": "photo",
"url": "https://pbs.twimg.com/media/foo.jpg",
"variants": [
{
"bit_rate": 123,
"content_type": "video/mp4",
"url": "<string>"
}
],
"width": 1200
}
],
"media_json": "<string>",
"mentions": [
"elonmusk"
],
"meta_json": "<string>",
"platform_id": "1799123456789",
"profile_image_url": "https://pbs.twimg.com/profile_images/1234/avatar_normal.jpg",
"published_at": "2025-04-25T12:34:56Z",
"quote_count": 12,
"referenced_tweet_id": "1799000000001",
"referenced_tweet_type": "quoted",
"referenced_tweets": [
{
"author_display_name": "Elon Musk",
"author_external_id": "44196397",
"author_handle": "elonmusk",
"id": "1799000000001",
"published_at": "2025-04-25T12:34:56Z",
"text": "<string>",
"text_status": "ok",
"type": "quoted"
}
],
"reply_count": 78,
"retweet_count": 56,
"source": "<unknown>",
"twitter_handle": "CathieDWood",
"updated_at": "2025-04-25T12:40:00.123456Z",
"url": "https://x.com/CathieDWood/status/1799123456789",
"view_count": 90000
}
],
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}{
"data": "<unknown>",
"error": {
"code": "RESOURCE_NOT_FOUND",
"details": [
{
"field": "<string>",
"got": "<string>",
"reason": "<string>"
}
],
"docs_url": "<string>",
"examples": [
"<string>"
],
"hint": "<string>",
"message": "The requested resource was not found.",
"suggestions": [
"<string>"
]
},
"metadata": "<unknown>",
"pagination": "<unknown>",
"request_id": "<string>",
"success": true
}Authorizations
API Key authentication. Example: "your-api-key-here"
Query Parameters
X advanced-search query (at most 500 bytes once since/until are appended)
latest (default, newest first) or top (X's Top tab)
latest, top Earliest published_at (Unix seconds)
Latest published_at (Unix seconds); must be greater than since
pagination.cursor from the previous page; omit for the first page

