X / Twitter API

X / Twitter 用户帖子 API

按用户名获取 X (Twitter) 账号主页“帖子”标签页的时间线。结果按主页顺序排列:置顶帖子可能排在最前,其后按时间倒序排列本人发布的帖子、转帖、引用和作者自发帖子串的后续帖子。

US$0.45/千次请求,按请求付费,无需订阅。

@buildwithjonah / X
x.com/buildwithjonah

@buildwithjonah

BFollow

@buildwithjonah

PostsRepliesHighlightsMedia

Pinned

B

@buildwithjonah· Sep 26, 2024

Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.

964123,820
API 返回的内容tweets[0]
{
"id": "1842093771280384512",
"url": "https://x.com/buildwithjonah/status/1842093771280384512",
"text": "Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.",
"createdUtc": 1727366400,
"lang": "en",
"likes": 3820,
"retweets": 412,
"replies": 96,
... 还有 12 个字段
}
可用率
99.99%
30d · 338,831 次调用
请求数
339,051
30d · 按周,近 12 周
响应时间
1.6s
中位数 · 30d

试一试

一个请求获取 X / Twitter 用户帖子

requireFieldsarray
Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `isPinned`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a tweet that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. On a paginated walk it applies to the first page only; later pages stay with the source that page chose, at the price it was quoted.
打开于
获取免费密钥
示例响应
免费运行只返回前 3 条结果。为密钥充值即可获得完整响应。

这个示例展示了 30 个字段中的 28 个。查看全部字段

{
  "found": true,
  "data": {
    "tweets": [
      {
        "id": "1842093771280384512",
        "url": "https://x.com/buildwithjonah/status/1842093771280384512",
        "text": "Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.",
        "createdUtc": 1727366400,
        "lang": "en",
        "likes": 3820,
        "retweets": 412,
        "replies": 96,
        "quotes": 28,
        "views": 284000,
        "bookmarks": 1540,
        "isReply": false,
        "isPinned": true,
        "media": [],
        "conversationId": "1842093771280384512",
        "source": "Twitter Web App",
        "authorId": "1401882093771280384",
        "authorName": "Jonah Ruiz",
        "authorHandle": "buildwithjonah",
        "authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
      },
      {
        "id": "1841002881044099072",
        "url": "https://x.com/buildwithjonah/status/1841002881044099072",
        "text": "Shipped a small tool today that diffs API response schemas across versions. Saved me from a nasty silent break last week.",
        "createdUtc": 1727280000,
        "lang": "en",
        "likes": 640,
        "retweets": 52,
        "replies": 18,
        "quotes": 2,
        "views": 41200,
        "bookmarks": 210,
        "isReply": false,
        "isPinned": false,
        "media": [
          {
            "type": "photo",
            "url": "https://pbs.twimg.com/media/F9j1QoQWkAA_diff_tool.jpg",
            "width": 1600,
            "height": 1000
          }
        ],
        "conversationId": "1841002881044099072",
        "source": "Twitter for iPhone",
        "authorId": "1401882093771280384",
        "authorName": "Jonah Ruiz",
        "authorHandle": "buildwithjonah",
        "authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
      },
      {
        "id": "1839881220337844224",
        "url": "https://x.com/buildwithjonah/status/1839881220337844224",
        "text": "@dataeng_marta Totally agree, cursor pagination beats offset once you get past a few hundred thousand rows.",
        "createdUtc": 1727107200,
        "lang": "en",
        "likes": 88,
        "retweets": 4,
        "replies": 6,
        "quotes": 0,
        "views": 6200,
        "bookmarks": 12,
        "isReply": true,
        "isPinned": false,
        "media": [],
        "conversationId": "1839880002114899968",
        "source": "Twitter Web App",
        "authorId": "1401882093771280384",
        "authorName": "Jonah Ruiz",
        "authorHandle": "buildwithjonah",
        "authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
      }
    ],
    "nextCursor": "DAABCgABGZ3xw5A2xVIKAAIY__posts_page2"
  }
}

完整的参数与响应参考:这个接口的每个字段、类型和示例。

参考

一个请求,一种响应结构。

你发送的每个字段和收到的每个字段,都附有真实示例。

最近验证于 2026-11-14 · 可用率和延迟按 30d 统计

请求体

JSON,POST 到这个接口。

  • handlestring

    buildwithjonah

    Twitter/X 用户名,不带开头的 @。

  • cursorstring

    来自上一次响应 nextCursor 的不透明分页游标。获取第一页时省略。

  • requireFieldsarray

    Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `isPinned`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a tweet that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. On a paginated walk it applies to the first page only; later pages stay with the source that page chose, at the price it was quoted.

你发送。 一个简短的 JSON 请求体。显示的值只是示例,请换成你自己的。

响应

JSON,每个字段一个示例值。

datadata

The Posts-tab timeline page, or null when the account was not found.

  • nextCursorstring

    DAABCgABGZ3xw5A2xVIKAAIY__posts_page2

    Opaque cursor for the next native Posts-tab page, or null when no more pages are available.

each tweetdata.tweets[]

