Push candidates into Loxo and attach them to the right job.
Loxo 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 21 actions: 10 that look something up and 11 that create or change records. Loxo runs on your own Loxo account: hyreflow charges no credits for it, and Loxo bills you as before.
Loxo is where the work gets recorded. Your agent creates candidate records, reads your live jobs, and links people to the roles they are up for. These are real writes to a production system, so it does one and shows you before it does the rest.
Loxo is the destination. Everything the pipeline produced ends up filed here.
With hyreflow connected, you ask for the outcome in plain language and the assistant runs Loxo for you. For example:
In a hyreflow run, Loxo is most often paired with AI Ark, Lusha, Granola and HeyReach.
Through hyreflow, an AI agent can run 21 Loxo actions: 10 that look something up and 11 that create or change records. Loxo runs on your own Loxo account: hyreflow charges no credits for it, and Loxo bills you as before.
| Loxo action | What it does | Cost through hyreflow |
|---|---|---|
| Apply to job | 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 |
| Create job | Creates or changes a record | no hyreflow credits |
| Create jobs batch | Creates or changes a record | no hyreflow credits |
| Create people batch | Creates or changes a record | no hyreflow credits |
| Create person | Creates or changes a record | no hyreflow credits |
| Create person event | Creates or changes a record | no hyreflow credits |
| Company custom fields | Looks something up | no hyreflow credits |
| Update company | Creates or changes a record | no hyreflow credits |
| Loxo action | What it does | Cost through hyreflow |
|---|---|---|
| Update job | Creates or changes a record | no hyreflow credits |
| Update person | Creates or changes a record | no hyreflow credits |
| List activity types | Looks something up | no hyreflow credits |
| List companies | Looks something up | no hyreflow credits |
| List dynamic fields | Looks something up | no hyreflow credits |
| List job candidates | Looks something up | no hyreflow credits |
| List jobs | Looks something up | no hyreflow credits |
| List people | Looks something up | no hyreflow credits |
| Get company | Looks something up | no hyreflow credits |
| Get job | Looks something up | no hyreflow credits |
| Get person | 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.
16 hyreflow skills call Loxo as part of the run. A skill is a whole pipeline your agent already knows, end to end.
use whenyou have years of placements in your database and no habit of asking those people who else is good
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 whenthe people you placed years ago are running teams, and your database still files them as candidates
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
use whenyour ATS or CRM is full of people you cannot reach because the email, mobile or LinkedIn field is empty
hyreflow ships a written playbook for Loxo, 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 Loxo docs →HOW in lib/loxo.py.
https://app.loxo.co/api/{LOXO_AGENCY_SLUG} — Loxo is agency-scoped. The host is fixed; an agency subdomain 404s.LOXO_API_KEY (Bearer), LOXO_AGENCY_SLUG (bare slug, e.g. acme — a pasted URL/domain is reduced to its first label). Never hardcode.page/per_page; people and companies paginate via scroll_id (+ a Lucene query). Index: reference/docs/loxo/raw/endpoints.md.Jobs: list_jobs, get_job, create_job, update_job. People: list_people, get_person, create_person, update_person. Activity log (notes, replies, calls): list_activity_types, create_person_event. Companies (accounts): list_companies, iter_companies, get_company, create_company, update_company, plus list_dynamic_fields + company_custom_fields for the agency's custom fields. Job↔candidate: list_job_candidates (GET /jobs/{id}/candidates), apply_to_job (POST /jobs/{id}/apply).
apply_to_job (POST /jobs/{job_id}/apply) — multipart/form-data with REQUIRED email+name+phone (+ optional resume file). create_job_candidate is a deprecated alias.list_activity_types and take its numeric id, then call create_person_event with that activity_type_id (required), person_id and notes. With job_id, use a note-type activity: a pipeline-stage type moves the candidate on that job.list_companies paginates by cursor only: pass the scroll_id each response returns, with a per_page up to 100 — there is no page param. iter_companies(max_records=…) walks the whole account list.custom_hierarchy_1..6 {id, value} pairs, and each slot holds a different field per agency. Read the definitions once with list_dynamic_fields, then pass a {"custom_hierarchy_3": "Therapeutic area"} map to company_custom_fields(company, labels).ATS write target: enriched candidates → create_person / apply_to_job (assign to a job); reply notes → create_person_event.
Company-first BD: iter_companies → each account's url (website) → hyreflow_native career-page scraping for their open roles → contacts via the people_search waterfall.
lib/loxo.pyImport: from lib.loxo import Loxo → instantiate Loxo() (reads key from env). Generic passthrough: request(method, path, *, params, json).
apply_to_job(job_id: str, *, email: str, name: str, phone: str, resume: tuple | None = None, **fields) -> Any — POST /jobs/{job_id}/apply — add a candidate to a job. CONFIRMED.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_person(id, payload). Destructive methods (delete) are refused. See lib/_base.run_ops.company_custom_fields(company: dict, labels: dict | None = None) -> dict — Local (no HTTP): a company's custom_hierarchy_1..6 slots as {field_name: value}.create_companies_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /companies for many records, rate-limited.create_company(payload: dict) -> Any — POST /companies — create a company (form-encoded, company[...] params). CONFIRMED.create_job(payload: dict) -> Any — POST /jobs — create a job (form-encoded, job[...] params). CONFIRMED.create_job_candidate(job_id: str, payload: dict) -> Any — DEPRECATED alias → apply_to_job (POST /jobs/{id}/apply, multipart).create_jobs_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /jobs for many records, rate-limited.create_people_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /people for many records, respecting LOXO_RATE_LIMIT_RPM.create_person(payload: dict, *, resume: tuple | None = None, document: tuple | None = None) -> Any — POST /people — create a person (multipart, person[...] params). CONFIRMED.create_person_event(payload: dict) -> Any — POST /person_events — log an activity (note, call, email, reply) on a person (form-encoded, person_event[...] params). CONFIRMED.{"activity_type_id":71536,"person_id":123456,"notes":"Replied to outreach: open to a call next week."}get_company(company_id: str) -> Any — GET /companies/{id} — one company, with its website (url) and custom fields. CONFIRMED.get_job(job_id: str) -> Any — GET /jobs/{id}. CONFIRMED.get_person(person_id: str) -> Any — GET /people/{id}. CONFIRMED.iter_companies(*, per_page: int = 100, max_records: int = 1000, cursor: str | None = None, **params) -> _base.PagedResult — GET /companies — follow the scroll cursor until the account list is exhausted. CONFIRMED.list_activity_types(**params) -> Any — GET /activity_types — the agency's activity types (call, email, note, …); their ids feed create_person_event. Optional workflow_id filter. CONFIRMED.list_companies(**params) -> Any — GET /companies — search/list companies (accounts, employers). CONFIRMED.list_dynamic_fields() -> Any — GET /dynamic_fields — the agency's custom (dynamic) field definitions. CONFIRMED.list_job_candidates(job_id: str, **params) -> Any — GET /jobs/{job_id}/candidates — candidates on a job, with pipeline stage. CONFIRMED.list_jobs(**params) -> Any — GET /jobs — paginated (page, per_page). CONFIRMED.list_people(**params) -> Any — GET /people — paginated people/candidates (scroll_id/per_page/query). CONFIRMED.update_company(company_id: str, payload: dict) -> Any — PUT /companies/{id} (form-encoded, company[...] params). CONFIRMED.update_job(job_id: str, payload: dict) -> Any — PUT /jobs/{id} (form-encoded, job[...] params). CONFIRMED.update_person(person_id: str, payload: dict) -> Any — PUT /people/{id} (form-encoded, person[...] params). CONFIRMED.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 Loxo for you. hyreflow exposes 21 Loxo actions this way.
Yes. Loxo runs on your own Loxo account. You connect it to hyreflow once, hyreflow charges no credits for the calls, and Loxo bills you as before.
Loxo runs on your own Loxo account: hyreflow charges no credits for it, and Loxo bills you as before.
Add the hyreflow MCP server to your assistant and sign in. hyreflow calls the Loxo API directly and exposes its actions as tools the assistant can run, so there is no separate Loxo 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.