Overview
All-in-one HR software for managing employees, attendance, time accounts, and performance. Through Langdock’s integration, you can access and manage Personio directly from your conversations.Authentication: API Key
Category: HR & Recruiting
Availability: All workspace plans
Available Actions
List persons
personio.list_employees
Get a list of persons with optional filters.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Number of persons to return per page (1-50, default: 10).cursor(TEXT, Optional): Pagination cursor for next page of results.id(TEXT, Optional): Filter by specific person ID.email(TEXT, Optional): Filter by email address.first_name(TEXT, Optional): Filter by first name.last_name(TEXT, Optional): Filter by last name.preferred_name(TEXT, Optional): Filter by preferred name.created_at(TEXT, Optional): Filter by creation date (YYYY-MM-DD).created_at_gt(TEXT, Optional): Filter persons created after this date (YYYY-MM-DD).created_at_lt(TEXT, Optional): Filter persons created before this date (YYYY-MM-DD).updated_at(TEXT, Optional): Filter by updated date (YYYY-MM-DD).updated_at_gt(TEXT, Optional): Filter persons updated after this date (YYYY-MM-DD).updated_at_lt(TEXT, Optional): Filter persons updated before this date (YYYY-MM-DD).
Get person
personio.get_employee
Retrieve a single person by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the employee (e.g. “12345678”).
Create person
personio.create_person
Create a new person and employment.
Requires Confirmation: No
Parameters:
first_name(TEXT, Required): First name of the employee (required).last_name(TEXT, Required): Last name of the employee (required).email(TEXT, Optional): Email address of the employee. Must be unique across all employees.preferred_name(TEXT, Optional): The preferred name of the employee, if relevant.gender(TEXT, Optional): Gender of the employee (e.g. MALE, FEMALE, DIVERSE).language_code(TEXT, Optional): Main language of the employee (e.g. ‘de’ for German, ‘en’ for English).custom_attributes(MULTI_LINE_TEXT, Optional): Custom attributes as JSON array: [{“id”: “attribute_name”, “value”: “attribute_value”}] or object: {“attribute_name”: “value”}employments(MULTI_LINE_TEXT, Optional): Employment details as JSON array. Leave empty to create default employment. Example: [{“position”: “Developer”, “department”: “Engineering”}]
Delete person
personio.delete_person
Delete a person.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the employee to delete (e.g. “12345678”).
List employments
personio.list_employments
List employments of a given person.
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The unique identifier of the person (e.g. “12345678”).limit(NUMBER, Optional): Number of employments to return per page (1-50, default: 10).cursor(TEXT, Optional): Pagination cursor for next page of results.id(TEXT, Optional): Filter by specific employment ID.updated_at(TEXT, Optional): Filter by updated date (YYYY-MM-DD).updated_at_gt(TEXT, Optional): Filter employments updated after this date (YYYY-MM-DD).updated_at_lt(TEXT, Optional): Filter employments updated before this date (YYYY-MM-DD).
Get employment
personio.get_employment
Retrieve a single employment by ID.
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The unique identifier of the person (e.g. “12345678”).id(TEXT, Required): The unique identifier of the employment (e.g. “98765432”).
Update employment
personio.update_employment
Update an employment record.
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The unique identifier of the person (e.g. “12345678”).employment_id(TEXT, Required): The unique identifier of the employment to update.supervisor(MULTI_LINE_TEXT, Optional): Supervisor object as JSON (e.g. {“id”: “123456”}).office(MULTI_LINE_TEXT, Optional): Office object as JSON.org_units(MULTI_LINE_TEXT, Optional): Organization units (department/team) as JSON array.legal_entity(MULTI_LINE_TEXT, Optional): Legal entity object as JSON.position(MULTI_LINE_TEXT, Optional): Position object as JSON.status(TEXT, Optional): Employment status (e.g. ACTIVE, INACTIVE).employment_start_date(TEXT, Optional): When the employment contract starts (YYYY-MM-DD).type(TEXT, Optional): Type of employment (e.g. INTERNAL, EXTERNAL).contract_end_date(TEXT, Optional): When the employment contract ends, if temporary (YYYY-MM-DD).probation_end_date(TEXT, Optional): When the probation period ends (YYYY-MM-DD). Set either this or probation_period_length.probation_period_length(NUMBER, Optional): Length of probation period in months. Set either this or probation_end_date.weekly_working_hours(NUMBER, Optional): Number of hours worked weekly.full_time_weekly_working_hours(NUMBER, Optional): Hours per week considered full time for this employment.cost_centers(MULTI_LINE_TEXT, Optional): Weight distribution between cost centers as JSON array with percentages.
Update person
personio.update_employee
Update a person’s information.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the employee to update (e.g. “12345678”).email(TEXT, Optional): Email address of the employee. Must be unique across all employees.first_name(TEXT, Optional): First name of the employee.last_name(TEXT, Optional): Last name of the employee.preferred_name(TEXT, Optional): The preferred name of the employee, if relevant.gender(TEXT, Optional): Gender of the employee (e.g. MALE, FEMALE, DIVERSE).language_code(TEXT, Optional): Main language of the employee (e.g. ‘de’ for German, ‘en’ for English).custom_attributes(MULTI_LINE_TEXT, Optional): Custom attributes as JSON array: [{“id”: “attribute_name”, “value”: “attribute_value”}] or object: {“attribute_name”: “value”}
Get attendance
personio.get_attendance
Get attendance records with date range and employee filtering.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Maximum number of attendance periods to return (1-100, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.id(TEXT, Optional): Filter by attendance period IDs (comma-separated for multiple).person_id(TEXT, Optional): Filter by person IDs (comma-separated for multiple).start_gte(TEXT, Optional): Filter periods starting from this date-time (ISO-8601).start_lte(TEXT, Optional): Filter periods starting before or at this date-time (ISO-8601).end_lte(TEXT, Optional): Filter periods ending before or at this date-time (ISO-8601).end_gte(TEXT, Optional): Filter periods ending after or at this date-time (ISO-8601).updated_at_gte(TEXT, Optional): Filter periods updated after or at this date-time (ISO-8601).updated_at_lte(TEXT, Optional): Filter periods updated before or at this date-time (ISO-8601).status(TEXT, Optional): Filter by attendance period status.
Get attendance period
personio.get_attendance_period
Retrieve a single attendance period by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the attendance period to retrieve (required).
Create attendance
personio.create_attendance
Create a new attendance entry for an employee.
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The person’s unique identifier (required).type(TEXT, Required): Attendance period type: WORK or BREAK (required).start(MULTI_LINE_TEXT, Required): Start date/time as JSON: {“date_time”: “2024-01-01T09:00:00”} (required).end(MULTI_LINE_TEXT, Optional): End date/time as JSON: {“date_time”: “2024-01-01T17:00:00”} (optional, null for open periods).comment(TEXT, Optional): Optional comment for the attendance period.project_id(TEXT, Optional): Project ID (only for WORK periods, must be ACTIVE).skip_approval(BOOLEAN, Optional): Skip any approval that this request would otherwise require (default: false).
Update attendance period
personio.update_attendance_period
Update an attendance period by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the attendance period to update (required).type(TEXT, Optional): Attendance period type: WORK or BREAK.start(MULTI_LINE_TEXT, Optional): Start date/time as JSON: {“date_time”: “2024-01-01T09:00:00”}.end(MULTI_LINE_TEXT, Optional): End date/time as JSON: {“date_time”: “2024-01-01T17:00:00”}.comment(TEXT, Optional): Optional comment for the attendance period.project_id(TEXT, Optional): Project ID (only for WORK periods, must be ACTIVE, or null to remove).skip_approval(BOOLEAN, Optional): Skip any approval that this request would otherwise require (default: false).
Delete attendance period
personio.delete_attendance_period
Delete an attendance period by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the attendance period to delete (required).
Create absence period
personio.create_absence
Creates a new absence period
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The person’s unique identifier (required)absence_type_id(TEXT, Required): The ID of the absence type (UUID format, required)starts_from(MULTI_LINE_TEXT, Required): Start of absence as JSON: {“date_time”: “2025-12-29T00:00:00”, “type”: “FIRST_HALF”} (required)ends_at(MULTI_LINE_TEXT, Optional): End of absence as JSON: {“date_time”: “2026-01-01T00:00:00”, “type”: “SECOND_HALF”} (optional, null for ongoing)comment(TEXT, Optional): Optional comment for the absence periodskip_approval(BOOLEAN, Optional): Skip any approval that this request would otherwise require (default: false)
List compensation types
personio.list_compensation_types
Returns a list of compensation types including one-time and recurring types.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Number of compensation types to return per page (1-100, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.
Create compensation type
personio.create_compensation_type
Creates a new compensation type that can be used when creating compensations.
Requires Confirmation: No
Parameters:
name(TEXT, Required): Name of the compensation type (required).category(TEXT, Required): Payout frequency: ONE_TIME or RECURRING (required).
Create compensation
personio.create_compensation
Creates a compensation for an employee (one-time, recurring, fixed, or hourly). Bonuses not supported.
Requires Confirmation: No
Parameters:
person_id(TEXT, Required): The person ID or person object as JSON {“id”: “12345678”} (required).type_id(TEXT, Required): The compensation type ID or type object as JSON {“id”: “uuid”} (required).value(NUMBER, Required): Amount in currency’s numeric unit with up to 2 decimal places (required).effective_from(TEXT, Required): The effective start date of the compensation (YYYY-MM-DD) (required).interval(TEXT, Optional): Payout interval: MONTHLY, YEARLY (mandatory for RECURRING, ignored for ONE_TIME).comment(TEXT, Optional): Optional comment about this compensation.
List legal entities
personio.list_legal_entities
Returns a list of legal entities for the company, sorted by creation date.
Requires Confirmation: No
Parameters:
id(TEXT, Optional): Filter by one or more legal entity IDs (comma-separated for multiple).country(TEXT, Optional): Filter by country codes (comma-separated for multiple, e.g. DE,US).limit(NUMBER, Optional): Number of legal entities to return per page (1-100, default: 20).cursor(TEXT, Optional): Pagination cursor for next page of results.
Get legal entity
personio.get_legal_entity
Retrieves a single legal entity by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the legal entity to retrieve (required).
Get org unit
personio.get_org_unit
Retrieves an organizational unit (team or department) by ID. Get org unit IDs from list_employments or get_employment responses.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the Org Unit to retrieve. Get this from list_employments or employment records (required).type(TEXT, Required): The type of the Org Unit (e.g. team or department) (required).include_parent_chain(BOOLEAN, Optional): Include the parent org unit chain in the response (default: false).
List absence periods
personio.list_absence_periods
Returns a list of absence periods with pagination and filtering.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Maximum number of absence periods to return (1-100, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.id(TEXT, Optional): Filter by one or more absence period IDs.absence_type_id(TEXT, Optional): Filter by one or more absence type IDs.person_id(TEXT, Optional): Filter by one or more person IDs.starts_from_gte(TEXT, Optional): Filter periods starting from this date-time (inclusive, ISO-8601).starts_from_lte(TEXT, Optional): Filter periods starting before or at this date-time (ISO-8601).ends_at_lte(TEXT, Optional): Filter periods ending before or at this date-time (ISO-8601).ends_at_gte(TEXT, Optional): Filter periods ending after or at this date-time (ISO-8601).updated_at_gte(TEXT, Optional): Filter periods updated after or at this date-time (ISO-8601).updated_at_lte(TEXT, Optional): Filter periods updated before or at this date-time (ISO-8601).
Get absence period
personio.get_absence_period
Retrieves an absence period by ID. Get absence period IDs from list_absence_periods or create_absence responses.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the absence period to retrieve. Get this from list_absence_periods or create_absence responses (required).
Update absence period
personio.update_absence_period
Updates an absence period by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the absence period to update (required).starts_from(MULTI_LINE_TEXT, Optional): Start of absence period as JSON object: {“date_time”: “2025-12-29T00:00:00”, “type”: “FIRST_HALF”}ends_at(MULTI_LINE_TEXT, Optional): End of absence period as JSON object: {“date_time”: “2026-01-01T00:00:00”, “type”: “SECOND_HALF”}comment(TEXT, Optional): Optional comment for the absence period.skip_approval(BOOLEAN, Optional): Skip any approval that this update would otherwise require (default: false).
Delete absence period
personio.delete_absence_period
Deletes an absence period by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the absence period to delete (required).
Get absence period breakdowns
personio.get_absence_period_breakdowns
Retrieves daily breakdowns for an absence period.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the absence period (required).limit(NUMBER, Optional): Number of breakdown days to return (1-28, default: 28).cursor(TEXT, Optional): Pagination cursor for next page of results.
Get time off types
personio.get_time_off_types
Get all available time off types.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Maximum number of absence types to return (1-100, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.
Get absence type
personio.get_absence_type
Retrieves an absence type by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The ID of the absence type (UUID format, required).
List documents
personio.list_documents
Lists the metadata of documents belonging to the provided owner ID.
Requires Confirmation: No
Parameters:
owner_id(TEXT, Required): The ID of the owner of the documents (required).category_id(TEXT, Optional): The ID of the category in which the documents belong.created_at_gte(TEXT, Optional): Filter documents created on or after this date (YYYY-MM-DD).created_at_lt(TEXT, Optional): Filter documents created before this date (YYYY-MM-DD).limit(NUMBER, Optional): Number of documents to return (1-200, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.
Delete document
personio.delete_document
Deletes a document with the provided document ID.
Requires Confirmation: No
Parameters:
document_id(TEXT, Required): The ID of the document to delete (required).
List compensations
personio.list_compensations
Returns payroll compensations including salary, hourly, one-time, recurring, and bonuses.
Requires Confirmation: No
Parameters:
start_date(TEXT, Optional): Start date for compensations (YYYY-MM-DD). Duration with end_date must be ≤ 1 month.end_date(TEXT, Optional): End date for compensations (YYYY-MM-DD). Duration with start_date must be ≤ 1 month.person_id(TEXT, Optional): Filter by one or more person IDs (comma-separated for multiple).legal_entity_id(TEXT, Optional): Filter by one or more legal entity IDs (comma-separated for multiple).limit(NUMBER, Optional): Number of compensations to return per page (1-100, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.
Search person by email
personio.search_employee_by_email
Find a person by their email address.
Requires Confirmation: No
Parameters:
email(TEXT, Required): The email address of the employee to search for.
Get time off balance
personio.get_time_off_balance
Get the time off balance for a person.
Requires Confirmation: No
Parameters:
employeeId(TEXT, Required): The unique identifier of the employee.
Get custom attributes
personio.get_custom_attributes
Get the list of custom attributes defined in Personio.
Requires Confirmation: No
Parameters: None
Output: Returns the operation result
List applications
personio.list_applications
Get a list of recruiting applications with optional filters.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Number of applications to return (1-200, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.updated_at_lt(TEXT, Optional): Return applications updated before this date/time (ISO 8601 format). Cannot be used with ‘Updated after’.updated_at_gt(TEXT, Optional): Return applications updated after this date/time (ISO 8601 format). Cannot be used with ‘Updated before’.candidate_email(TEXT, Optional): Filter applications by candidate email address.
Get application
personio.get_application
Retrieve a recruiting application by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the application.
Get application stage transitions
personio.get_application_stage_transitions
Get the history of stage transitions for a recruiting application.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the application.
List candidates
personio.list_candidates
Get a list of recruiting candidates with optional filters.
Requires Confirmation: Yes
Parameters:
limit(NUMBER, Optional): Number of candidates to return (1-200, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.updated_at_lt(TEXT, Optional): Return candidates updated before this date/time (ISO 8601 format). Cannot be used with ‘Updated after’.updated_at_gt(TEXT, Optional): Return candidates updated after this date/time (ISO 8601 format). Cannot be used with ‘Updated before’.email(TEXT, Optional): Filter candidates by email address.
Get candidate
personio.get_candidate
Retrieve a recruiting candidate by ID.
Requires Confirmation: Yes
Parameters:
id(TEXT, Required): The unique identifier of the candidate.
List jobs
personio.list_jobs
Get a list of recruiting jobs with optional filters.
Requires Confirmation: No
Parameters:
limit(NUMBER, Optional): Number of jobs to return (1-200, default: 100).cursor(TEXT, Optional): Pagination cursor for next page of results.updated_at_lt(TEXT, Optional): Return jobs updated before this date/time (ISO 8601 format). Cannot be used with ‘Updated after’.updated_at_gt(TEXT, Optional): Return jobs updated after this date/time (ISO 8601 format). Cannot be used with ‘Updated before’.
Get job
personio.get_job
Retrieve a recruiting job by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the job.
List job categories
personio.list_job_categories
Get all recruiting job categories.
Requires Confirmation: No
Parameters: None
Output: Returns the operation result
Get job category
personio.get_job_category
Retrieve a recruiting job category by ID.
Requires Confirmation: No
Parameters:
id(TEXT, Required): The unique identifier of the job category.
List cost centers
personio.list_cost_centers
Get a list of cost centers with filtering, sorting, and pagination.
Requires Confirmation: Yes
Parameters:
id(TEXT, Optional): Filter by one or more cost center IDs (comma-separated).name(TEXT, Optional): Filter by one or more cost center names (comma-separated).sort(TEXT, Optional): Sort results by field. Use field name for ascending (e.g., ‘name’) or minus sign for descending (e.g., ‘-name’). Options: id, -id, name, -name.limit(NUMBER, Optional): Number of cost centers to return (1-100, default: 50).cursor(TEXT, Optional): Pagination cursor for next page of results.
List workplaces
personio.list_workplaces
Get a list of workplaces with filtering, sorting, and pagination.
Requires Confirmation: No
Parameters:
id(TEXT, Optional): Filter by one or more workplace IDs (comma-separated).name(TEXT, Optional): Filter by one or more workplace names (comma-separated).sort(TEXT, Optional): Sort results by field. Use field name for ascending (e.g., ‘name’) or minus sign for descending (e.g., ‘-name’). Options: id, -id, name, -name.limit(NUMBER, Optional): Number of workplaces to return (1-100, default: 50).cursor(TEXT, Optional): Pagination cursor for next page of results.