Form Fields (Beta)
BETA — The field types you get from Kini AI, how to show them, and how to send the answers.
Beta — subject to change
Field types and properties can change without notice while the beta runs.
What a form field looks like
application_form_fields is a list, in the order the employer shows it. Every field has an id — you use it when you send the answer.
{
"id": "gehaltswunsch",
"label": "Gehaltsvorstellung (Jahresbruttogehalt)",
"type": "number",
"required": true,
"order": 12
}
Use it when you send the answer.
The employer's own label. Show it as it is, in German — please don't translate it.
What kind of field it is — see Field types.
The candidate must fill it in.
The choices, for select and multiselect. Show the label, send the value.
Extra text from the employer, if any.
For files: allowed file types and maximum size.
The field is only shown in certain cases — see Fields shown only sometimes.
Field types
type | Show as | Answer |
|---|---|---|
text | Single-line text box | Text |
textarea | Multi-line text box | Text |
email | Email box | Text |
tel | Phone box | Text |
number | Number box | Number |
date | Date picker | Date as YYYY-MM-DD |
select | Dropdown or radio buttons | One value |
multiselect | Checkboxes | A list of values |
checkbox | One checkbox | true or false |
file | File upload | Goes into attachments |
consent | Checkbox, never pre-ticked | true or false |
info | Text only, no input | Nothing to send |
Privacy notices and consent
Employers usually show a privacy notice and ask for consent. You get these as info and consent fields.
[
{ "id": "datenschutz_hinweis", "type": "info",
"text": "Es gelten unsere <a href="https://www.example.de/datenschutz/">Datenschutzhinweise</a>." },
{ "id": "datenschutz", "type": "consent", "subtype": "application", "required": true,
"label": "Ich stimme der Verarbeitung meiner Daten zu." },
{ "id": "bewerberpool", "type": "consent", "subtype": "talent_pool", "required": false,
"label": "Speicherung meiner Daten für den Bewerberpool" }
]
subtype tells you what the consent is for:
subtype | Meaning |
|---|---|
application | Processing the application — usually required |
talent_pool | Keeping the candidate's data for future jobs (Bewerberpool) — optional |
marketing | Newsletter or job alerts — optional |
other | Anything else — treat it as optional |
Your side — these rules matter for data protection (DSGVO):
- Show**
info**** text exactly as it is**, with working links. - Never pre-tick a consent box. The candidate ticks it, or not.
- Show every consent separately. Don't combine them into one box.
Our side:
- We never tick a consent box for the candidate.
- If the candidate says no to a required consent, we don't send the application. You will see
NOTSENT.
Fields shown only sometimes
Some fields only appear after a certain answer. Example: the name of the colleague who recommended you, only if "Mitarbeiterempfehlung" was chosen.
{
"id": "empfehlung_name",
"label": "Name des Mitarbeiters / der Mitarbeiterin",
"type": "text",
"required": false,
"visible_if": { "id": "referenzmedium", "value": "Mitarbeiterempfehlung" }
}
Show the field only when field referenzmedium has the answer Mitarbeiterempfehlung. If it's hidden, don't send an answer for it.
Sensitive questions
Some employers ask about disability (Schwerbehinderung), gender, nationality or health. These fields have "sensitive": true.
- Show them like any other field. The candidate decides whether to answer.
- We never answer them for the candidate.
Sending the answers
Answers go into screening_questions, files into attachments — both using the field id.
type | Example |
|---|---|
text, textarea, email, tel | { "id": "ort", "answer": "Pforzheim" } |
number | { "id": "gehaltswunsch", "answer": 54000 } |
date | { "id": "eintritt", "answer": "2026-11-01" } |
select | { "id": "anrede", "answer": "Frau" } |
multiselect | { "id": "schichten", "answer": ["frueh", "spaet"] } |
checkbox, consent | { "id": "datenschutz", "answer": true } |
file | In attachments: { "id": "lebenslauf", "name": "cv.pdf", "content_type": "application/pdf", "data": "JVBERi0xLjQK..." } |
If an answer doesn't fit its field — for example an option that doesn't exist — we reject the application with an error that names the field, so you can fix it right away.