Build guide

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.

SourceEndpointShapeFields to useUse with
Greenhousehttps://boards-api.greenhouse.io/v1/boards/{company}/jobs{ jobs: [...] }title, location.name, absolute_url, first_publishedScript
Leverhttps://api.lever.co/v0/postings/{company}?mode=json[ ... ]text (the title), categories.location, hostedUrl, createdAt (ms)Script
Ashbyhttps://api.ashbyhq.com/posting-api/job-board/{company}?includeCompensation=true{ jobs: [...] }title, location, isRemote, jobUrl, publishedAt, compensation.compensationTierSummaryScript
Himalayas (remote)https://himalayas.app/jobs/rssAtom, 20 itemstitle, link, publishedRSS connector
Jobicy (remote)https://jobicy.com/?feed=job_feedRSS, 200 itemstitle, link, pubDateRSS connector
We Work Remotelyhttps://weworkremotely.com/categories/remote-programming-jobs.rssRSS, 25 items"Company: Role" title, link, pubDateRSS connector
HN "Who is hiring?"https://hnrss.org/whoishiring/jobsRSS, 20 itemsEach top-level comment in the monthly threadRSS 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:  @yourjobsfeed

Hacker 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 HiringJob bot with OpenTweet
Where jobs appearX's job board and a Jobs section on your profileYour followers' timelines, as posts
Who can use itOrganizations on X Premium BusinessAny X account, including job boards and recruiters
PricePremium Business: Basic $200/mo, Full Access $1,000/moFrom $19.99/mo
SpeedGreenhouse sync: 3-4 hours, then up to 48 hours at XYour next check, every 15 minutes
Other companies' jobsNo, your own organizationYes

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 typeTypical volumePlan
Daily digest thread, one linkUp to 20 posts a dayPro, $19.99/mo
One post per job, each with its apply linkUp to 10 link posts a dayAdvanced, $29/mo
One account per city or roleUp to 10 X accounts, 300 posts a dayAgency, $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.