Tweet search API by contract address (CA Search)
CA Search is a B2B Extra Feature: full tweet search by contract address, ticker, cashtag, or any keyword — returned as structured JSON with complete tweet and author metadata. Built for trading apps that need to show who called a token and what they said, without sending users to x.com.
It answers the questions degens ask about any CA: which accounts posted it, how big they are, what reach the token has, and the full context of every quote, retweet, and reply.
Endpoint
POST https://api.xanguard.tech/v1/searchUses your B2B (dt_) API key — issued when you activate CA Search in @B2B_Xanguard_bot, with or without a base B2B subscription (standalone works). Both auth header styles are accepted:
Authorization: Bearer dt_your_api_key_here
# or, twitterapi.io-compatible:
X-API-Key: dt_your_api_key_hereRequest Body
| Field | Type | Description |
|---|---|---|
query | string | Required, 1–200 bytes after trimming (UTF-8, so fewer characters for non-Latin text). Contract address, $TICKER, cashtag, or any keywords. |
cursor | string | Optional. Send the previous response's next_cursor together with the same query, since and until; without since the window resets to the last 24h. An unrecognised cursor restarts from the newest tweet. |
since | string | Optional. Window start — RFC3339 (2026-07-20T00:00:00Z), YYYY-MM-DD (midnight UTC), or unix epoch (s or ms). Defaults to 24 hours ago. |
until | string | Optional. Window end (exclusive) — same formats as since. If it is more than 24 hours ago you must also send since, e.g. {"query": "...", "since": "2026-07-20", "until": "2026-07-25"}. |
curl -X POST https://api.xanguard.tech/v1/search \
-H "Authorization: Bearer dt_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"query": "0x7a848a5a8169aa6a2f603d056a749f924f504444"}'Historical window example:
curl -X POST https://api.xanguard.tech/v1/search \
-H "Authorization: Bearer dt_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"query": "0x7a848a5a8169aa6a2f603d056a749f924f504444", "since": "2026-07-20", "until": "2026-07-25"}'Response
Standard envelope. Each call searches backwards through the window — the last 24 hours by default, or a custom range when since/until are supplied (echoed back as data.since / data.until; data.window_hours is always 24) — and returns
up to 200 tweets per call in data.tweets, each with full engagement metrics and a complete author object.
Very hot queries (or long windows) that exceed 200 tweets come back with has_next_page: true — pass next_cursor as cursor to continue. Rarely, a call returns fewer tweets with has_next_page: false. Every call counts once against your daily search allowance, including cursor continuations and calls that fail with 500.
data.summary aggregates the result set: how many unique authors posted, total_reach (author followers summed once per returned tweet) and top_callers (the authors of the 5 highest-follower tweets, so an author can repeat).
{
"ok": true,
"data": {
"tweets": [
{
"type": "tweet",
"id": "1947000000000000000",
"url": "https://x.com/hongxiao_sol/status/1947000000000000000",
"text": "$EXAMPLE just launched, CA: 0x7a84…4444",
"createdAt": "Sun Jul 20 10:15:00 +0000 2026",
"retweetCount": 3,
"replyCount": 1,
"likeCount": 42,
"quoteCount": 0,
"viewCount": 5100,
"bookmarkCount": 2,
"lang": "en",
"isReply": false,
"inReplyToId": "",
"inReplyToUsername": "",
"conversationId": "1947000000000000000",
"author": {
"userName": "hongxiao_sol",
"name": "Hong",
"id": "1500000000000000000",
"followers": 11145,
"following": 320,
"isBlueVerified": true,
"profilePicture": "https://pbs.twimg.com/profile_images/…",
"description": "sol maxi",
"location": "",
"createdAt": "Mon Mar 15 09:00:00 +0000 2021",
"statusesCount": 8900,
"mediaCount": 1200,
"favouritesCount": 4500
},
"entities": {"hashtags": [], "urls": [], "user_mentions": []},
"quoted_tweet": null,
"retweeted_tweet": null
}
],
"summary": {
"total_tweets": 20,
"unique_authors": 17,
"total_reach": 208122,
"top_callers": ["@whalecaller", "@hongxiao_sol"]
},
"window_hours": 24,
"has_next_page": false,
"next_cursor": null
}
}Quote, Retweet & Reply Context
Every tweet keeps its full context, so you can render the original content alongside reposts and replies:
| Field | Present when | Contents |
|---|---|---|
quoted_tweet | The tweet quotes another | Nested tweet object: id, url, text, author, metrics |
retweeted_tweet | The tweet is a repost | Nested tweet object of the original |
original | The tweet is a reply (filled for up to the first 30 replies per call; omitted if the parent could not be fetched) | The parent tweet: id, text, author username |
Plans & Limits
CA Search is a monthly plan — standalone or on top of your B2B subscription (activate in @B2B_Xanguard_bot → Extra Features):
| Plan | Daily searches | Price |
|---|---|---|
| CA Search 1K | 1,000/day (~30k/mo) | $100/mo |
| CA Search 2K | 2,000/day (~60k/mo) | $180/mo |
| CA Search 5K | 5,000/day (~150k/mo) | $250/mo |
| Limit | Value |
|---|---|
| Rate limit | 10 requests/sec and 20 requests/min per Telegram account (all your keys share it), in fixed windows that start at your first request |
| Results per call | Up to 200 tweets per call (default window: last 24h; custom via since/until) — continue with cursor for hotter queries or longer windows |
200, 429 and 500 responses carry your quota state as headers — check them instead of hard-coding plan values:
| Header | Meaning |
|---|---|
X-RateLimit-Daily-Limit | Your plan's daily search allowance (e.g. 1000) |
X-RateLimit-Daily-Remaining | Searches left today (UTC day) after this request |
X-RateLimit-Minute-Limit | Burst ceiling per minute window (20) |
X-RateLimit-Minute-Remaining | Burst allowance left in the current minute window |
| Status | Meaning | Example error |
|---|---|---|
400 | Missing or oversized query, or a bad since/until (bad_request) | "Query must be 1-200 characters" · "Invalid since/until" · "since must be before until" |
401 | Missing / invalid dt_ key (unauthorized) | "Invalid or inactive API key" |
403 | CA Search add-on not enabled on this key, or expired | "CA Search is not enabled for this key" |
422 | Body has no query field (plain-text response) | — |
429 | Rate limit (rate_limited, retry_after 1 or 60) or daily allowance exhausted (daily_limit_reached, retry_after = seconds to 00:00 UTC); also a Retry-After header | "Daily search limit reached (1000/1000)" |
500 | Temporary search failure (server_error, retry_after 30); still counted against your allowance | "Search failed" |
Add-on feature. CA Search is enabled per B2B subscription. Buy it under Extra Features → CA Search in @B2B_Xanguard_bot — SOL payment, automatic activation on confirmation. Payments are final and non-refundable; all prices are on xanguard.tech/pricing.