The hard part of a giveaway is not picking a name. It is convincing several thousand people who did not win that the draw was real. A draw nobody can check is indistinguishable from one you rigged, and the accusation always arrives.
This is how to run one that survives scrutiny, and the mechanics of doing it from a tweet.
Step 1: decide what counts as an entry
Announce this before the draw, in the tweet itself. Changing the rule afterwards is the single most common way a legitimate giveaway starts looking crooked. The available signals:
- Retweets. The usual entry action. Cheap for the entrant, which cuts both ways.
- Replies. Higher effort, better engagement, more spam.
- Quotes. The strongest signal of the three, and the smallest pool.
- Likes. Effectively unavailable — X does not expose the identities of people who liked a post to third parties, only the count. Any tool claiming to draw from likers is guessing. Do not make liking an entry condition.
Also decide up front whether entrants need to do all of the chosen actions or any of them. "Retweet and reply" is an intersection and yields a much smaller pool than people expect.
Step 2: collect and dedupe
Someone who retweeted and replied is one person, not two entries, unless you deliberately decided otherwise. Deduplicate on the numeric user id rather than the handle — handles change, ids do not.
Collecting means paginating each engagement type. Expect the totals not to match the counts shown on the tweet: blocked accounts, deleted replies, suspended users, and protected accounts all fall out between the counter and the list. That gap is normal and worth stating publicly so it does not look like a discrepancy you created.
Step 3: filter, but disclose the filter
Bot filtering is legitimate and it is also where organisers get accused of putting a thumb on the scale. The defence is publishing the rule beforehand. Reasonable, checkable filters:
- Account created before the giveaway was announced.
- A minimum follower count, if you state the number.
- A profile picture, or a non-empty bio.
- Excluding your own accounts and your team's.
Every filter should be something an entrant can evaluate for themselves by looking at a profile. "Looked like a bot to me" is not a rule.
Step 4: draw with a published seed
This is the part that turns a claim into a proof. A seeded random pick is deterministic: the same pool and the same seed always produce the same winners. Publish the seed and anyone can re-run the draw and get your result.
Pick a seed you demonstrably could not have chosen after seeing the outcome. Good options: the closing date as a number, the id of the giveaway tweet, or the hash of a Bitcoin block mined after the deadline. Bad option: a number you picked once you had the entrant list.
Then post three things: the seed, the pool size, and the winners. Anybody can verify the third follows from the first two.
Doing it with the API
GET /v1/tweet/{id}/engagers does the collection, deduplication, and seeded draw in one call:
JavaScript
const url = new URL(
"https://api.probeuranus.fun/v1/tweet/1234567890/engagers",
);
url.searchParams.set("types", "retweet,reply,quote");
url.searchParams.set("winners", "3");
url.searchParams.set("seed", "20260915");
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.PROBE_API_KEY}` },
});
const { data, meta } = await res.json();
// data -> the drawn winners
// meta.counts -> per-type totals and deduped pool sizeThe parameters that matter:
types— any ofretweet,reply,quote. This is your entry rule.mode—unionfor "any of them",intersectfor "all of them".winners— how many to draw. Omit it to get the whole deduplicated pool instead, which is what you want if you are applying your own filters before drawing.seed— the published number that makes the draw reproducible.max_pages— how deep to paginate per type. Raise it for a large tweet; the default is deliberately conservative.
meta.counts comes back with the per-type totals and the final pool size — publish those alongside the seed.
Try it without writing anything
There is a free version of exactly this on the site: paste a tweet URL, choose the entry types, set a seed, and draw. No account, no card.
The short version
- State the entry rule in the giveaway tweet.
- Do not make liking a condition — the data does not exist.
- Dedupe on user id.
- Publish any bot filter before drawing.
- Choose a seed you could not have known in advance, and publish it with the pool size and the winners.
- Expect the pool to be smaller than the on-tweet counter. Say so.