x-twitter
The deterministic read path for public X (Twitter) data through UnifAPI. This
is a Data Skill: it does not run a marketing job on its own — it names the
concrete x/... operations, response shapes, and gotchas so any X-first
workflow (KOL pricing, creator vetting, buying signals, competitor and listening
work) reads from one known recipe instead of rediscovering the surface each time.
Read-only — eyes, not hands. It researches public X data and returns cited
records; it never posts, replies, follows, or DMs, and UnifAPI never holds X
credentials.
Use the unifapi skill for live evidence
Connect once through the shared unifapi skill (OAuth MCP), then call the
operations below. The X integration is backed by RapidAPI SocialLab but the
public contract uses X-style /x/... paths — do not use legacy
/twitter/... paths. Keep any billing metadata so the output can state record
cost.
Response contract
Single-entity endpoints return the object in data:
{
"request_id": "unif_...",
"data": {},
"billing": { "records_charged": 1, "balance_remaining": 99 }
}
List endpoints return an array in data plus pagination:
{
"request_id": "unif_...",
"data": [],
"pagination": { "has_more": false, "next_cursor": null },
"billing": { "records_charged": 1 }
}
When pagination.has_more is true, pass pagination.next_cursor as the next
request's pagination_token (next_token is also accepted). Always preserve
billing when reporting cost.
Core operations
| Need |
Operation |
| Profile by handle |
x/users/by/username/{username} |
| Profiles by handles |
x/users/by (?usernames=a,b) |
| Profile by id |
x/users/{id} |
| Profiles by ids |
x/users (?ids=123,456) |
| Recent authored posts |
x/users/{id}/tweets (?max_results=10&exclude=replies) |
| Search recent posts |
x/tweets/search/recent (?query=...&max_results=10) |
| Autocomplete users/topics |
x/autocomplete (?query=...) |
| Post by id / posts by ids |
x/tweets/{id} · x/tweets (?ids=123,456) |
| Who amplified a post |
x/tweets/{id}/retweeted_by · x/tweets/{id}/quote_tweets |
| Who liked a post |
x/tweets/{id}/liking_users |
| What a user likes |
x/users/{id}/liked_tweets |
| Followers / following |
x/users/{id}/followers · x/users/{id}/following |
| Verified followers |
x/users/{id}/verified_followers |
| Regional trends |
x/trends/by/woeid/{woeid} |
Need a field not listed here? Use the unifapi skill's get_operation to read
the exact schema before calling — but pick the operation from this table, don't
discover blind.
Workflow
The deterministic recipes. Pick the one that matches the job; each names exactly
what to call.
- Resolve a handle to a profile. Strip the leading
@, then call
x/users/by/username/{username}. Read data.id (needed for every per-user
call below) and data.public_metrics.followers_count.
- Read recent engagement. With the id from step 1, call
x/users/{id}/tweets?max_results=10&exclude=replies. Compute engagement from
each tweet's public_metrics (like_count, retweet_count, reply_count,
quote_count, impression_count). Page with
x/users/{id}/tweets?pagination_token={next_cursor} when has_more.
- Trace who amplified a post. With a tweet id from step 2, call
x/tweets/{id}/retweeted_by, x/tweets/{id}/quote_tweets, or
x/tweets/{id}/liking_users to see who reposted, quoted, or liked it — the
amplification and intent signal behind buying-signal, listening, and
competitor work. Use x/users/{id}/liked_tweets for what a user engages with.
Page via next_cursor.
- Gauge audience quality. Call
x/users/{id}/verified_followers; it returns
the verified followers as a paginated list, not a ready figure. Measure its
size against data.public_metrics.followers_count from step 1 — that verified
share is the real-vs-inflated signal that feeds confidence and warnings in
downstream pricing/vetting skills. Page via next_cursor for a fuller count.
- Discover from a topic (no handles yet). Call
x/tweets/search/recent?query=... for recent matching posts, or
x/autocomplete?query=... for user/topic suggestions, then resolve the
surfaced handles with step 1.
- Map a network. Call
x/users/{id}/followers or x/users/{id}/following
for audience-overlap or reach work; page via next_cursor.
- Read regional trends. Call
x/trends/by/woeid/{woeid} for what's trending
in a location (WOEID), e.g. for listening or content-timing.
- Cite everything. Every figure ties back to the post or profile it came
from; report
billing.records_charged (or estimate when billing metadata is
absent).
Shape notes
XUser — metrics nested under public_metrics: followers_count,
following_count, tweet_count, listed_count. Profile flags at top level:
protected, verified, verified_type. Read public_metrics, not legacy
flat fields.
XTweet — metrics nested under public_metrics: like_count,
retweet_count, reply_count, quote_count, bookmark_count,
impression_count. May include author and media when available.
Gotchas
- Use
/x/... paths, never /twitter/... (legacy). Old /twitter/users/{screen_name}
→ x/users/by/username/{username}; old /twitter/search →
x/tweets/search/recent (use x/autocomplete for user/topic discovery).
- A protected, too-old, or too-thin timeline lowers confidence — surface it,
don't paper over it.
- Resolve the handle to
data.id before any x/users/{id}/... call.
- A low balance can silently truncate list pages: check
billing.truncated_due_to_balance — when true the page is partial, so top up
before trusting any count or share computed from it.
Output
Return the records the calling workflow needs, each cited to its post/profile,
plus a one-line cost note (records_charged). When this skill is used directly,
a compact profile + engagement summary per handle is the default:
**@handle** — followers {N}, verified {yes/no}. Recent 10 posts: avg engagement {x}% ({likes}/{reposts}/{replies}). Evidence: {post URLs}. Records: ~{N}.
Related skills
- kol-pricing, creator-shortlist, audience-fit-check (Influencer Marketing) — price and vet X creators on top of this read path.
- buying-signal-monitor (Social Selling), competitor-profiling (Competitive Intelligence), social-listening-brief (Social Listening) — X-first intent, competitor, and listening work.
- unifapi — the shared data skill: connect MCP and look up exact schemas with
get_operation.
1---
2name: x-twitter
3description: When a workflow needs public X/Twitter data through UnifAPI — profiles, posts, engagement, followers/following, recent search, autocomplete, or trends. Also use on "read this X handle," "pull tweets for," "X follower count," "search X for," "Twitter engagement," "X trends," or when another skill (KOL pricing, creator shortlist, buying signals, competitor/listening) needs the deterministic X read path. Connect via the `unifapi` skill first. Read-only research, never posts.
4license: MIT
5metadata:
6 author: UnifAPI
7 version: "1.0.0"
8 homepage: https://unifapi.com/agents/x-twitter
9 source: https://github.com/unifapi-agent/agents
10---
11
12# x-twitter
13
14The deterministic read path for public **X (Twitter)** data through UnifAPI. This
15is a **Data Skill**: it does not run a marketing job on its own — it names the
16concrete `x/...` operations, response shapes, and gotchas so any X-first
17workflow (KOL pricing, creator vetting, buying signals, competitor and listening
18work) reads from one known recipe instead of rediscovering the surface each time.
19
20Read-only — **eyes, not hands**. It researches public X data and returns cited
21records; it never posts, replies, follows, or DMs, and UnifAPI never holds X
22credentials.
23
24## Use the `unifapi` skill for live evidence
25
26Connect once through the shared **`unifapi`** skill (OAuth MCP), then call the
27operations below. The X integration is backed by RapidAPI SocialLab but the
28public contract uses **X-style `/x/...` paths** — do **not** use legacy
29`/twitter/...` paths. Keep any `billing` metadata so the output can state record
30cost.
31
32## Response contract
33
34Single-entity endpoints return the object in `data`:
35
36```json
37{
38 "request_id": "unif_...",
39 "data": {},
40 "billing": { "records_charged": 1, "balance_remaining": 99 }
41}
42```
43
44List endpoints return an array in `data` plus `pagination`:
45
46```json
47{
48 "request_id": "unif_...",
49 "data": [],
50 "pagination": { "has_more": false, "next_cursor": null },
51 "billing": { "records_charged": 1 }
52}
53```
54
55When `pagination.has_more` is true, pass `pagination.next_cursor` as the next
56request's `pagination_token` (`next_token` is also accepted). Always preserve
57`billing` when reporting cost.
58
59## Core operations
60
61| Need | Operation |
62| ------------------------- | ----------------------------------------------------------- |
63| Profile by handle | `x/users/by/username/{username}` |
64| Profiles by handles | `x/users/by` (`?usernames=a,b`) |
65| Profile by id | `x/users/{id}` |
66| Profiles by ids | `x/users` (`?ids=123,456`) |
67| Recent authored posts | `x/users/{id}/tweets` (`?max_results=10&exclude=replies`) |
68| Search recent posts | `x/tweets/search/recent` (`?query=...&max_results=10`) |
69| Autocomplete users/topics | `x/autocomplete` (`?query=...`) |
70| Post by id / posts by ids | `x/tweets/{id}` · `x/tweets` (`?ids=123,456`) |
71| Who amplified a post | `x/tweets/{id}/retweeted_by` · `x/tweets/{id}/quote_tweets` |
72| Who liked a post | `x/tweets/{id}/liking_users` |
73| What a user likes | `x/users/{id}/liked_tweets` |
74| Followers / following | `x/users/{id}/followers` · `x/users/{id}/following` |
75| Verified followers | `x/users/{id}/verified_followers` |
76| Regional trends | `x/trends/by/woeid/{woeid}` |
77
78Need a field not listed here? Use the `unifapi` skill's `get_operation` to read
79the exact schema before calling — but pick the operation from this table, don't
80discover blind.
81
82## Workflow
83
84The deterministic recipes. Pick the one that matches the job; each names exactly
85what to call.
86
871. **Resolve a handle to a profile.** Strip the leading `@`, then call
88 `x/users/by/username/{username}`. Read `data.id` (needed for every per-user
89 call below) and `data.public_metrics.followers_count`.
902. **Read recent engagement.** With the id from step 1, call
91 `x/users/{id}/tweets?max_results=10&exclude=replies`. Compute engagement from
92 each tweet's `public_metrics` (`like_count`, `retweet_count`, `reply_count`,
93 `quote_count`, `impression_count`). Page with
94 `x/users/{id}/tweets?pagination_token={next_cursor}` when `has_more`.
953. **Trace who amplified a post.** With a tweet id from step 2, call
96 `x/tweets/{id}/retweeted_by`, `x/tweets/{id}/quote_tweets`, or
97 `x/tweets/{id}/liking_users` to see who reposted, quoted, or liked it — the
98 amplification and intent signal behind buying-signal, listening, and
99 competitor work. Use `x/users/{id}/liked_tweets` for what a user engages with.
100 Page via `next_cursor`.
1014. **Gauge audience quality.** Call `x/users/{id}/verified_followers`; it returns
102 the verified followers as a paginated list, not a ready figure. Measure its
103 size against `data.public_metrics.followers_count` from step 1 — that verified
104 share is the real-vs-inflated signal that feeds confidence and warnings in
105 downstream pricing/vetting skills. Page via `next_cursor` for a fuller count.
1065. **Discover from a topic (no handles yet).** Call
107 `x/tweets/search/recent?query=...` for recent matching posts, or
108 `x/autocomplete?query=...` for user/topic suggestions, then resolve the
109 surfaced handles with step 1.
1106. **Map a network.** Call `x/users/{id}/followers` or `x/users/{id}/following`
111 for audience-overlap or reach work; page via `next_cursor`.
1127. **Read regional trends.** Call `x/trends/by/woeid/{woeid}` for what's trending
113 in a location (WOEID), e.g. for listening or content-timing.
1148. **Cite everything.** Every figure ties back to the post or profile it came
115 from; report `billing.records_charged` (or estimate when billing metadata is
116 absent).
117
118## Shape notes
119
120- **`XUser`** — metrics nested under `public_metrics`: `followers_count`,
121 `following_count`, `tweet_count`, `listed_count`. Profile flags at top level:
122 `protected`, `verified`, `verified_type`. Read `public_metrics`, not legacy
123 flat fields.
124- **`XTweet`** — metrics nested under `public_metrics`: `like_count`,
125 `retweet_count`, `reply_count`, `quote_count`, `bookmark_count`,
126 `impression_count`. May include `author` and `media` when available.
127
128## Gotchas
129
130- Use `/x/...` paths, never `/twitter/...` (legacy). Old `/twitter/users/{screen_name}`
131 → `x/users/by/username/{username}`; old `/twitter/search` →
132 `x/tweets/search/recent` (use `x/autocomplete` for user/topic discovery).
133- A protected, too-old, or too-thin timeline lowers confidence — surface it,
134 don't paper over it.
135- Resolve the handle to `data.id` **before** any `x/users/{id}/...` call.
136- A low balance can silently truncate list pages: check
137 `billing.truncated_due_to_balance` — when true the page is partial, so top up
138 before trusting any count or share computed from it.
139
140## Output
141
142Return the records the calling workflow needs, each cited to its post/profile,
143plus a one-line cost note (`records_charged`). When this skill is used directly,
144a compact profile + engagement summary per handle is the default:
145
146```markdown
147**@handle** — followers {N}, verified {yes/no}. Recent 10 posts: avg engagement {x}% ({likes}/{reposts}/{replies}). Evidence: {post URLs}. Records: ~{N}.
148```
149
150## Related skills
151
152- **kol-pricing**, **creator-shortlist**, **audience-fit-check** (Influencer Marketing) — price and vet X creators on top of this read path.
153- **buying-signal-monitor** (Social Selling), **competitor-profiling** (Competitive Intelligence), **social-listening-brief** (Social Listening) — X-first intent, competitor, and listening work.
154- **unifapi** — the shared data skill: connect MCP and look up exact schemas with `get_operation`.