Posts in profile order. A pinned post may appear before otherwise reverse-chronological results. Populated whenever the provider has data for the entity.

  • authorHandlestring

    buildwithjonah

    Handle of the account that posted.

  • authorIdstring

    1401882093771280384

    Numeric X user id of the account that posted, as a string.

  • authorImagestring

    https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg

    Avatar image URL of the account that posted.

  • authorNamestring

    Jonah Ruiz

    Display name of the account that posted.

  • bookmarksinteger

    1540

    Number of bookmarks.

  • conversationIdstring

    1842093771280384512

    Id of the conversation the post belongs to, as a string.

  • createdUtcnumber

    1727366400

    UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Populated whenever the provider has data for the entity.

  • idstring

    1842093771280384512

    The post's numeric tweet ID, represented as a string. Populated whenever the provider has data for the entity.

  • isPinnedboolean可设为必填

    true

    Whether X marks the post as pinned on the profile, or null when the serving source does not publish it.

  • isReplyboolean

    false

    Whether X marks the record as a reply. Certified Posts-tab captures use this for self-thread continuations.

  • langstring

    en

    Language code reported for the post, when available.

  • likesinteger

    3820

    Number of likes.

  • quotesinteger

    28

    Number of quote posts.

  • repliesinteger

    96

    Number of replies.

  • retweetsinteger

    412

    Number of reposts or retweets.

  • sourcestring

    Twitter Web App

    Client the post was sent from, e.g. "Twitter Web App".

  • textstring

    Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.

    The post text. Empty for media-only posts. Populated whenever the provider has data for the entity.

  • urlstring

    https://x.com/buildwithjonah/status/1842093771280384512

    Canonical x.com URL of the post. Populated whenever the provider has data for the entity.

  • viewsinteger

    284000

    Number of views.

each mediadata.tweets[].media[]

Photo, video, and GIF attachments on the post. Empty when the post has none.

  • heightinteger
  • typestring

    One of photo, video, or gif.

  • urlstring

    Image URL. For a video or GIF this is the poster/thumbnail frame. X media URLs on pbs.twimg.com are publicly fetchable without authentication; append ?name=orig for the full-resolution original.

  • videoUrlstring

    Playable video file URL. Present only for video and gif items.

  • widthinteger
top level
  • foundboolean

    true

    Whether the account's Posts-tab timeline was returned.

  • reason"not_found" | "suspended"

    Present only when `found` is false, and says why there is no result. `not_found`: the source states the target does not exist, or returned nothing for it. `suspended`: the platform has suspended the account. A `found: false` answer is a successful call, not an error, and `costUsd` is what it actually cost.

你收到。 字段有名称、有类型,无论哪个数据源响应,结构都一样。

你在出售这个 API?查看你的接口必须返回的完整数据结构。

常见问题

关于 X / Twitter 用户帖子 API

AnyAPI 的 X / Twitter 用户帖子 API 只需一次 POST 请求 /v1/run/twitter.user_posts,就以统一格式的 JSON 返回 X / Twitter 数据。按用户名获取 X (Twitter) 账号主页“帖子”标签页的时间线。结果按主页顺序排列:置顶帖子可能排在最前,其后按时间倒序排列本人发布的帖子、转帖、引用和作者自发帖子串的后续帖子。AnyAPI 会在 3 个数据源之间路由每个请求,某个数据源失败时自动切换。费用:每千次请求 US$0.45 起,以美元计价,无需订阅,也没有每月最低消费。过去 30 天,通过 AnyAPI 发起的 X / Twitter 用户帖子 API 调用中有 100.0% 成功,响应时间中位数为 1.6 秒,共测量 338,831 次调用。

费用:每千次请求 US$0.45 起,以美元计价,无需订阅,也没有每月最低消费。你只需为一个美元钱包充值,每次调用从中扣费。部分由钱包付费的失败请求会产生处理费用,我们按成本原价转嫁,不加价;错误响应会显示收取的金额。

按用户名获取 X (Twitter) 账号主页“帖子”标签页的时间线。结果按主页顺序排列:置顶帖子可能排在最前,其后按时间倒序排列本人发布的帖子、转帖、引用和作者自发帖子串的后续帖子。响应是统一格式的 JSON,外层结构与每个 AnyAPI 接口相同,所以解析另一个接口只需换一个 URL,别的都不用改。

过去 30 天,通过 AnyAPI 发起的 X / Twitter 用户帖子 API 调用中有 100.0% 成功,响应时间中位数为 1.6 秒,共测量 338,831 次调用。这些是 AnyAPI 对经过网关的流量的自有测量,持续重新计算,并非公开承诺的服务等级目标。

可以。新的 AnyAPI 账户自带 US$0.10 免费余额,无需绑卡,足够调用 222 次 X / Twitter 用户帖子,每次 US$0.00045。

AnyAPI 会在同一个请求中依次尝试它的 3 个数据源,从最便宜的开始,所以一个数据源宕机不会让你的调用失败。

向 https://api.getanyapi.com/v1/run/twitter.user_posts 发送 POST 请求,在 “Authorization: Bearer” 请求头中放入你的 AnyAPI 密钥,并以 JSON 请求体传入参数。同一个密钥和同一个钱包适用于所有 AnyAPI 接口。

不需要。你向一个预付费的 AnyAPI 余额充值美元,每个请求从中扣费。没有月度套餐,也没有最低消费,同一个余额可用于所有 AnyAPI 接口。

有。TypeScript 用 npm 安装 @getanyapi/sdk,Python 用 pip 安装 getanyapi。两者都用同一个密钥调用所有 AnyAPI 接口,任何 HTTP 客户端也都可以。

可以。智能体可以连接 https://api.getanyapi.com/mcp 上的 AnyAPI MCP 服务器,或者向 https://api.getanyapi.com/agent/signup 发送一次无需认证的 POST 来创建自己的免费试用密钥,再通过 HTTP 调用这个接口。