{
  "release": {
    "version": "v0.2.4",
    "sdk_version": "0.2.4",
    "image_tag": "0.2.4",
    "commit": "9d30b7c8248b96587d3100069e86e5750f152b79",
    "channel": "pro"
  },
  "schema_version": 1,
  "project": "go-twitter-api",
  "protocol": "grpc",
  "not_official_api": "本项目封装 X 客户端私有协议，不是 X 官方公开 API v2；契约与官方文档不同。",
  "server_authentication": {
    "type": "grpc_metadata",
    "key": "x-twitter-api-key",
    "required_when": "Go server 配置 TWITTER_GRPC_API_KEY 时（远程部署必须配置）"
  },
  "account_authentication": {
    "type": "request_message",
    "field": "state",
    "value_format": "AndroidAccountState",
    "not_required_for": [
      "AndroidApi/Login"
    ],
    "notes": "完整往返状态，含账号、完整设备、Session 与 App 版本。★调用方必须持久化每次 RPC 返回的最新 state，并禁止重新生成设备★。"
  },
  "caller_responsibilities": [
    "持久化并加密存储 AccountState（含明文 token 与 secret）",
    "同账号并发调用的互斥与账号锁",
    "重试与幂等控制：非幂等写 RPC 重试前必须先确认上一次是否已生效",
    "调度与频率控制：平台会对高频操作实施风控"
  ],
  "python_sdk": {
    "package": "twitter-sdk",
    "import": "twitter_sdk",
    "version_source": "release_tag",
    "compatible_server": "必须连接同一 X.Y.Z Tag 发布的 Go gRPC server",
    "release_assets": [
      "twitter_sdk-0.2.4-py3-none-any.whl",
      "twitter_sdk-0.2.4.tar.gz",
      "twitter_sdk-0.2.4-copy.zip"
    ],
    "version": "0.2.4",
    "server_image": "ghcr.io/robin528919/go-twitter-api:0.2.4"
  },
  "platforms": {
    "android": {
      "status": "available",
      "namespace": "twitter_sdk.x.android",
      "services": [
        "AndroidApi",
        "PostsApi",
        "MediaApi",
        "UsersApi",
        "TimelineApi"
      ],
      "session": "OAuth 1.0a（oauth_token + oauth_secret）",
      "notes": "当前唯一落地平台。"
    },
    "ios": {
      "status": "unimplemented",
      "namespace": "twitter_sdk.x.ios",
      "services": [],
      "session": "Bearer + JF sec-tok + cookie（规划）",
      "notes": "尚无任何 RPC。调用方现在无法通过本项目访问 iOS 客户端协议。"
    },
    "web": {
      "status": "unimplemented",
      "namespace": "twitter_sdk.x.web",
      "services": [],
      "session": "auth_token / ct0 cookie（规划）",
      "notes": "尚无任何 RPC。调用方现在无法通过本项目访问 Web 客户端协议。"
    }
  },
  "callable": [
    {
      "rpc": "AndroidApi/Login",
      "service": "AndroidApi",
      "method": "Login",
      "platform": "android",
      "crud": "write",
      "idempotent": false,
      "requires_account_state": false,
      "side_effects": [
        "在 X 平台创建一个新的登录会话，可能触发风控与设备绑定",
        "消耗账号的登录频次配额"
      ],
      "success_criteria": "返回的 AndroidAccountState.session 中 user_id / screen_name 与登录账号一致，且服务端已用 account/settings.json 正面复核同一账号。HTTP 2xx 或响应里出现某个 token 字段都不作为成功判据。",
      "python_facade": "x.android.AndroidClient.login",
      "request_message": "LoginRequest",
      "response_message": "LoginResponse",
      "verification": {
        "status": "verified",
        "date": "2026-08-11"
      }
    },
    {
      "rpc": "MediaApi/UploadMedia",
      "service": "MediaApi",
      "method": "UploadMedia",
      "platform": "android",
      "crud": "write",
      "idempotent": false,
      "requires_account_state": true,
      "side_effects": [
        "在 X 媒体服务上创建一份待引用的媒体对象"
      ],
      "success_criteria": "响应 media_id 非空。",
      "python_facade": "account.media.upload",
      "request_message": "UploadMediaRequest",
      "response_message": "UploadMediaResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/CreatePost",
      "service": "PostsApi",
      "method": "CreatePost",
      "platform": "android",
      "crud": "write",
      "idempotent": false,
      "requires_account_state": true,
      "side_effects": [
        "在目标账号下公开发布一条推文"
      ],
      "success_criteria": "响应 tweet.tweet_id 非空。",
      "python_facade": "account.posts.create",
      "request_message": "CreatePostRequest",
      "response_message": "CreatePostResponse",
      "verification": {
        "status": "verified",
        "date": "2026-08-11"
      }
    },
    {
      "rpc": "PostsApi/DeletePost",
      "service": "PostsApi",
      "method": "DeletePost",
      "platform": "android",
      "crud": "write",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [
        "永久删除目标推文，不可恢复"
      ],
      "success_criteria": "RPC 正常返回且未抛出 gRPC 错误。",
      "python_facade": "account.posts.delete",
      "request_message": "DeletePostRequest",
      "response_message": "DeletePostResponse",
      "verification": {
        "status": "verified",
        "date": "2026-08-11"
      }
    },
    {
      "rpc": "PostsApi/Like",
      "service": "PostsApi",
      "method": "Like",
      "platform": "android",
      "crud": "write",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [
        "在目标推文上留下本账号的点赞记录，对方可见"
      ],
      "success_criteria": "RPC 正常返回且未抛出 gRPC 错误。",
      "python_facade": "account.posts.like",
      "request_message": "EngageRequest",
      "response_message": "EngageResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/Quote",
      "service": "PostsApi",
      "method": "Quote",
      "platform": "android",
      "crud": "write",
      "idempotent": false,
      "requires_account_state": true,
      "side_effects": [
        "公开发布一条引用推文"
      ],
      "success_criteria": "响应 tweet.tweet_id 非空。",
      "python_facade": "account.posts.quote",
      "request_message": "QuoteRequest",
      "response_message": "CreatePostResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/Reply",
      "service": "PostsApi",
      "method": "Reply",
      "platform": "android",
      "crud": "write",
      "idempotent": false,
      "requires_account_state": true,
      "side_effects": [
        "在目标推文下公开发布一条回复"
      ],
      "success_criteria": "响应 tweet.tweet_id 非空。",
      "python_facade": "account.posts.reply",
      "request_message": "ReplyRequest",
      "response_message": "CreatePostResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/Retweet",
      "service": "PostsApi",
      "method": "Retweet",
      "platform": "android",
      "crud": "write",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [
        "在本账号时间线公开转发目标推文"
      ],
      "success_criteria": "RPC 正常返回且未抛出 gRPC 错误。",
      "python_facade": "account.posts.retweet",
      "request_message": "EngageRequest",
      "response_message": "EngageResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/Unlike",
      "service": "PostsApi",
      "method": "Unlike",
      "platform": "android",
      "crud": "write",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [
        "撤销本账号对目标推文的点赞"
      ],
      "success_criteria": "RPC 正常返回且未抛出 gRPC 错误。",
      "python_facade": "account.posts.unlike",
      "request_message": "EngageRequest",
      "response_message": "EngageResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "PostsApi/Unretweet",
      "service": "PostsApi",
      "method": "Unretweet",
      "platform": "android",
      "crud": "write",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [
        "撤销本账号对目标推文的转发"
      ],
      "success_criteria": "RPC 正常返回且未抛出 gRPC 错误。",
      "python_facade": "account.posts.unretweet",
      "request_message": "EngageRequest",
      "response_message": "EngageResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "TimelineApi/HomeTimeline",
      "service": "TimelineApi",
      "method": "HomeTimeline",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 raw_json 为可解析的非空 JSON。",
      "python_facade": "account.timeline.home",
      "request_message": "HomeTimelineRequest",
      "response_message": "TimelineResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "TimelineApi/UserTweets",
      "service": "TimelineApi",
      "method": "UserTweets",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 raw_json 为可解析的非空 JSON。",
      "python_facade": "account.timeline.user_tweets",
      "request_message": "UserTweetsRequest",
      "response_message": "TimelineResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "UsersApi/Me",
      "service": "UsersApi",
      "method": "Me",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 user 非空且 rest_id 与当前会话账号一致。",
      "python_facade": "account.users.me",
      "request_message": "MeRequest",
      "response_message": "UserResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "UsersApi/ProfileAnalytics",
      "service": "UsersApi",
      "method": "ProfileAnalytics",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 raw_json 为可解析的非空 JSON。",
      "python_facade": "account.users.profile_analytics",
      "request_message": "ProfileAnalyticsRequest",
      "response_message": "RawResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "UsersApi/ProfileModules",
      "service": "UsersApi",
      "method": "ProfileModules",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 raw_json 为可解析的非空 JSON。",
      "python_facade": "account.users.profile_modules",
      "request_message": "ProfileModulesRequest",
      "response_message": "RawResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    },
    {
      "rpc": "UsersApi/UserByRestID",
      "service": "UsersApi",
      "method": "UserByRestID",
      "platform": "android",
      "crud": "read",
      "idempotent": true,
      "requires_account_state": true,
      "side_effects": [],
      "success_criteria": "响应 user 非空。",
      "python_facade": "account.users.by_rest_id",
      "request_message": "UserByRestIDRequest",
      "response_message": "UserResponse",
      "verification": {
        "status": "implemented_not_verified",
        "date": null
      }
    }
  ],
  "planned": [
    {
      "platform": "ios",
      "status": "unimplemented",
      "namespace": "twitter_sdk.x.ios",
      "notes": "尚无任何 RPC。调用方现在无法通过本项目访问 iOS 客户端协议。",
      "callable": false
    },
    {
      "platform": "web",
      "status": "unimplemented",
      "namespace": "twitter_sdk.x.web",
      "notes": "尚无任何 RPC。调用方现在无法通过本项目访问 Web 客户端协议。",
      "callable": false
    }
  ]
}
