Compose Company Integration
Configure the Company's integration in a single call: store the integration credentials, switch on the features the partner is entitled to, and optionally update the Company's own master data.
Which keys config accepts depends on the integration and on the partner's entitlements — unknown keys are rejected with 400. Use List Integration Fields to discover the field list of the integration you are wiring up.
Existing configuration for the same company and integration is overwritten, so the call is safe to repeat.
curl -X POST "https://api.getkini.com/companies/1/compose/" \
-H "Content-Type: application/json" \
-H "Company-Id: 1" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"integration": "personio",
"config": {
"credentials": {
"api_key": "papi-EXAMPLE-0123456789abcdef"
},
"ats_config": {
"company_id": "12345",
"subdomain": "example-company"
}
},
"company_data": {
"contact_email": "jane.doe@example.com",
"website": "https://www.example.com"
}
}'
import requests
import json
url = "https://api.getkini.com/companies/1/compose/"
headers = {
"Content-Type": "application/json",
"Company-Id": "1",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"integration": "personio",
"config": {
"credentials": {
"api_key": "papi-EXAMPLE-0123456789abcdef"
},
"ats_config": {
"company_id": "12345",
"subdomain": "example-company"
}
},
"company_data": {
"contact_email": "jane.doe@example.com",
"website": "https://www.example.com"
}
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.getkini.com/companies/1/compose/", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Company-Id": "1",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"integration": "personio",
"config": {
"credentials": {
"api_key": "papi-EXAMPLE-0123456789abcdef"
},
"ats_config": {
"company_id": "12345",
"subdomain": "example-company"
}
},
"company_data": {
"contact_email": "jane.doe@example.com",
"website": "https://www.example.com"
}
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"integration": "personio",
"config": {
"credentials": {
"api_key": "papi-EXAMPLE-0123456789abcdef"
},
"ats_config": {
"company_id": "12345",
"subdomain": "example-company"
}
},
"company_data": {
"contact_email": "jane.doe@example.com",
"website": "https://www.example.com"
}
}`)
req, err := http.NewRequest("POST", "https://api.getkini.com/companies/1/compose/", 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/companies/1/compose/')
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 = '{
"integration": "personio",
"config": {
"credentials": {
"api_key": "papi-EXAMPLE-0123456789abcdef"
},
"ats_config": {
"company_id": "12345",
"subdomain": "example-company"
}
},
"company_data": {
"contact_email": "jane.doe@example.com",
"website": "https://www.example.com"
}
}'
response = http.request(request)
puts response.body
{
"detail": "success"
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Forbidden",
"message": "You don't have permission to access this resource",
"code": 403
}
{
"error": "Not Found",
"message": "The requested resource was not found",
"code": 404
}
/companies/{id}/compose/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>.Unique Kini ID of the company
The media type of the request body
Kini ID of the company the key is associated with. Optional here — the company is already identified by the path parameter.
Slug of the integration to configure, e.g. personio or softgarden
Integration settings, keyed by the config_path values from List Integration Fields. Dotted paths may be sent flat ("credentials.api_key": "…") or nested ({"credentials": {"api_key": "…"}}) — both are accepted. Keys under credentials. are written to the secret store and never returned by the API; everything else is stored as plain configuration. Unknown keys are rejected with 400, and required fields differ per integration.
Optional partial update of the Company itself. Accepts the same fields as Update Company.
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\>.
Path Parameters
Headers
Kini ID of the company the key is associated with. Optional here — the company is already identified by the path parameter.
1Body
Slug of the integration to configure, e.g. personio or softgarden
personioIntegration settings, keyed by the config_path values from List Integration Fields. Dotted paths may be sent flat ("credentials.api_key": "…") or nested (\\{"credentials": \\{"api_key": "…"\\}\\}) — both are accepted. Keys under credentials. are written to the secret store and never returned by the API; everything else is stored as plain configuration. Unknown keys are rejected with 400, and required fields differ per integration.
{"credentials":{"api_key":"papi-EXAMPLE-0123456789abcdef"},"ats_config":{"company_id":"12345","subdomain":"example-company"}}Optional partial update of the Company itself. Accepts the same fields as Update Company.
{"contact_email":"jane.doe@example.com","website":"https://www.example.com"}