Read/write TrackerRMS (recruiting ATS/CRM) via its v1 API — search/get/create/update resources (candidates), opportunities (jobs), clients (companies) and contacts, plus shortlists, longlists and activities. Use when the user mentions TrackerRMS or Tracker, pushing candidates into the ATS, or reading jobs/companies. Keys: self-serve OAuth — paste the client secret Tracker support issues + pick the region, then Connect.
TrackerRMS is a recruiting CRM, and one of the 54 tools hyreflow connects to Claude, ChatGPT and other AI assistants. Through hyreflow, an AI agent can run 37 actions: 19 that look something up and 18 that create or change records. TrackerRMS costs no hyreflow credits, and runs on your own TrackerRMS account.
Through hyreflow, an AI agent can run 37 TrackerRMS actions: 19 that look something up and 18 that create or change records. TrackerRMS costs no hyreflow credits, and runs on your own TrackerRMS account.
| TrackerRMS action | What it does | Cost through hyreflow |
|---|---|---|
| Search activities | Looks something up | no hyreflow credits |
| Search clients | Looks something up | no hyreflow credits |
| Search contacts | Looks something up | no hyreflow credits |
| Search opportunities | Looks something up | no hyreflow credits |
| Search opportunities paged | Looks something up | no hyreflow credits |
| Search opportunity resources | Looks something up | no hyreflow credits |
| Search resources | Looks something up | no hyreflow credits |
| Search resources paged | Looks something up | no hyreflow credits |
| Search users | Looks something up | no hyreflow credits |
| Add to longlist | Creates or changes a record | no hyreflow credits |
| TrackerRMS action | What it does | Cost through hyreflow |
|---|---|---|
| Create activity | Creates or changes a record | no hyreflow credits |
| Create client | Creates or changes a record | no hyreflow credits |
| Create clients batch | Creates or changes a record | no hyreflow credits |
| Create contact | Creates or changes a record | no hyreflow credits |
| Create contacts batch | Creates or changes a record | no hyreflow credits |
| Create opportunities batch | Creates or changes a record | no hyreflow credits |
| Create opportunity | Creates or changes a record | no hyreflow credits |
| Create resource | Creates or changes a record | no hyreflow credits |
| Create resource from resume | Creates or changes a record | no hyreflow credits |
| Create resources batch | Creates or changes a record | no hyreflow credits |
| Publish opportunity | Creates or changes a record | no hyreflow credits |
| Shortlist resource | Creates or changes a record | no hyreflow credits |
| Update client | Creates or changes a record | no hyreflow credits |
| Update contact | Creates or changes a record | no hyreflow credits |
| Update opportunity | Creates or changes a record | no hyreflow credits |
| Update opportunity resource | Creates or changes a record | no hyreflow credits |
| Update resource | Creates or changes a record | no hyreflow credits |
| Get client | Looks something up | no hyreflow credits |
| Get contact | Looks something up | no hyreflow credits |
| Get metadata | Looks something up | no hyreflow credits |
| Get opportunity | Looks something up | no hyreflow credits |
| Get opportunity applicants | Looks something up | no hyreflow credits |
| Get opportunity longlist | Looks something up | no hyreflow credits |
| Get opportunity resource | Looks something up | no hyreflow credits |
| Get resource | Looks something up | no hyreflow credits |
| Get resource skills | Looks something up | no hyreflow credits |
| Get shortlist | 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.
One hyreflow skill calls TrackerRMS as part of the run. A skill is a whole pipeline your agent already knows, end to end.
hyreflow ships a written playbook for TrackerRMS, 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 TrackerRMS docs →HOW in lib/trackerrms.py.
https://evoglapi.tracker-rms.com (global; the OAuth hosts are regional — evoapius / evoapica / evoapi.tracker-rms.com)./oauth2/authorize → /oauth2/token, client_id EvoApi_1.0, secret issued by Tracker support) is exchanged for a short-lived API JWT via POST /api/Auth/ExchangeToken, and the JWT goes in Authorization: Bearer <jwt> on every call. Access tokens auto-refresh; a dead token triggers one fresh-token + re-exchange.TRACKERRMS_ACCESS_TOKEN, optionally TRACKERRMS_JWT and TRACKERRMS_BASE_URL. Never hardcode. A connected workspace never reads env.Resource = candidate, Opportunity = job, Client = company, Contact = person at a client, OpportunityResource = shortlist entry / placement.
Resources (candidates): search_resources, search_resources_paged, get_resource, create_resource, update_resource, create_resource_from_resume, get_resource_skills.
Opportunities (jobs): search_opportunities, search_opportunities_paged, get_opportunity, create_opportunity, update_opportunity, publish_opportunity, get_opportunity_applicants, get_opportunity_longlist, add_to_longlist.
Clients (companies): search_clients, get_client, create_client, update_client.
Contacts (people at a client): search_contacts, get_contact, create_contact, update_contact.
Shortlists/placements: shortlist_resource, search_opportunity_resources, get_opportunity_resource, update_opportunity_resource, get_shortlist.
Activities/metadata/users: create_activity, search_activities, get_metadata, search_users.
search_resources/search_opportunities/search_clients/search_contacts/search_activities/search_users all POST a payload object.maxResults/pageNumber are rejected, not clamped: they must be positive integers or the call errors before any request is sent.publish_opportunity has no dedicated endpoint — Tracker advertises a job online by PATCHing the opportunity's advertDetails block (publishOnline: true, advertStatus: "A").get_metadata is the free read that resolves the status/type/source/team ids a write needs first — call it before a create/update that references one of those ids.Production ATS writes — pilot one, confirm, then bulk. TrackerRMS documents no idempotency key, so never blind-retry a create — a timeout or unclassifiable response may already have landed. A 401 is different: it means Tracker REJECTED the request, so nothing landed upstream, which is why the adapter can safely re-exchange the JWT and re-issue the call once, for any verb.
ATS write target: enriched candidates → create_resource.
Call via the CLI: hyreflow tools execute trackerrms <method> --payload '{...}' (preview with --dry-run; hyreflow tools get trackerrms <method> returns the live contract + cost). Only the methods listed below are callable.
add_to_longlist(payload: dict) -> Any — POST /api/v1/Opportunity/Longlist — add candidates to a job's longlist.{"resourceId":5501,"opportunityId":4821}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_resource(id, payload). Destructive methods (delete) are refused. See lib/_base.run_ops.create_activity(payload: dict) -> Any — POST /api/v1/Activity — log an activity.{"subject":"Intro call with Acme","note":"Discussed the Senior Platform Engineer role.","activityType":{"id":3,"name":"Call"},"contactDirection":"Outbound","dueDateTime":"2026-09-20T14:00:00Z"}create_client(payload: dict) -> Any — POST /api/v1/Client — create a company.{"name":"Acme Corp","website":"acme.example.com","contactDetails":{"telephone":"+1-555-0101"},"status":{"id":1,"name":"Active"},"sectors":[{"id":12,"name":"Technology"}]}create_clients_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /api/v1/Client for many records, paced by the 600 rpm limiter.create_contact(payload: dict) -> Any — POST /api/v1/Contact — create a client contact.{"firstName":"Grace","surname":"Hopper","jobTitle":"VP Engineering","client":{"id":4821,"name":"Acme Corp"},"contactDetails":{"email":"[email protected]"},"isPrimary":true}create_contacts_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /api/v1/Contact for many records, paced by the 600 rpm limiter.create_opportunities_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /api/v1/Opportunity for many records, paced by the 600 rpm limiter.create_opportunity(payload: dict) -> Any — POST /api/v1/Opportunity — create a job.{"name":"Senior Platform Engineer","description":"Own the deployment platform for Acme's core product.","client":{"id":4821,"name":"Acme Corp"},"status":{"id":2,"name":"Live"},"numberOfPositions":1,"advertDetails":{"publishOnline":true,"advertStatus":"A","title":"Senior Platform Engineer","location":"Remote (US)"}}create_resource(payload: dict) -> Any — POST /api/v1/Resource — create a candidate.{"firstName":"Ada","surname":"Lovelace","jobTitle":"Platform Engineer","contactDetails":{"email":"[email protected]","mobilePhone":"+1-555-0100"},"status":{"id":1,"name":"Registered"},"availableForWork":true,"sectors":[{"id":12,"name":"Technology"}]}create_resource_from_resume(payload: dict) -> Any — POST /api/v1/Resource/CreateFromResume — create a candidate by parsing an uploaded resume.{"fileName":"ada-lovelace-resume.pdf","fileData":"<base64-encoded file contents>","resourceSource":"Career site"}create_resources_batch(payloads: list[dict], *, stop_on_error: bool = False) -> dict — POST /api/v1/Resource for many records, paced by the 600 rpm limiter.get_client(client_id: Any) -> Any — GET /api/v1/Client/{Id} — a single company by id.get_contact(contact_id: Any) -> Any — GET /api/v1/Contact/{Id} — a single client contact by id.get_metadata() -> Any — GET /api/v1/MetaData — statuses, types, sources and teams for the calling user (the ids a write needs).get_opportunity(opportunity_id: Any) -> Any — GET /api/v1/Opportunity/{Id} — a single job by id.get_opportunity_applicants(opportunity_id: Any) -> Any — GET /api/v1/Opportunity/{Id}/Applicants — candidates who applied to a job.get_opportunity_longlist(opportunity_id: Any) -> Any — GET /api/v1/Opportunity/{Id}/Longlist — a job's longlist.get_opportunity_resource(opportunity_resource_id: Any) -> Any — GET /api/v1/OpportunityResource/{Id} — a single shortlist entry by id.get_resource(resource_id: Any) -> Any — GET /api/v1/Resource/{Id} — a single candidate by id.get_resource_skills(resource_id: Any) -> Any — GET /api/v1/Resource/{resourceId}/Skills — the skills recorded against a candidate.get_shortlist(opportunity_id: Any) -> Any — GET /api/v1/OpportunityResource/Shortlist/{opportunityId} — the shortlist for a job.publish_opportunity(opportunity_id: Any, advert: dict | None = None) -> Any — PATCH /api/v1/Opportunity/{Id} — advertise a job online.search_activities(payload: dict) -> Any — POST /api/v1/Activity/Search — search activities by a search DTO.{"resourceId":5501,"mustHaveResource":true,"maxResults":25}search_clients(payload: dict) -> Any — POST /api/v1/Client/Search — search companies by a search DTO.{"searchTerm":"Acme","maxResults":25}search_contacts(payload: dict) -> Any — POST /api/v1/Contact/Search — search client contacts by a search DTO.{"searchTerm":"Hopper","clientId":4821,"maxResults":25}search_opportunities(payload: dict) -> Any — POST /api/v1/Opportunity/Search — search jobs by a search DTO.{"searchTerm":"Platform Engineer","clientId":4821,"maxResults":25}search_opportunities_paged(payload: dict) -> Any — POST /api/v1/Opportunity/PagedSearch — paged search of jobs.{"searchTerm":"Platform Engineer","clientId":4821,"maxResults":25}search_opportunity_resources(payload: dict) -> Any — POST /api/v1/OpportunityResource/Search — search shortlist entries / placements.{"opportunityId":4821,"state":"Shortlisted","maxResults":25}search_resources(payload: dict) -> Any — POST /api/v1/Resource/Search — search candidates by a search DTO.{"searchTerm":"Lovelace","maxResults":25,"onlyMyRecords":false}search_resources_paged(payload: dict) -> Any — POST /api/v1/Resource/PagedSearch — paged search of candidates.{"searchTerm":"Lovelace","maxResults":25,"onlyMyRecords":false}search_users(payload: dict) -> Any — POST /api/v1/User/Search — search users by a search DTO.{"searchTerm":"Lovelace","maxResults":25}shortlist_resource(payload: dict) -> Any — POST /api/v1/OpportunityResource — add a candidate to a job's shortlist.{"resourceId":5501,"opportunityIds":[4821],"statusId":6,"note":"Strong technical fit."}update_client(client_id: Any, payload: dict) -> Any — PATCH /api/v1/Client/{Id} — partial update of a company.update_contact(contact_id: Any, payload: dict) -> Any — PATCH /api/v1/Contact/{Id} — partial update of a client contact.update_opportunity(opportunity_id: Any, payload: dict) -> Any — PATCH /api/v1/Opportunity/{Id} — partial update of a job.update_opportunity_resource(opportunity_resource_id: Any, payload: dict) -> Any — PATCH /api/v1/OpportunityResource/{Id} — partial update of a shortlist entry.update_resource(resource_id: Any, payload: dict) -> Any — PATCH /api/v1/Resource/{Id} — partial update of a candidate.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 TrackerRMS for you. hyreflow exposes 37 TrackerRMS actions this way.
Yes. TrackerRMS runs on your own TrackerRMS account. You connect it to hyreflow once, hyreflow charges no credits for the calls, and TrackerRMS bills you as before.
TrackerRMS costs no hyreflow credits, and runs on your own TrackerRMS account.
Add the hyreflow MCP server to your assistant and sign in. hyreflow calls the TrackerRMS API directly and exposes its actions as tools the assistant can run, so there is no separate TrackerRMS 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.