xpoz-ts-sdk
Health Uyari
- No license — Repository has no license file
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 8 GitHub stars
Code Uyari
- fs module — File system access in .github/workflows/release.yml
- process.env — Environment variable access in src/client.ts
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
TypeScript SDK for Xpoz — typed access to Twitter/X, Instagram, Reddit & TikTok data for social listening, research, and AI agents. npm: @xpoz/xpoz
Xpoz TypeScript SDK
TypeScript SDK for the Xpoz social media intelligence platform. Query Twitter/X, Instagram, Reddit, and TikTok data through a simple, typed interface.
Installation
npm install @xpoz/xpoz
Requires Node.js 18+.
Get an API Key
Sign up and get your token at https://xpoz.ai/get-token.
Once you have it, pass it directly or set the XPOZ_API_KEY environment variable:
export XPOZ_API_KEY=your-token-here
What is Xpoz?
Xpoz provides unified access to social media data across Twitter/X, Instagram, Reddit, and TikTok. The platform indexes billions of posts, user profiles, and engagement metrics — making it possible to search, analyze, and export social media data at scale.
The SDK wraps Xpoz's MCP server, abstracting away transport, authentication, operation polling, and pagination into a clean developer-friendly API.
Features
- 42 data methods across Twitter, Instagram, Reddit, and TikTok
- Fully async — all methods return
Promise<T> - Automatic operation polling — long-running queries are abstracted away
- Response types — choose between fast (immediate), paging (full pagination), or CSV export
- Server-side pagination —
PaginatedResult<T>withnextPage(),getPage(n) - CSV export —
exportCsv()on any paginated result - Field selection — request only the fields you need
- TypeScript-first — fully typed results with autocomplete support
- Namespaced API —
client.twitter.*,client.instagram.*,client.reddit.*,client.tiktok.*,client.tracking.*
Quick Start
import { XpozClient, ResponseType } from "@xpoz/xpoz";
const client = new XpozClient({ apiKey: "your-api-key" });
await client.connect();
const user = await client.twitter.getUser("elonmusk");
console.log(`${user.name} — ${user.followersCount?.toLocaleString()} followers`);
const results = await client.twitter.searchPosts("artificial intelligence", {
startDate: "2025-01-01",
});
for (const post of results.data) {
console.log(post.text, post.likeCount);
}
await client.close();
Authentication
Get your API key at https://xpoz.ai/get-token, then use it as follows:
// Pass API key directly
const client = new XpozClient({ apiKey: "your-api-key" });
// Or use XPOZ_API_KEY environment variable
const client = new XpozClient();
// Custom server URL (also reads XPOZ_SERVER_URL env var)
const client = new XpozClient({ apiKey: "your-api-key", serverUrl: "https://xpoz.ai/mcp" });
// Custom operation timeout in milliseconds (default: 300000)
const client = new XpozClient({ apiKey: "your-api-key", timeoutMs: 600_000 });
Trial Access (No Sign-Up Required)
Want to try the SDK before signing up? Mint a free trial token (no account needed, valid for 5 days):
curl -X POST https://api.xpoz.ai/api/trial/token \
-H "Content-Type: application/json" \
-d '{"source": "sdk"}'
# -> { "success": true, "data": { "accessKey": "TRIAL...", "expiresInSeconds": 432000 }, ... }
The source field is required — it identifies where the trial token request came from (e.g. skills, a specific page, sdk, cli).
Then use the returned token (it starts with TRIAL) as your API key:
// Optional: try without your own account
const client = new XpozClient({
apiKey: "TRIAL...", // the token from the curl response above
});
await client.connect();
const user = await client.twitter.getUser("elonmusk");
The trial token is rate-limited and intentionally restricted:
- Read-only data tools only — search and lookup methods across Twitter, Instagram, Reddit, and TikTok. Account, tracking, and operation-management methods are not available and return an upgrade prompt.
- Up to 5 results per call — every response is capped at 5 items.
responseTypeis forced toResponseType.FAST, so pagination (PAGING) and CSV export (CSV) are unavailable. - Cached data only — trial reads from the database and does not trigger live on-demand crawling, so the very latest posts may not appear.
For full result limits, pagination, CSV export, and live data, get your own API key.
Async Disposal
// Using Symbol.asyncDispose (Node.js 18.2+ with --experimental-vm-modules or TypeScript 5.2+)
await using client = new XpozClient({ apiKey: "your-api-key" });
await client.connect();
const user = await client.twitter.getUser("elonmusk");
// client.close() is called automatically
// Manual connect/close
const client = new XpozClient({ apiKey: "your-api-key" });
await client.connect();
try {
const results = await client.twitter.searchPosts("AI");
} finally {
await client.close();
}
Pagination
Methods that return large datasets use server-side pagination (100 items per page). These return a PaginatedResult<T> with built-in helpers:
const results = await client.twitter.searchPosts("AI");
results.data // TwitterPost[] — current page
results.pagination.totalRows // total matching rows
results.pagination.totalPages // total pages
results.pagination.pageNumber // current page number
results.pagination.pageSize // items per page (100)
results.pagination.resultsCount // items on current page
results.hasNextPage() // boolean
// Navigate pages
const page2 = await results.nextPage(); // fetch next page
const page5 = await results.getPage(5); // jump to specific page
// Export to CSV
const csvUrl = await results.exportCsv(); // returns download URL
Field Selection
All methods accept a fields option. Use camelCase field names.
// Only fetch the fields you need (faster + less memory)
const results = await client.twitter.searchPosts("AI", {
fields: ["id", "text", "likeCount", "retweetCount", "createdAtDate"],
});
const user = await client.twitter.getUser("elonmusk", {
fields: ["id", "username", "name", "followersCount", "description"],
});
Requesting fewer fields significantly improves response time.
Response Types
Search and query methods support a responseType option that controls how results are returned. Import the ResponseType enum:
import { XpozClient, ResponseType } from "@xpoz/xpoz";
| Mode | Enum Value | Behavior | Best For |
|---|---|---|---|
| Fast | ResponseType.Fast |
Returns up to 300 results immediately, no async polling (default) | Quick queries, UI previews |
| Paging | ResponseType.Paging |
Async paginated query with full dataset access | Full analysis, large datasets |
| CSV | ResponseType.Csv |
Async bulk export, use exportCsv() to get download URL |
Data exports |
Fast mode (default)
The default behavior. Returns results immediately without polling. Use limit to constrain the number of results (max 300):
const results = await client.twitter.searchPosts("bitcoin", {
startDate: "2025-01-01",
responseType: ResponseType.Fast,
limit: 50,
});
console.log(results.data.length); // up to 50 results, returned immediately
Paging mode
Returns paginated results with full totalRows, totalPages, and tableName for cursor-based navigation:
const results = await client.twitter.searchPosts("bitcoin", {
startDate: "2025-01-01",
responseType: ResponseType.Paging, // optional — this is the default
});
console.log(results.pagination.totalRows); // total matching rows
if (results.hasNextPage()) {
const page2 = await results.nextPage();
}
CSV mode
Initiates an async export. Call exportCsv() on the result to poll the export operation and get a download URL:
const results = await client.twitter.searchPosts("bitcoin", {
startDate: "2025-01-01",
responseType: ResponseType.Csv,
});
const downloadUrl = await results.exportCsv();
console.log(downloadUrl); // URL to download the CSV file
Methods supporting responseType and limit
The following methods accept both responseType and limit:
twitter.getPostsByAuthor(),twitter.searchPosts(),twitter.getUsersByKeywords()instagram.getPostsByUser(),instagram.searchPosts(),instagram.getUsersByKeywords()reddit.searchPosts()tiktok.getPostsByUser(),tiktok.searchPosts(),tiktok.getUsersByKeywords(),tiktok.getPostsByHashtags(),tiktok.getUsersByHashtags(),tiktok.getPostsBySound()
These methods accept limit only:
twitter.searchUsers(),instagram.searchUsers(),reddit.searchUsers(),reddit.searchSubreddits()tiktok.searchUsers(),tiktok.searchSounds()
Query Syntax
The query parameter on all search* and get*ByKeywords methods supports a Lucene-style full-text syntax across Twitter, Instagram, and Reddit.
Exact phrase
Wrap in double quotes to require an exact match:
"machine learning"
"climate change"
Keywords (any word)
Space-separated terms without quotes match posts containing any of the words:
AI crypto blockchain
Boolean operators
Use AND, OR, NOT (case-insensitive). A bare space is treated as OR — be explicit:
"deep learning" AND python
tensorflow OR pytorch
climate NOT politics
Grouping with parentheses
(AI OR "artificial intelligence") AND ethics
(startup OR entrepreneur) NOT "venture capital"
Combined example
const results = await client.twitter.searchPosts(
'("machine learning" OR "deep learning") AND python NOT spam',
{
startDate: "2025-01-01",
language: "en",
}
);
Note: Do not use
from:,lang:,since:, oruntil:in the query string — use the dedicated parameters (authorUsername,language,startDate,endDate) instead.
Error Handling
import {
XpozError,
AuthenticationError,
XpozConnectionError,
OperationTimeoutError,
OperationFailedError,
OperationCancelledError,
ResponseType,
} from "@xpoz/xpoz";
try {
const user = await client.twitter.getUser("nonexistent_user_12345");
} catch (e) {
if (e instanceof OperationFailedError) {
console.log(`Operation ${e.operationId} failed: ${e.operationError}`);
} else if (e instanceof OperationTimeoutError) {
console.log(`Timed out after ${Math.round(e.elapsedMs / 1000)}s`);
} else if (e instanceof AuthenticationError) {
console.log("Invalid API key");
} else if (e instanceof XpozError) {
console.log(`Xpoz error: ${e.message}`);
}
}
API Reference
Twitter — client.twitter
getUser(identifier, options?) -> Promise<TwitterUser>
Get a single Twitter user profile.
// By username (default)
const user = await client.twitter.getUser("elonmusk");
// By numeric ID
const user = await client.twitter.getUser("44196397", { identifierType: "id" });
searchUsers(name, options?) -> Promise<TwitterUser[]>
Search users by name or username. Returns up to 10 results by default. Use limit to adjust.
const users = await client.twitter.searchUsers("elon");
const topFive = await client.twitter.searchUsers("elon", { limit: 5 });
getUserConnections(username, connectionType, options?) -> Promise<PaginatedResult<TwitterUser>>
Get followers or following for a user.
const followers = await client.twitter.getUserConnections("elonmusk", "followers");
const following = await client.twitter.getUserConnections("elonmusk", "following");
getUsersByKeywords(query, options?) -> Promise<PaginatedResult<TwitterUser>>
Find users who authored posts matching a keyword query. Supports responseType and limit.
const users = await client.twitter.getUsersByKeywords('"machine learning"', {
fields: ["username", "name", "followersCount"],
responseType: ResponseType.Fast,
limit: 20,
});
getPostsByIds(postIds, options?) -> Promise<TwitterPost[]>
Get 1-100 posts by their IDs.
const tweets = await client.twitter.getPostsByIds(["1234567890", "0987654321"]);
getPostsByAuthor(identifier, options?) -> Promise<PaginatedResult<TwitterPost>>
Get all posts by an author with optional date filtering. Supports responseType and limit.
const results = await client.twitter.getPostsByAuthor("elonmusk", {
startDate: "2025-01-01",
responseType: ResponseType.Fast,
limit: 100,
});
searchPosts(query, options?) -> Promise<PaginatedResult<TwitterPost>>
Full-text search with filters. Supports exact phrases ("machine learning"), boolean operators (AI AND python), and parentheses. Supports responseType and limit.
const results = await client.twitter.searchPosts('"artificial intelligence" AND ethics', {
startDate: "2025-01-01",
endDate: "2025-06-01",
language: "en",
fields: ["id", "text", "likeCount", "authorUsername", "createdAtDate"],
responseType: ResponseType.Fast,
limit: 50,
});
getRetweets(postId, options?) -> Promise<PaginatedResult<TwitterPost>>
Get retweets of a specific post (database only).
const retweets = await client.twitter.getRetweets("1234567890");
getQuotes(postId, options?) -> Promise<PaginatedResult<TwitterPost>>
Get quote tweets of a specific post.
const quotes = await client.twitter.getQuotes("1234567890");
getComments(postId, options?) -> Promise<PaginatedResult<TwitterPost>>
Get replies to a specific post.
const comments = await client.twitter.getComments("1234567890");
getPostInteractingUsers(postId, interactionType, options?) -> Promise<PaginatedResult<TwitterUser>>
Get users who interacted with a post. interactionType: "commenters", "quoters", "retweeters".
const commenters = await client.twitter.getPostInteractingUsers("1234567890", "commenters");
countPosts(phrase, options?) -> Promise<number>
Count tweets containing a phrase within a date range.
const count = await client.twitter.countPosts("bitcoin", { startDate: "2025-01-01" });
console.log(`${count.toLocaleString()} tweets mention bitcoin`);
Instagram — client.instagram
getUser(identifier, options?) -> Promise<InstagramUser>
const user = await client.instagram.getUser("instagram");
console.log(`${user.fullName} — ${user.followerCount?.toLocaleString()} followers`);
searchUsers(name, options?) -> Promise<InstagramUser[]>
Search users by name. Use limit to adjust the number of results.
const users = await client.instagram.searchUsers("nasa");
const topThree = await client.instagram.searchUsers("nasa", { limit: 3 });
getUserConnections(username, connectionType, options?) -> Promise<PaginatedResult<InstagramUser>>
const followers = await client.instagram.getUserConnections("instagram", "followers");
getUsersByKeywords(query, options?) -> Promise<PaginatedResult<InstagramUser>>
Find users who authored posts matching a keyword query. Supports responseType and limit.
const users = await client.instagram.getUsersByKeywords('"sustainable fashion"', {
responseType: ResponseType.Fast,
limit: 20,
});
getPostsByIds(postIds, options?) -> Promise<InstagramPost[]>
Post IDs must be in strong_id format: "media_id_user_id" (e.g. "3606450040306139062_4836333238").
const posts = await client.instagram.getPostsByIds(["3606450040306139062_4836333238"]);
getPostsByUser(identifier, options?) -> Promise<PaginatedResult<InstagramPost>>
Get all posts by a user. Supports responseType and limit.
const results = await client.instagram.getPostsByUser("nasa", {
responseType: ResponseType.Fast,
limit: 50,
});
searchPosts(query, options?) -> Promise<PaginatedResult<InstagramPost>>
Full-text search with filters. Supports responseType and limit.
const results = await client.instagram.searchPosts("travel photography", {
responseType: ResponseType.Fast,
limit: 30,
});
getComments(postId, options?) -> Promise<PaginatedResult<InstagramComment>>
const comments = await client.instagram.getComments("3606450040306139062_4836333238");
getPostInteractingUsers(postId, interactionType, options?) -> Promise<PaginatedResult<InstagramUser>>
interactionType: "commenters", "likers".
const likers = await client.instagram.getPostInteractingUsers(
"3606450040306139062_4836333238",
"likers"
);
Reddit — client.reddit
getUser(username, options?) -> Promise<RedditUser>
const user = await client.reddit.getUser("spez");
console.log(`${user.username} — ${user.totalKarma?.toLocaleString()} karma`);
searchUsers(name, options?) -> Promise<RedditUser[]>
Search users by name. Use limit to adjust the number of results.
const users = await client.reddit.searchUsers("spez");
const topThree = await client.reddit.searchUsers("spez", { limit: 3 });
getUsersByKeywords(query, options?) -> Promise<PaginatedResult<RedditUser>>
const users = await client.reddit.getUsersByKeywords('"machine learning"', {
subreddit: "MachineLearning",
});
searchPosts(query, options?) -> Promise<PaginatedResult<RedditPost>>
sort: "relevance", "hot", "top", "new", "comments". time: "hour", "day", "week", "month", "year", "all". Supports responseType and limit.
const results = await client.reddit.searchPosts("python tutorial", {
subreddit: "learnpython",
sort: "top",
time: "month",
responseType: ResponseType.Fast,
limit: 25,
});
getPostWithComments(postId, options?) -> Promise<RedditPostWithComments>
Returns an object with the post and its comments.
const result = await client.reddit.getPostWithComments("abc123");
console.log(result.post.title);
for (const comment of result.comments) {
console.log(` ${comment.authorUsername}: ${comment.body?.slice(0, 80)}`);
}
searchComments(query, options?) -> Promise<PaginatedResult<RedditComment>>
const comments = await client.reddit.searchComments("helpful tip", {
subreddit: "LifeProTips",
});
searchSubreddits(query, options?) -> Promise<RedditSubreddit[]>
Search subreddits by name. Use limit to adjust the number of results.
const subs = await client.reddit.searchSubreddits("machine learning");
const topFive = await client.reddit.searchSubreddits("machine learning", { limit: 5 });
getSubredditWithPosts(subredditName, options?) -> Promise<SubredditWithPosts>
const result = await client.reddit.getSubredditWithPosts("wallstreetbets");
console.log(`r/${result.subreddit.displayName} — ${result.subreddit.subscribersCount?.toLocaleString()} members`);
for (const post of result.posts) {
console.log(` ${post.title} (${post.score} points)`);
}
getSubredditsByKeywords(query, options?) -> Promise<PaginatedResult<RedditSubreddit>>
const subs = await client.reddit.getSubredditsByKeywords("cryptocurrency");
TikTok — client.tiktok
getUser(identifier, options?) -> Promise<TiktokUser>
const user = await client.tiktok.getUser("charlidamelio");
console.log(`${user.nickname} — ${user.followerCount?.toLocaleString()} followers`);
// By numeric ID
const user = await client.tiktok.getUser("123456789", { identifierType: "id" });
searchUsers(name, options?) -> Promise<TiktokUser[]>
Search users by name. Use limit to adjust the number of results.
const users = await client.tiktok.searchUsers("charli");
const topFive = await client.tiktok.searchUsers("charli", { limit: 5 });
getUsersByKeywords(query, options?) -> Promise<PaginatedResult<TiktokUser>>
Find users who authored posts matching a keyword query. Supports responseType and limit.
const users = await client.tiktok.getUsersByKeywords('"machine learning"', {
responseType: ResponseType.Fast,
limit: 20,
});
getPostsByIds(postIds, options?) -> Promise<TiktokPost[]>
Get 1-100 posts by their IDs.
const posts = await client.tiktok.getPostsByIds(["7123456789012345678"]);
getPostsByUser(identifier, options?) -> Promise<PaginatedResult<TiktokPost>>
Get all posts by a user. Supports responseType and limit.
const results = await client.tiktok.getPostsByUser("charlidamelio", {
startDate: "2025-01-01",
responseType: ResponseType.Fast,
limit: 50,
});
searchPosts(query, options?) -> Promise<PaginatedResult<TiktokPost>>
Full-text search with filters. Supports responseType and limit.
const results = await client.tiktok.searchPosts("travel vlog", {
startDate: "2025-01-01",
responseType: ResponseType.Fast,
limit: 30,
});
getPostsByHashtags(hashtags, options?) -> Promise<PaginatedResult<TiktokPost>>
Search posts by hashtags via the indexed hashtags column. Pass bare alphanumeric tags (no leading #). Max 5 hashtags per request; OR semantics across the list.
const results = await client.tiktok.getPostsByHashtags(["dance", "fyp"], {
responseType: ResponseType.Fast,
limit: 50,
});
getUsersByHashtags(hashtags, options?) -> Promise<PaginatedResult<TiktokUser>>
Find users who authored posts tagged with the given hashtags. Same input rules as getPostsByHashtags.
const users = await client.tiktok.getUsersByHashtags(["sustainable_fashion"], {
responseType: ResponseType.Fast,
limit: 20,
});
searchSounds(keyword, options?) -> Promise<TiktokSound[]>
Search sound/music objects by keyword (title or artist). Pass the returned id to getPostsBySound.
const sounds = await client.tiktok.searchSounds("dance monkey");
const soundId = sounds[0].id;
getPostsBySound(soundId, options?) -> Promise<PaginatedResult<TiktokPost>>
Find posts that use a specific sound via the indexed music_id column. Pass a single numeric soundId from searchSounds.
const results = await client.tiktok.getPostsBySound("7016548364456789012", {
responseType: ResponseType.Fast,
limit: 50,
});
getComments(postId, options?) -> Promise<PaginatedResult<TiktokComment>>
const comments = await client.tiktok.getComments("7123456789012345678");
Tracking — client.tracking
Manage tracked items (keywords, users, subreddits) that Xpoz monitors on your behalf. Import the enums to build items:
import { XpozClient, TrackedItemType, TrackedItemPlatform } from "@xpoz/xpoz";
getTrackedItems() -> Promise<TrackedItem[]>
List all currently tracked items on your account.
const items = await client.tracking.getTrackedItems();
for (const item of items) {
console.log(`${item.platform} / ${item.type}: ${item.phrase}`);
}
addTrackedItems(items) -> Promise<AddTrackedItemsResult>
Add one or more items to track.
const result = await client.tracking.addTrackedItems([
{ phrase: "bitcoin", type: TrackedItemType.Keyword, platform: TrackedItemPlatform.Twitter },
{ phrase: "nasa", type: TrackedItemType.User, platform: TrackedItemPlatform.Instagram },
]);
console.log(`Added ${result.addedCount} items (${result.currentCount}/${result.maxTrackedItems} used)`);
removeTrackedItems(items) -> Promise<RemoveTrackedItemsResult>
Remove one or more tracked items.
const result = await client.tracking.removeTrackedItems([
{ phrase: "bitcoin", type: TrackedItemType.Keyword, platform: TrackedItemPlatform.Twitter },
]);
console.log(`Removed ${result.removedCount} items`);
Account — client.account
Read-only account, plan, and usage information for the authenticated user.
getAccountDetails() -> Promise<AccountDetails>
Returns the plan (name + feature limits), billing (period + next renewal; billing is null on the Free plan), and current usage (remaining subscription/extra credits, extra tracked items).
const details = await client.account.getAccountDetails();
console.log(details.plan.name, details.usage.subscriptionCreditsRemaining);
getCreditsUsageHistory(range?, granularity?) -> Promise<CreditsUsageHistory>
Returns time-series usage for credits and export rows. range is one of "today", "7d", "current_month" (default), "lifetime"; granularity is "hour" or "day" (default). For current remaining balances, use getAccountDetails().
const history = await client.account.getCreditsUsageHistory("7d", "day");
for (const bucket of history.credits) {
console.log(bucket.bucket, bucket.totalUsed);
}
Type Models
All fields are optional and typed as their respective TypeScript types. Unknown fields are preserved on the object.
TwitterPost
| Field | Type | Description |
|---|---|---|
id |
string |
Post ID |
text |
string |
Post text content |
authorId |
string |
Author's user ID |
authorUsername |
string |
Author's username |
likeCount |
number |
Number of likes |
retweetCount |
number |
Number of retweets |
replyCount |
number |
Number of replies |
quoteCount |
number |
Number of quotes |
impressionCount |
number |
Number of impressions |
bookmarkCount |
number |
Number of bookmarks |
lang |
string |
Language code |
hashtags |
string[] |
Hashtags in tweet |
mentions |
string[] |
Mentioned usernames |
mediaUrls |
string[] |
Media attachment URLs |
urls |
string[] |
URLs in tweet text |
country |
string |
Country (if geo-tagged) |
createdAt |
string |
Creation timestamp |
createdAtDate |
string |
Creation date (YYYY-MM-DD) |
conversationId |
string |
Thread conversation ID |
quotedTweetId |
string |
ID of quoted tweet |
replyToTweetId |
string |
ID of parent tweet |
possiblySensitive |
boolean |
Sensitive content flag |
isRetweet |
boolean |
Whether this is a retweet |
hasBirdwatchNotes |
boolean |
Has community notes |
birdwatchNotesId |
string |
Birdwatch note ID |
birdwatchNotesText |
string |
Birdwatch note text |
birdwatchNotesUrl |
string |
Birdwatch note URL |
status |
string |
Tweet status |
TwitterUser
| Field | Type | Description |
|---|---|---|
id |
string |
User ID |
username |
string |
Username (handle) |
name |
string |
Display name |
description |
string |
Bio text |
location |
string |
Location string |
verified |
boolean |
Verification status |
verifiedType |
string |
Verification type |
followersCount |
number |
Number of followers |
followingCount |
number |
Number of following |
tweetCount |
number |
Total tweets |
likesCount |
number |
Total likes |
profileImageUrl |
string |
Profile picture URL |
createdAt |
string |
Account creation timestamp |
accountBasedIn |
string |
Account location |
InstagramPost
| Field | Type | Description |
|---|---|---|
id |
string |
Post ID (strong_id format) |
caption |
string |
Post caption |
username |
string |
Author username |
fullName |
string |
Author display name |
likeCount |
number |
Number of likes |
commentCount |
number |
Number of comments |
reshareCount |
number |
Number of reshares |
videoPlayCount |
number |
Video play count |
mediaType |
string |
Media type |
imageUrl |
string |
Image URL |
videoUrl |
string |
Video URL |
createdAtDate |
string |
Creation date |
genAiChatWithAiCtaInfo |
string |
Gen AI chat CTA info |
hasHighRiskGenAiInformTreatment |
boolean |
High risk Gen AI treatment flag |
InstagramUser
| Field | Type | Description |
|---|---|---|
id |
string |
User ID |
username |
string |
Username |
fullName |
string |
Display name |
biography |
string |
Bio text |
isPrivate |
boolean |
Private account |
isVerified |
boolean |
Verified status |
followerCount |
number |
Followers |
followingCount |
number |
Following |
mediaCount |
number |
Total posts |
profilePicUrl |
string |
Profile picture URL |
InstagramComment
| Field | Type | Description |
|---|---|---|
id |
string |
Comment ID |
text |
string |
Comment text |
username |
string |
Author username |
parentPostId |
string |
Parent post ID |
likeCount |
number |
Number of likes |
childCommentCount |
number |
Reply count |
createdAtDate |
string |
Creation date |
RedditPost
| Field | Type | Description |
|---|---|---|
id |
string |
Post ID |
title |
string |
Post title |
selftext |
string |
Post body text |
authorUsername |
string |
Author username |
subredditName |
string |
Subreddit name |
score |
number |
Net score |
upvotes |
number |
Upvote count |
commentsCount |
number |
Comment count |
url |
string |
Post URL |
permalink |
string |
Reddit permalink |
isSelf |
boolean |
Self post (text only) |
over18 |
boolean |
NSFW flag |
createdAtDate |
string |
Creation date |
RedditUser
| Field | Type | Description |
|---|---|---|
id |
string |
User ID |
username |
string |
Username |
totalKarma |
number |
Total karma |
linkKarma |
number |
Link karma |
commentKarma |
number |
Comment karma |
isGold |
boolean |
Reddit Gold status |
isMod |
boolean |
Moderator status |
profileDescription |
string |
Profile bio |
createdAtDate |
string |
Account creation date |
RedditComment
| Field | Type | Description |
|---|---|---|
id |
string |
Comment ID |
body |
string |
Comment text |
authorUsername |
string |
Author username |
parentPostId |
string |
Parent post ID |
score |
number |
Net score |
depth |
number |
Nesting depth |
isSubmitter |
boolean |
Is OP |
createdAtDate |
string |
Creation date |
RedditSubreddit
| Field | Type | Description |
|---|---|---|
id |
string |
Subreddit ID |
displayName |
string |
Subreddit name |
title |
string |
Subreddit title |
publicDescription |
string |
Short description |
description |
string |
Full description |
subscribersCount |
number |
Subscriber count |
activeUserCount |
number |
Active users |
over18 |
boolean |
NSFW flag |
createdAtDate |
string |
Creation date |
TiktokPost
| Field | Type | Description |
|---|---|---|
id |
string |
Post ID |
description |
string |
Post caption/description |
descriptionLanguage |
string |
Language of description |
userId |
string |
Author user ID |
username |
string |
Author username |
nickname |
string |
Author display name |
likeCount |
number |
Number of likes |
commentCount |
number |
Number of comments |
playCount |
number |
Video play count |
collectCount |
number |
Number of collects/saves |
downloadCount |
number |
Number of downloads |
forwardCount |
number |
Number of forwards/shares |
videoThumbnail |
string |
Thumbnail URL |
videoUrl |
string[] |
Array of video URLs |
duration |
number |
Video duration in seconds |
hashtags |
string[] |
Hashtags in the post |
postType |
number |
Post type code |
isPrivate |
boolean |
Private post flag |
createdAt |
string |
Creation timestamp |
createdAtDate |
string |
Creation date (YYYY-MM-DD) |
TiktokUser
| Field | Type | Description |
|---|---|---|
id |
string |
User ID |
username |
string |
Username |
nickname |
string |
Display name |
signature |
string |
Bio text |
secUid |
string |
Secure user ID |
avatar |
string |
Profile picture URL |
isPrivate |
boolean |
Private account |
isVerified |
boolean |
Verified status |
followerCount |
number |
Number of followers |
followingCount |
number |
Number of following |
likeCount |
number |
Total likes received |
postCount |
number |
Total posts |
language |
string |
Profile language |
region |
string |
Account region |
createdAt |
string |
Account creation date |
TiktokComment
| Field | Type | Description |
|---|---|---|
id |
string |
Comment ID |
postId |
string |
Parent post ID |
userId |
string |
Author user ID |
username |
string |
Author username |
text |
string |
Comment text |
likeCount |
number |
Number of likes |
createdAt |
string |
Creation timestamp |
createdAtDate |
string |
Creation date (YYYY-MM-DD) |
TiktokSound
| Field | Type | Description |
|---|---|---|
id |
string |
Sound/music ID |
title |
string |
Sound title |
author |
string |
Sound artist/author |
album |
string |
Album name |
duration |
number |
Duration in seconds |
userCount |
number |
Number of posts using the sound |
isOriginal |
boolean |
Whether the sound is original |
isCommerceMusic |
boolean |
Whether the sound is commercial |
isOriginalSound |
boolean |
Whether it is an original sound |
AccountDetails
Returned by getAccountDetails().
| Field | Type | Description |
|---|---|---|
plan |
{ name: string; features: PlanFeatures } |
Plan name and feature limits |
billing |
AccountBilling | null |
Billing info (null on Free plan) |
usage |
AccountUsage |
Current usage balances |
PlanFeatures
| Field | Type | Description |
|---|---|---|
credits |
number |
Subscription credits per period |
creditResetFrequency |
CreditResetFrequency |
"monthly" or "never" |
extraCreditPrice |
number |
Price per extra credit |
trackedItems |
number |
Tracked-item allowance |
csvRowExportLimit |
number |
CSV row export limit |
extraCsvRowPrice |
number |
Price per extra CSV row |
extraTrackedItemPrice |
number |
Price per extra tracked item |
maxRowsPerExport |
number |
Max rows per single export |
AccountBilling
| Field | Type | Description |
|---|---|---|
billingPeriod |
BillingPeriod |
"monthly" or "annual" |
nextRenewalDate |
string | null |
Next renewal date |
AccountUsage
| Field | Type | Description |
|---|---|---|
subscriptionCreditsRemaining |
number |
Subscription credits remaining |
extraCreditsRemaining |
number |
Extra credits remaining |
extraTrackedItems |
number |
Extra tracked items purchased |
CreditsUsageHistory
Returned by getCreditsUsageHistory().
| Field | Type | Description |
|---|---|---|
range |
string |
Requested range |
granularity |
string |
Requested granularity |
generatedAt |
string |
Timestamp the report was generated |
credits |
UsageHistoryBucket[] |
Credit usage buckets over time |
exportRows |
UsageHistoryBucket[] |
Export-rows usage buckets over time |
UsageHistoryBucket
| Field | Type | Description |
|---|---|---|
bucket |
string |
Bucket timestamp (hour or day) |
subscriptionUsed |
number |
Subscription units used in the bucket |
extraUsed |
number |
Extra units used in the bucket |
totalUsed |
number |
Total units used in the bucket |
extraPurchased |
number |
Extra units purchased in the bucket |
TrackedItem
| Field | Type | Description |
|---|---|---|
phrase |
string |
Keyword, username, or subreddit name to track |
type |
TrackedItemType |
"keyword", "user", or "subreddit" |
platform |
TrackedItemPlatform |
"twitter", "instagram", "reddit", or "tiktok" |
AddTrackedItemsResult
| Field | Type | Description |
|---|---|---|
success |
boolean |
Whether the operation succeeded |
addedCount |
number |
Number of items added |
message |
string |
Status message |
currentCount |
number |
Total tracked items after addition |
maxTrackedItems |
number |
Plan limit for tracked items |
planName |
string |
Current plan name |
RemoveTrackedItemsResult
| Field | Type | Description |
|---|---|---|
success |
boolean |
Whether the operation succeeded |
removedCount |
number |
Number of items removed |
message |
string |
Status message |
Composite Types
RedditPostWithComments — returned by getPostWithComments():
post: RedditPostcomments: RedditComment[]commentsPagination: PaginationInfo | nullcommentsTableName: string | null
SubredditWithPosts — returned by getSubredditWithPosts():
subreddit: RedditSubredditposts: RedditPost[]postsPagination: PaginationInfo | nullpostsTableName: string | null
Environment Variables
| Variable | Description | Default |
|---|---|---|
XPOZ_API_KEY |
API key for authentication | — |
XPOZ_SERVER_URL |
MCP server URL | https://mcp.xpoz.ai/mcp |
Testing
Tests hit the live Xpoz API and require a valid API key:
XPOZ_API_KEY=your-api-key npx vitest run
License
MIT
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi