JOIN integration
JOIN (join.com) is a recruiting platform and applicant tracking system. With API v3 an agent can list, read, create, publish, update and archive jobs (with the contract types, employment types, pipeline templates and remote regions they use), list, read and create applications and move them through hiring stages, list, read and permanently delete candidates, read their interview scorecards, read, add and delete candidate notes, and manage company locations. Application documents and screening-answer files are listed by name and type only: their signed download links are not returned. Moving an application can send the stage's automated emails, and publishing a job ONLINE posts it to job boards. Authentication is a company API token (System Admins create up to 10 in Company Settings, Developer, API tokens; the company plan must include API access) sent as Authorization: Bearer. Limits: 600 requests per 60 seconds and 100 per 10 seconds per token.
Say what should happen.
The workflow builds itself.
What you can do with JOIN
Each of these is one operation on one endpoint, available both as a workflow step and as a tool an AI agent can call on its own. Nothing bundles several operations into one action, so what a run did stays readable afterwards.
Most endpoints run on the free plan. A few, mainly the ones that publish on your behalf, need a paid plan.
Location, 5 operations
create_locationCreate locationPOSTCreates a company location from an address (countryCode and city required; the postal code is validated against the country). isDefault true makes it the company default instead of the current one.delete_locationDelete locationDELETEDeletes a location. The company default (location_is_default) and a location used by active jobs (location_referenced_by_active_jobs) cannot be deleted. Returns no content.get_locationGet locationGETReturns one location by id (from list_locations) with its address, establishment id and whether it is the company default.list_locationsList locationsGETLists your company's locations (name, address, default flag), oldest first; filter by countryCode or partial city. Paginated: pass nextCursor as cursor until null. Use an id as locationId in create_job.update_locationUpdate locationPATCHChanges a location for real. Omitted fields stay unchanged, but a supplied address replaces the whole address. isDefault true makes it the default; isDefault false on the current default is refused.
Application, 4 operations
create_applicationCreate applicationPOSTCreates a real application on a job (jobId from list_jobs) for an existing candidateId or an inline candidate; pass exactly one of the two. It starts ACTIVE in the job's first review stage.get_applicationGet applicationGETReturns one application by id (from list_applications): candidate, status, current stage, documents (name and type only, no file links), screening answers and source.list_applicationsList applicationsGETLists your company's applications with candidate, current stage, documents (name and type, no file links) and screening answers; filter by job, candidate, status, stage type or dates. Paginated: pass nextCursor as cursor.update_applicationUpdate applicationPATCHSets, or clears with null, your own externalId reference on an application. Changes nothing else: to move the application through the hiring process use update_application_stage.
Job, 4 operations
create_jobCreate jobPOSTCreates and PUBLISHES a job for real: status ONLINE posts it to job boards, OFFLINE keeps it internal; both count toward the active-job limit. Needs title, HTML description, workLocation and contractTypeId.get_jobGet jobGETReturns one published job by id (from list_jobs) with its hiring stages and their ids, which update_application_stage needs. A draft, an unknown id or another company's job returns 404 job_not_found.list_jobsList jobsGETLists your company's published jobs (drafts excluded), oldest first unless sort=-createdAt; filters combine with AND. Paginated: pass nextCursor back as cursor until it is null. Each job carries its stages, location, contract and salary.update_jobUpdate jobPATCHChanges a published job for real (details, status or both). Omitted fields stay unchanged, but a supplied workLocation, compensation, applicationForm or hiringTeam replaces its old value in full. status ARCHIVED archives it.
Candidate, 3 operations
delete_candidateDelete candidateDELETEPERMANENTLY deletes a candidate with all their applications, notes and attachments; this cannot be undone. Meant for acting on a candidate's erasure request. Returns no content.get_candidateGet candidateGETReturns one candidate by id (from list_candidates): name, email, phone, country, tags, professional links, consent status (PENDING when JOIN has no consent record) and application summaries.list_candidatesList candidatesGETLists your company's candidates with their application summaries, archived ones included. q fuzzy-searches names and email (relevance order; never combine with sort). Paginated: pass nextCursor as cursor until null.
Note, 3 operations
create_candidate_noteCreate candidate notePOSTAdds a note to a candidate for real, visible to the whole company, with no individual author. At most 2,500 characters, never editable; a candidate with 50 notes refuses new ones (note_limit_reached).delete_candidate_noteDelete candidate noteDELETEDeletes a candidate note with its replies and reactions, whoever wrote it. Returns no content.list_candidate_notesList candidate notesGETLists a candidate's notes with their replies, oldest first, private notes included (isPrivate only limits recruiters inside JOIN). Paginated: pass nextCursor back as cursor until it is null.
Contract type, 1 operation
list_contract_typesList contract typesGETLists contract types with the limits they set on employment terms (duration, probation, vacation, weekly hours). Use an id as contractTypeId in create_job; pass countryCode for on-site or hybrid jobs. Not paginated.
Employment type, 1 operation
list_employment_typesList employment typesGETLists employment types (id, name, slug). Use a slug as employmentType in list_jobs. A job's employment type follows from its contract type. Not paginated.
Pipeline template, 1 operation
list_pipeline_templatesList pipeline templatesGETLists your pipeline templates with their ordered stages. Use an id as pipelineTemplateId in create_job. Paginated: pass nextCursor back as cursor until it is null.
Remote region, 1 operation
list_remote_regionsList remote regionsGETLists the regions available for remote jobs (id, name, code, countries). Use an id as remoteRegionId in create_job, update_job or list_jobs. Filter with countryCode or q. Not paginated.
Scorecard, 1 operation
list_scorecardsList scorecardsGETLists the published interview scorecards of one candidate (candidateId from list_candidates) across every job they applied to, withdrawn applications included: ratings, recommendation and answers. Not paginated.
Stage, 1 operation
update_application_stageUpdate application stagePUTMoves an application to a stage of its job for real (stageId from get_job stages). The stage can send automated emails to the candidate; a HIRED stage hires them. Rejected applications cannot be moved.
Use JOIN from Claude Code, Cursor or Codex
Connect JOIN in LiveContext, create an API key in Settings, then add the LiveContext MCP server to your client. Its JOIN operations become tools the client can call, next to every other integration you connected.
claude mcp add --transport http livecontext https://livecontext.ai/mcp --header "X-API-Key: YOUR_API_KEY"[mcp_servers.livecontext]
url = "https://livecontext.ai/mcp"
[mcp_servers.livecontext.http_headers]
"X-API-Key" = "YOUR_API_KEY"{
"mcpServers": {
"livecontext": {
"type": "http",
"url": "https://livecontext.ai/mcp",
"headers": {
"X-API-Key": "YOUR_API_KEY"
}
}
}
}How to connect JOIN
- Create your workspace
Sign up free. Nothing to install.
- Connect JOIN once
Add your JOIN connection in Settings. Every tool from this integration reuses it, and secrets are encrypted at rest and visible only to you.
- Describe the job in chat
The workflow builds itself in front of you and picks the endpoints it needs. Drag the steps yourself on the canvas whenever you would rather be explicit.
JOIN integration FAQ
What can you do with the JOIN integration?
LiveContext exposes 25 operations on JOIN, covering location, application, job and candidate.
