Skip to main content

How to Verify Twitter Engagement Actions via API: Follows, Retweets, Comments, Quotes

Reward campaigns on X (formerly Twitter) ask users to complete actions: follow an account, retweet a post, leave a comment, join a community. To hand out rewards fairly, you need to verify that each participant actually did what they claimed. Doing this manually does not scale past a handful of users, and honor-system checkboxes invite bots and fraud. Sorsa API provides a dedicated set of verification endpoints that answer simple questions: did this user follow that account? Did they retweet this tweet? Did they comment on it? Did they join this community? Each check is a single API call that returns a clear yes/no (or status) result, so you can build automated quest systems, giveaway platforms, referral programs, and engagement campaigns on top of verifiable, auditable data. This guide covers every verification endpoint with working code, then shows how to combine them into a complete campaign verification pipeline. Every new account includes 100 free requests (no card required) that work across all endpoints, so you can prototype the full flow before picking a plan.
Note: For a fuller walkthrough with extra workflows and end-to-end examples, see Twitter Engagement Verification API: Full Campaign Guide on the blog.

Available Verification Checks

Here is what you can verify, which endpoint to use, and what you cannot check: What you cannot verify: Likes. X made likes private in 2024, so no API (including the official one) can check whether a specific user liked a specific tweet. Design your campaigns around the five actions above.

Check 1: Did the User Follow an Account?

The most common campaign task. “Follow @YourBrand to enter the giveaway.” Endpoint: POST /v3/check-follow The endpoint answers “does user_2 follow user_1?”. Set user_1 to the brand (the account being followed) and user_2 to the participant.

Simplest Example

Response:

Parameters

Provide exactly one identifier for each side:

Python

If user_protected is true, the participant’s account is private and their follow relationships cannot be verified.

Check 2: Did the User Retweet a Tweet?

“Retweet this post to enter.” The endpoint scans up to 100 retweets per request and paginates for tweets with more retweets than that. Endpoint: POST /v3/check-retweet

Parameters

Python

Each call scans the most recent 100 retweets. For most campaigns one request is enough, because users tend to retweet shortly after a campaign starts, so their retweet lands in the most recent batch. For popular tweets where the user retweeted early, page through next_cursor.

Check 3: Did the User Quote a Tweet?

“Quote tweet this post with your thoughts.” The /check-quoted endpoint distinguishes a quote tweet from a plain retweet and returns a status string. Endpoint: POST /v3/check-quoted

Python

Response

The status field returns one of three values: "quoted" (user posted a quote tweet), "retweet" (user retweeted without adding text), or "not_found" (neither action detected). When a quote exists, the response also includes its date and text, which you can use for content quality checks (minimum length, required hashtag, profanity filter).

Check 4: Did the User Comment on a Tweet?

“Leave a comment under this post.” This is the only verification endpoint that uses GET instead of POST. Endpoint: GET /v3/check-comment

Parameters (query string)

Python

When commented is true, the response includes the full tweet object of the comment itself, with text, engagement metrics, and timestamp. Use it to enforce comment quality (minimum length, required hashtag, no emoji-only replies) beyond just checking that a reply exists.

Check 5: Is the User a Community Member?

Confirm current Community data availability with support before making this a campaign requirement. See the availability note in Lists and Communities. “Join our X Community to participate.” Useful for campaigns that require community membership as a prerequisite. Endpoint: POST /v3/check-community-member

Python

The community ID is the numeric string in the community URL (x.com/i/communities/<id>).

Building a Campaign Verification Pipeline

In a real campaign, users complete multiple tasks. The pattern below runs all five checks for a single participant, returns a structured result, and applies quality rules to the comment and quote.
The first page of each of the five checks uses five requests. Retweet pagination and retries add requests, so five is a baseline rather than a fixed cost. A page-budget exception is an incomplete verification, not evidence that the participant failed the task.

Verifying Participants in Bulk

When a campaign has thousands of participants, verify them in batch. The pattern below respects the rate limit, writes results to CSV, and is resumable: it writes a row after each participant, so a crash does not lose progress.
The loop waits between participants and retries a 429 up to three times, but retweet pagination can add calls within a participant. Use a shared request limiter for a production worker pool. Actual throughput depends on page depth and response latency. Incomplete or failed participants must remain eligible for retry rather than being recorded as a negative result.

Account Ownership Verification

Before a user joins a campaign, you may want to confirm they actually own the X handle they provided. A common pattern:
  1. Generate a unique code (for example, VERIFY-a8f3b2) and show it to the user.
  2. Ask them to post a tweet containing that code.
  3. Use /user-tweets to fetch their recent tweets and check whether the code appears.
Bind each challenge to the signed-in participant and intended X account, give it a short expiration, and consume it once. Verify the matching post’s author and creation time against that challenge. The example checks author and text; your application must implement challenge storage, expiry, and one-time use. The participant can delete the tweet after verification.

Anti-Fraud Considerations

Use the checks below as configurable eligibility or review criteria. Profile age and counts do not prove whether an account is legitimate:
  • Minimum account age. Fetch the participant’s profile via /info and check created_at. Reject accounts created in the last 30 days, since most bot farms use fresh accounts.
  • Minimum activity. Check tweets_count and followers_count. Low counts can justify additional review, but do not establish that an account is a bot.
  • Comment quality. When verifying comments via /check-comment, the response includes the full tweet text. Check for minimum length, required keywords or hashtags, and reject single-character or emoji-only replies.
  • Quote quality. The /check-quoted response includes the quote text. Apply the same quality checks as for comments.
  • Rate of completion. Fast completion is a review signal, not proof of automation. Log timestamps and flag suspiciously fast completions.
Run this before the five verification checks. If is_legitimate_account returns False, you skip 5 verification requests on a participant you would have rejected anyway.

Scoring Participants by Influence

Not all participants have equal reach. A retweet from an account with 50,000 followers is worth more to a campaign than one from an account with 50. Use /info to fetch the participant’s profile and weight their reward by follower count.
For crypto-focused campaigns, replace the follower-count multiplier with the Sorsa Score, which measures recognition among crypto KOLs, projects, and VCs.

A Note on Likes

X (Twitter) made likes private in 2024. The platform no longer exposes which users liked a specific tweet through any public API: not Sorsa, not the official X API, not any third-party tool. If a campaign previously included a “Like this tweet” task, replace it with a retweet or comment requirement, both of which remain fully verifiable.

Next Steps

  • Search Tweets: find campaign-related tweets by keyword for broader monitoring.
  • Track Mentions: track organic mentions of your brand alongside campaign-driven mentions.
  • Real-Time Monitoring: verify tasks in near real time by polling for new activity.
  • Followers & Following: extract your own follower list to cross-reference with campaign participants.
  • Pricing: estimate campaign costs (5 requests per participant for full verification).
  • API Reference: full specification for all verification endpoints.