Discussions

Ask a Question
ANSWERED

How can I be informed about changes to the API?

Hi all, is there a way to be actively informed about changes? Like an email, RSS feed or anything? There's not much fun in either waiting for an error and hot fixing or constantly checking the Changelog page. Thanks and regards, Simone
ANSWERED

API Response is incorrect

Hi, the request /v1/company/employees delivers incomplete Data. The response ends midstream and does not form a complete set of data. Here the response from this morning, right where the set of data ends: ![](https://files.readme.io/a9b32ef-grafik.png) Thanks for your help. Regards, Stefan
ANSWERED

Incomplete API response (unvalid json)

Hi all, We experience some wired behavior since this morning. API calls to the endpoints "employees", "attendances" and "absences" response with incomplete data. This results in invalid json which can't be parsed. We didn't change anything on our side and our business heavily relies on this API. Therefor any help is highly appreciated. Best regards Dennis

Personio API credentials do not work

Hi, I'm trying to make my C#-code work with the Personio API but fail already with getting the bearer token from the /auth-interface. I see that there is a little tryout-tool on <https://developer.personio.de/reference/post_auth> but I can't even manage to get it right here. What am I missing? The corresponding shell command looks like this: curl --request POST --url <https://api.personio.de/v1/auth> --header 'accept: application/json' --header 'content-type: application/json' --data ' { "client_id": "copy-paste-starting-with-papi-...", "client_secret": "copy-paste-starting-with-papi-..." } ' The response to this very request is this: { "success": false, "error": { "code": 0, "message": "Wrong credentials" } } "Wrong credentials"?? Having a typo here is very unlikely, if you copy+paste the id and secret, right?

How to get Personiodata for Power BI Reporting

Hello, I am looking for ways to access more comprehensive data from Personio for Power BI reporting via the API. The standard API doesn't provide alle the information I need. Does anyone have experience with workarounds or alternative methods to extract more data? Appreciate any help or recommendations. Thanks, Ricardo

No metadata available for GET /company/employees

Hi, In the API documentation page, it returns the metadata with elements, pages count. But when I called the GET method "/company/employees" with below query string via code, it returns all records (148), but no metadata. ```curl :?limit=100&offset=0&attributes\[]=id&attributes\[]=first_name&attributes\[]=last_name&attributes\[]=email&attributes\[]=gender&attributes\[]=status&attributes\[]=position&attributes\[]=last_modified_at&attributes\[]=department&attributes\[]=profile_picture ``` Regardless of limit and offset values, always it returns all records. Please help me to sort-out this as sooner.

breaking changes in API of v1/company/employees since yesterday

We have noticed that values of property "label" of some dynamic fields have been changed: "Straße", "Postleitzahl", "Hausnummer", "Ort", "Austrittsdatum (aktueller Anstellungszeitraum)" , just yesterday around midday This changed has been partially reverted today. Since we ar using "label" as identifier for dynamic fields, we ar in big trouble now, since API contract is somehow broken. 1. Since "label" is not a reliable indentifier for dynamic fields: 1. New property called universal_id looks (more appealing)? 2. Where can I find docs about it, including table of personio fields with values of universal_id? 2. Did we miss the info about changes in label values, is it expected to get such an info? 3. Currently, described changes have been reverted partially, what will happen to the dynamic field, with label = ""Austrittsdatum (aktueller Anstellungszeitraum) "

API token with read rights only for specific team

Hello there I am currently trying to use the Personio API to automate some processes. For that I need access to the attendances and absences of specific employees using the API. For compliance reasons the access cannot go beyond a specific team. My question now is: Is it possible to create a token only with read rights to a specific team and not anyone else? Thanks in advance!
ANSWERED

Creating new Application

I have questions, So.. i want to create New application to my Company With API. I successfully created that flow but I think i get something wrong. For creating new application i need following Data: - job_position_id - Integer number That I get from Public Job board link (<https://COMPANY_NAME.personio.com/job/JOB_ID>) - authorization - Bearer + Access token from "Recruiting API key" - X-Company-ID - Your company ID from "Recruiting API key" So, for only one function (Creating new Application) I need 3 data input from my Customers that uses Personio ATS (API tokens (company id and Access token) + Company id From browser URL Is there betther way of creating new application?

Cant pass applicant data + applicant documents

Hello, since the Personio API changed last year, we are not able to pass the applicant documents and applicant information to Personio. We are working with PHP and cURL. From the documentation, we gather that we need to first transfer the attached documents to Personio and then link the applicant information using the UUIDs of the documents. In the old API, we were able to transmit everything collectively as multipart. Here is our current code: ``` add_action('gform_after_submission', function ($entry, $form) { // Extraktion der Formularfelder $jobId = rgar($entry, '1'); $firstName = rgar($entry, '2'); $lastName = rgar($entry, '8'); $phone = rgar($entry, '3'); $email = rgar($entry, '4'); $text = rgar($entry, '5'); $gender = rgar($entry, '9'); $salary = rgar($entry, '11'); $birthday = rgar($entry, '12'); $availableFrom = rgar($entry, '10'); $files = json_decode(rgar($entry, '7'), true); // Formatieren der Daten $birthday = date('Y-m-d', strtotime($birthday)); $availableFrom = date('Y-m-d', strtotime($availableFrom)); // Array für die UUIDs der hochgeladenen Dateien $fileUuids = []; foreach ($files as $file) { $uploadedFilePath = str_replace(site_url(), $_SERVER['DOCUMENT_ROOT'], $file); $uploadResponse = uploadFileToPersonio($uploadedFilePath); if (empty($uploadResponse['uuid'])) { // Fehlerbehandlung für Datei-Upload sendErrorEmail('Fehler beim Dateiupload', $uploadResponse); } else { $fileUuids[] = $uploadResponse['uuid']; } } // Vorbereiten und Senden der Bewerberdaten $applicantData = [ 'phase' => [ 'type' => 'custom', 'id' => '316302' ], 'job_position_id' => $jobId, 'first_name' => $firstName, 'last_name' => $lastName, 'phone' => $phone, 'email' => $email, 'gender' => $gender, 'salary_expectations' => $salary, 'birthday' => $birthday, 'available_from' => $availableFrom, 'message' => $text, 'files' => $fileUuids ]; $applicantResponse = sendApplicantToPersonio($applicantData); if (!$applicantResponse) { // Fehlerbehandlung für die Übermittlung der Bewerberdaten sendErrorEmail('Fehler bei der Übermittlung der Bewerberdaten', $applicantResponse); } }, 10, 2); function uploadFileToPersonio($filePath) { $boundary = uniqid(); $filename = basename($filePath); $payload = "--$boundary\\r\\n"; $payload .= "Content-Disposition: form-data; name=\"file\"; filename=\"$filename\"\\r\\n"; $payload .= "Content-Type: application/pdf\\r\\n\\r\\n"; $payload .= file_get_contents($filePath); $payload .= "\\r\\n--$boundary--\\r\\n"; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://api.personio.de/v1/recruiting/applications/documents", CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => [ "X-Company-ID: *sanitized*", "Authorization: Bearer *sanitized*", "Content-Type: multipart/form-data; boundary=$boundary" ], ]); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } function sendApplicantToPersonio($data) { $curl = curl_init(); curl_setopt_array($curl, \[ CURLOPT_URL => "<https://api.personio.de/v1/recruiting/applications">, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_HTTPHEADER => [ "X-Company-ID: *sanitized*", "Authorization: Bearer *sanitized*", "Content-Type: application/json" ], ]); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } function sendErrorEmail($subject, $message) { $to = '*sanitzied*'; $headers = 'From: *sanitized*' . "\\r\\n" . 'Reply-To: *sanitized*' . "\\r\\n"; mail($to, $subject, print_r($message, true), $headers); } ``` Additional information: We are collecting the data via a Gravity Forms Form on one of our WordPress websites. If we skip the document upload, there are still some applicant information missing such as "available from" The error handling function worked well but since the newest code, we don't even get an error response. Thank you so much for your help. Kind regards Pascal