x-twitter-scraper 0.5.1 → 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.
Files changed (87) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +33 -3
  3. package/assets/pi-package.png +0 -0
  4. package/package.json +9 -2
  5. package/skills/x-twitter-scraper/LICENSE +21 -0
  6. package/skills/x-twitter-scraper/SKILL.md +389 -0
  7. package/skills/x-twitter-scraper/metadata.json +38 -0
  8. package/skills/x-twitter-scraper/references/api-endpoints-api-keys.md +31 -0
  9. package/skills/x-twitter-scraper/references/api-endpoints-compose.md +33 -0
  10. package/skills/x-twitter-scraper/references/api-endpoints-credits.md +11 -0
  11. package/skills/x-twitter-scraper/references/api-endpoints-drafts.md +86 -0
  12. package/skills/x-twitter-scraper/references/api-endpoints-draws.md +75 -0
  13. package/skills/x-twitter-scraper/references/api-endpoints-error-codes.md +37 -0
  14. package/skills/x-twitter-scraper/references/api-endpoints-events.md +48 -0
  15. package/skills/x-twitter-scraper/references/api-endpoints-extractions.md +97 -0
  16. package/skills/x-twitter-scraper/references/api-endpoints-monitors.md +74 -0
  17. package/skills/x-twitter-scraper/references/api-endpoints-radar.md +49 -0
  18. package/skills/x-twitter-scraper/references/api-endpoints-support.md +47 -0
  19. package/skills/x-twitter-scraper/references/api-endpoints-trends.md +25 -0
  20. package/skills/x-twitter-scraper/references/api-endpoints-tweet-style-cache.md +155 -0
  21. package/skills/x-twitter-scraper/references/api-endpoints-webhooks.md +74 -0
  22. package/skills/x-twitter-scraper/references/api-endpoints-x-accounts.md +42 -0
  23. package/skills/x-twitter-scraper/references/api-endpoints-x-api.md +206 -0
  24. package/skills/x-twitter-scraper/references/api-endpoints-x-media.md +40 -0
  25. package/skills/x-twitter-scraper/references/api-endpoints-x-write.md +204 -0
  26. package/skills/x-twitter-scraper/references/api-endpoints.md +30 -0
  27. package/skills/x-twitter-scraper/references/draws.md +57 -0
  28. package/skills/x-twitter-scraper/references/extractions.md +237 -0
  29. package/skills/x-twitter-scraper/references/mcp-setup.md +326 -0
  30. package/skills/x-twitter-scraper/references/mcp-tools.md +174 -0
  31. package/skills/x-twitter-scraper/references/python-examples.md +182 -0
  32. package/skills/x-twitter-scraper/references/security.md +124 -0
  33. package/skills/x-twitter-scraper/references/types-account-identity.md +9 -0
  34. package/skills/x-twitter-scraper/references/types-account.md +26 -0
  35. package/skills/x-twitter-scraper/references/types-api-keys.md +22 -0
  36. package/skills/x-twitter-scraper/references/types-bookmarks-and-timeline.md +46 -0
  37. package/skills/x-twitter-scraper/references/types-credits.md +11 -0
  38. package/skills/x-twitter-scraper/references/types-download-media.md +22 -0
  39. package/skills/x-twitter-scraper/references/types-draws.md +60 -0
  40. package/skills/x-twitter-scraper/references/types-error.md +10 -0
  41. package/skills/x-twitter-scraper/references/types-events.md +43 -0
  42. package/skills/x-twitter-scraper/references/types-extractions.md +106 -0
  43. package/skills/x-twitter-scraper/references/types-mcp-add-webhook.md +14 -0
  44. package/skills/x-twitter-scraper/references/types-mcp-check-follow.md +10 -0
  45. package/skills/x-twitter-scraper/references/types-mcp-compose-tweet.md +31 -0
  46. package/skills/x-twitter-scraper/references/types-mcp-estimate-extraction.md +15 -0
  47. package/skills/x-twitter-scraper/references/types-mcp-get-account.md +26 -0
  48. package/skills/x-twitter-scraper/references/types-mcp-get-draw.md +30 -0
  49. package/skills/x-twitter-scraper/references/types-mcp-get-events.md +19 -0
  50. package/skills/x-twitter-scraper/references/types-mcp-get-trends.md +16 -0
  51. package/skills/x-twitter-scraper/references/types-mcp-get-user-info.md +16 -0
  52. package/skills/x-twitter-scraper/references/types-mcp-list-monitors.md +15 -0
  53. package/skills/x-twitter-scraper/references/types-mcp-lookup-tweet.md +25 -0
  54. package/skills/x-twitter-scraper/references/types-mcp-output-schemas.md +22 -0
  55. package/skills/x-twitter-scraper/references/types-mcp-refine-tweet.md +13 -0
  56. package/skills/x-twitter-scraper/references/types-mcp-run-draw.md +18 -0
  57. package/skills/x-twitter-scraper/references/types-mcp-run-extraction.md +12 -0
  58. package/skills/x-twitter-scraper/references/types-mcp-score-tweet.md +16 -0
  59. package/skills/x-twitter-scraper/references/types-mcp-search-tweets.md +17 -0
  60. package/skills/x-twitter-scraper/references/types-mcp-test-webhook.md +11 -0
  61. package/skills/x-twitter-scraper/references/types-monitors.md +20 -0
  62. package/skills/x-twitter-scraper/references/types-radar.md +40 -0
  63. package/skills/x-twitter-scraper/references/types-request-bodies.md +30 -0
  64. package/skills/x-twitter-scraper/references/types-rest-api-vs-mcp-field-naming.md +15 -0
  65. package/skills/x-twitter-scraper/references/types-support.md +25 -0
  66. package/skills/x-twitter-scraper/references/types-trends.md +18 -0
  67. package/skills/x-twitter-scraper/references/types-tweet-drafts.md +20 -0
  68. package/skills/x-twitter-scraper/references/types-tweet-style-cache.md +50 -0
  69. package/skills/x-twitter-scraper/references/types-user-activity.md +35 -0
  70. package/skills/x-twitter-scraper/references/types-webhooks.md +38 -0
  71. package/skills/x-twitter-scraper/references/types-x-accounts.md +16 -0
  72. package/skills/x-twitter-scraper/references/types-x-api.md +69 -0
  73. package/skills/x-twitter-scraper/references/types-x-articles.md +21 -0
  74. package/skills/x-twitter-scraper/references/types-x-write.md +39 -0
  75. package/skills/x-twitter-scraper/references/types.md +48 -0
  76. package/skills/x-twitter-scraper/references/usage.md +50 -0
  77. package/skills/x-twitter-scraper/references/webhooks.md +243 -0
  78. package/skills/x-twitter-scraper/references/workflows.md +202 -0
  79. package/skills/x-twitter-scraper/skill-card.md +76 -0
  80. package/skills/x-twitter-scraper/skillspector-report.md +17 -0
  81. package/skills/xquik-social-research/LICENSE +21 -0
  82. package/skills/xquik-social-research/SKILL.md +79 -0
  83. package/src/version.ts +1 -1
  84. package/version.d.mts +1 -1
  85. package/version.d.ts +1 -1
  86. package/version.js +1 -1
  87. 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
+ ---