← all tools
Recruiting CRM

Bullhorn

Write into Bullhorn, at the scale Bullhorn shops work at.

Bullhorn is a recruiting CRM, and one of the 52 tools hyreflow connects to Claude, ChatGPT and other AI assistants. Through hyreflow, an AI agent can run 13 actions: 3 that look something up and 10 that create or change records. Bullhorn runs on your own Bullhorn account: hyreflow charges no credits for it, and Bullhorn bills you as before.

Cost per callBYOK · vendor billed
Your own keyrequired
CategoryRecruiting CRM

Your agent searches and updates Bullhorn candidates, contacts, companies and job orders, piloting one record before it writes the rest. Bullhorn is the enterprise end of recruitment CRM, and writes there are real and hard to undo.

Bullhorn is the destination. Everything upstream converges here.

What can you ask Claude or ChatGPT to do with Bullhorn?

With hyreflow connected, you ask for the outcome in plain language and the assistant runs Bullhorn for you. For example:

  • “Push these candidates in as new records”
  • “Search for anyone matching this brief url we already have, then source the gap with Apollo”
  • “What job orders are open? Build a longlist for the oldest one”
  • “Update the contact on this account with what ZoomInfo returned”

Which tools work well with Bullhorn?

In a hyreflow run, Bullhorn is most often paired with Apollo, ZoomInfo, SmartLead and Aircall.

  • Apollo

    source only the gap your database does not already cover

  • ZoomInfo

    enterprise-grade data for enterprise-sized accounts

  • SmartLead

    volume outreach off a Bullhorn list

  • Aircall

    calls logged onto the record automatically

Which Bullhorn actions can an AI agent run through hyreflow?

Through hyreflow, an AI agent can run 13 Bullhorn actions: 3 that look something up and 10 that create or change records. Bullhorn runs on your own Bullhorn account: hyreflow charges no credits for it, and Bullhorn bills you as before.

Bullhorn actionWhat it doesCost through hyreflow
SearchLooks something upno hyreflow credits
Create candidateCreates or changes a recordno hyreflow credits
Create candidates batchCreates or changes a recordno hyreflow credits
Create client contactCreates or changes a recordno hyreflow credits
Create client contacts batchCreates or changes a recordno hyreflow credits
Create client corporationCreates or changes a recordno hyreflow credits
Create client corporations batchCreates or changes a recordno hyreflow credits
Create entityCreates or changes a recordno hyreflow credits
Create job orderCreates or changes a recordno hyreflow credits
Create job orders batchCreates or changes a recordno hyreflow credits
Show all 13 Bullhorn actions →
Bullhorn actionWhat it doesCost through hyreflow
QueryLooks something upno hyreflow credits
Update entityCreates or changes a recordno hyreflow credits
Get entityLooks something upno hyreflow credits

One credit is priced on the pricing page. The full price list for every tool is in the pricing tables.

Which hyreflow skills use Bullhorn?

6 hyreflow skills call Bullhorn as part of the run. A skill is a whole pipeline your agent already knows, end to end.

Sourcing

Find the candidates already sitting in your own ATS

use whena role comes in and you want to know who you already have before you pay to source anyone new

Recruit CRMBullhornVincereLoxoRecruiterflowJobAdderAtlashyreflow Agent
starts from a job spec · 6 stepsget the prompt →
Sourcing

Score one candidate against every open role in your ATS

use whena strong applicant comes in for the wrong job, and your team is working dozens of other roles they might fit

Recruit CRMBullhornVincereLoxoRecruiterflowJobAdderAtlashyreflow AgentAI Ark
starts from a candidate · 7 stepsget the prompt →
Business development

Spec one strong candidate out to fifteen companies

use whenyou have an excellent candidate on the bench and no live role to put them into

hyreflow NativeProspeoLushaPredictLeadsExaRecruit CRMBullhornLemlistInstantly
starts from a candidate · 8 stepsget the prompt →
Signals

Follow your client contacts when they move company

use whena hiring manager who knows you has changed employer, and your CRM still shows them at the company they left

LushaLeadMagicProspeoEnrichleyLemlistRecruit CRMBullhornJobAdderRecruiterflow
starts from your database · 8 stepsget the prompt →
Signals

Get back in touch with candidates who were promoted or changed job

use whenyour database is full of people you have not spoken to in years, and you do not know which of them have been promoted or changed employer since

LushaLeadMagicFullEnrichLemlistRecruit CRMBullhornLoxoVincereJobAdder
starts from your database · 8 stepsget the prompt →
Database

Load a finished shortlist into your ATS without creating duplicates

use whenyou have a finished shortlist or prospect list as a file, and it needs to be in your ATS or CRM without doubling up people you already hold

Recruit CRMJobAdderLoxoRecruiterflowAtlasBullhornVincere
starts from a list · 7 stepsget the prompt →

How does an AI agent know how to use Bullhorn?

hyreflow ships a written playbook for Bullhorn, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.

Read the Bullhorn docs →
Show the raw playbookwritten for the agent

HOW in lib/bullhorn.py. Docs: bullhorn.github.io/rest-api-docs.

