An SDK to work with Personio (https://www.personio.de)

This library comes with out of the box support for Guzzle and for HTTP clients implementing PSR-18.

Programming language: PHP
License: MIT License
Tags: API     Sdk     Client     Timetracking     Time Tracking     Personio    
Latest version: v1.0

Personio SDK for PHP alternatives and similar libraries

Based on the "API" category.
Alternatively, view Personio SDK for PHP alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Personio SDK for PHP or a related project?

Add another 'API' Library


Personio SDK for PHP

Interact with Personio from your PHP application.

Current version Supported PHP version Build Status



composer require gamez/personio


Creating an API client based on Guzzle

composer require guzzlehttp/guzzle
// a file in the same directory in which you perfomed the composer command(s)
require 'vendor/autoload.php';

use Gamez\Personio\Api\GuzzleApiClient;

$clientId = 'xxx';
$clientSecret = 'xxx';

$apiClient = GuzzleApiClient::with($clientId, $clientSecret);

Creating an API client based on a PSR-18 HTTP Client

The following example uses kriswallsmith/buzz as the client and nyholm/psr7 as the Request Factory, but you can use any library that implements PSR-17 and PSR-18.

composer require kriswallsmith/buzz:^1.0 nyholm/psr7:^1.0
// a file in the same directory in which you perfomed the composer command(s)
require 'vendor/autoload.php';

use Buzz\Client\FileGetContents;
use Gamez\Personio\Api\HttpApiClient;
use Nyholm\Psr7\Factory\Psr17Factory;

$clientId = 'xxx';
$clientSecret = 'xxx';

$psr17Factory = new Psr17Factory();
$httpClient = new FileGetContents($psr17Factory);
$apiClient = HttpApiClient::with($clientId, $clientSecret, $httpClient, $psr17Factory);

Creating your own API client

If you want to create your own API client, implement the \Gamez\Personio\Api\ApiClient interface and use your implementation.

Caching HTTP requests

To cache HTTP requests to the API, you can add a caching middleware/plugin to the HTTP client before injecting it into the API client instance. See the documentation of the respective component for instructions on how to do that.


Simple API

[Gamez\Personio\SimpleApi](./src/SimpleApi.php) is the easiest and fastest way to access the data in your Personio account. Its methods are named after the available REST API endpoints and return arrays of data. You can inspect the available methods by looking at the [source code of the Gamez\Personio\SimpleApi class](./src/SimpleApi.php) or by using the autocompletion features of your IDE.

The Simple API doesn't get in your way when accessing the Personio API, but it doesn't provide additional features either. It will, for example, not tell you if you used a wrong query parameter or invalid field value, so you will have to rely on the returned API responses.

For information on which query parameters and field values are allowed, see Personio Developer Hub.

Catching errors

All exceptions thrown by this library implement the \Gamez\Personio\Exception\PersonioException interface. Exceptions thrown while using an API Client will throw a \Gamez\Personio\Exception\ApiClientError.


use Gamez\Personio\Exception\ApiClientError;
use Gamez\Personio\Exception\PersonioException;

try {
    /** @var \Gamez\Personio\Api\ApiClient $apiClient */
    $result = $apiClient->get('nice-try');
} catch (ApiClientError $e) {
    $message = "Something went wrong while accessing {$e->getRequest()->getUri()}";

    if ($response = $e->getResponse()) {
        $message .= " ({$response->getStatusCode()})";

    $message .= ' : '.$e->getMessage();

} catch (PersonioException $e) {
    exit('Something not API related went really wrong: '.$e->getMessage());


  • Tests
  • Interfaces and value objects
  • CLI tool
  • Better documentation