Build a job board bot for X
every new opening, posted with the pay
Greenhouse, Lever and Ashby publish every open job as free public JSON. A short script turns each new one into a post on X, and job RSS feeds work with no code at all. No X developer account, no Premium Business subscription.
Card required, cancel any time.
The short answer
Every 15 minutes, read https://boards-api.greenhouse.io/v1/boards/{company}/jobs (or the Lever or Ashby equivalent below), keep the job IDs you have not posted, and send each new job to POST https://opentweet.io/api/v1/posts with the company, role, location, pay and apply link. For a job RSS feed such as https://himalayas.app/jobs/rss, use the OpenTweet RSS connector instead. This is separate from X Hiring, which needs X Premium Business.
Where the jobs come from
All seven returned 200 with current jobs on November 3, 2026, with no key. On that day Anthropic's Greenhouse board listed 677 open jobs and Ramp's Ashby board 170. Replace {company} with the board name from the company's careers page URL.
| Source | Endpoint | Shape | Fields to use | Use with |
|---|---|---|---|---|
| Greenhouse | https://boards-api.greenhouse.io/v1/boards/{company}/jobs | { jobs: [...] } | title, location.name, absolute_url, first_published | Script |
| Lever | https://api.lever.co/v0/postings/{company}?mode=json | [ ... ] | text (the title), categories.location, hostedUrl, createdAt (ms) | Script |
| Ashby | https://api.ashbyhq.com/posting-api/job-board/{company}?includeCompensation=true | { jobs: [...] } | title, location, isRemote, jobUrl, publishedAt, compensation.compensationTierSummary | Script |
| Himalayas (remote) | https://himalayas.app/jobs/rss | Atom, 20 items | title, link, published | RSS connector |
| Jobicy (remote) | https://jobicy.com/?feed=job_feed | RSS, 200 items | title, link, pubDate | RSS connector |
| We Work Remotely | https://weworkremotely.com/categories/remote-programming-jobs.rss | RSS, 25 items | "Company: Role" title, link, pubDate | RSS connector |
| HN "Who is hiring?" | https://hnrss.org/whoishiring/jobs | RSS, 20 items | Each top-level comment in the monthly thread | RSS connector + AI prompt |
Lever's createdAt is in milliseconds. Ashby only returns pay when you add includeCompensation=true and the company shows pay on its postings.
Three formats that work
One job, one post
Company, role, location, pay. The format a paying OpenTweet account uses for creator and UGC jobs, with the pay range in the first line.
Daily digest thread
Every new job of the day without links, and one final post linking to your board. One link post a day.
Pay-first niche feed
Only jobs that list pay, sorted by the top of the range. Ashby gives you the range directly.
The job watcher
One script for all three trackers. Run it every 15 minutes with cron or a scheduled GitHub Action. The first run only records the jobs that are already open, so you do not post 677 old jobs. After that, each new job becomes one post, at most ten a run.
import json, pathlib, requests
OT_KEY = "ot_your_key"
COMPANIES = { # board name in each ATS
"greenhouse": ["anthropic"],
"lever": ["palantir"],
"ashby": ["ramp"],
}
STATE = pathlib.Path("posted_jobs.json")
seen = set(json.loads(STATE.read_text())) if STATE.exists() else None
def jobs():
for c in COMPANIES["greenhouse"]:
for j in requests.get(f"https://boards-api.greenhouse.io/v1/boards/{c}/jobs", timeout=30).json()["jobs"]:
yield f"gh:{j['id']}", j.get("company_name", c), j["title"], j["location"]["name"], None, j["absolute_url"]
for c in COMPANIES["lever"]:
for j in requests.get(f"https://api.lever.co/v0/postings/{c}?mode=json", timeout=30).json():
yield f"lv:{j['id']}", c.title(), j["text"], j["categories"].get("location", ""), None, j["hostedUrl"]
for c in COMPANIES["ashby"]:
url = f"https://api.ashbyhq.com/posting-api/job-board/{c}?includeCompensation=true"
for j in requests.get(url, timeout=30).json()["jobs"]:
pay = (j.get("compensation") or {}).get("compensationTierSummary")
yield f"ab:{j['id']}", c.title(), j["title"].strip(), j["location"], pay, j["jobUrl"]
open_jobs = list(jobs())
if seen is None: # first run: remember every open job, post nothing
seen = {j[0] for j in open_jobs}
else:
new = [j for j in open_jobs if j[0] not in seen]
for job_id, company, title, location, pay, link in new[:10]:
lines = [f"{company} is hiring: {title}", location[:80]] # long locations would push the link past 280
if pay:
lines.append(f"Pay: {pay}")
lines.append(link)
r = requests.post(
"https://opentweet.io/api/v1/posts",
headers={"Authorization": f"Bearer {OT_KEY}"},
json={"text": "\n".join(lines)[:280], "publish_now": True},
timeout=30,
)
if r.ok:
seen.add(job_id)
STATE.write_text(json.dumps(sorted(seen)))The daily digest thread
Collect the day's jobs instead of posting each one, then schedule a single thread. The first post is text, the rest go in thread_tweets, and only the last one has a link.
curl -X POST https://opentweet.io/api/v1/posts \
-H "Authorization: Bearer $OPENTWEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "7 new remote AI jobs today, with pay. A thread.",
"is_thread": true,
"thread_tweets": [
"1/ Ramp: Security Engineer, Cloud. New York or remote (Canada). $211.4K-$290.6K + equity",
"2/ Anthropic: 3P Revenue Accounting & Reporting. San Francisco or Seattle",
"3/ ...",
"All 7, with apply links: yourjobboard.com/today"
],
"scheduled_date": "2026-11-04T15:00:00Z"
}'Every field is in the API reference. Prefer to approve each post? Connect Claude, ChatGPT or Cursor to the OpenTweet MCP server and let it draft from the job data.
No code: a job RSS feed
Remote job boards publish RSS. Add one as a connector and the AI writes each post from the listing, skipping the ones outside your niche. The connector checks every 5 or 15 minutes if you choose, posts the newest jobs first and skips anything older than 48 hours.
Connectors -> New connector -> Blog or newsletter (RSS)
Feed URL: https://himalayas.app/jobs/rss
Prompt: One post per job. Line 1: company and role.
Line 2: location or "Remote", and the pay range
if the listing gives one. No emoji, no hashtags.
Skip the job if it is not in software or AI.
Frequency: Every 15 minutes
Include link: On
X account: @yourjobsfeedHacker News posts a "Who is hiring?" thread on the first weekday of each month (the November 2026 one went up on November 2). https://hnrss.org/whoishiring/jobs turns each top-level comment into a feed item. Ask the AI to pull out the company, role, location and whether it is remote, and to skip comments that are not job posts.
X Hiring or a job bot?
They solve different problems, and many companies use both.
| X Hiring | Job bot with OpenTweet | |
|---|---|---|
| Where jobs appear | X's job board and a Jobs section on your profile | Your followers' timelines, as posts |
| Who can use it | Organizations on X Premium Business | Any X account, including job boards and recruiters |
| Price | Premium Business: Basic $200/mo, Full Access $1,000/mo | From $19.99/mo |
| Speed | Greenhouse sync: 3-4 hours, then up to 48 hours at X | Your next check, every 15 minutes |
| Other companies' jobs | No, your own organization | Yes |
Sources: X's Premium Business help page and Greenhouse's X Hiring article, read November 3, 2026. More in does X Premium Business include API access.
Which plan fits your board
Flat monthly price. Jobs almost always carry a link, so link posts decide the plan.
| Board type | Typical volume | Plan |
|---|---|---|
| Daily digest thread, one link | Up to 20 posts a day | Pro, $19.99/mo |
| One post per job, each with its apply link | Up to 10 link posts a day | Advanced, $29/mo |
| One account per city or role | Up to 10 X accounts, 300 posts a day | Agency, $49/mo |
Link posts: Pro 1 a day, Advanced 10, Agency 20, plus link credits. See pricing.
Facts from the listing. Company, title, location and pay come from the data, never from a model. A wrong salary is the fastest way to lose trust.
Post once. Each job once, then in a weekly roundup if it is still open. Daily reposts of the same job look like spam.
Label it. Turn on the Automated label in your X settings and do not tag companies or candidates. More in X automation rules.
Frequently asked questions
How do I post new job openings to X automatically?
Read your jobs from your applicant tracking system's public job board API, keep the IDs you have already posted, and send each new job to POST https://opentweet.io/api/v1/posts. Greenhouse, Lever and Ashby all publish open jobs as public JSON with no key. If your jobs are already in an RSS feed, add the feed to the OpenTweet RSS connector instead and skip the code.
Is this the same as X Hiring?
No. X Hiring puts your jobs on X's job board and a Jobs section on your profile. It is part of X Premium Business (Basic is $200 a month, Full Access $1,000 a month, per X's help page), and Greenhouse can sync to it. A job bot posts each opening as a normal post that shows up in your followers' timelines. Any account can do it, including a job board that lists other companies' jobs, which X Hiring is not built for.
How long does the Greenhouse X Hiring sync take?
Greenhouse says it sends a newly published job to X within 3 to 4 hours, and X can take up to 48 hours more to process it. The job must have a location, or it does not sync. A job bot posts within minutes of your next check.
Can I include the salary in the post?
Yes, when the source has it. Ashby returns a summary such as "$211.4K – $290.6K • Offers Equity" in compensation.compensationTierSummary when you add includeCompensation=true and the company shows pay on its postings. Greenhouse and Lever do not have a standard pay field in the public list, so parse it from the description or leave it out. Posts that lead with the pay range get more clicks.
Does every job post count as a link post?
If it has the apply link, yes: $0.20 per post on the X API, and it uses your OpenTweet link allowance (1 a day on Pro, 10 on Advanced, 20 on Agency). Busy boards post a daily digest thread instead: one post per job without a link, and one final post that links to your board. That is one link post a day, however many jobs you list.
Can I use the OpenTweet JSON connector for Greenhouse or Ashby?
Not well. The JSON connector reads a top-level list, or a list under items, data, results, entries, records or posts. Greenhouse and Ashby put jobs under "jobs", and Lever names its title field "text" and its link "hostedUrl", so the connector would not find the title and link. Use the script on this page for these three, and the RSS connector for job feeds.
Will X limit an account that only posts jobs?
Not for original posts on your own timeline. Turn on the Automated label, post each job once, remove filled jobs from your board, and do not mention or tag candidates. Do not repost the same job every day; post it once and include it in a weekly roundup if it is still open.
Posting from another kind of feed? See the alert bot, the affiliate deals bot, the GitHub trending bot, or the cybersecurity news account.
Everything you can build on X with OpenTweet
Post to X from your code, a feed, or an AI agent. Start anywhere in the cluster.
OpenTweet vs the X API
Post, schedule, and automate X without a developer account or the $200/mo minimum.
X DM outreach, human-approved
Find and qualify leads, AI-draft DMs, approve each one, and drip-send from your own account via API or MCP.
Post to X without an API
The clean, account-safe way to post to X from your code or an AI agent.
Twitter MCP Server
Give Claude, Cursor, and OpenClaw the ability to post to X. 44 tools included.
Developer docs
Quickstart, API keys, MCP setup, and the REST reference for posting to X from code or an agent.
Cross-posting reference
One call posts to X, Bluesky and LinkedIn. The platforms field, per-network results, and why a network gets skipped.
Social media API for AI agents
Three ways an agent can post to X, Bluesky and LinkedIn, and the trade-offs of each.
LinkedIn MCP server
Post and schedule to a LinkedIn profile from Claude or Cursor through the official LinkedIn API.
XMCP vs OpenTweet
X's official MCP server bills per API call and cannot schedule. Compare it with the flat-fee hosted MCP.
MCP for AI agents
Connect your AI client to X in under two minutes, no X developer account.
Developer API and keys
REST endpoints, one bearer key, and usage tracking. Build on OpenTweet.
OpenTweet for AI agents
The posting layer for autonomous agents and automations that live on X.
Build an AI Twitter persona
Give your AI agent its own X account. Setup, cadence, and the rules that keep it safe.
Best MCP servers for social media
The 2026 ranked list. How the hosted OpenTweet MCP compares with the official X MCP and others.
Best API to post to X
Seven options priced at real volumes, and why links decide the bill.
Cheapest way to post to X via code
Flat fee vs pay-per-use. Why the $0.20 per-link fee flips the math past ~145 link posts a month.
X API pricing 2026
Every pay-per-use X API endpoint price from docs.x.com in one searchable table.
Bluesky posting API
Post and schedule to Bluesky with one REST call and OAuth, and cross-post to X and LinkedIn in the same request.
Automate LinkedIn posts
Post to LinkedIn from an AI agent, n8n or a script through the official Posts API, with one REST or MCP call.
Put your job board on X today
Connect X, create a key, and the next job you open goes out within 15 minutes.