Refolk
DevelopersReference

Hiring pipeline

View as Markdown

Roles, 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.

  1. 01Describe them

    One plain sentence. Role, city, stack, stage, whatever matters to you.

  2. 02I read the web live

    GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.

  3. 03You read the shortlist

    Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.

  • 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.