Hiring pipeline
View as MarkdownRoles, stages and candidates over HTTP. Open a role, drop a search's people onto it, move them through stages and leave notes. Free.
The hiring pipeline is the board at /hire/pipeline: one per role, a column per stage, a card per person. Everything on it is reachable from code with the same key as the searches, and none of it costs a credit.
The usual job is a scheduled search whose results land on a role: run a filtered search, then post the people it returned straight to the role. Nobody already on the role is moved or duplicated, so the same script can run every morning.
Open a role
curl https://www.refolk.ai/api/v1/pipelines \
-H "Authorization: Bearer $REFOLK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Senior Backend Engineer", "company": "Acme", "template": "engineering"}'Templates: standard (Sourced, Contacted, Screen, Interview, Offer, Hired, Rejected); engineering (Sourced, Contacted, Recruiter screen, Technical, Onsite, Offer, Hired, Rejected); agency (Sourced, Contacted, Interested, Submitted to client, Client interview, Offer, Placed, Rejected); sales (Sourced, Contacted, Screen, Hiring manager, Role play, Final round, Offer, Hired, Rejected); simple (Sourced, Talking, Hired, Rejected).
Stages can be renamed and reordered on the board afterwards. Every stage has a
kind - open, hired or rejected - and that, not the name, is what
to branch on in code.
GET /api/v1/pipelines lists every role with a count per stage, and
GET /api/v1/pipelines/{roleId} returns one role's stages and every
candidate on it.
Add people
await fetch("https://www.refolk.ai/api/v1/pipelines/" + roleId + "/candidates", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.REFOLK_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ candidates: people, stage: "Sourced" }),
});A name or a linkedinUrl is enough for each person, and the people
the search endpoints return are accepted exactly as they come. Up to
200 a call. The response splits them into added and
existing: a person is the same person when their LinkedIn profile, GitHub
login or email matches someone already on the role.
Move, rate and note
PATCH /api/v1/candidates/{id} with {"stage": "onsite", "note": "Strong system design"}
moves somebody. stage takes a stage id or its name, and loose names work:
"rejected" finds the role's rejected column whatever it is called.
rating is 1 (strong no) to 4 (strong yes), 0 to clear.
POST /api/v1/candidates/{id}/notes with {"body": "..."} leaves a
note. Every change made through the API is marked as such on the candidate's
timeline, so the people working the board can tell a script from a colleague.
From an assistant
The MCP server has the same operations as tools, named
refolk_pipeline_*, and they take names rather than ids: "move Jane Doe to
onsite on the backend role" is one call.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.