Write it all back to your CRM, so nothing ends up in a spreadsheet.
Recruit CRM is a recruiting CRM, and one of the 53 tools hyreflow connects to Claude, ChatGPT and other AI assistants. Through hyreflow, an AI agent can run 29 actions: 15 that look something up and 14 that create or change records. Recruit CRM runs on your own Recruit CRM account: hyreflow charges no credits for it, and Recruit CRM bills you as before.
Your agent pushes candidates, companies and contacts into Recruit CRM, reads your open roles, and moves people through hiring stages. Every write is real, so it does one record first and shows you the result before the rest.
Recruit CRM is the destination. Whatever the pipeline produced, this is where it gets filed.
With hyreflow connected, you ask for the outcome in plain language and the assistant runs Recruit CRM for you. For example:
In a hyreflow run, Recruit CRM is most often paired with Prospeo, Fathom, Instantly and Aircall.
Through hyreflow, an AI agent can run 29 Recruit CRM actions: 15 that look something up and 14 that create or change records. Recruit CRM runs on your own Recruit CRM account: hyreflow charges no credits for it, and Recruit CRM bills you as before.
| Recruit CRM action | What it does | Cost through hyreflow |
|---|---|---|
| Search candidates | Looks something up | no hyreflow credits |
| Search companies | Looks something up | no hyreflow credits |
| Search contacts | Looks something up | no hyreflow credits |
| Search jobs | Looks something up | no hyreflow credits |
| Apply candidate to job | Creates or changes a record | no hyreflow credits |
| Assign candidate to job | Creates or changes a record | no hyreflow credits |
| Create candidate | Creates or changes a record | no hyreflow credits |
| Create candidates batch | Creates or changes a record | no hyreflow credits |
| Create companies batch | Creates or changes a record | no hyreflow credits |
| Create company | Creates or changes a record | no hyreflow credits |
| Recruit CRM action | What it does | Cost through hyreflow |
|---|---|---|
| Create contact | Creates or changes a record | no hyreflow credits |
| Create contacts batch | Creates or changes a record | no hyreflow credits |
| Create job | Creates or changes a record | no hyreflow credits |
| Update candidate | Creates or changes a record | no hyreflow credits |
| Update candidate hiring stage | Creates or changes a record | no hyreflow credits |
| Update company | Creates or changes a record | no hyreflow credits |
| Update contact | Creates or changes a record | no hyreflow credits |
| Update job | Creates or changes a record | no hyreflow credits |
| List candidates | Looks something up | no hyreflow credits |
| List companies | Looks something up | no hyreflow credits |
| List contacts | Looks something up | no hyreflow credits |
| List custom fields | Looks something up | no hyreflow credits |
| List jobs | Looks something up | no hyreflow credits |
| Get candidate | Looks something up | no hyreflow credits |
| Get candidate hiring pipelines | Looks something up | no hyreflow credits |
| Get candidate hiring stages | Looks something up | no hyreflow credits |
| Get company | Looks something up | no hyreflow credits |
| Get contact | Looks something up | no hyreflow credits |
| Get job | Looks something up | no hyreflow credits |
One credit is priced on the pricing page. The full price list for every tool is in the pricing tables.
25 hyreflow skills call Recruit CRM as part of the run. A skill is a whole pipeline your agent already knows, end to end.
use whena role comes in and you want to know who you already have before you pay to source anyone new
use whena strong applicant comes in for the wrong job, and your team is working dozens of other roles they might fit
use whenyou know exactly which firms to take people from, and which firms must never be touched
use whenyou have won a place on a supplier list or made one placement at a large company, and you want everyone there who hires in your discipline
use whenyou have an excellent candidate on the bench and no live role to put them into
use whenthere are companies you have placed with or worked for that nobody on the team has spoken to in a long while
hyreflow ships a written playbook for Recruit CRM, 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 Recruit CRM docs →Confidence: highest of the CRMs — every path is taken straight from Recruit CRM's own live docs (20 endpoint groups; cache:
reference/docs/recruitcrm/raw/). Basehttps://api.recruitcrm.io/v1, Bearer.
Routing layer for all Recruit CRM API work. This file tells you WHERE to go and the guardrails to respect; the HOW lives in the reference playbook, the recipes, and the Python client. Read the matching doc BEFORE making any call.
lib/recruit_crm.py (Python-only stack).reference/endpoints.md; task playbooks in recipes/*.md.https://api.recruitcrm.io/v1/Authorization: Bearer <API_TOKEN>RECRUITCRM_API_KEY. NEVER hardcode the key in any file, recipe, or commit. The Python
client raises if the env var is missing.STOP. Before writing or running a call:
| When the task involves... | Read this first |
|---|---|
| Any endpoint shape, params, pagination, field names | reference/endpoints.md |
| Pushing enriched leads (companies + contacts) from a CSV | recipes/push-enriched-leads.md |
| Calling the API from Python | lib/recruit_crm.py (docstrings) |
If the exact payload for an operation is marked TODO (paste schema) in
reference/endpoints.md, do NOT guess it — ask the user to paste that section of
https://docs.recruitcrm.io first. (The docs site is a JS-rendered SPA and cannot be scraped.)
Recruit CRM writes are real, irreversible changes to a production ATS. Before any create/update or bulk push:
--rows 0:1 (one record) and show the user
the exact payload + response before continuing.reference/endpoints.md → "Account-specific IDs"). Confirm the mapping before writing.jobs/search, assign candidatesThe canonical flow: the sourcing + enrichment adapters produce an enriched CSV → this skill loads that CSV into Recruit CRM. Inspect the CSV (row count, columns, sample values) first before mapping columns to Recruit CRM fields. Never read large CSVs into context.
lib/recruit_crm.pyImport: from lib.recruit_crm import RecruitCRM → instantiate RecruitCRM() (reads key from env). Base: https://api.recruitcrm.io/v1. Generic passthrough: request(method, path, *, params, json).
apply_candidate_to_job(candidate_slug: str, payload: dict) -> Any — POST /v1/candidates/{candidate}/apply.assign_candidate_to_job(candidate_slug: str, payload: dict) -> Any — POST /v1/candidates/{candidate}/assign — assign candidate to a job (job slug in body).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_candidate(slug, payload). Destructive methods (delete) are refused. See lib/_base.run_ops.create_candidate(payload: dict) -> dict — POST /v1/candidates — create a candidate. Required: first_name.create_candidates_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /v1/candidates (repeated, rate-limited).create_companies_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /v1/companies (repeated, rate-limited). See create_candidates_batch.create_company(payload: dict) -> dict — POST /v1/companies — create a company. Required: company_name.create_contact(payload: dict) -> dict — POST /v1/contacts — create a contact. Required: first_name, last_name.create_contacts_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /v1/contacts (repeated, rate-limited). See create_candidates_batch.create_job(payload: dict) -> dict — POST /v1/jobs — create a job. Required: name, number_of_openings, company_slug,get_candidate(slug: str) -> dict — GET /v1/candidates/{slug} — single candidate by slug.get_candidate_hiring_pipelines() -> Any — GET /v1/hiring-pipelines — pipelines + stage IDs (needed for hiring-stage moves).get_candidate_hiring_stages(slug: str) -> Any — GET /v1/candidates/{slug}/hiring-stages — all jobs+stages for the candidate.get_company(slug: str) -> dictget_contact(slug: str) -> dictget_job(slug: str) -> dictlist_candidates(sort_by: str = 'updatedon', sort_order: str = 'desc', limit: int = 100) -> Iterator[dict] — GET /v1/candidates — iterate all candidates. sort_by: createdon|updatedon.list_companies(sort_by: str = 'updatedon', sort_order: str = 'desc', limit: int = 100) -> Iterator[dict] — GET /v1/companies — iterate all companies.list_contacts(sort_by: str = 'updatedon', sort_order: str = 'desc', limit: int = 100) -> Iterator[dict] — GET /v1/contacts — iterate all contacts.list_custom_fields(entity: str = '') -> Any — GET /v1/custom-fields[/{entity}] — custom field IDs. entity e.g.list_jobs(sort_by: str = 'updatedon', sort_order: str = 'desc', limit: int = 100) -> Iterator[dict] — GET /v1/jobs — iterate all jobs.search_candidates(*, custom_fields: list[dict] | None = None, **filters) -> Iterator[dict] — GET /v1/candidates/search — query filters + optional custom_fields body.search_companies(*, custom_fields: list[dict] | None = None, **filters) -> Iterator[dict] — GET /v1/companies/search. Filters: company_name, company_slug, owner_email,search_contacts(*, custom_fields: list[dict] | None = None, **filters) -> Iterator[dict] — GET /v1/contacts/search — query filters + optional custom_fields body.search_jobs(*, custom_fields: list[dict] | None = None, **filters) -> Iterator[dict] — GET /v1/jobs/search — query filters + optional custom_fields body.update_candidate(slug: str, payload: dict) -> dict — POST /v1/candidates/{slug} — edit a candidate (POST, not PUT).update_candidate_hiring_stage(candidate_slug: str, job_slug: str, payload: dict) -> Any — POST /v1/candidates/{candidate}/hiring-stages/{job} — move candidate's stage in a job.update_company(slug: str, payload: dict) -> dict — POST /v1/companies/{slug} — edit (POST, not PUT). company_name required again.update_contact(slug: str, payload: dict) -> dict — POST /v1/contacts/{slug} — edit a contact (POST, not PUT).update_job(slug: str, payload: dict) -> dict — POST /v1/jobs/{slug} — edit a job (POST, not PUT).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 Recruit CRM for you. hyreflow exposes 29 Recruit CRM actions this way.
Yes. Recruit CRM runs on your own Recruit CRM account. You connect it to hyreflow once, hyreflow charges no credits for the calls, and Recruit CRM bills you as before.
Recruit CRM runs on your own Recruit CRM account: hyreflow charges no credits for it, and Recruit CRM bills you as before.
Add the hyreflow MCP server to your assistant and sign in. hyreflow calls the Recruit CRM API directly and exposes its actions as tools the assistant can run, so there is no separate Recruit CRM server to install.
Connect hyreflow to Claude or ChatGPT and ask for the outcome. It reads the playbook above before it makes a single call.