Skip to content

Connect Recruitee to AI Agents: Sync Hiring Feedback and Offer Notes

Learn how to connect Recruitee to AI agents using Truto's /tools endpoint. Fetch tools, handle multi-step hiring workflows, and bind them to your LLM.

Uday Gajavalli Uday Gajavalli · · 9 min read
Connect Recruitee to AI Agents: Sync Hiring Feedback and Offer Notes

You want to connect Recruitee to an AI agent so your system can read interview results, synthesize candidate feedback, audit offer notes, and track internal hiring operations autonomously. Here is exactly how to do it using Truto's /tools endpoint and SDK, bypassing the need to build and maintain a custom integration from scratch.

The industry is shifting from basic conversational chatbots to agentic AI - autonomous systems capable of executing multi-step workflows across your entire B2B SaaS stack. Giving an agent access to your Applicant Tracking System (ATS) unlocks massive operational leverage. If your team uses ChatGPT, check out our guide on connecting Recruitee to ChatGPT, or if you are building on Anthropic's models, read our guide on connecting Recruitee to Claude. For developers building custom autonomous workflows across LLM frameworks, you need a programmatic way to fetch Recruitee API tools and bind them natively to your agent's reasoning loop. You can read more about the underlying architecture required for this in our guide on Architecting AI Agents: LangGraph, LangChain, and the SaaS Integration Bottleneck.

Giving a Large Language Model (LLM) read and write access to your Recruitee instance is an engineering headache. You either spend weeks reading API documentation, dealing with authentication lifecycles, and managing schemas, or you use a managed proxy layer that generates AI-ready tools on the fly.

This guide breaks down exactly how to fetch Recruitee tools, handle API limits correctly, bind tools natively to an LLM using LangChain (or any framework like LangGraph, CrewAI, or Vercel AI SDK), and execute complex talent acquisition workflows.

The Engineering Reality of Custom Recruitee Connectors

Building AI agents is easy. Connecting them reliably to external SaaS APIs in production is where development grinds to a halt. For a deeper look at the technical challenges involved in these connections, read our 2026 ATS integration architecture strategy guide.

Giving an LLM access to external data sounds simple in a prototype: you write a Node.js function that makes an HTTP request and wrap it in an @tool decorator. In a production environment, this approach collapses entirely. If you decide to build a custom integration for Recruitee, you own the entire API lifecycle. You must write and maintain JSON schemas for every endpoint, handle complex pagination logic, and deal with token refreshes.

Recruitee's API introduces several specific integration challenges that break standard REST CRUD assumptions:

The Multi-Entity Evaluation Matrix

Recruitee is a highly relational ATS. Standard AI agents assume data exists in flat structures - like asking for a "candidate profile." In Recruitee, an interview result is not just a text field on a candidate object. It is a nested entity linked to an evaluation form, an admin (the interviewer), a candidate ID, and a specific pipeline stage. If an LLM just searches for "candidate notes," it misses structured interview scorecards entirely unless tools are explicitly defined to query those specific relational edges. Exposing this correctly requires strict schema definitions that guide the LLM to query the right relational IDs.

Mandatory Company Context

Almost all high-value Recruitee endpoints require a company_id parameter to scope the request. Because Recruitee supports multi-company and agency setups, hitting an endpoint without this context results in errors. General-purpose LLMs notoriously hallucinate ID parameters or attempt to query globally. Your tool schema must strictly enforce company_id as a required parameter, forcing the agent to retrieve it first or injecting it automatically into the agent's context window.

Rate Limits and 429 Errors

Recruitee enforces strict rate limits to protect its infrastructure. If your AI agent gets stuck in a loop or attempts to summarize notes for 500 candidates simultaneously, Recruitee will return an HTTP 429 Too Many Requests error.

It is critical to understand how Truto handles this: Truto does not retry, throttle, or apply backoff on rate limit errors. When an upstream API like Recruitee returns HTTP 429, Truto passes that error directly to the caller. What Truto does is normalize the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. The caller - your agent's execution loop - is completely responsible for reading these headers and implementing retry and exponential backoff logic. Do not build an agent assuming the integration layer will magically absorb excessive request volumes.

Generating AI-Ready Recruitee Tools

Instead of manually coding wrappers around the Recruitee API, Truto maps the underlying API into standard Proxy APIs and provides a /tools endpoint. When you connect a Recruitee account via Truto, this endpoint inspects the available resources and returns comprehensive JSON schemas describing each available method. These schemas are immediately consumable by LLM frameworks, which is why Truto is often cited as one of the best unified APIs for LLM function calling.

