API for reading and writing personnel data incl. data about attendances and absences
Bring your own key. This API needs your own Personnel Data key - get one from the provider, add it once below, and the proxy injects it on every call. Your OmniStream plan covers the unified SDK, key storage, and proxy - the provider's own rate limits still apply to your key.
This is a community listing. If you own this API, you can request ownership.
npm install omnistream-sdkimport { OmniClient } from "omnistream-sdk";
const omni = new OmniClient({ token: process.env.OMNI_KEY! });
// One key reaches every API on the marketplace.
const data = await omni.call("personio/getcompany_attendances");One install, one key - the same client calls every API on the marketplace.
First day of the period to be queried. It is inclusive, so the day specified as start_date will also be considered on the results
Last day of the period to be queried. It is inclusive, so the day specified as end_date will also be considered on the results.
Datetime from when the queried periods have been updated. Same format as updated_at. It is inclusive, so the day specified as updated_from will also be considered on the results. Can be just the date, or the date and the time, with or without the timezone.
Datetime until when the queried periods have been updated. Same format as updated_at. It is inclusive, so the day specified as updated_to will also be considered on the results. Can be just the date, or the date and the time, with or without the timezone.
A list of Personio employee identifiers to filter the results. Only those employees specified here will be returned.
Pagination attribute to limit how many attendances will be returned per page
Pagination attribute to identify which page you are requesting, by the form of telling an offset from the first record that would be returned.
This endpoint is responsible for fetching attendance data for the company employees. It is possible to paginate results, filter by period, the date and/or time it was updated, and/or specific employees. The result will contain a list of attendance periods, structured as defined here.
This endpoint is responsible for adding attendance data for the company employees. It is possible to add attendances for one or many employees at the same time. The payload sent on the request should be a list of attendance periods, in the form of an array containing attendance period objects.
This endpoint is responsible for updating attendance data for the company employees. Attributes are not required and if not specified, the current value will be used. It is not possible to change the employee id.
This endpoint is responsible for deleting attendance data for the company employees.
/**
* PersonnelData - generated by OmniStream from Personnel Data's OpenAPI spec.
* One typed method per endpoint. A single Omni key reaches the API.
*/
const DEFAULT_BASE = "https://grid.skinvaults.online/v1/proxy/personio";
export class PersonnelDataError extends Error {
status: number;
code?: string;
constructor(status: number, code: string | undefined, message?: string) {
super(message || `PersonnelData error ${status}`);
this.name = "PersonnelDataError";
this.status = status;
this.code = code;
}
}
export interface PersonnelDataOptions {
baseUrl?: string;
fetch?: typeof fetch;
timeoutMs?: number;
}
export class PersonnelData {
/** @param token Your OmniStream key (one key for every API). */
constructor(private token: string, private opts: PersonnelDataOptions = {}) {
if (!token) throw new Error("PersonnelData: token is required");
}
rateLimit: { remainingMinute?: number; remainingDay?: number } | null = null;
private async _request(method: string, path: string, { params, body }: { params?: Record<string, unknown>; body?: unknown } = {}): Promise<any> {
const f = this.opts.fetch ?? globalThis.fetch;
const url = new URL((this.opts.baseUrl ?? DEFAULT_BASE).replace(/\/+$/, "") + path);
if (params) for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
const headers: Record<string, string> = { "x-omni-key": this.token };
if (body !== undefined) headers["content-type"] = "application/json";
const res = await f(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined });
this.rateLimit = {
remainingMinute: Number(res.headers.get("x-ratelimit-remaining-minute")) || undefined,
remainingDay: Number(res.headers.get("x-ratelimit-remaining-day")) || undefined,
};
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new PersonnelDataError(res.status, data?.error?.code, data?.error?.message);
return data.data ?? data;
}
/** This endpoint is responsible for fetching attendance data for the company employees. It is possible to paginate results, filter by period, the date and/or time it was updated, and/or specific employees. The result will contain a list of attendance periods, structured as defined here. */
getcompanyAttendances(params: { "start_date": string; "end_date": string; "updated_from"?: string; "updated_to"?: string; "employees"?: unknown[]; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/company/attendances", { params });
}
/** This endpoint is responsible for adding attendance data for the company employees. It is possible to add attendances for one or many employees at the same time. The payload sent on the request should be a list of attendance periods, in the form of an array containing attendance period objects. */
postcompanyAttendances(body: unknown): Promise<any> {
return this._request("POST", "/company/attendances", { body });
}
/** This endpoint is responsible for updating attendance data for the company employees. Attributes are not required and if not specified, the current value will be used. It is not possible to change the employee id. */
patchcompanyAttendancesId(body: unknown, params: { "id": number }): Promise<any> {
return this._request("PATCH", "/company/attendances/{id}", { body, params });
}
/** This endpoint is responsible for deleting attendance data for the company employees. */
deletecompanyAttendancesId(params: { "id": number }): Promise<any> {
return this._request("DELETE", "/company/attendances/{id}", { params });
}
/** List Employees */
getcompanyEmployees(): Promise<any> {
return this._request("GET", "/company/employees", {});
}
/** Create an employee */
postcompanyEmployees(): Promise<any> {
return this._request("POST", "/company/employees", { });
}
/** Show employee by ID */
getcompanyEmployeesEmployeeId(params: { "employee_id": number }): Promise<any> {
return this._request("GET", "/company/employees/{employee_id}", { params });
}
/** Show employee profile picture */
getcompanyEmployeesEmployeeIdProfilePictureWi(params: { "employee_id": number; "width": number }): Promise<any> {
return this._request("GET", "/company/employees/{employee_id}/profile-picture/{width}", { params });
}
/** Provides a list of available time-off types, for example 'Paid vacation', 'Parental leave' or 'Home office' */
getcompanyTimeOffTypes(params: { "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/company/time-off-types", { params });
}
/** This endpoint is responsible for fetching absence data for the company employees. It is possible to paginate results, filter by period and/or specific employees. The result will contain a list of absence periods, structured as defined here. */
getcompanyTimeOffs(params: { "start_date"?: string; "end_date"?: string; "updated_from"?: string; "updated_to"?: string; "employees"?: unknown[]; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/company/time-offs", { params });
}
/** This endpoint is responsible for adding absence data for the company employees. */
postcompanyTimeOffs(body: unknown): Promise<any> {
return this._request("POST", "/company/time-offs", { body });
}
/** Absence Period */
getcompanyTimeOffsId(params: { "id": number }): Promise<any> {
return this._request("GET", "/company/time-offs/{id}", { params });
}
/** This endpoint is responsible for deleting absence period data for the company employees. */
deletecompanyTimeOffsId(params: { "id": number }): Promise<any> {
return this._request("DELETE", "/company/time-offs/{id}", { params });
}
}
export default PersonnelData;
No reviews yet. Be the first to rate this API.
Yes. Personnel Data uses apiKey authentication, so you bring your own key from the provider. You store it once on OmniStream and the proxy injects it into every call, so your code only ever sends your Omni key.
API for reading and writing personnel data incl. data about attendances and absences It exposes 13 endpoints over GET, POST, PATCH, DELETE, including GET /company/attendances, POST /company/attendances, PATCH /company/attendances/{id}.
Install the OmniStream SDK for your language and call Personnel Data through it. The client is generated from this API's OpenAPI spec, so parameters and responses are fully typed, and the same client also calls every other API in the marketplace.
You can start on the free plan. OmniStream charges for the unified SDK, key storage and proxy rather than for Personnel Data itself, and Personnel Data's own rate limits still apply to your provider key.
Notion: The official Notion API - read and write pages, databases, blocks, comments, and users, plus workspace search.
List Employees
Create an employee
Show employee by ID
Show employee profile picture
Provides a list of available time-off types, for example 'Paid vacation', 'Parental leave' or 'Home office'
This endpoint is responsible for fetching absence data for the company employees. It is possible to paginate results, filter by period and/or specific employees. The result will contain a list of absence periods, structured as defined here.
This endpoint is responsible for adding absence data for the company employees.
Absence Period
This endpoint is responsible for deleting absence period data for the company employees.