Hiring Signal Radar is a small Python script for B2B sales and growth teams. Give it one role, such as "data analyst", and it finds companies that posted for that role in the last 30 days on X and on public job boards, then scores them into a short list of accounts worth researching.
The problem
A company hiring for a role is often a company about to buy tools for that role. These hiring signals are public, but they are spread across X posts and job board pages, and many are old or closed. Sales teams need a fresh, company-level list, not a pile of links.
What the app does
- Takes a role and optional keywords to narrow the industry.
- Finds hiring posts on X from the last 30 days.
- Finds job pages on public job boards and reads each one.
- Pulls company, role, location, date and open or closed status.
- Scores each company on role match, freshness, number of roles and signal sources.
- Writes a short accounts list and CSVs. Output is company-level only; personal handles are never saved.
How it works
- X posts.
GET /twitterwith queries like"we're hiring" "<role>", for the last 14 days and days 15 to 30. - Job pages.
GET /webwithsite:queries for public job boards. - Read.
GET /web/extractas text, with an HTML read only when the text has no date. - Name the company from the post or page and merge duplicates.
- Score and write the accounts list, CSVs, a chart and a cost log.
The code
def get(self, phase, path, params, timeout=120):
t0 = time.time()
try:
r = requests.get(API + path, params=params, headers={"Authorization": self.key}, timeout=timeout)
status, headers, text = r.status_code, r.headers, r.text
except requests.RequestException as e:
status, headers, text = 0, {}, str(e)
try:
body = json.loads(text)
except ValueError:
body = text
rec = {"ts": dt.datetime.now(TZ).isoformat(timespec="seconds"), "phase": phase, "path": path, "params": params,
"status": status, "latency_s": round(time.time() - t0, 2),
"cost_usd": headers.get(BILL[0]), "usage": headers.get(BILL[1]), "service": headers.get(BILL[2]),
"currency": headers.get(BILL[3])}
if isinstance(body, list):
rec["items"] = len(body)
elif isinstance(body, dict) and isinstance(body.get("data"), list):
rec["items"] = len(body["data"])
elif isinstance(body, str) and status == 200:
rec["items"] = 1 if body.strip() else 0
else:
rec["items"] = 0
self.calls.append(rec)
print(f" {rec['ts'][11:19]} {phase:8} {status} {rec['latency_s']:>6}s items={rec['items']} usage={rec['usage']} cost={rec['cost_usd']}", flush=True)
return status, body
The folder has one script, hiring_signal_radar.py, and the sample run in output/.
Endpoints
GET /twitterGET /webGET /web/extract
Example output
From a run on 2026-10-10 for the role "data analyst" with a crypto keyword:
| Step | Result |
|---|---|
| X posts returned | 130 (123 unique, all inside the date windows) |
| Posts that named a company | 60 of 123 |
| Job board results | 160 |
| Job pages read | 150 (21 open postings, 64 closed) |
Run it yourself
The public examples folder linked above includes the script and a README. Install its requirements, set DESEARCH_API_KEY from console.desearch.ai, and use the run command in that README.
Useful flags: --x-keyword (narrow X posts, for example by industry), --web-keyword (narrow job board searches), --from-raw FILE (offline, no cost).
What it costs
The sample run made 324 calls and cost $0.1125 in total, summed from the X-Desearch-Cost-Usd headers on 2026-10-10. It took about 5.5 minutes with 3 page readers. See pricing.
Ideas to extend it
- Run it weekly per role and only show new companies.
- Join the list with your CRM to skip current customers.
- Add more job boards with
site:queries.