Here are the highest-leverage Recruitee tools you can expose to your AI agents to automate talent operations.

Retrieve Interview Results

Tool Name: list_all_recruitee_interview_results

To make informed hiring decisions, an agent needs access to the raw evaluations submitted by the hiring panel. This tool retrieves all interview results within a specific company context. It returns crucial details including the candidate_id, admin_id (who conducted the interview), the kind of evaluation, and the specific evaluation data (scorecards, strengths, and weaknesses).

"Fetch all interview results for candidate ID 84729 in company 1092. Extract the interviewer IDs and summarize the overall technical evaluation scores across all rounds."

Extract Candidate Notes

Tool Name: list_all_recruitee_notes

Informal communication, back-channel references, and recruiter screens often live in the candidate notes rather than structured evaluations. This tool targets a specific candidate and pulls an array of chronological notes. It returns the admin_id of the author, the note body, creation timestamps, attached files, and visibility settings, allowing the agent to reconstruct the entire narrative of a candidate's journey.

"Retrieve all notes for candidate ID 99182. Summarize any mentions of salary expectations or relocation concerns left by the recruiting team."

Audit Offer Negotiations

Tool Name: list_all_recruitee_offer_notes

Offer generation is the most sensitive part of the hiring funnel. Offer notes contain critical alignment data, compensation adjustments, and approval chains. This tool requires both the company_id and the specific offer_id. It returns nested data including text, visibility restrictions, and threaded replies. Agents can use this to verify if an offer was adjusted based on a counter-offer or if specific terms were approved by finance.

"Get the offer notes for offer ID 4410. Check the nested replies to see if the VP of Engineering approved the equity bump requested on Tuesday."

Map Office Locations and Requisitions

Tool Name: list_all_recruitee_locations

For distributed teams, capacity planning requires understanding where roles are open. This tool lists all configured locations for a company, returning full addresses, state codes, and valuable metadata like active_offers_count and active_requisitions_count. An agent can use this to cross-reference hiring velocity against specific geographic offices.

"List all company locations. Identify which European office has the highest number of active requisitions and active offers currently open."

Audit System Admins and Roles

Tool Name: list_all_recruitee_admins

When summarizing feedback or assigning tasks, agents need to resolve internal user IDs to actual human names and roles. This tool lists all admins in the Recruitee instance. It returns the id, name, email, and role of each internal user, acting as a critical lookup table for the LLM to format human-readable reports.

"Fetch the list of admins in the system. Map the admin IDs found in the recent interview results to their actual names and email addresses for the final debrief report."

To view the complete inventory of available resources, schemas, and endpoints you can expose to your agents, visit the Recruitee integration page.

Workflows in Action

By chaining these specific tools together, an AI agent transitions from a simple data retriever to an active participant in your talent operations.

Scenario 1: The Pre-Offer Debrief Summarizer

Before extending an offer, hiring managers must review a fragmented trail of scorecards, casual notes, and recruiter updates. An AI agent can compile a definitive debrief instantly.

"Generate a final debrief for candidate 5541. Pull all their interview results, compile any general candidate notes left by the recruiting team, and resolve the interviewer IDs to their actual names so I know who said what."

  1. The agent calls list_all_recruitee_interview_results filtered by the target candidate ID to grab structured technical scores.
  2. The agent calls list_all_recruitee_notes to fetch informal recruiter check-ins and salary expectations.
  3. Recognizing it only has admin_id numbers, the agent calls list_all_recruitee_admins to build an identity map.
  4. The LLM synthesizes the data, replacing IDs with names, and outputs a formatted Markdown report highlighting consensus areas and potential red flags.

Scenario 2: Pipeline Capacity Audit

Talent leaders need to understand hiring distribution across regions to allocate recruiting resources effectively.

"Audit our global hiring capacity. Pull all office locations and their active requisitions. Then, check the current admins in the system to see who is assigned the 'Recruiter' role so we can balance the workload."

  1. The agent calls list_all_recruitee_locations and extracts the city, country_code, and active_requisitions_count for each entry.
  2. The agent calls list_all_recruitee_admins and filters the response to isolate users with the specific recruiter role.
  3. The agent calculates the ratio of open requisitions per location against the available recruiting headcount, outputting a capacity warning if a specific region is under-resourced.

Building Multi-Step Workflows

To execute these complex workflows, your agent needs an execution loop capable of handling tool responses, tracking context, and crucially - managing rate limits.

