Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.6.2"
".": "0.7.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 122
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/xquik/x-twitter-scraper-26de9a1d18b92c9472fcc289877ba281ae305db846b7b14065142e26c7637d72.yml
openapi_spec_hash: f90f7016413291fdcbedb986385dc3ae
config_hash: 17c84052d27489691ee6dd861cc56e24
configured_endpoints: 123
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/xquik/x-twitter-scraper-323137ebb1ee9824cd9cfb63a325c0839deb81f17244e42e8154d6567e7af954.yml
openapi_spec_hash: 48da9c2747c1e7c474dd514d39c28c49
config_hash: dab26921eb273c16e5570c0485c9ac2c
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 0.7.0 (2026-07-29)

Full Changelog: [v0.6.2...v0.7.0](https://github.com/Xquik-dev/x-twitter-scraper-typescript/compare/v0.6.2...v0.7.0)

### Features

* **api:** api update ([88d6bd0](https://github.com/Xquik-dev/x-twitter-scraper-typescript/commit/88d6bd0144e12dbe9137181104795e0cd26cb44e))
* **api:** api update ([8dd7565](https://github.com/Xquik-dev/x-twitter-scraper-typescript/commit/8dd7565b670085b6ad7c09fc6dbcae0352aba9b7))

## 0.6.2 (2026-07-24)

Full Changelog: [v0.6.1...v0.6.2](https://github.com/Xquik-dev/x-twitter-scraper-typescript/compare/v0.6.1...v0.6.2)
Expand Down
12 changes: 11 additions & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ Types:

Methods:

- <code title="post /x/accounts">client.x.accounts.<a href="./src/resources/x/accounts.ts">create</a>({ ...params }) -> AccountCreateResponse</code>
- <code title="post /x/accounts">client.x.accounts.<a href="./src/resources/x/accounts.ts">create</a>({ ...params }) -> unknown</code>
- <code title="get /x/accounts/{id}">client.x.accounts.<a href="./src/resources/x/accounts.ts">retrieve</a>(id) -> XAccountDetail</code>
- <code title="get /x/accounts">client.x.accounts.<a href="./src/resources/x/accounts.ts">list</a>() -> AccountListResponse</code>
- <code title="delete /x/accounts/{id}">client.x.accounts.<a href="./src/resources/x/accounts.ts">delete</a>(id) -> AccountDeleteResponse</code>
Expand All @@ -425,6 +425,16 @@ Methods:

- <code title="post /x/account-connection-challenges/{id}/submit">client.x.accountConnectionChallenges.<a href="./src/resources/x/account-connection-challenges.ts">submit</a>(id, { ...params }) -> AccountConnectionChallengeSubmitResponse</code>

## AccountConnectionAttempts

Types:

- <code><a href="./src/resources/x/account-connection-attempts.ts">AccountConnectionAttemptRetrieveResponse</a></code>

Methods:

- <code title="get /x/account-connection-attempts/{id}">client.x.accountConnectionAttempts.<a href="./src/resources/x/account-connection-attempts.ts">retrieve</a>(id) -> AccountConnectionAttemptRetrieveResponse</code>

## Bookmarks

Types:
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "x-twitter-scraper",
"version": "0.6.2",
"version": "0.7.0",
"description": "Xquik TypeScript SDK & agent Skills for X/Twitter data, automation, MCP & webhooks. Not affiliated with X Corp.",
"author": "Xquik <support@xquik.com>",
"types": "dist/index.d.ts",
Expand Down
32 changes: 28 additions & 4 deletions src/resources/compose.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import { RequestOptions } from '../internal/request-options';
*/
export class Compose extends APIResource {
/**
* Run one step of Xquik's three-step writing workflow. Compose returns questions
* and editorial rules. Refine returns goal-specific guidance. Score applies
* deterministic text checks. It does not predict reach or expose X ranking
* weights.
* Run one step of Xquik's three-step writing workflow. Compose returns questions,
* editorial rules, and source-specific Radar recommendations. Refine returns
* goal-specific guidance. Score applies deterministic text checks. It does not
* predict reach or expose X ranking weights.
*
* @example
* ```ts
Expand Down Expand Up @@ -63,6 +63,11 @@ export namespace ComposeCreateResponse {

nextStep: string;

/**
* Sources and guidance for researching a fresh post angle.
*/
radarRecommendations: Array<ComposePrepareResult.RadarRecommendation>;

/**
* Published signal names with unpublished weights as null.
*/
Expand Down Expand Up @@ -108,6 +113,25 @@ export namespace ComposeCreateResponse {
multiplier: 'Production weight not published by X';
}

export interface RadarRecommendation {
/**
* Radar endpoint for this source.
*/
endpoint: string;

/**
* Source-specific drafting guidance.
*/
guidance: string;

source: 'reddit' | 'github' | 'trustmrr' | 'hacker_news' | 'google_trends' | 'wikipedia' | 'polymarket';

/**
* Current-topic research this source supports.
*/
useFor: string;
}

export interface ScorerWeight {
/**
* Signal direction and publication limit.
Expand Down
86 changes: 83 additions & 3 deletions src/resources/radar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,41 @@ export interface RadarItem {

createdAt: string;

/**
* BCP-47 language code. und means the source did not identify a language.
*/
language: string;

/**
* Source-specific fields. Shape varies per source:
*
* - reddit: { subreddit: string, author: string }
* - reddit: { author, authorId?, subreddit, subredditId?, subredditSubscribers?,
* sourceFormat, score?, upvoteRatio?, estimatedUpvotes?, estimatedDownvotes?,
* numberComments?, numberCrossposts?, selftext?, contentUrl?, domain?,
* postHint?, linkFlairText?, distinguished?, totalAwardsReceived?, viewCount?,
* editedAt?, galleryImageUrls?, redditVideo?, archived?, contestMode?,
* isCrosspostable?, isMeta?, isNsfw?, isOriginalContent?, isRobotIndexable?,
* isSelf?, isSpoiler?, isVideo?, locked?, stickied? }. `score` is Reddit's
* public net score. Exact public upvote and downvote counts are not available.
* Estimated counts derive from the public score and upvote ratio, which Reddit
* may fuzz. Comment bodies are not included. Current items combine public
* listing discovery with server-rendered post data and use `sourceFormat: html`;
* `json` and `rss` remain for legacy rows.
* - github: { starsToday: number }
* - hacker_news: { points: number, numberComments: number }
* - google_trends: { approxTraffic: number }
* - polymarket: { volume24hr: number }
* - wikipedia: { views: number }
* - trustmrr: { mrr, growthPercent, last30Days, total, customers,
* activeSubscriptions, onSale, xHandle?, category?, askingPrice?, country?,
* growthMrrPercent?, multiple?, paymentProvider?, rank? }
* foundedDate?, googleSearchImpressionsLast30Days?, growthMrrPercent?,
* multiple?, paymentProvider?, profitMarginLast30Days?, rank?,
* revenuePerVisitor?, targetAudience?, visitorsLast30Days? } For the startup
* growth source, xHandle is the founder's X username without @. The rank field
* is the source's revenue rank. Result order represents reported 30-day
* revenue-growth rank.
*/
metadata: { [key: string]: unknown };
metadata: RadarItem.Metadata;

publishedAt: string;

Expand All @@ -71,11 +90,72 @@ export interface RadarItem {

description?: string;

/**
* Source image. Startup growth items return the logo here.
*/
imageUrl?: string;

url?: string;
}

export namespace RadarItem {
/**
* Source-specific fields. Shape varies per source:
*
* - reddit: { author, authorId?, subreddit, subredditId?, subredditSubscribers?,
* sourceFormat, score?, upvoteRatio?, estimatedUpvotes?, estimatedDownvotes?,
* numberComments?, numberCrossposts?, selftext?, contentUrl?, domain?,
* postHint?, linkFlairText?, distinguished?, totalAwardsReceived?, viewCount?,
* editedAt?, galleryImageUrls?, redditVideo?, archived?, contestMode?,
* isCrosspostable?, isMeta?, isNsfw?, isOriginalContent?, isRobotIndexable?,
* isSelf?, isSpoiler?, isVideo?, locked?, stickied? }. `score` is Reddit's
* public net score. Exact public upvote and downvote counts are not available.
* Estimated counts derive from the public score and upvote ratio, which Reddit
* may fuzz. Comment bodies are not included. Current items combine public
* listing discovery with server-rendered post data and use `sourceFormat: html`;
* `json` and `rss` remain for legacy rows.
* - github: { starsToday: number }
* - hacker_news: { points: number, numberComments: number }
* - google_trends: { approxTraffic: number }
* - polymarket: { volume24hr: number }
* - wikipedia: { views: number }
* - trustmrr: { mrr, growthPercent, last30Days, total, customers,
* activeSubscriptions, onSale, xHandle?, category?, askingPrice?, country?,
* foundedDate?, googleSearchImpressionsLast30Days?, growthMrrPercent?,
* multiple?, paymentProvider?, profitMarginLast30Days?, rank?,
* revenuePerVisitor?, targetAudience?, visitorsLast30Days? } For the startup
* growth source, xHandle is the founder's X username without @. The rank field
* is the source's revenue rank. Result order represents reported 30-day
* revenue-growth rank.
*/
export interface Metadata {
author?: string;

contentUrl?: string;

estimatedDownvotes?: number;

estimatedUpvotes?: number;

numberComments?: number;

score?: number;

selftext?: string;

/**
* Current items use html. json and rss are retained for legacy rows.
*/
sourceFormat?: 'html' | 'json' | 'rss';

subreddit?: string;

upvoteRatio?: number;

[k: string]: unknown;
}
}

export interface RadarRetrieveTrendingTopicsResponse {
hasMore: boolean;

Expand Down
100 changes: 100 additions & 0 deletions src/resources/x/account-connection-attempts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

import { APIResource } from '../../core/resource';
import { APIPromise } from '../../core/api-promise';
import { RequestOptions } from '../../internal/request-options';
import { path } from '../../internal/utils/path';

/**
* Connected X account management
*/
export class AccountConnectionAttempts extends APIResource {
/**
* Get X account connection status
*
* @example
* ```ts
* const accountConnectionAttempt =
* await client.x.accountConnectionAttempts.retrieve(
* 'xatt_0123456789abcdef0123456789abcdef',
* );
* ```
*/
retrieve(id: string, options?: RequestOptions): APIPromise<AccountConnectionAttemptRetrieveResponse> {
return this._client.get(path`/x/account-connection-attempts/${id}`, options);
}
}

/**
* The connection is still in progress.
*/
export type AccountConnectionAttemptRetrieveResponse =
| AccountConnectionAttemptRetrieveResponse.XAccountConnectionAttemptPending
| AccountConnectionAttemptRetrieveResponse.XAccountConnectionAttemptSuccess
| AccountConnectionAttemptRetrieveResponse.XAccountConnectionAttemptFailed
| AccountConnectionAttemptRetrieveResponse.XAccountConnectionChallenge;

export namespace AccountConnectionAttemptRetrieveResponse {
/**
* The connection is still in progress.
*/
export interface XAccountConnectionAttemptPending {
id: string;

object: 'x_account_connection_attempt';

pollAfterMs: number;

status: 'pending';
}

/**
* The account connected successfully.
*/
export interface XAccountConnectionAttemptSuccess {
id: string;

object: 'x_account_connection_attempt';

status: 'success';
}

/**
* The connection reached a final failure.
*/
export interface XAccountConnectionAttemptFailed {
id: string;

error: string;

object: 'x_account_connection_attempt';

retryable: boolean;

status: 'failed';

reason?: string;
}

/**
* Resumable account connection challenge. Submit the email code to finish the same
* connection attempt.
*/
export interface XAccountConnectionChallenge {
id: string;

expiresAt: string;

message: string;

object: 'x_account_connection_challenge';

status: 'requires_email_code';

username: string;
}
}

export declare namespace AccountConnectionAttempts {
export { type AccountConnectionAttemptRetrieveResponse as AccountConnectionAttemptRetrieveResponse };
}
Loading