Kini AIForm Fields (Beta)

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
}
idstring
Required

Use it when you send the answer.

labelstring
Required

The employer's own label. Show it as it is, in German — please don't translate it.

typestring
Required

What kind of field it is — see Field types.

requiredboolean
Required

The candidate must fill it in.

optionsarray

The choices, for select and multiselect. Show the label, send the value.

helpstring

Extra text from the employer, if any.

accept, max_size_mbarray, number

For files: allowed file types and maximum size.

visible_ifobject

The field is only shown in certain cases — see Fields shown only sometimes.

Field types

typeShow asAnswer
textSingle-line text boxText
textareaMulti-line text boxText
emailEmail boxText
telPhone boxText
numberNumber boxNumber
dateDate pickerDate as YYYY-MM-DD
selectDropdown or radio buttonsOne value
multiselectCheckboxesA list of values
checkboxOne checkboxtrue or false
fileFile uploadGoes into attachments
consentCheckbox, never pre-tickedtrue or false
infoText only, no inputNothing to send

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:

subtypeMeaning
applicationProcessing the application — usually required
talent_poolKeeping the candidate's data for future jobs (Bewerberpool) — optional
marketingNewsletter or job alerts — optional
otherAnything 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.

typeExample
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 }
fileIn 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.