Using the @trutohq/truto-langchainjs-toolset SDK, you can dynamically fetch Recruitee tools and bind them to your model. Because Truto passes HTTP 429 errors directly to the caller, your agent execution code must be wrapped in a mechanism that respects the ratelimit-reset header.

Here is a conceptual architecture using TypeScript and LangChain:

import { ChatOpenAI } from "@langchain/openai";
import { TrutoToolManager } from "@trutohq/truto-langchainjs-toolset";
import { AgentExecutor, createOpenAIToolsAgent } from "langchain/agents";
import {
  ChatPromptTemplate,
  MessagesPlaceholder,
} from "@langchain/core/prompts";
 
// 1. Initialize the Truto Tool Manager with your tenant's API key
const toolManager = new TrutoToolManager({
  apiKey: process.env.TRUTO_API_KEY,
});
 
async function runRecruiteeAgent() {
  // 2. Fetch AI-ready tools for a specific Recruitee connected account
  const tools = await toolManager.getTools("recruitee_account_id_123");
 
  // 3. Initialize your LLM
  const model = new ChatOpenAI({
    modelName: "gpt-4o",
    temperature: 0,
  });
 
  // 4. Bind the Recruitee tools to the LLM
  const modelWithTools = model.bindTools(tools);
 
  // 5. Define the prompt architecture
  const prompt = ChatPromptTemplate.fromMessages([
    ["system", "You are a senior Talent Acquisition Operations assistant. Always ensure you have a company_id before making Recruitee API calls. If an API call fails due to a rate limit, gracefully inform the user or wait."],
    ["human", "{input}"],
    new MessagesPlaceholder("agent_scratchpad"),
  ]);
 
  // 6. Create the agent and executor
  const agent = await createOpenAIToolsAgent({
    llm: modelWithTools,
    tools,
    prompt,
  });
 
  const executor = new AgentExecutor({
    agent,
    tools,
    // We handle custom error parsing in the execution loop
    handleParsingErrors: true,
  });
 
  // 7. Execute the multi-step workflow with a basic rate-limit awareness wrapper
  try {
    const result = await executor.invoke({
      input: "Fetch all interview results for candidate 84729 in company 1092, then get the admin list to map their names."
    });
    console.log(result.output);
  } catch (error) {
    // STRICT REQUIREMENT: The caller must handle HTTP 429 limits.
    // Truto normalizes the headers but passes the error through.
    if (error.status === 429) {
      const resetTime = error.headers?.get('ratelimit-reset');
      console.warn(`Rate limit hit. Truto passed the 429. Reset at: ${resetTime}`);
      // Implement your application-specific backoff logic here (e.g., sleep and retry)
    } else {
      console.error("Agent execution failed:", error);
    }
  }
}
 
runRecruiteeAgent();

In this execution loop, the LLM takes the user prompt, determines it needs to call list_all_recruitee_interview_results, parses the required company_id from the prompt, executes the tool, evaluates the response, and automatically follows up by calling list_all_recruitee_admins. If the ATS is experiencing high load, the catch block correctly identifies the 429 error and extracts Truto's standardized ratelimit-reset header, allowing the system to pause rather than crashing.

The Future of Hiring Integrations

Building integrations by hardcoding static routes is an obsolete pattern. By utilizing a managed integration layer that normalizes schemas and automatically generates tool definitions, your engineering team can focus entirely on prompt engineering, deterministic evaluation, and workflow design.

Connecting Recruitee via Truto's /tools endpoint transforms a static ATS into an active intelligence layer. Your agents can read scorecards, evaluate offer margins, map internal resources, and write context back into candidate profiles natively, all while relying on standardized IETF rate limit headers to execute safely at scale.

FAQ

How do AI agents handle Recruitee API rate limits?
Truto does not automatically retry or absorb rate limit errors. When Recruitee returns an HTTP 429, Truto passes the error to the caller and normalizes the rate limit info into standard headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). Your agent's execution loop is responsible for retry and backoff.
Can I use these Recruitee tools with LangGraph or CrewAI?
Yes. Truto's /tools endpoint returns standard JSON schemas for every Recruitee method. These can be consumed by any modern LLM framework, including LangChain, LangGraph, CrewAI, and the Vercel AI SDK, allowing framework-agnostic workflow creation.
Do I need to manually define JSON schemas for Recruitee endpoints?
No. Truto inspects the available API resources and dynamically generates the AI-ready tool schemas (including descriptions and required parameters like company_id) directly via the API.

More from our Blog