Create Job Booking
Publish a job on one or more talent channels. job_bookings is an array, and each object is one booking. Every booking needs job, product, and provider_product. Use id and provider_product from List Products. You can also send job fields when the booking should differ from the job. The booking stores the fields you send, so include the job's current value for every field the booking should keep. company_billing_detail must be an active billing detail of this company. A job that already has an active booking on the same talent channel is rejected. Campaign products are rejected. The API key must belong to a user, and the transaction stores that user on auth_user_id. See Publish a Job Ad.
curl -X POST "https://api.getkini.com/job_bookings/" \
-H "Content-Type: application/json" \
-H "Company-Id: 1" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"company_billing_detail": 12,
"job_bookings": [
{
"job": 123456,
"product": 2526,
"provider_product": 2861,
"title": "Software Engineer (m/w/d)",
"city": "Berlin"
}
]
}'
import requests
import json
url = "https://api.getkini.com/job_bookings/"
headers = {
"Content-Type": "application/json",
"Company-Id": "1",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"company_billing_detail": 12,
"job_bookings": [
{
"job": 123456,
"product": 2526,
"provider_product": 2861,
"title": "Software Engineer (m/w/d)",
"city": "Berlin"
}
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.getkini.com/job_bookings/", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Company-Id": "1",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"company_billing_detail": 12,
"job_bookings": [
{
"job": 123456,
"product": 2526,
"provider_product": 2861,
"title": "Software Engineer (m/w/d)",
"city": "Berlin"
}
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"company_billing_detail": 12,
"job_bookings": [
{
"job": 123456,
"product": 2526,
"provider_product": 2861,
"title": "Software Engineer (m/w/d)",
"city": "Berlin"
}
]
}`)
req, err := http.NewRequest("POST", "https://api.getkini.com/job_bookings/", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Company-Id", "1")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.getkini.com/job_bookings/')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Company-Id'] = '1'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"company_billing_detail": 12,
"job_bookings": [
{
"job": 123456,
"product": 2526,
"provider_product": 2861,
"title": "Software Engineer (m/w/d)",
"city": "Berlin"
}
]
}'
response = http.request(request)
puts response.body
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"auth_user_id": "user_01HXYZ",
"company": 1,
"company_billing_detail": 12,
"total_price": 1299,
"total_list_price": 1399,
"created_at": "2026-07-21T06:03:12.447201Z",
"updated_at": "2026-07-21T06:03:12.447201Z",
"job_bookings": [
{
"id": 1,
"external_id": "EXT-123456",
"company": 1,
"title": "Software Engineer (m/w/d)",
"description": "Example job description. We are looking for a Software Engineer (m/w/d) to join our team in Berlin.",
"posting_url": "https://careers.example.com/jobs/123456",
"application_url": "https://careers.example.com/jobs/123456/apply",
"application_email": "jobs@example.com",
"status": "published",
"remote": "on-site",
"language": "en",
"category": "software_development",
"employment_type": "permanent",
"work_schedule": "full_time",
"senority": "mid_level",
"education": "Bachelor's degree",
"start_date": "2026-10-01",
"contract_limitation": "Unlimited contract",
"location_name": "Berlin, Germany",
"street": "Example Street 1",
"city": "Berlin",
"country": "Germany",
"postcode": "10115",
"longitude": 13.405,
"latitude": 52.52,
"salary": "50,000 – 65,000 € gross per year",
"salary_from": 50000,
"salary_to": 65000,
"salary_currency": "EUR",
"salary_frequency": "annual",
"contact_name": "Jane Doe",
"contact_email": "jane.doe@example.com",
"contact_title": "Head of HR",
"contact_phone": "+49 30 1234567",
"contact_salutation": "Frau",
"banner_image": "https://www.example.com/banner.jpg",
"screening_questions": [
{
"id": "sq-001",
"question": "Do you have a valid work permit for Germany?",
"answer_type": "boolean",
"required": true,
"options": [
{
"label": "Yes",
"value": "yes"
}
]
}
],
"application_form_fields": [
{
"id": "email",
"name": "email",
"label": "Email address",
"type": "email",
"subtype": null,
"required": true,
"order": 1,
"options": []
}
],
"description_sections": [
{
"id": "tasks",
"type": "tasks",
"order": 2,
"title": "Your tasks",
"content": "Example section content. Describe the responsibilities of the role here."
}
],
"custom_fields": {
"employer_name": "Example Company GmbH",
"employer_logo": "https://www.example.com/logo.png"
},
"raw_values": {
"employmentType": "FULL_TIME"
},
"import_source": "api",
"run_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"created_at": "2026-06-02T11:07:44.512038Z",
"updated_at": "2026-07-30T09:15:02.771604Z",
"last_content_update_at": "2026-07-30T09:15:02.771604Z",
"job": 123456,
"campaign": null,
"failure_error": null,
"transaction": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"provider_product": 2861,
"purchase_price": 430,
"purchase_list_price": 430,
"booking_reference_id": "IND-2026-0041287",
"booking_id": "0123456789abcdef",
"booking_url": "https://de.indeed.com/viewjob?jk=0123456789abcdef",
"booking_starts_at": "2026-07-21T06:03:12.447201Z",
"booking_expires_at": "2026-08-20T06:03:12.447201Z",
"statistics": {
"booking_clicks": 1284,
"booking_apply_clicks": 96
},
"product": {
"id": 2857,
"name": "Indeed.com Germany (Sponsored Job)",
"url": "http://de.indeed.com",
"list_price": 430,
"list_days": 30,
"max_jobs": null,
"refresh_interval_options": [
7,
14,
30
],
"statistics": {
"booking_expected_clicks": 1100,
"booking_apply_expected_clicks": 80
},
"rating": 98,
"required_fields": {},
"talent_channel": {
"id": 1,
"slug": "indeed",
"name": "Indeed",
"url": "https://de.indeed.com/",
"catalog_url": "https://de.indeed.com/hire/pricing",
"logo": "https://storage.googleapis.com/prod-product-logos/logos/indeedcom.com"
}
}
}
]
}
/job_bookings/
Target server for requests. Edit to use your own host.
Authenticate every request with an API key from the Kini Partner App, sent as Authorization: Bearer <your_api_key>.
Authorization: Bearer <your_api_key>.The media type of the request body
Kini ID of the company the key is associated with
Kini ID of an active billing detail for this company. The product is invoiced to this record.
One booking per object. job, product, and provider_product are required. Any other property is a job field. Send it when the booking should differ from the job. The booking stores the fields you send, so include the job's current value for every field the booking should keep.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Authenticate every request with an API key from the Kini Partner App, sent as Authorization: Bearer <your_api_key>.
Headers
Body
Kini ID of an active billing detail for this company. The product is invoiced to this record.
12One booking per object. job, product, and provider_product are required. Any other property is a job field. Send it when the booking should differ from the job. The booking stores the fields you send, so include the job's current value for every field the booking should keep.