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:
| Field | Description |
|---|---|
title | Public job title (e.g. "Verkoopadviseur Antwerpen") |
slug | URL-safe identifier used in your public careers URL |
department | Filterable grouping (e.g. "Sales", "Operations") |
location | City / region the role is based in |
type | full_time, part_time, contract, internship |
status | draft, open, or closed — only open vacancies are exposed publicly |
summary | Short blurb shown at the top of the public detail page |
responsibilities | Bullet list — one entry per item |
requirements | Bullet list — one entry per item |
publishedAt / closesAt | Optional schedule for going live and closing |
The status controls visibility:
draft— invisible to the public, useful while authoringopen— exposed via the public API and listed onGET /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:
- Confirmation to the applicant (
APPLICATION_RECEIVEDautomation trigger) - Internal notification (
APPLICATION_SUBMITTED_INTERNALautomation 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 field | Type | Notes |
|---|---|---|
data | JSON (ApplicationSubmissionDto) | See payload below |
cv | file | Required. PDF/DOC/DOCX, max 10 MB |
coverLetter | file | Optional. 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
| Permission | Grants |
|---|---|
READ_VACANCIES | Read vacancies in the admin UI |
MANAGE_VACANCIES | Create / edit / delete vacancies and update HR Settings |
READ_APPLICATIONS | View applications and download CV / cover letter |
MANAGE_APPLICATIONS | Update 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.