Auth — 3-leg flow (most complex adapter; handled in _login)

  1. GET rest.bullhornstaffing.com/rest-services/loginInfo?username=… → oauthUrl + restUrl for the user's datacenter (e.g. auth-emea / rest-emea). Tenants are cluster-pinned: the global auth host answers a cross-cluster login with its login page, not a code.
  2. GET {oauthUrl}/authorize (client_id + username/password + action=Login) → 302 with ?code=.
  3. POST {oauthUrl}/token (grant_type=authorization_code) → access_token.
  4. POST {restUrl}/login?version=*&access_token=… → BhRestToken + restUrl. Then every call hits {restUrl}<path> with BhRestToken. The client re-logs in once on 401.
  • Env: BULLHORN_CLIENT_ID, BULLHORN_CLIENT_SECRET, BULLHORN_USERNAME, BULLHORN_PASSWORD; optional BULLHORN_REDIRECT_URI — leave unset so Bullhorn uses the OAuth app's registered URI (a mismatch fails authorize with "Invalid Redirect URI"). Never hardcode. BYOK: api_key = client ID; client_secret, username, password are the extra fields.
  • ping() = safe read-only pilot.

Operations (CONFIRMED from bullhorn.github.io/rest-api-docs, 2026-06-01)

search(entity, query, fields) — GET /search/{Entity} Lucene (indexed: Candidate, JobOrder, ClientContact, ClientCorporation…). query(entity, where, fields) — GET /query/{Entity} SQL-style (non-indexed). get_entity (GET /entity/{Entity}/{id}), create_entity (PUT /entity/{Entity}), update_entity (POST /entity/{Entity}/{id}). request() covers the rest. BhRestToken via query param is valid (also accepted as a header). All path patterns verified.

Guardrail

Production ATS writes — pilot one record, confirm, then bulk.

Handoff

ATS write target: enriched candidates → create_entity("Candidate", …).

Callable surface — lib/bullhorn.py

Import: from lib.bullhorn import Bullhorn → instantiate Bullhorn() (reads key from env). Generic passthrough: request(method, path, *, params, json).

  • batch(method: str, calls: list, *, stop_on_error: bool = False) -> dict — Batched get/search/update/create: run one method over many inputs, rate-limited. Each call is a value -> method(value), or {"args": [...], "kwargs": {...}} for multi-arg methods like update_entity(entity, id, payload). Destructive methods (delete) are refused. See lib/_base.run_ops.
  • create_candidate(payload: dict) -> Any — PUT /entity/Candidate — create a candidate.
  • create_candidates_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — Create many candidates sequentially while respecting the 1,500 req/min limit.
  • create_client_contact(payload: dict) -> Any — PUT /entity/ClientContact — create a contact.
  • create_client_contacts_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — Create many client contacts sequentially, rate-limited.
  • create_client_corporation(payload: dict) -> Any — PUT /entity/ClientCorporation — create a company.
  • create_client_corporations_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — Create many companies sequentially, rate-limited.
  • create_entity(entity: str, payload: dict) -> Any — PUT /entity/{entity} — create a record.
  • create_job_order(payload: dict) -> Any — PUT /entity/JobOrder — create a job.
  • create_job_orders_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — Create many job orders sequentially, rate-limited.
  • get_entity(entity: str, entity_id: int, *, fields: str = '*') -> Any — GET /entity/{entity}/{id}?fields=...
  • ping() -> Any — GET ping — verify session (safe read-only pilot).
  • query(entity: str, where: str, *, fields: str = '*', **params) -> Any — GET /query/{entity}?where=...&fields=... — SQL-style where (non-indexed entities).
  • search(entity: str, query: str, *, fields: str = '*', **params) -> Any — GET /search/{entity}?query=...&fields=... — Lucene-style search (indexed entities).
  • update_entity(entity: str, entity_id: int, payload: dict) -> Any — POST /entity/{entity}/{id} — update a record.

Questions about Bullhorn and hyreflow

Can I use Bullhorn inside Claude or ChatGPT?

Yes. hyreflow is a connector for Claude, ChatGPT and other AI assistants. Once hyreflow is connected, you ask for the outcome in plain language and the assistant calls Bullhorn for you. hyreflow exposes 13 Bullhorn actions this way.

Do I need my own Bullhorn account to use it with hyreflow?

Yes. Bullhorn runs on your own Bullhorn account. You connect it to hyreflow once, hyreflow charges no credits for the calls, and Bullhorn bills you as before.

What does Bullhorn cost through hyreflow?

Bullhorn runs on your own Bullhorn account: hyreflow charges no credits for it, and Bullhorn bills you as before.

How do I connect Bullhorn to an AI agent over MCP?

Add the hyreflow MCP server to your assistant and sign in. hyreflow calls the Bullhorn API directly and exposes its actions as tools the assistant can run, so there is no separate Bullhorn server to install.

Connect hyreflow to your assistant →

Put Bullhorn to work from one prompt

Connect hyreflow to Claude or ChatGPT and ask for the outcome. It reads the playbook above before it makes a single call.