CONNECT APP
Build with Lever
Human Resources
- OAuth
MCP
Give your agent Lever tools
Every Lever action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Lever account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "lever",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Add Note:
const result = await mcp.callTool({
name: "lever-add-note",
arguments: {
opportunityId: "Opportunity ID",
note: "Note",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "lever",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Add Note:
result = await session.call_tool("lever-add-note", {
"opportunityId": "Opportunity ID",
"note": "Note",
})API PROXY
Call the Lever API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Lever API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.lever.co/v1/users",
})
// Any allowed Lever endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.lever.co/v1/users
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkubGV2ZXIuY28vdjEvdXNlcnM?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Lever actions from your backend
Connect a user's Lever account once, then run Add Note on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "lever-add-note",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
lever: { authProvisionId: "apn_xxxxxxx" },
opportunityId: "Opportunity ID",
note: "Note",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="lever-add-note",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"lever": {"authProvisionId": "apn_xxxxxxx"},
"opportunityId": "Opportunity ID",
"note": "Note",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "lever-add-note",
"configured_props": {
"lever": { "authProvisionId": "apn_xxxxxxx" },
"opportunityId": "Opportunity ID",
"note": "Note"
}
}'TOOLS
Lever actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Add Note
actionAdds a note to an opportunity. Use this to record recruiter observations, interview impressions, or follow-up reminders on a candidate. Use List Opportunity Items (resource=notes) first to check existing notes and avoid duplicates. Set Secret to true to make the note visible only to admins and super admins. Example: call with opportunityId="<id>", note="Strong communicator; advancing to onsite.", performAs="<userId>" → adds the note and returns it. See the documentationWritev0.0.2 -
Archive Opportunity
actionArchives a candidate opportunity with a specified reason (hired or not hired). Use this when a hiring decision has been made — to mark a candidate as hired or to reject them. Use List Archive Reasons to find valid reason IDs (filter by typehiredornon-hired). Use Search Opportunities to find the opportunity ID. Archiving is reversible — candidates can be unarchived in the Lever UI. Example: call with opportunityId="<id>", reasonId="<reasonId>", performAs="<userId>" → archives the candidate (reversible in the Lever UI) and returns the updated opportunity. See the documentationWritev0.0.2 -
Create Interview
actionSchedules an interview for a candidate opportunity. Use this when asked to set up, book, or schedule an interview for a candidate.panel(Interview Panel UID),interviewers,date,duration, and Perform As are all required. Interviews can only be created on panels whereexternallyManaged == true.dateis a single Unix timestamp in milliseconds for when the interview occurs (e.g.1700000000000).durationis in minutes (e.g.60).interviewersis a comma-separated list of user IDs — each will be assigned to the interview. Use List Users to find user IDs. Use Search Opportunities to find the opportunity ID. Example: call with opportunityId="<id>", panelId="<panelId>" (from List Opportunity Items (resource=interviews)), interviewers="<userId>", date=1700000000000, duration=60, performAs="<userId>" → adds an interview to the panel and returns it. See the documentationWritev0.0.2 -
Create Opportunity
actionCreates a new opportunity (candidate + application) in Lever. Use this to add a new candidate to the pipeline, optionally applying them to a specific job posting. Use List Postings to find posting IDs, List Stages to find stage IDs, and List Users to find the recruiter user ID for Perform As. Perform As is required — it sets the opportunity creator and owner. If a candidate with the same email already exists, Lever will link the new opportunity to the existing contact rather than creating a duplicate. WARNING: only one posting UID may be specified per request. Example: to add Jane Doe as a referred candidate on a posting, call with performAs="<userId>", candidateName="Jane Doe", email="jane@example.com", postingId="<postingId>", origin="referred" → returns the created opportunity with itsid. See the documentationWritev0.0.2 -
Download Opportunity Files
actionDownloads one or more candidate documents — résumés/CVs, other attached files, and/or offer documents — and saves them to the local file system for use in a later step. Use this when asked to download, export, or retrieve the actual files (not just their metadata). Setresourcesto the document types to pull from:resumes(CVs/résumés),files(other attachments),offers(offer documents). You can select more than one to grab everything at once. By default it downloads all matching documents of the selected types for the opportunity; narrow the set withfileNameContains(case-insensitive name/extension filter) and/oritemIds(specific document ids from List Opportunity Items). Use Search Opportunities to find the opportunity ID. Each file is saved to the temporary directory; the action exportsfile_pathsand returns afilesarray (each withresource,id,name,file_path). Documents that fail to download are reported inerrorsrather than aborting the batch. Example: to get a candidate's CV and any other documents, call with opportunityId="<id>", resources=["resumes","files"] → downloads every résumé and file and exports their paths. Add fileNameContains=".pdf" to limit to PDFs. See the documentationWritev0.0.2 -
Get Opportunity
actionReturns full details for a single opportunity (candidate application) by ID. Use this after Search Opportunities when you need complete candidate data including contact info, stage, notes, and application history. Set expand to inline related objects:applicationsfor application records,stagefor the current stage name,ownerfor the assigned recruiter,contactfor full contact details. The opportunity ID comes from search results or from a webhook payload. Example: call with opportunityId="<id>", expand=["applications","stage"] → returns the full opportunity with the application and stage objects inlined. See the documentationRead-onlyv0.0.2 -
Get Posting
actionReturns full details for a single job posting by ID, including its complete job description. Use this to read a specific role's description, requirements, and closing text — the responsecontentobject holdsdescription/descriptionHtml,lists(e.g. requirements), andclosing/closingHtml, plussalaryDescription,salaryRange,categories(team, department, location, commitment, level),state, and applicationurls. Use List Postings to find posting IDs. Example: call with postingId="<id>" → returns the posting with its full job description undercontent.description. See the documentationRead-onlyv0.0.2 -
List Archive Reasons
actionReturns all archive reasons configured in the Lever account. Use this to find a reason ID before archiving a candidate with Archive Opportunity. Filter by type to get only hired reasons or only non-hired (rejection) reasons. Returns each reason's id, text, and type. Returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Example: call with type="non-hired" → returns rejection reasons each with id, text, and type; pass an id as the reason for Archive Opportunity. See the documentationRead-onlyv0.0.2 -
List Feedback Templates
actionReturns the feedback form templates configured in the Lever account, including each template's field definitions. Use this before Submit Feedback to resolve thebaseTemplateIdand the field IDs required forfieldValues— without it those IDs are unknown. Returns each template's id, text (name), and fields (each with an id, type, and prompt text). Returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Example: call with no arguments → returns templates like{ id: "<templateId>", text: "Onsite Interview", fields: [{ id: "<fieldId>", type: "score-system", text: "Overall" }] }; pass that template id asbaseTemplateIdand the field ids insidefieldValueswhen calling Submit Feedback. See the documentationRead-onlyv0.0.2 -
List Opportunity Items
actionReturns sub-records attached to a single opportunity (candidate): notes, feedback, interviews, resumes, files, or offers. Use this when asked about a candidate's notes, interview feedback/scorecards, scheduled interviews, resumes, attached files, or offer. Setresourceto choose which:notes(recruiter notes),feedback(interview scorecards — each with panel id, interviewer, and score),interviews(scheduled interviews — each with panel id, date, interviewers),resumes(parsed resumes — each with a resume id),files(other attached documents — each with file id, name, extension), oroffers(offer details). Use Search Opportunities to find the opportunity ID first. The panel IDs returned byinterviews/feedbackare used by Submit Feedback; theresumesresource returns each resume's parsed data inline (status, file info, and extracted fields). Fornotes,feedback,interviews, andoffersthis returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Gotcha:resumesandfilesare not paginated — Lever returns the full set in a single payload with nohasNext/nextcursor, andlimit/offsetare ignored, so do not expect cursor metadata for them. Example: to read a candidate's interview feedback, call with opportunityId="<id>", resource="feedback" → returns feedback records each with panel id, interviewer, score, and completed form fields. See the documentationRead-onlyv0.0.2 -
List Postings
actionReturns job postings from Lever, optionally filtered by state, team, or location. Use this to discover posting IDs before searching opportunities with Search Opportunities or creating a new candidate with Create Opportunity. Returns each posting's id, name, state, team, department, and location. Returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Example: to find published engineering roles, call with team="Engineering", state="published" → returns postings each with id, name, state, team, and location. See the documentationRead-onlyv0.0.2 -
List Stages
actionReturns all pipeline stages configured in the Lever account. Use this to resolve stage names to IDs before filtering candidates with Search Opportunities, moving a candidate with Update Opportunity Stage, or creating an opportunity at a specific stage. Returns each stage's id and text (display name). Returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Example: call with no arguments → returns stages like{ id: "lead-new", text: "New lead" }; pass a stage id to Update Opportunity Stage. See the documentationRead-onlyv0.0.2 -
List Users
actionReturns all users (recruiters, hiring managers, admins) in the Lever account. Use this to resolve team member names to user IDs before assigning ownership, filtering opportunities by owner, or setting the Perform As field on write operations. Returns each user's id, name, email, and access role. Returns one page (up tolimit); if the response'shasNextis true, pass itsnextvalue tooffsetto fetch the following page. Example: call with no arguments → returns users each with id, name, email, and access role; pass a user's id as Perform As on write actions. See the documentationRead-onlyv0.0.2 -
Search Opportunities
actionSearches and filters opportunities (candidate applications) in Lever. This is the primary tool for finding candidates — use it whenever asked to find, list, or filter candidates or applications. Supports filtering by job posting, pipeline stage, tag, origin, email, and archived status. Use List Postings to find posting IDs, List Stages to find stage IDs. The Lever API has no name or owner filter. To find a candidate by name, pass the name inemail: when the value isn't a valid email address this tool lists opportunities and matches them by name/email locally (it does not send an invalidemailto the API). The local name match sweeps up to the first several pages of results; if that cap is reached the$summarysays so and the responsenextcursor lets you continue. When the user says 'my candidates', note that the API does not support filtering by owner directly — search by posting or stage and identify relevant records from the results. Set expand to include related objects inline (e.g.stage,owner,contact) and avoid follow-up calls. Returns cursor-paginated results; use thenextfield in the response to fetch subsequent pages. Example: to find a candidate by email, call with email="jane@example.com" → exact match; to find by name, call with email="Jane Doe" → local name match. See the documentationRead-onlyv0.0.2 -
Submit Feedback
actionSubmits an interview feedback form (scorecard) for an opportunity. Use this after an interview to record the interviewer's assessment.baseTemplateIdis required — it identifies which feedback form template to submit against. Use List Feedback Templates to resolve the template id and its field IDs.panelandintervieware optional but linked: if you specify one, you must specify the other. Use List Opportunity Items (resource=interviews) to find panel and interview IDs. Use List Opportunity Items (resource=feedback) to check if feedback has already been submitted for this panel.fieldValuesis a JSON array of{"id": "<field_id>", "value": "<answer>"}objects; the field IDs and valid values come from the template returned by List Feedback Templates. Perform As is required — feedback is attributed to this user. Use List Users to find user IDs. Example: call with opportunityId="<id>", performAs="<userId>", baseTemplateId="<templateId>", fieldValues=[{"id": "<fieldId>", "value": "strong_yes"}]→ submits the scorecard and returns the created feedback record. See the documentationWritev0.0.2 -
Update Opportunity Stage
actionMoves a candidate to a different stage in the hiring pipeline. Use this when asked to advance, move, or update a candidate's stage. Use List Stages to find the target stage ID, and Search Opportunities to find the opportunity ID. Every stage change is logged in Lever's audit trail under the Perform As user. Example: call with opportunityId="<id>", stageId="<stageId>", performAs="<userId>" → moves the candidate to that stage and returns the updated opportunity. See the documentationWritev0.0.2
No Lever triggers are available yet.
- App slug
- lever
- Authentication
- OAuth
- Categories
- Human Resources
- Actions
- 16
- Triggers
- 0
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Lever OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- offline_access
- archive_reasons:read:admin
- feedback:read:admin
- feedback:write:admin
- files:read:admin
- files:write:admin
- interviews:read:admin
- interviews:write:admin
- notes:read:admin
- notes:write:admin
- offers:read:admin
- opportunities:read:admin
- opportunities:write:admin
- postings:read:admin
- postings:write:admin
- resumes:read:admin
- stages:read:admin
- uploads:write:admin
- users:read:admin
- feedback_templates:read:admin
- panels:write:admin