HomeProjectsDiscord Bots

Job Bots for Discord

Published Aug 21, 2024
⋅
Updated Nov 9, 2026
⋅
2 minutes read
Two free bots that post new internship and new-grad roles to Discord servers and DMs minutes after they're listed.

The bots started as a script for one server. They now post to servers with over 200,000 members (live stats), anyone can add them, and anyone can get roles in their DMs. This is how they stay quiet when nothing's new, never lose a role, and clean up after servers that leave.

Get new roles in your server
Free. One command to set up.
Add to Discord

Polling

The listings live in a public JSON file on GitHub. Each bot asks for it once a minute with the ETag from its last read. When nothing changed, GitHub answers 304 Not Modified with an empty body, and the bot goes back to sleep. Most minutes look like that.

When a role is new, the bot writes it to a SQLite ledger with one row per subscribed channel, then sends.

listings.json
GitHub
↓
poller
every minute
↓
ledger
SQLite
↓
channels
0requests
0were 304
0new roles
0messages
Sped up so one tick is one minute. A quiet minute costs a single 304 and nothing else runs.

The ledger

Every row is written before anything goes to Discord, and each one is marked the moment Discord accepts its message. If the process dies halfway through, the restart reads the ledger and sends only the rows that aren't marked. The worst case is one duplicate: the message that was in flight when it died.

Stripe · Software Engineer Internidle
#internshipspending
#jobspending
#sponsoredpending
roles (forum)pending
#new-gradpending
Post a role, then kill the bot mid-send.
Rows are written before anything is sent and marked the moment Discord accepts each message. Kill the bot mid-send and the restart picks up the unmarked rows, so only the in-flight message can go out twice.

Delivery records are deleted after 30 days. The ledger is backed up every day, and the last 7 backups are kept.

Pacing

One role means one message per channel, so a server count of 2,000 is a 2,000-message burst. Discord allows a bot 50 requests a second. The bots cap themselves at 40 so slash command replies always have room.

0 / 100 sent0.0 s
One new role means one message per channel. Sends are capped at 40 a second, under Discord’s limit of 50, so even 2,000 channels drain in 50 seconds without a single 429.

Lifecycle

A subscription is never deleted, only paused with a reason. The reason decides what can turn it back on. A server that removes the bot and adds it back gets its channels back as they were. A channel that's been failing for 24 hours (deleted, or the bot lost access) stays paused until someone runs /jobs subscribe there again.

active
⇄
paused
Try the events below.
Rows are paused, never deleted, so a channel keeps its settings when it comes back.

DMs

/dm on sends new roles to your DMs instead of a channel. It works in any server that has the bot, or with no server at all: add the bot to your account and run it anywhere in Discord.

A DM subscription is the same ledger row as a channel, pointed at your DM channel with the bot. Discord refuses DMs from a bot you've blocked or whose DMs you've turned off, so the bot sends a confirmation first and saves the row only if it arrives. The ledger never holds a channel it can't post to. DM rows have no server, so the leave-and-rejoin bookkeeping skips them.

Links

Every role the bots post links through go.vansh.nyc, so clicks can be counted. How the links work.

Commands

CommandWhat it does
/jobs subscribe [channel] [sponsorship]Posts new roles in a channel. Pick "Only roles that may sponsor visas" to skip the ones that don't.
/jobs unsubscribe [channel]Stops posting there.
/jobs statusLists this server's channels.
/dm on [sponsorship]Sends new roles to your DMs.
/dm offStops them.

Only members with Manage Channels can run /jobs. Anyone can run /dm. Replies are visible only to whoever ran the command. A server can subscribe up to 5 channels.

Permissions

The bots ask for View Channel, Send Messages, Embed Links, Send Messages in Threads, and Create Public Threads. /dm needs no permissions. They don't read messages and don't request message content, members, or presence. See the privacy policy and terms.