x-twitter-scraper 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +17 -3
- package/assets/pi-package.png +0 -0
- package/package.json +9 -2
- package/skills/x-twitter-scraper/LICENSE +21 -0
- package/skills/x-twitter-scraper/SKILL.md +389 -0
- package/skills/x-twitter-scraper/metadata.json +38 -0
- package/skills/x-twitter-scraper/references/api-endpoints-api-keys.md +31 -0
- package/skills/x-twitter-scraper/references/api-endpoints-compose.md +33 -0
- package/skills/x-twitter-scraper/references/api-endpoints-credits.md +11 -0
- package/skills/x-twitter-scraper/references/api-endpoints-drafts.md +86 -0
- package/skills/x-twitter-scraper/references/api-endpoints-draws.md +75 -0
- package/skills/x-twitter-scraper/references/api-endpoints-error-codes.md +37 -0
- package/skills/x-twitter-scraper/references/api-endpoints-events.md +48 -0
- package/skills/x-twitter-scraper/references/api-endpoints-extractions.md +97 -0
- package/skills/x-twitter-scraper/references/api-endpoints-monitors.md +74 -0
- package/skills/x-twitter-scraper/references/api-endpoints-radar.md +49 -0
- package/skills/x-twitter-scraper/references/api-endpoints-support.md +47 -0
- package/skills/x-twitter-scraper/references/api-endpoints-trends.md +25 -0
- package/skills/x-twitter-scraper/references/api-endpoints-tweet-style-cache.md +155 -0
- package/skills/x-twitter-scraper/references/api-endpoints-webhooks.md +74 -0
- package/skills/x-twitter-scraper/references/api-endpoints-x-accounts.md +42 -0
- package/skills/x-twitter-scraper/references/api-endpoints-x-api.md +206 -0
- package/skills/x-twitter-scraper/references/api-endpoints-x-media.md +40 -0
- package/skills/x-twitter-scraper/references/api-endpoints-x-write.md +204 -0
- package/skills/x-twitter-scraper/references/api-endpoints.md +30 -0
- package/skills/x-twitter-scraper/references/draws.md +57 -0
- package/skills/x-twitter-scraper/references/extractions.md +237 -0
- package/skills/x-twitter-scraper/references/mcp-setup.md +326 -0
- package/skills/x-twitter-scraper/references/mcp-tools.md +174 -0
- package/skills/x-twitter-scraper/references/python-examples.md +182 -0
- package/skills/x-twitter-scraper/references/security.md +124 -0
- package/skills/x-twitter-scraper/references/types-account-identity.md +9 -0
- package/skills/x-twitter-scraper/references/types-account.md +26 -0
- package/skills/x-twitter-scraper/references/types-api-keys.md +22 -0
- package/skills/x-twitter-scraper/references/types-bookmarks-and-timeline.md +46 -0
- package/skills/x-twitter-scraper/references/types-credits.md +11 -0
- package/skills/x-twitter-scraper/references/types-download-media.md +22 -0
- package/skills/x-twitter-scraper/references/types-draws.md +60 -0
- package/skills/x-twitter-scraper/references/types-error.md +10 -0
- package/skills/x-twitter-scraper/references/types-events.md +43 -0
- package/skills/x-twitter-scraper/references/types-extractions.md +106 -0
- package/skills/x-twitter-scraper/references/types-mcp-add-webhook.md +14 -0
- package/skills/x-twitter-scraper/references/types-mcp-check-follow.md +10 -0
- package/skills/x-twitter-scraper/references/types-mcp-compose-tweet.md +31 -0
- package/skills/x-twitter-scraper/references/types-mcp-estimate-extraction.md +15 -0
- package/skills/x-twitter-scraper/references/types-mcp-get-account.md +26 -0
- package/skills/x-twitter-scraper/references/types-mcp-get-draw.md +30 -0
- package/skills/x-twitter-scraper/references/types-mcp-get-events.md +19 -0
- package/skills/x-twitter-scraper/references/types-mcp-get-trends.md +16 -0
- package/skills/x-twitter-scraper/references/types-mcp-get-user-info.md +16 -0
- package/skills/x-twitter-scraper/references/types-mcp-list-monitors.md +15 -0
- package/skills/x-twitter-scraper/references/types-mcp-lookup-tweet.md +25 -0
- package/skills/x-twitter-scraper/references/types-mcp-output-schemas.md +22 -0
- package/skills/x-twitter-scraper/references/types-mcp-refine-tweet.md +13 -0
- package/skills/x-twitter-scraper/references/types-mcp-run-draw.md +18 -0
- package/skills/x-twitter-scraper/references/types-mcp-run-extraction.md +12 -0
- package/skills/x-twitter-scraper/references/types-mcp-score-tweet.md +16 -0
- package/skills/x-twitter-scraper/references/types-mcp-search-tweets.md +17 -0
- package/skills/x-twitter-scraper/references/types-mcp-test-webhook.md +11 -0
- package/skills/x-twitter-scraper/references/types-monitors.md +20 -0
- package/skills/x-twitter-scraper/references/types-radar.md +40 -0
- package/skills/x-twitter-scraper/references/types-request-bodies.md +30 -0
- package/skills/x-twitter-scraper/references/types-rest-api-vs-mcp-field-naming.md +15 -0
- package/skills/x-twitter-scraper/references/types-support.md +25 -0
- package/skills/x-twitter-scraper/references/types-trends.md +18 -0
- package/skills/x-twitter-scraper/references/types-tweet-drafts.md +20 -0
- package/skills/x-twitter-scraper/references/types-tweet-style-cache.md +50 -0
- package/skills/x-twitter-scraper/references/types-user-activity.md +35 -0
- package/skills/x-twitter-scraper/references/types-webhooks.md +38 -0
- package/skills/x-twitter-scraper/references/types-x-accounts.md +16 -0
- package/skills/x-twitter-scraper/references/types-x-api.md +69 -0
- package/skills/x-twitter-scraper/references/types-x-articles.md +21 -0
- package/skills/x-twitter-scraper/references/types-x-write.md +39 -0
- package/skills/x-twitter-scraper/references/types.md +48 -0
- package/skills/x-twitter-scraper/references/usage.md +50 -0
- package/skills/x-twitter-scraper/references/webhooks.md +243 -0
- package/skills/x-twitter-scraper/references/workflows.md +202 -0
- package/skills/x-twitter-scraper/skill-card.md +76 -0
- package/skills/x-twitter-scraper/skillspector-report.md +17 -0
- package/skills/xquik-social-research/LICENSE +21 -0
- package/skills/xquik-social-research/SKILL.md +79 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Drafts
|
|
2
|
+
|
|
3
|
+
### Create Draft
|
|
4
|
+
|
|
5
|
+
`POST /drafts`
|
|
6
|
+
|
|
7
|
+
Save a tweet draft for later.
|
|
8
|
+
|
|
9
|
+
**Request body:**
|
|
10
|
+
|
|
11
|
+
| Field | Type | Required | Description |
|
|
12
|
+
|-------|------|----------|-------------|
|
|
13
|
+
| `text` | string | Yes | The draft tweet text |
|
|
14
|
+
| `topic` | string | No | Topic the tweet is about |
|
|
15
|
+
| `goal` | string | No | Optimization goal: `engagement`, `followers`, `authority`, `conversation` |
|
|
16
|
+
|
|
17
|
+
**Response (201):**
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"id": "123",
|
|
22
|
+
"text": "draft text",
|
|
23
|
+
"topic": "product launch",
|
|
24
|
+
"goal": "engagement",
|
|
25
|
+
"createdAt": "2026-02-24T10:30:00.000Z",
|
|
26
|
+
"updatedAt": "2026-02-24T10:30:00.000Z"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
### List Drafts
|
|
33
|
+
|
|
34
|
+
`GET /drafts`
|
|
35
|
+
|
|
36
|
+
List saved tweet drafts with cursor pagination.
|
|
37
|
+
|
|
38
|
+
**Query parameters:**
|
|
39
|
+
|
|
40
|
+
| Parameter | Type | Required | Default | Description |
|
|
41
|
+
|-----------|------|----------|---------|-------------|
|
|
42
|
+
| `limit` | number | No | 50 | Results per page (max 50) |
|
|
43
|
+
| `afterCursor` | string | No | - | Pagination cursor from previous response |
|
|
44
|
+
|
|
45
|
+
**Response (200):**
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"drafts": [
|
|
50
|
+
{
|
|
51
|
+
"id": "123",
|
|
52
|
+
"text": "draft text",
|
|
53
|
+
"topic": "product launch",
|
|
54
|
+
"goal": "engagement",
|
|
55
|
+
"createdAt": "2026-02-24T10:30:00.000Z",
|
|
56
|
+
"updatedAt": "2026-02-24T10:30:00.000Z"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"afterCursor": "cursor_string",
|
|
60
|
+
"hasMore": true
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### Get Draft
|
|
67
|
+
|
|
68
|
+
`GET /drafts/{id}`
|
|
69
|
+
|
|
70
|
+
Get a specific draft by ID.
|
|
71
|
+
|
|
72
|
+
**Response (200):** Single draft object.
|
|
73
|
+
|
|
74
|
+
**Errors:** `400 invalid_id`, `404 draft_not_found`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Delete Draft
|
|
79
|
+
|
|
80
|
+
delete request to `/drafts/{id}`
|
|
81
|
+
|
|
82
|
+
Delete a draft. Returns `204 No Content`.
|
|
83
|
+
|
|
84
|
+
**Errors:** `400 invalid_id`, `404 draft_not_found`
|
|
85
|
+
|
|
86
|
+
---
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Draws
|
|
2
|
+
|
|
3
|
+
### Create Draw
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
POST /draws
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Run a giveaway draw from a tweet. Picks random winners from replies.
|
|
10
|
+
|
|
11
|
+
**Body:**
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"tweetUrl": "https://x.com/user/status/1893456789012345678",
|
|
15
|
+
"winnerCount": 3,
|
|
16
|
+
"backupCount": 2,
|
|
17
|
+
"uniqueAuthorsOnly": true,
|
|
18
|
+
"mustRetweet": true,
|
|
19
|
+
"mustFollowUsername": "burakbayir",
|
|
20
|
+
"filterMinFollowers": 100,
|
|
21
|
+
"filterAccountAgeDays": 30,
|
|
22
|
+
"filterLanguage": "en",
|
|
23
|
+
"requiredKeywords": ["giveaway"],
|
|
24
|
+
"requiredHashtags": ["#contest"],
|
|
25
|
+
"requiredMentions": ["@xquik"]
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
All filter fields are optional. Only `tweetUrl` is required.
|
|
30
|
+
|
|
31
|
+
**Response:**
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"id": "42",
|
|
35
|
+
"tweetId": "1893456789012345678",
|
|
36
|
+
"tweetUrl": "https://x.com/user/status/1893456789012345678",
|
|
37
|
+
"tweetText": "Like & RT to enter! Picking 3 winners tomorrow.",
|
|
38
|
+
"tweetAuthorUsername": "xquik",
|
|
39
|
+
"tweetLikeCount": 4200,
|
|
40
|
+
"tweetRetweetCount": 1800,
|
|
41
|
+
"tweetReplyCount": 1500,
|
|
42
|
+
"tweetQuoteCount": 120,
|
|
43
|
+
"status": "completed",
|
|
44
|
+
"totalEntries": 1500,
|
|
45
|
+
"validEntries": 890,
|
|
46
|
+
"createdAt": "2026-02-24T10:00:00.000Z",
|
|
47
|
+
"drawnAt": "2026-02-24T10:01:00.000Z"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### List Draws
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
GET /draws
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Cursor-paginated. Returns compact draw objects.
|
|
58
|
+
|
|
59
|
+
### Get Draw
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
GET /draws/{id}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Returns full draw details including winners.
|
|
66
|
+
|
|
67
|
+
### Export Draw
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
GET /draws/{id}/export?format=csv&type=winners
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Formats: `csv`, `json`, `md`, `md-document`, `pdf`, `txt`, `xlsx`. Types: `winners` (default), `entries`. Entry exports capped at 100,000 rows (PDF capped at 10,000).
|
|
74
|
+
|
|
75
|
+
---
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Error Codes
|
|
2
|
+
|
|
3
|
+
| Status | Code | Meaning |
|
|
4
|
+
|--------|------|---------|
|
|
5
|
+
| 400 | `invalid_input` | Request body failed validation |
|
|
6
|
+
| 400 | `invalid_id` | Path parameter is not a valid ID |
|
|
7
|
+
| 400 | `invalid_json` | Invalid JSON in request body |
|
|
8
|
+
| 400 | `invalid_tweet_url` | Tweet URL format is invalid |
|
|
9
|
+
| 400 | `invalid_tweet_id` | Tweet ID is empty or invalid |
|
|
10
|
+
| 400 | `invalid_username` | X username is empty or invalid |
|
|
11
|
+
| 400 | `invalid_tool_type` | Extraction tool type not recognized |
|
|
12
|
+
| 400 | `invalid_format` | Export format not `csv`, `json`, `md`, `md-document`, `pdf`, `txt`, or `xlsx` |
|
|
13
|
+
| 400 | `invalid_params` | Export query parameters are missing or invalid |
|
|
14
|
+
| 400 | `missing_query` | Required query parameter is missing |
|
|
15
|
+
| 400 | `missing_params` | Required query parameters are missing |
|
|
16
|
+
| 400 | `no_media` | Tweet has no downloadable media |
|
|
17
|
+
| 400 | `webhook_inactive` | Webhook is disabled (test-webhook only) |
|
|
18
|
+
| 401 | `unauthenticated` | Missing or invalid API key |
|
|
19
|
+
| 403 | `account_needs_reauth` | X account session expired; use dashboard re-auth flow |
|
|
20
|
+
| 402 | `no_subscription` | No active plan |
|
|
21
|
+
| 402 | `subscription_inactive` | Plan is not active |
|
|
22
|
+
| 402 | `no_credits` | No credit balance record exists |
|
|
23
|
+
| 402 | `insufficient_credits` | Credit balance is too low |
|
|
24
|
+
| 403 | `api_key_limit_reached` | API key limit reached (100 max) |
|
|
25
|
+
| 404 | `not_found` | Resource does not exist |
|
|
26
|
+
| 404 | `user_not_found` | X user not found |
|
|
27
|
+
| 404 | `tweet_not_found` | Tweet not found |
|
|
28
|
+
| 404 | `style_not_found` | No cached style found |
|
|
29
|
+
| 404 | `draft_not_found` | Draft not found |
|
|
30
|
+
| 409 | `monitor_already_exists` | Duplicate monitor for same username |
|
|
31
|
+
| 422 | `login_failed` | Account connection failed; use dashboard re-auth flow |
|
|
32
|
+
| 429 | - | Rate limited. Retry with backoff |
|
|
33
|
+
| 429 | `x_api_rate_limited` | X data source rate limited. Retry |
|
|
34
|
+
| 500 | `internal_error` | Server error |
|
|
35
|
+
| 502 | `stream_registration_failed` | Stream registration failed. Retry |
|
|
36
|
+
| 502 | `x_api_unavailable` | X data source temporarily unavailable |
|
|
37
|
+
| 502 | `x_api_unauthorized` | X data source authentication failed. Retry |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Events
|
|
2
|
+
|
|
3
|
+
### List Events
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
GET /events
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Query parameters:**
|
|
10
|
+
|
|
11
|
+
| Param | Type | Description |
|
|
12
|
+
|-------|------|-------------|
|
|
13
|
+
| `monitorId` | string | Filter by monitor ID |
|
|
14
|
+
| `eventType` | string | Filter by event type |
|
|
15
|
+
| `limit` | number | Results per page (1-100, default 50) |
|
|
16
|
+
| `after` | string | Cursor for next page |
|
|
17
|
+
|
|
18
|
+
**Response:**
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"events": [
|
|
22
|
+
{
|
|
23
|
+
"id": "9010",
|
|
24
|
+
"type": "tweet.new",
|
|
25
|
+
"monitorId": "7",
|
|
26
|
+
"username": "elonmusk",
|
|
27
|
+
"occurredAt": "2026-02-24T16:45:00.000Z",
|
|
28
|
+
"data": {
|
|
29
|
+
"tweetId": "1893556789012345678",
|
|
30
|
+
"text": "Hello world",
|
|
31
|
+
"metrics": { "likes": 3200, "retweets": 890, "replies": 245 }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"hasMore": true,
|
|
36
|
+
"nextCursor": "MjAyNi0wMi0yNFQxNjozMDowMC4wMDBa..."
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Get Event
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
GET /events/{id}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Returns a single event with full details.
|
|
47
|
+
|
|
48
|
+
---
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Extractions
|
|
2
|
+
|
|
3
|
+
### Create Extraction
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
POST /extractions
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Run a bulk data extraction job. See `references/extractions.md` for all 23 tool types.
|
|
10
|
+
|
|
11
|
+
**Body:**
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"toolType": "reply_extractor",
|
|
15
|
+
"targetTweetId": "1893704267862470862",
|
|
16
|
+
"resultsLimit": 500
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`resultsLimit` (optional): Maximum results to extract. Stops early instead of fetching all data. Useful for controlling usage.
|
|
21
|
+
|
|
22
|
+
**Tweet Search Filters** (`tweet_search_extractor` only):
|
|
23
|
+
|
|
24
|
+
| Field | Type | Description |
|
|
25
|
+
|-------|------|-------------|
|
|
26
|
+
| `fromUser` | string | Author username |
|
|
27
|
+
| `toUser` | string | Directed to user |
|
|
28
|
+
| `mentioning` | string | Mentions user |
|
|
29
|
+
| `language` | string | Language code (e.g., `en`) |
|
|
30
|
+
| `sinceDate` | string | Start date (YYYY-MM-DD) |
|
|
31
|
+
| `untilDate` | string | End date (YYYY-MM-DD) |
|
|
32
|
+
| `mediaType` | string | `images`, `videos`, `gifs`, or `media` |
|
|
33
|
+
| `minFaves` | number | Minimum likes |
|
|
34
|
+
| `minRetweets` | number | Minimum retweets |
|
|
35
|
+
| `minReplies` | number | Minimum replies |
|
|
36
|
+
| `verifiedOnly` | boolean | Verified authors only |
|
|
37
|
+
| `replies` | string | `include`, `exclude`, or `only` |
|
|
38
|
+
| `retweets` | string | `include`, `exclude`, or `only` |
|
|
39
|
+
| `exactPhrase` | string | Exact match text |
|
|
40
|
+
| `excludeWords` | string | Comma-separated words to exclude |
|
|
41
|
+
| `advancedQuery` | string | Raw X search operators appended to query |
|
|
42
|
+
|
|
43
|
+
These filters are converted to X search operators and combined with `searchQuery`.
|
|
44
|
+
|
|
45
|
+
**Response:**
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
49
|
+
"toolType": "reply_extractor",
|
|
50
|
+
"status": "running"
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Estimate Extraction
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
POST /extractions/estimate
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Preview usage before running. Same body as create.
|
|
61
|
+
|
|
62
|
+
**Response:**
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"allowed": true,
|
|
66
|
+
"creditsAvailable": "50000",
|
|
67
|
+
"creditsRequired": "150",
|
|
68
|
+
"source": "replyCount",
|
|
69
|
+
"estimatedResults": 150
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### List Extractions
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
GET /extractions
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Cursor-paginated. Filter by `status` and `toolType`.
|
|
80
|
+
|
|
81
|
+
### Get Extraction
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
GET /extractions/{id}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Returns job details with paginated results (up to 1,000 per page).
|
|
88
|
+
|
|
89
|
+
### Export Extraction
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
GET /extractions/{id}/export?format=csv
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Formats: `csv`, `json`, `md`, `md-document`, `pdf`, `txt`, `xlsx`. 100,000 row limit (PDF 10,000). Exports include enrichment columns not in the API response.
|
|
96
|
+
|
|
97
|
+
---
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Monitors
|
|
2
|
+
|
|
3
|
+
### Create Monitor
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
POST /monitors
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Body:**
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"username": "elonmusk",
|
|
13
|
+
"eventTypes": ["tweet.new", "tweet.reply", "tweet.quote"]
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Response:**
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"id": "7",
|
|
21
|
+
"username": "elonmusk",
|
|
22
|
+
"xUserId": "44196397",
|
|
23
|
+
"eventTypes": ["tweet.new", "tweet.reply", "tweet.quote"],
|
|
24
|
+
"createdAt": "2026-02-24T10:30:00.000Z"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Event types: `tweet.new`, `tweet.quote`, `tweet.reply`, `tweet.retweet`, `webhook.test`.
|
|
29
|
+
|
|
30
|
+
Returns `409 monitor_already_exists` if the username is already monitored.
|
|
31
|
+
|
|
32
|
+
### List Monitors
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
GET /monitors
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Returns all monitors (up to 200, no pagination). Response includes `monitors` array and `total` count.
|
|
39
|
+
|
|
40
|
+
### Get Monitor
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
GET /monitors/{id}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Update Monitor
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
PATCH /monitors/{id}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Body:** `{ "eventTypes": [...], "isActive": true|false }` (both optional)
|
|
53
|
+
|
|
54
|
+
### Delete Monitor
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
delete request to `/monitors/{id}`
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Stops tracking and deletes all associated data.
|
|
61
|
+
|
|
62
|
+
### Keyword Monitors
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
GET /monitors/keywords
|
|
66
|
+
POST /monitors/keywords
|
|
67
|
+
GET /monitors/keywords/{id}
|
|
68
|
+
PATCH /monitors/keywords/{id}
|
|
69
|
+
delete request to `/monitors/keywords/{id}`
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Create and manage ongoing keyword monitors. Treat these as persistent resources: confirm the keyword query, event delivery plan, and ongoing usage before creating or enabling one.
|
|
73
|
+
|
|
74
|
+
---
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Radar
|
|
2
|
+
|
|
3
|
+
### List Radar Items
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
GET /radar
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Get trending topics and news from supported trend and news sources.
|
|
10
|
+
|
|
11
|
+
**Query parameters:**
|
|
12
|
+
|
|
13
|
+
| Param | Type | Description |
|
|
14
|
+
|-------|------|-------------|
|
|
15
|
+
| `source` | string | Filter by public source: `google_trends`, `hacker_news`, `polymarket`, `wikipedia`, `github`, `reddit`. Omit to include all supported sources |
|
|
16
|
+
| `category` | string | Filter by category: `general`, `tech`, `dev`, `science`, `culture`, `politics`, `business`, `entertainment` |
|
|
17
|
+
| `limit` | number | Items per page (1-100, default 50) |
|
|
18
|
+
| `hours` | number | Look-back window in hours (1-72, default 6) |
|
|
19
|
+
| `region` | string | Region code: `US`, `GB`, `TR`, `ES`, `DE`, `FR`, `JP`, `IN`, `BR`, `CA`, `MX`, `global` (default) |
|
|
20
|
+
|
|
21
|
+
**Response:**
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"items": [
|
|
25
|
+
{
|
|
26
|
+
"id": "12345",
|
|
27
|
+
"title": "Claude 4.6 Released",
|
|
28
|
+
"description": "Anthropic releases Claude 4.6...",
|
|
29
|
+
"url": "https://example.com/article",
|
|
30
|
+
"imageUrl": "https://example.com/image.png",
|
|
31
|
+
"source": "hacker_news",
|
|
32
|
+
"sourceId": "hn_12345",
|
|
33
|
+
"category": "tech",
|
|
34
|
+
"region": "global",
|
|
35
|
+
"language": "en",
|
|
36
|
+
"score": 450,
|
|
37
|
+
"metadata": { "points": 450, "numberComments": 132, "author": "pgdev" },
|
|
38
|
+
"publishedAt": "2026-03-05T10:00:00.000Z",
|
|
39
|
+
"createdAt": "2026-03-05T10:05:00.000Z"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"hasMore": true,
|
|
43
|
+
"nextCursor": "NDUwfDIwMjYtMDMtMDRUMDg6MzA6MDAuMDAwWnwxMjM0NQ=="
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Fields: `id`, `title`, `description?`, `url?`, `imageUrl?`, `source`, `sourceId`, `category`, `region`, `language`, `score`, `metadata`, `publishedAt`, `createdAt`. Response includes `hasMore` and `nextCursor` for pagination.
|
|
48
|
+
|
|
49
|
+
---
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Support
|
|
2
|
+
|
|
3
|
+
### Create Ticket
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
POST /support/tickets
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**Body:** `{ "subject": "...", "body": "..." }`
|
|
10
|
+
|
|
11
|
+
**Response (201):** `{ id, subject, status, createdAt }`
|
|
12
|
+
|
|
13
|
+
### List Tickets
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
GET /support/tickets
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Returns all tickets for the authenticated user.
|
|
20
|
+
|
|
21
|
+
### Get Ticket
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
GET /support/tickets/{id}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Returns ticket with messages.
|
|
28
|
+
|
|
29
|
+
### Update Ticket
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
PATCH /support/tickets/{id}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Update ticket status.
|
|
36
|
+
|
|
37
|
+
### Reply to Ticket
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
POST /support/tickets/{id}/messages
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Body:** `{ "body": "..." }`
|
|
44
|
+
|
|
45
|
+
Add a message to an existing ticket.
|
|
46
|
+
|
|
47
|
+
---
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Trends
|
|
2
|
+
|
|
3
|
+
### List Trends
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
GET /x/trends?woeid=1&count=30
|
|
7
|
+
GET /trends?woeid=1&count=30
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Metered. Plan access required. `/trends` is an alias of `/x/trends`. Cached, refreshes every 15 minutes.
|
|
11
|
+
|
|
12
|
+
**WOEIDs:** 1 (Worldwide), 23424977 (US), 23424975 (UK), 23424969 (Turkey), 23424950 (Spain), 23424829 (Germany), 23424819 (France), 23424856 (Japan), 23424848 (India), 23424768 (Brazil), 23424775 (Canada), 23424900 (Mexico).
|
|
13
|
+
|
|
14
|
+
**Response:**
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"trends": [
|
|
18
|
+
{ "name": "#AI", "description": "...", "rank": 1, "query": "#AI" }
|
|
19
|
+
],
|
|
20
|
+
"total": 30,
|
|
21
|
+
"woeid": 1
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Xquik REST API Endpoints: Tweet Style Cache
|
|
2
|
+
|
|
3
|
+
### Analyze & Cache Style
|
|
4
|
+
|
|
5
|
+
`POST /styles`
|
|
6
|
+
|
|
7
|
+
Fetch recent tweets from an X account and cache them for style analysis. **Consumes metered API usage.**
|
|
8
|
+
|
|
9
|
+
**Request body:**
|
|
10
|
+
|
|
11
|
+
| Field | Type | Required | Description |
|
|
12
|
+
|-------|------|----------|-------------|
|
|
13
|
+
| `username` | string | Yes | X username to analyze (without @) |
|
|
14
|
+
|
|
15
|
+
**Response (201):**
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"xUsername": "elonmusk",
|
|
20
|
+
"tweetCount": 20,
|
|
21
|
+
"isOwnAccount": false,
|
|
22
|
+
"fetchedAt": "2026-02-24T10:30:00.000Z",
|
|
23
|
+
"tweets": [
|
|
24
|
+
{
|
|
25
|
+
"id": "1893456789012345678",
|
|
26
|
+
"text": "The future is now.",
|
|
27
|
+
"authorUsername": "elonmusk",
|
|
28
|
+
"createdAt": "2026-02-24T14:22:00.000Z"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### List Cached Styles
|
|
37
|
+
|
|
38
|
+
`GET /styles`
|
|
39
|
+
|
|
40
|
+
List all cached tweet style profiles. Max 200 results, ordered by fetch date.
|
|
41
|
+
|
|
42
|
+
**Response (200):**
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"styles": [
|
|
47
|
+
{
|
|
48
|
+
"xUsername": "elonmusk",
|
|
49
|
+
"tweetCount": 20,
|
|
50
|
+
"isOwnAccount": false,
|
|
51
|
+
"fetchedAt": "2026-02-24T10:30:00.000Z"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Save Custom Style
|
|
60
|
+
|
|
61
|
+
`PUT /styles/{id}`
|
|
62
|
+
|
|
63
|
+
Save a custom style profile from tweet texts. The body `label` controls the saved style label and replaces any existing style with that label.
|
|
64
|
+
|
|
65
|
+
**Body:**
|
|
66
|
+
|
|
67
|
+
| Field | Type | Required | Description |
|
|
68
|
+
|-------|------|----------|-------------|
|
|
69
|
+
| `label` | string | Yes | Style label name (1-30 characters) |
|
|
70
|
+
| `tweets` | object[] | Yes | Array of tweet objects (1-100). Each must have a `text` field |
|
|
71
|
+
|
|
72
|
+
**Response (200):** Style object with label, `tweetCount`, `isOwnAccount: false`, `fetchedAt`, and `tweets` array.
|
|
73
|
+
|
|
74
|
+
**Errors:** `400 invalid_input`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Get Cached Style
|
|
79
|
+
|
|
80
|
+
`GET /styles/{id}`
|
|
81
|
+
|
|
82
|
+
Get a cached style profile with full tweet data. `id` is the cached style label or username.
|
|
83
|
+
|
|
84
|
+
**Response (200):** Full style object with `tweets` array.
|
|
85
|
+
|
|
86
|
+
**Errors:** `404 style_not_found`
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### Delete Cached Style
|
|
91
|
+
|
|
92
|
+
delete request to `/styles/{id}`
|
|
93
|
+
|
|
94
|
+
Delete a cached style by label or username. Returns `204 No Content`.
|
|
95
|
+
|
|
96
|
+
**Errors:** `404 style_not_found`
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### Compare Styles
|
|
101
|
+
|
|
102
|
+
`GET /styles/compare?username1=A&username2=B`
|
|
103
|
+
|
|
104
|
+
Compare two cached tweet style profiles side by side.
|
|
105
|
+
|
|
106
|
+
**Query parameters:**
|
|
107
|
+
|
|
108
|
+
| Parameter | Type | Required | Description |
|
|
109
|
+
|-----------|------|----------|-------------|
|
|
110
|
+
| `username1` | string | Yes | First X username |
|
|
111
|
+
| `username2` | string | Yes | Second X username |
|
|
112
|
+
|
|
113
|
+
**Response (200):**
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"style1": { "xUsername": "user1", "tweetCount": 20, "isOwnAccount": true, "fetchedAt": "...", "tweets": [...] },
|
|
118
|
+
"style2": { "xUsername": "user2", "tweetCount": 15, "isOwnAccount": false, "fetchedAt": "...", "tweets": [...] }
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Errors:** `400 missing_params`, `404 style_not_found`
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Analyze Performance
|
|
127
|
+
|
|
128
|
+
`GET /styles/{id}/performance`
|
|
129
|
+
|
|
130
|
+
Get live engagement metrics for cached tweets for a cached style label or username. **Consumes metered API usage.**
|
|
131
|
+
|
|
132
|
+
**Response (200):**
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"xUsername": "elonmusk",
|
|
137
|
+
"tweetCount": 20,
|
|
138
|
+
"tweets": [
|
|
139
|
+
{
|
|
140
|
+
"id": "1893456789012345678",
|
|
141
|
+
"text": "The future is now.",
|
|
142
|
+
"likeCount": 42000,
|
|
143
|
+
"retweetCount": 8500,
|
|
144
|
+
"replyCount": 3200,
|
|
145
|
+
"quoteCount": 1100,
|
|
146
|
+
"viewCount": 5000000,
|
|
147
|
+
"bookmarkCount": 2400
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Errors:** `404 style_not_found`
|
|
154
|
+
|
|
155
|
+
---
|