AlphaAlpha Docs
HR ModuleRecruiting

Recruiting

Manage vacancies, accept job applications via your public careers page, and triage candidates from the hiring inbox.

Alpha's recruiting tools let you publish open roles on your website, capture applications (with CV upload) through a public form, and triage candidates from an admin inbox inside Alpha.

The flow has three moving parts:

Vacancies

Vacancies are managed at HR → Vacancies. Each vacancy has:

FieldDescription
titlePublic job title (e.g. "Verkoopadviseur Antwerpen")
slugURL-safe identifier used in your public careers URL
departmentFilterable grouping (e.g. "Sales", "Operations")
locationCity / region the role is based in
typefull_time, part_time, contract, internship
statusdraft, open, or closed — only open vacancies are exposed publicly
summaryShort blurb shown at the top of the public detail page
responsibilitiesBullet list — one entry per item
requirementsBullet list — one entry per item
publishedAt / closesAtOptional schedule for going live and closing

The status controls visibility:

  • draft — invisible to the public, useful while authoring
  • open — exposed via the public API and listed on GET /public/vacancies/{tenantSlug}
  • closed — hidden from the public again, but historical applications stay attached

Hiring inbox

When an application lands, two emails go out automatically:

  1. Confirmation to the applicant (APPLICATION_RECEIVED automation trigger)
  2. Internal notification (APPLICATION_SUBMITTED_INTERNAL automation trigger), delivered to every user listed in your hiring inbox

Configure recipients at HR → Settings → Hiring inbox recipients. The multi-select lists every user inside your tenant; pick one or more people (typically the hiring manager + recruiter). The list is stored per-tenant in HrSettings.hiringNotificationUserIds.

If no recipients are configured, applications are still stored, but nobody receives a notification email — useful for a soft launch, but make sure you set recipients before going live.

Applications inbox

Submitted applications appear at HR → Applications with applicant name, email, phone, vacancy, and submission timestamp. Click any row to open the detail view, where you can:

  • Download the CV and (optional) cover letter
  • Update the status (new, reviewing, shortlisted, rejected, hired)
  • Add internal notes that only the hiring team can see

Each application also stores the UTM parameters and referrer URL it was submitted with, so you can attribute candidates to specific campaigns.

Public API for your website

Your website calls these endpoints — all routes are tenant-scoped via {tenantSlug} and require no authentication. Submissions are honeypotted and rate-limited per IP.

List open vacancies

GET /public/vacancies/{tenantSlug}

Returns every vacancy with status = open. Filter and render on your site as needed.

Get a single vacancy

GET /public/vacancies/{tenantSlug}/{slug}

Returns one vacancy by its slug. Use this for /vacatures/[slug] detail pages.

Submit an application

POST /public/applications/{tenantSlug}/submit
Content-Type: multipart/form-data
Form fieldTypeNotes
dataJSON (ApplicationSubmissionDto)See payload below
cvfileRequired. PDF/DOC/DOCX, max 10 MB
coverLetterfileOptional. PDF/DOC/DOCX, max 10 MB

ApplicationSubmissionDto:

{
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "jane@example.com",
  "phone": "+31 6 12345678",
  "message": "Optional message",
  "vacancySlug": "verkoopadviseur-antwerpen",
  "termsAccepted": true,
  "pageUrl": "https://example.com/vacatures/verkoopadviseur-antwerpen",
  "referrerUrl": "https://google.com",
  "utmSource": "google",
  "utmCampaign": "spring-hiring",
  "utmMedium": "cpc",
  "utmContent": "",
  "utmTerm": "",
  "website": ""
}

The website field is a honeypot — leave it empty. Submissions where it has a value are silently dropped. termsAccepted must be true.

Embed example

A minimal HTML form your site can use:

<form
  enctype="multipart/form-data"
  action="https://prod.alpha.kube.asrr.nl/api/v1/public/applications/your-tenant-slug/submit"
  method="POST"
>
  <input type="hidden" name="data" value='{"vacancySlug":"verkoopadviseur-antwerpen","termsAccepted":true,...}' />
  <input name="firstName" required />
  <input name="lastName" required />
  <input name="email" type="email" required />
  <input name="phone" />
  <input name="cv" type="file" accept=".pdf,.doc,.docx" required />
  <input name="coverLetter" type="file" accept=".pdf,.doc,.docx" />
  <button type="submit">Apply</button>
</form>

Submit data as a JSON string and the cv / coverLetter files as additional multipart parts — the backend parses ApplicationSubmissionDto from data and treats the file parts as attachments.

Permissions

PermissionGrants
READ_VACANCIESRead vacancies in the admin UI
MANAGE_VACANCIESCreate / edit / delete vacancies and update HR Settings
READ_APPLICATIONSView applications and download CV / cover letter
MANAGE_APPLICATIONSUpdate application status, notes, and delete applications

The default HR Manager role already has all four. Add them to other roles via Settings → Roles as needed.

On this page