Read/write Carerix (recruiting ATS/CRM) via its GraphQL API — list/get candidates, vacancies, companies, contacts, matches and notes; create candidates and notes; update matches. Use when the user mentions Carerix, pushing candidates into the ATS, or reading vacancies/companies. Keys: BYOK-only — the workspace connects a Carerix confidential client (Client ID + secret + tenant name).
Ask for the outcome and your agent composes the run itself. Or start from a skill, a whole pipeline it already knows end to end.
browse all skills →Every tool ships with a written playbook, 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 Carerix docs →HOW in lib/carerix.py.
https://api.carerix.io/graphql/v1/graphql; every call is a fixed, typed document.https://acme.carerix.net → acme); the pasted URL is never fetched. Tenants on a non-default identity host are not supported yet. The token is cached until shortly before it expires; an HTTP 401 triggers one fresh-token retry (also after a GraphQL UNAUTHENTICATED on the top-level field, which means nothing ran).api_key = Client ID; client_secret and tenant are the extra fields. Permissions are controlled in Carerix, on the client. A connected workspace never reads env.ping() = safe read-only pilot.Candidate = CREmployee, Vacancy = CRVacancy, Company = CRCompany, Contact = person at a company, Match = candidate-to-vacancy link carrying the pipeline status, Note = a to-do of kind note.
Candidates: list_candidates, search_candidates, get_candidate, create_candidate, create_candidates_batch.
Vacancies / companies / contacts: list_vacancies, get_vacancy, list_companies, get_company, list_contacts, get_contact.
Matches / notes: list_matches, get_match, update_match, list_notes, get_note, create_note.
list_*/search_candidates take qualifier. One page per call: page from 0, page_size max 100, rejected above that, not clamped.errors[] array or a missing result raises even on HTTP 200.UNAUTHENTICATED on the top-level field), which Carerix rejects before they run).Production ATS writes — pilot one record, confirm, then bulk. Carerix documents no idempotency key for creates, so never blind-retry one. Required fields, the duplicate-detection key and status ids are tenant-specific.
ATS write target: enriched candidates → create_candidate.
Call via the CLI: hyreflow tools execute carerix <method> --payload '{...}' (preview with --dry-run; hyreflow tools get carerix <method> returns the live contract + cost). Base: https://api.carerix.io/graphql/v1/graphql. Only the methods listed below are callable.
batch(method: str, calls: list, *, stop_on_error: bool = False) -> dict — Batched get/update/create: run one method over many inputs, rate-limited.create_candidate(payload: dict, *, dedupe: bool = True) -> dict — POST /graphql/v1/graphql — crEmployeeCreate: create a candidate (CREmployeeRequest, e.g. {"firstName", "lastName", "emailAddress"}).create_candidates_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /graphql/v1/graphql — crEmployeeCreate: create many candidates sequentially and rate-limited, each with Carerix's duplicate detection on (its match key is tenant-specific: search first).create_note(payload: dict) -> dict — POST /graphql/v1/graphql — crToDoCreate: add a note to a candidate, vacancy, match, company or contact.get_candidate(candidate_id: str) -> dict — POST /graphql/v1/graphql — crEmployee: one candidate by id.get_company(company_id: str) -> dict — POST /graphql/v1/graphql — crCompany: one company by id.get_contact(contact_id: str) -> dict — POST /graphql/v1/graphql — crContact: one contact by id.get_match(match_id: str) -> dict — POST /graphql/v1/graphql — crMatch: one match by id.get_note(note_id: str) -> dict — POST /graphql/v1/graphql — crNote: one note by id.get_vacancy(vacancy_id: str) -> dict — POST /graphql/v1/graphql — crVacancy: one vacancy by id.list_candidates(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crEmployeePage: one page of candidates (CREmployee), oldest first. qualifier is Carerix's filter string.list_companies(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crCompanyPage: one page of client companies (CRCompany), oldest first.list_contacts(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crContactPage: one page of client contacts (CRUser), oldest first.list_matches(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crMatchPage: one page of matches (CRMatch), the candidate-to-vacancy links that carry the pipeline status.list_notes(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crNotePage: one page of notes (a note is a CRToDo), oldest first.list_vacancies(qualifier: str | None = None, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crVacancyPage: one page of vacancies (CRVacancy), oldest first.ping() -> dict — POST /graphql/v1/graphql — crEmployeePage: free read, one row count. Verifies the credentials, tenant and candidate read access (the BYOK probe).search_candidates(qualifier: str, page: int = 0, page_size: int = 100) -> list[dict] — POST /graphql/v1/graphql — crEmployeePage: one page of candidates matching a required qualifier, e.g. emailAddress = '[email protected]'.update_match(match_id: str, payload: dict) -> dict — POST /graphql/v1/graphql — crMatchUpdate: update a match's notes or move its pipeline status.