X cải tổ giá API năm 2026: Trả tiền theo lượt dùng nghĩa là gì với việc nhận DM và lượt @ nhắc tên — UnifyPort
Nếu bạn đăng ký X API lần đầu trong năm nay, bạn sẽ va vào một rào cản không tồn tại vào năm 2025: không có gói miễn phí. Tháng 2/2026, X chuyển API cho nhà phát triển sang mô hình trả tiền theo lượt dùng, thay thế các gói cố định cũ (dao động từ $0 đến $5.000/tháng tùy gói). Nhà phát triển mới giờ phải nạp tiền vào tài khoản trước khi gọi bất kỳ request nào — không còn lựa chọn “thử miễn phí vài lần” nữa.
Với các team chỉ cần nhận tin nhắn trực tiếp (DM) và lượt @ nhắc tên trên một tài khoản X — tức là phía nhận tin, không phải đăng bài hay phân tích dữ liệu — điều này thay đổi hoàn toàn bản chất của quyết định. Trước đây câu hỏi là “gói cố định nào đủ cho lượng dùng của mình”, giờ thành “mỗi tin nhắn nhận về sẽ tốn bao nhiêu, và đây là một khoản chi phí lặp lại mãi mãi”.
Điều gì thực sự thay đổi, và thay đổi hai lần
Cải tổ tháng 2/2026 đặt nền tảng cơ bản: tính phí theo từng request, đọc và viết được tính giá riêng, không có giới hạn lượng dùng — gọi bao nhiêu trả bấy nhiêu. Sau đó, ngày 20/4/2026, X công bố một điều chỉnh giá không báo trước. Việc đọc dữ liệu của chính tài khoản bạn — bài đăng, người theo dõi, và DM của chính mình — giảm mạnh xuống còn $0,001 mỗi tài nguyên, giảm 5 lần so với mức giá trả-theo-lượt-dùng ban đầu. Trong khi đó, request viết tiêu chuẩn tăng từ $0,010 lên $0,015 mỗi request.
Với một pipeline nhận DM/lượt @ nhắc tên, điều này nghĩa là có hai bộ đếm phí chạy song song:
- Đọc DM và lượt @ nhắc tên đến — sau điều chỉnh tháng 4, tương đối rẻ, $0,001 mỗi lượt đọc tài nguyên của chính mình
- Gửi phản hồi — là một request viết, giờ $0,015 mỗi lượt gọi
Con số $0,001 nghe có vẻ nhỏ, cho đến khi bạn tính theo công việc thực tế của một team hỗ trợ khách hàng. Một team nhỏ xử lý vài trăm DM và lượt @ nhắc tên mỗi ngày, mỗi tin nhắn cần phản hồi đều tốn cả phí đọc và phí viết — và đó còn chưa tính chi phí polling, vì việc “nhận” DM qua API của X về cơ bản vẫn là truy vấn xem có hoạt động mới hay không, chứ không phải webhook đẩy dữ liệu chủ động. Tần suất polling sẽ nhân thêm chi phí đọc, độc lập với số tin nhắn thực tế nhận được.
Ở mức dùng thấp, tất cả điều này không quá nghiêm trọng — như vài bài phân tích giá đầu năm đã chỉ ra, dùng nhẹ chỉ tốn vài đô la mỗi tháng. Nhưng đây là một mô hình chi phí hoàn toàn khác so với “trả một khoản cố định mỗi tháng rồi không cần nghĩ tới nữa”. Mỗi lần lượng tin nhắn từ khách hàng tăng vọt — ra mắt sản phẩm, một lượt @ nhắc tên bất ngờ viral, hoặc dồn ứ yêu cầu hỗ trợ — giờ sẽ thể hiện trực tiếp trên hóa đơn, tính theo từng tin nhắn, từng phản hồi, từng lượt polling.
Nhìn theo hướng khác: nhận một tin nhắn không nên cần “gọi API”
Điểm dễ bị bỏ qua là: cấu trúc chi phí trên là đặc điểm của API chính thức của X, không phải đặc điểm của việc “nhận một tin nhắn trên X” nói chung. Nếu yêu cầu thực sự của bạn là “khi có người gửi DM hoặc @ nhắc đến tài khoản của chúng tôi, backend phải biết ngay và có thể phản hồi” — yêu cầu đó tự nó không bắt buộc bạn phải trả tiền cho X theo từng lượt đọc và từng lượt viết.
Đây chính là khoảng trống mà giao diện đầu vào không chính thức của UnifyPort cho X lấp đầy. Thay vì backend của bạn liên tục polling API của X (và trả phí cho mỗi lượt đọc), UnifyPort kết nối trực tiếp với tài khoản X và đẩy hoạt động đến ngay vào webhook của bạn khi nó xảy ra — không tính số lượt đọc, không có vòng lặp polling, không có khoản phí theo tin nhắn từ phía nền tảng.
Với các team ở Việt Nam, X thường không phải là kênh duy nhất — WhatsApp và Zalo cũng đóng vai trò quan trọng, đặc biệt với các team làm khách hàng quốc tế hoặc thương mại điện tử xuyên biên giới. Việc đưa X vào cùng một webhook chuẩn hóa với WhatsApp và Zalo nghĩa là bạn không phải lo về mô hình tính phí riêng của từng nền tảng — tất cả đều đi qua một message.received duy nhất.
Cách hoạt động trong thực tế
Kết nối tài khoản X với UnifyPort dùng cùng luồng dựa trên session đã mô tả trong tiện ích mở rộng UnifyPort Exporter: bạn tạo một bản ghi tài khoản với provider: "twitter" và auth_mode: "session", xuất session của tài khoản bạn đang đăng nhập, rồi khởi động runtime.
POST /v1/accounts
Content-Type: application/json
{
"provider": "twitter",
"auth_mode": "session"
}
Từ đó, mọi DM và lượt @ nhắc tên đến tài khoản này sẽ được gửi tới webhook của bạn dưới dạng sự kiện message.received — cùng định dạng chuẩn hóa mà UnifyPort dùng cho WhatsApp, Telegram, LINE, TikTok và Zalo:
{
"event": "message.received",
"account_id": "acct_8Q2vK",
"provider": "twitter",
"from": "user_3f9c1a",
"text": "Hey, do you ship to the EU?",
"timestamp": 1749427200,
"message_id": "x_msg_7c1f9d"
}
Phản hồi cũng dùng cùng lệnh POST /v1/messages, định danh qua account_id và from — giống hoàn toàn với mọi kênh khác. Không có bước “đọc” DM riêng trước khi xử lý — sự kiện đã chứa đầy đủ thông tin bạn cần, và không có khoản phí nào tính theo lượng tin nhắn hay tần suất truy vấn.
X (Twitter) ──► UnifyPort ──► message.received ──► webhook của bạn
▲ │
│ ▼
POST /v1/messages ◄──────────── logic phản hồi của bạn
Mọi lượt gửi đều được ký bằng HMAC-SHA256 với signing_secret bạn đã cấu hình, nên việc xác minh chỉ là một đoạn code duy nhất, dùng chung cho mọi kênh.
Ý nghĩa thực tế
Nếu lượng dùng X của bạn thực sự nhẹ — vài DM mỗi tuần, không có tự động hóa khác — mức giá đọc $0,001 sau điều chỉnh tháng 4 đã đủ rẻ, và API chính thức là đủ dùng. Triển khai thêm một kết nối riêng sẽ không đáng công.
Nhưng nếu X là một trong nhiều kênh team bạn theo dõi để nhận tin nhắn, đặc biệt khi lượng dùng khó dự đoán — một bài viral, một đợt hỗ trợ tăng vọt, một lần ra mắt sản phẩm — mô hình tính phí đọc + viết theo từng lượt sẽ biến “chúng ta được chú ý nhiều hơn” trực tiếp thành “hóa đơn tăng lên”, đi ngược lại hướng động lực đáng lẽ phải có. Kết nối X qua webhook hợp nhất của UnifyPort đưa nó vào cùng một nền tảng chuẩn hóa, không tính phí theo lượt như các kênh khác của bạn — cùng một sự kiện message.received, cùng một endpoint phản hồi, không có lớp tính phí bổ sung.