Authorization: Bearer <token>; every ATS route sits under /c/{company_id}. Things to know before you call:
- The company id is half the credential. A token belongs to one company, and the id is part of every path. Using a token for another company answers
401, so the plugin stores both and refuses to build a request without the id. - Tokens cannot be regenerated. Revoking one leaves you creating a new token and updating every integration, so a
401is terminal; the plugin never retries it. A token also carries its creator’s permissions, including removing that user from the company cutting their tokens off from it. - Three error shapes exist. The current one is
{ errors: [{ code, data, message }] }; the older ATS routes answer{ error, error_code }; and the host can answer a bare401with no body. The plugin reads whichever arrived. - Candidate search takes one
filters_jsonarray.candidates.listcalls/search/new/candidatesand builds that array fromquery,offer_id,stage,status,department_idandlocation_id. The route ignores plainqueryoroffsetparameters, and answers{ hits, total }. - Offer filters are arrays.
offers.listsendsstatuses[],department_ids[]andlocation_ids[]; Recruitee ignores a barestatusand returns every offer. - Creates and updates wrap the record. A candidate or offer goes in under a
candidateorofferkey, and a candidate’s offer assignments sit beside that key as anoffersarray rather than inside it. - Paging is
pageandlimit. Candidates, offers and locations returntotalandnext_page(null on the last page). Departments come back in one answer. - A new offer is a draft. The create and update routes take no status; publishing is a separate step in Recruitee. A job needs
description,requirementsand at least one oflocation_ids. - Drafts take no candidates.
candidates.createwith theoffer_idof a draft offer creates the candidate but places them nowhere, and Recruitee returns no error. Publish the offer first, or assign the candidate later. - A candidate delete is restorable for 7 days. Recruitee sets
deleted_ata week ahead and keeps the candidate in its deleted list until then. - Stages live on placements.
candidates.updateedits the profile; moving a candidate to another stage or disqualifying them happens on their placement for an offer, which this plugin does not cover yet. - Rate limit. 1000 requests per minute per token. Recruitee documents no
Retry-After, so a 429 is retried three times with backoff.
- 11 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
Search candidates on one offerWhat’s next
API reference
Every
recruitee.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.