Kini AI (Beta)
BETA — Let candidates apply to any job directly on your job board. You show the form, Kini delivers the application to the employer.
Beta — subject to change
Kini AI is in closed beta and is switched on per partner by your Kini contact.
What it does
A candidate finds a job on your job board and applies right there — no redirect to the employer's website.
- You tell us which job it is (the link to the employer's job ad).
- We read the employer's application form and give you its fields.
- You show those fields on your site. The candidate fills them in.
- You send us the application. We deliver it to the employer.
You do not need to set anything up with the employer. No ATS connection, no employer onboarding.
Two ways to start
Kini App
You add your customers and jobs in the Kini App. Kini keeps them up to date.
Good for: employers you work with regularly.
API
You send us the job link by API. No employer setup needed.
Good for: single or short-term bookings.
However a job reaches us, everything after that works the same way: you fetch the form fields, show them on your site, and send us the application.
Before you start
You need an API key from the Kini App. Send it with every request — see Authentication. You do not need the Company-Id header for Kini AI.
curl 'https://api.getkini.com/jobs/form_fields/?apply_url=https%3A%2F%2Fjobs.example.de%2Fstelle%2F2026-061' \
--header 'Authorization: Bearer YOUR_API_KEY'
How it works
Send us the job link
POST /jobs/form_fields/ — only needed on the API path. Skip this if the job was added in the Kini App or by your Kini contact.
Get the form fields
GET /jobs/form_fields/?apply_url=... — returns the fields of the employer's application form.
Show the form
Show the fields on your job board. The candidate fills them in.
Send the application
POST /applications/ — we deliver it to the employer and keep you updated.
Step 1: Send us the job link
Only needed on the API path.
curl -X POST 'https://api.getkini.com/jobs/form_fields/' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"apply_url": "https://jobs.example.de/stelle/2026-061",
"partner_job_id": "your-job-123"
}'
{
"apply_url": "https://jobs.example.de/stelle/2026-061",
"status": "processing"
}
The link to the employer's job ad or application form.
Your own ID for the job, so you can find it again.
We answer with 202 Accepted and start reading the employer's form. This usually takes a few seconds, sometimes a few minutes.
- Send it when the job is published on your board, not when a candidate clicks "apply". Then the form is ready in time.
- Sending the same link twice is fine. Nothing is duplicated.
Step 2: Get the form fields
curl 'https://api.getkini.com/jobs/form_fields/?apply_url=https%3A%2F%2Fjobs.example.de%2Fstelle%2F2026-061' \
--header 'Authorization: Bearer YOUR_API_KEY'
{
"job_id": 48211,
"status": "ready",
"apply_url": "https://jobs.example.de/stelle/2026-061",
"updated_at": "2026-09-22T07:10:00Z",
"application_form_fields": [
{ "id": "anrede", "label": "Anrede", "type": "select", "required": true,
"options": [ { "value": "Frau", "label": "Frau" }, { "value": "Herr", "label": "Herr" }, { "value": "Divers", "label": "Divers" } ] },
{ "id": "vorname", "label": "Vorname", "type": "text", "required": true },
{ "id": "email", "label": "E-Mail", "type": "email", "required": true },
{ "id": "lebenslauf", "label": "Lebenslauf", "type": "file", "required": true,
"accept": ["pdf"], "max_size_mb": 2 },
{ "id": "datenschutz_hinweis", "type": "info",
"text": "Es gelten unsere <a href="https://www.example.de/datenschutz/">Datenschutzhinweise</a>." },
{ "id": "datenschutz", "label": "Ich stimme der Verarbeitung meiner Daten zu.", "type": "consent",
"subtype": "application", "required": true }
]
}
What status means:
status | What to do |
|---|---|
ready | Show the form on your site |
processing | We are still reading the form. Show your normal "apply on the employer's site" button for now |
not_supported | We can't send applications to this employer's website. Show your normal "apply on the employer's site" button |
offline | The job is no longer online |
not_supported applies to the employer, not the single job: if we can't handle one of an employer's jobs, we can't handle the others either. This is usually because the employer's website blocks automated applications.
Fetch the form fields each time before you show the form. It is quick, and you always get the latest version if the employer changed something.
What each field type means, and how to show it: Form Fields.
Step 3: Show the form
Show the fields in the given order, with the employer's labels. Four rules:
- Show privacy text as it is. Show every
infofield unchanged, with its links. This is usually the employer's privacy notice. - Never tick consent. The candidate must tick consent boxes themselves. We never tick them either.
- Mark required fields. Don't let the candidate send the form without them.
- Only offer the given options. For choice fields, show exactly the options we give you.
Step 4: Send the application
Use the normal POST /applications/ endpoint.
{
"job": 48211,
"partner_application_id": "your-application-456",
"candidate": {
"first_name": "Maria",
"last_name": "Schneider",
"email": "maria.schneider@example.com"
},
"screening_questions": [
{ "id": "anrede", "answer": "Frau" },
{ "id": "vorname", "answer": "Maria" },
{ "id": "email", "answer": "maria.schneider@example.com" },
{ "id": "datenschutz", "answer": true }
],
"attachments": [
{ "id": "lebenslauf", "name": "lebenslauf.pdf", "content_type": "application/pdf", "data": "JVBERi0xLjQK..." }
]
}
{
"id": 8813204,
"job": 48211,
"partner_application_id": "your-application-456",
"sync_status": "NOTSENT"
}
The job_id from Step 2.
Your own ID for the application. With it, an application is never created twice — see Duplicate Applications.
The candidate's name and email address.
One entry per answer. Use the id of the form field as id, and put the answer into answer.
Files such as the CV, as Base64. Use the id of the file field, and respect its size limit.
That's it. We deliver the application to the employer in the background.
Checking the status
Choose what suits you — you can use all three:
We email you about applications, for example when one could not be delivered. Tell your Kini contact which address to use.
We call your server whenever the status of an application changes. Details: Application Sync Status Update.
GET /applications/{id} shows the current sync_status. Details: API Reference.
sync_status | Meaning |
|---|---|
NOTSENT | Not delivered yet — we are still working on it |
SUCCESS | Delivered to the employer |
SUCCESS_FALLBACK | Delivered to the employer another way, for example by email |
EXPECTED_FAILURE | Could not be delivered for a known reason, for example the job is closed or the candidate already applied |
FAILURE | Could not be delivered — our team is looking into it |
When something goes wrong
In the rare case that an application can't be delivered automatically:
- Our team checks it and fixes it — usually on the same working day. You don't need to send it again.
- If it still can't be delivered, we email you automatically so you can let the candidate know.
Questions? Write to tech@getkini.com.