### Get Portal Information (JSON Response Sample) Source: https://developer.planday.com/api/portal This is a sample JSON response for the GET /portal/v1.0/info endpoint. It includes details about the portal, such as its ID, name, company name, country, time zone, and a list of any connected child portals. ```json { "data": { "id": 0, "name": "string", "companyName": "string", "country": "string", "timeZone": "string", "maxDepartments": 0, "aliases": [ "string" ], "portals": [ { "id": 0, "name": "string", "aliases": [ "string" ] } ] } } ``` -------------------------------- ### Get List of Schedule Days Response Sample Source: https://developer.planday.com/api/schedule Example JSON response for retrieving a list of schedule days within a department and time period. Shows details like date, title, visibility, and holiday information. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "date": "2026-04-29", "title": "string", "description": "string", "isVisible": true, "holiday": [ { "title": "string", "calendarName": "string" } ], "lockState": "Unlocked", "departmentId": 0, "id": 0 } ] } ``` -------------------------------- ### Get Shift History Response Sample Source: https://developer.planday.com/api/schedule Example JSON response for retrieving the history of a specific shift. Includes paging information and a list of changes made to the shift. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "modifiedAt": "string", "modifiedBy": { "id": 0, "name": "string" }, "changes": [ "string" ] } ] } ``` -------------------------------- ### Get Skills Response Source: https://developer.planday.com/api/schedule Sample response for retrieving a list of skills. Includes pagination details and a data array containing skill objects with their properties. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "isRemoved": true, "isDeleted": true, "description": "string", "employeeGroupIds": [ 0 ], "allEmployeeGroups": true } ] } ``` -------------------------------- ### GET /revenue/v1.0/revenueunits Source: https://developer.planday.com/api/revenue Get all revenue units from the whole portal. Requires authorization and the 'revenue read' scope. ```APIDOC ## GET /revenue/v1.0/revenueunits ### Description Get all revenue units from the whole portal. Requires authorization and the 'revenue read' scope. ### Method GET ### Endpoint https://openapi.planday.com/revenue/v1.0/revenueunits ### Query Parameters - **offset** (integer or null) - Default: 0. Skip first "offset" records (for paging purposes). - **limit** (integer or null) - Default: 50. Return no more than "limit" records. Maximum of 50 records per request. ### Response #### Success Response (200) - **paging** (object) - Pagination information. - **data** (array) - List of revenue units. #### Response Example ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 0, "includeInGlobalTurnover": true } ] } ``` ``` -------------------------------- ### Get Revenue Units Response Sample Source: https://developer.planday.com/api/revenue This sample shows the structure of the response when retrieving all revenue units for a portal. It includes paging information and a list of revenue units. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 0, "includeInGlobalTurnover": true } ] } ``` -------------------------------- ### Create or Update Employee with Custom Fields Source: https://developer.planday.com/guides/hr-guide This example shows how to create or update an employee, including specifying values for custom fields. Custom fields are identified by keys like 'custom_xxxx'. ```APIDOC ## POST /employees ### Description Creates or updates an employee with specified details, including custom fields. ### Method POST ### Endpoint /employees ### Request Body - **firstName** (string) - Required - Employee's first name - **lastName** (string) - Required - Employee's last name - **userName** (string) - Required - Employee's username - **cellPhone** (string) - Optional - Employee's cell phone number - **street1** (string) - Optional - Employee's street address - **zip** (string) - Optional - Employee's zip code - **city** (string) - Optional - Employee's city - **phone** (string) - Optional - Employee's phone number - **gender** (string) - Optional - Employee's gender - **email** (string) - Required - Employee's email address - **departments** (array) - Optional - List of department IDs - **employeeGroups** (array) - Optional - List of employee group IDs - **custom_xxxx** (any) - Optional - Custom field values (e.g., boolean, number, string, date, picture) ### Request Example ```json { "firstName": "First", "lastName": "Last", "userName": "User123", "cellPhone": "1234567", "street1": "Example", "zip": "12332", "city": "ExampleCity", "phone": "23213232", "gender": "Female", "email": "x-planday123123@planday.com", "departments": [147991], "employeeGroups": [266955], "custom_146688": true, "custom_164605": 5 } ``` ### Response #### Success Response (200) - **employeeId** (integer) - The ID of the created or updated employee. - **message** (string) - Confirmation message. ``` -------------------------------- ### Get Shift by ID Response Sample (200 OK) Source: https://developer.planday.com/api/schedule This sample shows the response when successfully retrieving a shift by its ID. It includes detailed shift information, including start and end times, status, and associated IDs. ```json { "data": { "punchClockShiftId": 0, "startDateTime": "2026-04-29T04:48", "endDateTime": "2026-04-29T04:48", "status": "Open", "dateTimeCreated": "2026-04-29T08:48:46.1369738Z", "dateTimeModified": "2026-04-29T08:48:46.1369738Z", "skillIds": [ 0 ], "id": 0, "departmentId": 0, "employeeId": 0, "employeeGroupId": 0, "positionId": 0, "shiftTypeId": 0, "date": "2026-04-29", "comment": "string" } } ``` -------------------------------- ### Start a New Break - Request Payload Source: https://developer.planday.com/api/punchclock Use this JSON payload to start a new break for an employee. The entry will be created at the time of the request unless a specific `startDateTime` is provided. ```json { "employeeId": 0, "startDateTime": "2025-01-01T00:00" } ``` -------------------------------- ### Revenue Records Response Sample Source: https://developer.planday.com/api/revenue Example of a successful response structure for retrieving revenue records, including paging information and a list of revenue data. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "dayScheduleId": 0, "revenueUnitId": 0, "departmentId": 0, "turnover": 0.1, "date": "2026-04-29" } ] } ``` -------------------------------- ### Start a new break Source: https://developer.planday.com/api/punchclock Initiates a new break entry for a Punch Clock Shift. If no break is ongoing, an entry will be created at the time of the request unless a specific start time is provided. ```APIDOC ## POST Start a new break if none are ongoing ### Description Entry will be created at time of request (if StartDateTime parameter is not included). ### Method POST ### Endpoint /punchclock/v1.0/punchclockshifts/{punchClockShiftId}/breaks ### Parameters #### Path Parameters - **punchClockShiftId** (integer) - Required - The ID of the Punch Clock Shift. #### Query Parameters - **deviceCode** (string) - Optional - The unique identifier for the device. #### Request Body - **employeeId** (integer) - Required - The ID of the employee. - **startDateTime** (string or null) - Optional - The start date and time for the break. ### Request Example ```json { "employeeId": 0, "startDateTime": "2025-01-01T00:00" } ``` ### Responses #### Success Response (200) OK ``` -------------------------------- ### GET Available sections Source: https://developer.planday.com/api/schedule Returns a paginated list of available sections. Requires authorization and the 'shiftposition read' scope. ```APIDOC ## GET Available sections ### Description Returns paginated list of available sections. ### Method GET ### Endpoint /scheduling/v1.0/sections ### Parameters #### Query Parameters - **departmentId** (integer or null) - Optional - Return records for the given Department. - **offset** (integer or null) - Optional - Skip the first "offset" records (for paging purposes). - **limit** (integer or null) - Optional - Return no more than "limit" records. Maximum of 50 records per request. ### Responses #### Success Response (200) - **paging** (object) - Pagination details. - **data** (array) - List of sections. - **id** (integer) - Identifier of the section. - **name** (string) - Name of the section. - **departmentId** (integer) - Identifier of the department. #### Response Example ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "departmentId": 0 } ] } ``` ``` -------------------------------- ### Access Planday API Resources Source: https://developer.planday.com/gettingstarted/authorization Make GET requests to Planday API endpoints with the required X-ClientId and Authorization headers. Replace CLIENT_ID and ACCESS_TOKEN with your valid credentials. ```http GET https://openapi.planday.com/hr/v1/Departments X-ClientId: CLIENT_ID Authorization: Bearer ACCESS_TOKEN ``` -------------------------------- ### GET Available positions Source: https://developer.planday.com/api/schedule Returns a paginated list of available positions. Requires authorization and the 'shiftposition read' scope. ```APIDOC ## GET Available positions ### Description Returns paginated list of available positions. Requires authorization. ### Method GET ### Endpoint /scheduling/v1.0/positions ### Query Parameters - **offset** (integer or null ) - Optional - Skip first "offset" records (for paging purposes) - **limit** (integer or null ) - Optional - Return no more than "limit" records. Maximum of 50 records per request - **isActive** (boolean or null) - Optional - Status of the position ### Responses #### Success Response (200) - **paging** (object) - Paging information - **offset** (integer) - **limit** (integer) - **total** (integer) - **data** (array) - Array of position objects - **id** (integer) - **name** (string) - **startDate** (string) - **endDate** (string) - **isActive** (boolean) - **departmentId** (integer) - **sectionId** (integer) - **employeeGroupId** (integer) - **affectRevenue** (boolean) - **revenueUnitId** (integer) #### Error Responses - **401** Unauthorized - **403** Your application isn't assigned to the appropriate scope, so it can't perform this action. - **429** Too many requests ### Response Example (200) ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "startDate": "2026-04-29", "endDate": "2026-04-29", "isActive": true, "departmentId": 0, "sectionId": 0, "employeeGroupId": 0, "affectRevenue": true, "revenueUnitId": 0 } ] } ``` ``` -------------------------------- ### View Rate Limit Status (Not Limited) Source: https://developer.planday.com/gettingstarted/rate-limiting Inspect response headers to check the current rate limit status. This example shows a successful request where the client ID has remaining requests within the per-second bucket. ```bash $ curl -v 'https://openapi.planday.com/hr/v1/Departments' -H "Authorization: Bearer $token" ... < HTTP/2 200 ... < x-ratelimit-limit: 100, 20;w=1, 750;w=60, 100;w=1, 2000;w=60 < x-ratelimit-remaining: 99 < x-ratelimit-reset: 1 ... ``` -------------------------------- ### View Rate Limit Status (Rate Limited) Source: https://developer.planday.com/gettingstarted/rate-limiting This example demonstrates a request that has exceeded the rate limit, resulting in a 429 Too Many Requests response. The headers indicate zero remaining requests and the time until the counter resets. ```bash $ curl -v 'https://openapi.planday.com/hr/v1/Departments' -H "Authorization: Bearer $token" ... < HTTP/2 429 ... < x-ratelimit-limit: 2000, 20;w=1, 750;w=60, 100;w=1, 2000;w=60 < x-ratelimit-remaining: 0 < x-ratelimit-reset: 33 ... ``` -------------------------------- ### Initiate Authorization Request Source: https://developer.planday.com/gettingstarted/authorization-flow Redirect users to this endpoint to start the authorization process. Ensure all required parameters like client_id, redirect_uri, response_type, and scope are correctly provided and URL-encoded. ```curl curl --location --request GET 'https://id.planday.com/connect/authorize?client_id=f2370889-3ffe-46b6-83e7-1a20f5a20d2f&scope=openid%20offline_access%20employee:read&redirect_uri=http://example.com/code&response_type=code&state=xyzABC123' ``` -------------------------------- ### GET Available Positions Response Sample Source: https://developer.planday.com/api/schedule This JSON structure represents a successful response when retrieving a paginated list of available positions. It includes paging information and an array of position data. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "startDate": "2026-04-29", "endDate": "2026-04-29", "isActive": true, "departmentId": 0, "sectionId": 0, "employeeGroupId": 0, "affectRevenue": true, "revenueUnitId": 0 } ] } ``` -------------------------------- ### Get Time and Cost of Shifts Response Source: https://developer.planday.com/api/schedule This is a sample response for retrieving time and cost data for shifts within a specified department and time period. It includes shift details, costs, and currency information. ```json { "data": { "costs": [ { "shiftId": 0, "duration": "2:03:45", "cost": 0.1, "employeeId": 0, "date": "2026-04-29", "shiftTypeId": 0, "positionId": 0 } ], "currencySymbol": "string", "currencyFormatString": "string" } } ``` -------------------------------- ### Stop Current Break - Response Sample Source: https://developer.planday.com/api/punchclock This is a sample successful response when stopping a break, showing the break's details including its ID, associated shift ID, start and end times, and duration. ```json { "data": { "id": 0, "punchClocksShiftId": 0, "startDateTime": "2025-01-01T00:00", "endDateTime": "2025-01-01T00:00", "duration": "string" } } ``` -------------------------------- ### Update Schedule Day Request Body Sample Source: https://developer.planday.com/api/schedule Example JSON payload for updating schedule day information. Allows modification of department, date, title, description, and visibility settings. ```json { "departmentId": 0, "date": "2026-04-29", "title": "string", "description": "string", "isVisible": true } ``` -------------------------------- ### Get Shift Types Response Sample Source: https://developer.planday.com/api/schedule This is a sample JSON response for retrieving a paginated list of shift types. It includes paging information and a data array of shift type objects. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "color": "string", "salaryCode": "string", "isActive": true, "payPercentage": 0.1, "payMonetary": 0.1, "allowsBreaks": true, "allowBooking": true, "paymentType": "Percentage", "includeInSchedulePrint": true } ] } ``` -------------------------------- ### Create Revenue Unit Response Sample Source: https://developer.planday.com/api/revenue This sample illustrates the response structure upon successfully creating a new revenue unit. ```json { "data": { "id": 0, "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 0, "includeInGlobalTurnover": true } } ``` -------------------------------- ### Revenue Response Sample Source: https://developer.planday.com/api/revenue This is a sample response when revenue data is successfully set or retrieved. ```json { "data": { "dayScheduleId": 0, "revenueUnitId": 0 } } ``` -------------------------------- ### Create Shift Response Sample (200 OK) Source: https://developer.planday.com/api/schedule This is a sample successful response when creating a shift. It includes the details of the created shift, such as its ID and assigned properties. ```json { "data": { "startTime": "04:48", "endTime": "04:48", "defaultWage": { "amount": 0.1, "type": "PerHour" }, "skillIds": [ 0 ], "id": 0, "departmentId": 0, "employeeId": 0, "employeeGroupId": 0, "positionId": 0, "shiftTypeId": 0, "date": "2026-04-29", "comment": "string" } } ``` -------------------------------- ### POST Create Shift Source: https://developer.planday.com/api/schedule Create a shift. ```APIDOC ## POST Create Shift ### Description Create a shift. ### Method POST ### Endpoint /scheduling/v1.0/shifts ### Requirements **Required scope**: shift create. Requires authorization. ``` -------------------------------- ### Get Shift History Source: https://developer.planday.com/api/schedule Retrieves the history of changes for a specific shift. ```APIDOC ## GET /scheduling/v1.0/shifts/{shiftId}/history ### Description Retrieves the history of changes for a specific shift, including who made the changes and when. ### Method GET ### Endpoint https://openapi.planday.com/scheduling/v1.0/shifts/{shiftId}/history ### Parameters #### Path Parameters - **shiftId** (integer) - Required - The ID of the shift to retrieve history for. #### Query Parameters - **offset** (integer or null) - Optional - Skip the first "offset" records (for paging purposes). - **limit** (integer or null) - Optional - Return no more than "limit" records. Maximum of 50 records per request. ### Response #### Success Response (200) - **paging** (object) - Information about the pagination of the results. - **offset** (integer) - The current offset. - **limit** (integer) - The limit of records per page. - **total** (integer) - The total number of records available. - **data** (array) - An array of shift history entries. - **modifiedAt** (string) - The timestamp when the modification occurred. - **modifiedBy** (object) - Information about the user who made the modification. - **id** (integer) - The ID of the user. - **name** (string) - The name of the user. - **changes** (array of strings) - A list of changes made to the shift. #### Response Example ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "modifiedAt": "string", "modifiedBy": { "id": 0, "name": "string" }, "changes": [ "string" ] } ] } ``` ``` -------------------------------- ### Get Shift by ID Source: https://developer.planday.com/api/schedule Retrieves the details of a specific shift using its unique identifier. ```APIDOC ## GET /scheduling/v1.0/shifts/{shiftId} ### Description Returns shift by shift id. ### Method GET ### Endpoint https://openapi.planday.com/scheduling/v1.0/shifts/{shiftId} ### Parameters #### Path Parameters - **shiftId** (integer) - Required - The unique identifier of the shift. ### Response #### Success Response (200) - **data** (object) - Contains the details of the shift. - **punchClockShiftId** (integer) - ID of the punch clock shift. - **startDateTime** (string) - The start date and time of the shift. - **endDateTime** (string) - The end date and time of the shift. - **status** (string) - The status of the shift (e.g., "Open"). - **dateTimeCreated** (string) - The date and time the shift was created. - **dateTimeModified** (string) - The date and time the shift was last modified. - **skillIds** (Array of integers) - Skill ids associated with the shift. - **id** (integer) - Unique identifier for the shift. - **departmentId** (integer) - Planday id of the department. - **employeeId** (integer) - Planday id of the employee assigned. - **employeeGroupId** (integer) - Planday id of the employee group. - **positionId** (integer) - Planday id of the schedule position. - **shiftTypeId** (integer) - Planday id of the shift type. - **date** (string) - The date of the shift. - **comment** (string) - The comment set on the shift. #### Response Example ```json { "data": { "punchClockShiftId": 0, "startDateTime": "2026-04-29T04:48", "endDateTime": "2026-04-29T04:48", "status": "Open", "dateTimeCreated": "2026-04-29T08:48:46.1369738Z", "dateTimeModified": "2026-04-29T08:48:46.1369738Z", "skillIds": [ 0 ], "id": 0, "departmentId": 0, "employeeId": 0, "employeeGroupId": 0, "positionId": 0, "shiftTypeId": 0, "date": "2026-04-29", "comment": "string" } } ``` ``` -------------------------------- ### Get List of Schedule Days Source: https://developer.planday.com/api/schedule Returns the day schedules in the specified department and time period. ```APIDOC ## GET /scheduling/v1.0/scheduleDay ### Description Returns the day schedules in the given department and time period. Requires authorization and the `shift:read` scope. ### Method GET ### Endpoint https://openapi.planday.com/scheduling/v1.0/scheduleDay ### Parameters #### Query Parameters - **DepartmentId** (integer or null) - Required - The ID of the department. - **From** (string) - Required - The start date for the schedule period (e.g., `From=2026-04-29`). - **To** (string) - Required - The end date for the schedule period (e.g., `To=2026-04-29`). - **Offset** (integer or null) - Optional - The offset for pagination. - **Limit** (integer or null) - Optional - The limit for the number of records to return. ### Response #### Success Response (200) - **paging** (object) - Information about the pagination of the results. - **offset** (integer) - The current offset. - **limit** (integer) - The limit of records per page. - **total** (integer) - The total number of records available. - **data** (array) - An array of schedule day objects. - **date** (string) - The date of the schedule day. - **title** (string) - The title of the schedule day. - **description** (string) - The description for the schedule day. - **isVisible** (boolean) - Indicates if the schedule day is visible to employees. - **holiday** (array) - Information about holidays on this day. - **title** (string) - The title of the holiday. - **calendarName** (string) - The name of the holiday calendar. - **lockState** (string) - The lock state of the schedule day (e.g., "Unlocked"). - **departmentId** (integer) - The ID of the department. - **id** (integer) - The ID of the schedule day. #### Response Example ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "date": "2026-04-29", "title": "string", "description": "string", "isVisible": true, "holiday": [ { "title": "string", "calendarName": "string" } ], "lockState": "Unlocked", "departmentId": 0, "id": 0 } ] } ``` ``` -------------------------------- ### GET position by id Source: https://developer.planday.com/api/schedule Retrieves a specific position by its ID. Requires authorization and the 'shiftposition read' scope. ```APIDOC ## GET position by id ### Description Returns position by provided id. Requires authorization. ### Method GET ### Endpoint /scheduling/v1.0/positions/{positionId} ### Path Parameters - **positionId** (integer ) - Required - Position Id ### Responses #### Success Response (200) - **data** (object) - The position object - **skillIds** (array) - **id** (integer) - **name** (string) - **startDate** (string) - **endDate** (string) - **isActive** (boolean) - **departmentId** (integer) - **sectionId** (integer) - **employeeGroupId** (integer) - **affectRevenue** (boolean) - **revenueUnitId** (integer) #### Error Responses - **401** Unauthorized - **403** Your application isn't assigned to the appropriate scope, so it can't perform this action. - **429** Too many requests ### Response Example (200) ```json { "data": { "skillIds": [ 0 ], "id": 0, "name": "string", "startDate": "2026-04-29", "endDate": "2026-04-29", "isActive": true, "departmentId": 0, "sectionId": 0, "employeeGroupId": 0, "affectRevenue": true, "revenueUnitId": 0 } } ``` ``` -------------------------------- ### Set Revenue Input Model Source: https://developer.planday.com/api/revenue Use this model to set daily revenue data. Ensure all required fields are provided. ```json { "description": "string", "turnover": 0.1, "revenueUnitId": 0, "date": "2026-04-29" } ``` -------------------------------- ### POST /revenue/v1.0/revenueunits Source: https://developer.planday.com/api/revenue Create a new Revenue Unit to store daily revenue data of a department. Requires authorization and the 'revenue set' scope. ```APIDOC ## POST /revenue/v1.0/revenueunits ### Description Create a new Revenue Unit to store daily revenue data of a department. Requires authorization and the 'revenue set' scope. ### Method POST ### Endpoint https://openapi.planday.com/revenue/v1.0/revenueunits ### Request Body - **departmentId** (integer or null) - Department Id - **name** (string) - Name - **description** (string) - Description - **allowPurchases** (boolean or null) - Default: true. Allow Purchases - **allowSale** (boolean or null) - Default: true. Allow Sale - **sortValue** (integer or null) - Default: 100. [ 0 .. 2147483647 ] - **includeInGlobalTurnover** (boolean or null) - Default: true. Include In Global Turnover ### Request Example ```json { "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 100, "includeInGlobalTurnover": true } ``` ### Response #### Success Response (200) - **data** (object) - The created revenue unit details. #### Response Example ```json { "data": { "id": 0, "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 0, "includeInGlobalTurnover": true } } ``` ``` -------------------------------- ### Get Security Groups Source: https://developer.planday.com/api/securitygroupmembership Retrieves a list of all security groups available in the portal. Requires the 'securitygroups read' scope. ```json [ * { * "id": 0, * "name": "string", * "employeeCount": 0 } ] ``` -------------------------------- ### Available Sections Response Sample Source: https://developer.planday.com/api/schedule This JSON sample illustrates the response structure for available sections, including paging and a list of sections with their IDs, names, and department IDs. ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "departmentId": 0 } ] } ``` -------------------------------- ### GET Shift Types Source: https://developer.planday.com/api/schedule Retrieves a paginated list of available shift types in the system. Supports filtering by active status. ```APIDOC ## GET /scheduling/v1.0/shifttypes ### Description Returns paginated list of available shift types. ### Method GET ### Endpoint https://openapi.planday.com/scheduling/v1.0/shifttypes ### Parameters #### Query Parameters - **isActive** (boolean or null) - Optional - Filter by active status. - **limit** (integer) - Optional - Default: 50. Return no more than 'limit' records. Maximum of 50 records per request. - **offset** (integer) - Optional - Default: 0. Skip first 'offset' records (for paging purposes). ### Response #### Success Response (200) - **paging** (object) - Pagination information. - **offset** (integer) - **limit** (integer) - **total** (integer) - **data** (array of objects) - List of shift types. - **id** (integer) - **name** (string) - **color** (string) - **salaryCode** (string) - **isActive** (boolean) - **payPercentage** (number) - **payMonetary** (number) - **allowsBreaks** (boolean) - **allowBooking** (boolean) - **paymentType** (string) - e.g., "Percentage" - **includeInSchedulePrint** (boolean) #### Response Example ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "name": "string", "color": "string", "salaryCode": "string", "isActive": true, "payPercentage": 0.1, "payMonetary": 0.1, "allowsBreaks": true, "allowBooking": true, "paymentType": "Percentage", "includeInSchedulePrint": true } ] } ``` ``` -------------------------------- ### Get revenue records Source: https://developer.planday.com/api/revenue Retrieves all revenue records matching the specified criteria. Requires 'revenue read' scope and authorization. ```APIDOC ## GET Revenue ### Description Get all revenue records matching the request criteria. ### Method GET ### Endpoint /revenue/v1.0/revenue ### Query Parameters - **revenueUnitId** (integer or null) - Return records for given Revenue unit - **departmentId** (integer or null) - Return records for given Department - **from** (string or null) - Return records from given date (inclusive) - **to** (string or null) - Return records till given date (inclusive) - **offset** (integer) - Default: 0 - Skip first "offset" records (for paging purposes) - **limit** (integer) - Default: 50 - Return no more than "limit" records. Maximum of 50 records per request ### Responses #### Success Response (200) Success #### Error Responses - **401** Unauthorized - **403** Your application isn't assigned to the appropriate scope, so it can't perform this action. - **429** Too many requests ``` -------------------------------- ### Complete Support for Skills in OpenAPI Source: https://developer.planday.com/gettingstarted/release_notes New endpoints in the HR Skills controller allow for full management of skills via OpenAPI. ```APIDOC ## POST Create a new skill ### Description Creates a new skill in the Planday portal. ### Method POST ### Endpoint /hr/skills ## PUT Update a skill ### Description Updates an existing skill. ### Method PUT ### Endpoint /hr/skills/{skillId} ## DELETE Delete a skill ### Description Deletes a skill. ### Method DELETE ### Endpoint /hr/skills/{skillId} ``` -------------------------------- ### Get daily budgets Source: https://developer.planday.com/api/revenue Retrieves all daily budgets matching the specified criteria. Requires 'revenue read' scope and authorization. ```APIDOC ## GET Get daily budgets ### Description Get all daily budgets matching the request criteria. ### Method GET ### Endpoint /revenue/v1.0/budgets ### Query Parameters - **from** (string) - Optional - The start date of the budget period. - **to** (string) - Optional - The end date of the budget period. - **departmentIds** (Array of integers) - Optional - An optional array of department IDs to filter the budget data. If null, budgets for all departments are returned. ### Responses #### Success Response (200) Success #### Error Responses - **400** Bad Request - **401** Unauthorized - **403** Your application isn't assigned to the appropriate scope, so it can't perform this action. - **429** Too many requests ``` -------------------------------- ### Get Break access for a punch clock shift Source: https://developer.planday.com/api/punchclock Retrieves break access details for a specific employee and Punch Clock Shift. ```APIDOC ## GET Break access for a punch clock shift on behalf of the employee in the query param. ### Description Returns break access for given employee and Punch Clock shift. ### Method GET ### Endpoint /punchclock/v1.0/punchclockshifts/{punchClockShiftId}/breakaccess ### Parameters #### Path Parameters - **punchClockShiftId** (integer) - Required - The ID of the Punch Clock Shift. #### Query Parameters - **employeeId** (integer) - Required - The ID of the employee. ### Responses #### Success Response (200) OK ``` -------------------------------- ### POST Create Position Response Sample Source: https://developer.planday.com/api/schedule This JSON structure represents a successful response after creating a new position. It returns the details of the newly created position, including its ID and other properties. ```json { "data": { "skillIds": [ 0 ], "id": 0, "name": "string", "startDate": "2026-04-29", "endDate": "2026-04-29", "isActive": true, "departmentId": 0, "sectionId": 0, "employeeGroupId": 0, "affectRevenue": true, "revenueUnitId": 0 } } ``` -------------------------------- ### List Employee Shifts - Response Sample Source: https://developer.planday.com/api/punchclock This sample response shows a list of employee shifts for the current day, including details like shift ID, employee ID, department ID, and shift timings. It also includes pagination information. ```json { "data": [ { "id": 0, "departmentId": 0, "employeeId": 0, "employeeGroupId": 0, "positionId": 0, "shiftTypeId": 0, "date": "2025-01-01", "startDateTime": "2025-01-01T00:00", "endDateTime": "2025-01-01T00:00", "description": "string" } ], "paging": { "total": 0 } } ``` -------------------------------- ### Get Punch Clock Break Records Source: https://developer.planday.com/guides/timeclock-guide Retrieves break records associated with a specific Punch Clock entry using its ID. ```APIDOC ## GET /punchclock/v{version}/punchclockshifts/{punchClockShiftId}/breaks ### Description Retrieves break records associated with a specific Punch Clock entry. ### Method GET ### Endpoint /punchclock/v{version}/punchclockshifts/{punchClockShiftId}/breaks ### Parameters #### Path Parameters - **punchClockShiftId** (string) - Required - The ID of the Punch Clock entry to retrieve breaks for. ``` -------------------------------- ### GET Security groups for portal Source: https://developer.planday.com/api/securitygroupmembership Retrieves a list of security groups available for the portal. Requires authorization and the 'securitygroups read' scope. ```APIDOC ## GET Security groups for portal ### Description Retrieves a list of security groups for the portal. ### Method GET ### Endpoint /securityGroupMembership/v1.0/securityGroups ### Responses #### Success Response (200) - **id** (integer) - The unique identifier of the security group. - **name** (string) - The name of the security group. - **employeeCount** (integer) - The number of employees in the security group. #### Response Example (200) ```json [ { "id": 0, "name": "string", "employeeCount": 0 } ] ``` ``` -------------------------------- ### Get Skills Source: https://developer.planday.com/api/schedule Retrieves a list of skills that can be used for scheduling. Supports filtering by department and employee group. Requires authorization and the 'shifttype:read' scope. ```APIDOC ## GET Skills Returns the list of Skills that can be used for scheduling **Required scope** : shifttype read. Requires authorization. ##### query Parameters DepartmentIdrequired| integer or null Department Id ---|--- EmployeeGroupId| integer or null Employee Group Id Offset| integer or null Offset Limit| integer or null Limit ### Responses **200** Success **401** Unauthorized **403** Your application isn't assigned to the appropriate scope, so it can't perform this action. **429** Too many requests get/scheduling/v1.0/skills https://openapi.planday.com/scheduling/v1.0/skills ``` -------------------------------- ### CURL: Access Planday API Resources Source: https://developer.planday.com/gettingstarted/authorization This cURL command shows how to fetch departments from the Planday API. Ensure you include the correct Authorization and X-ClientId headers with your tokens. ```curl curl -X GET \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "X-ClientId: CLIENT_ID" \ https://openapi.planday.com/hr/v1/Departments ``` -------------------------------- ### Get Revenue Units for Department Source: https://developer.planday.com/api/revenue Retrieves a list of revenue units associated with a specific department. Supports pagination via offset and limit parameters. ```APIDOC ## GET /revenue/v1.0/departments/{departmentId}/revenueunits ### Description Gets revenue units of a given department. ### Method GET ### Endpoint https://openapi.planday.com/revenue/v1.0/departments/{departmentId}/revenueunits ### Parameters #### Path Parameters - **departmentId** (integer) - Required - Department ID #### Query Parameters - **offset** (integer or null) - Optional - Default: 0. Skip first "offset" records (for paging purposes). - **limit** (integer or null) - Optional - Default: 50. Return no more than "limit" records. Maximum of 50 records per request. ### Responses #### Success Response (200) - **paging** (object) - **offset** (integer) - **limit** (integer) - **total** (integer) - **data** (array of objects) - **id** (integer) - **departmentId** (integer) - **name** (string) - **description** (string) - **allowPurchases** (boolean) - **allowSale** (boolean) - **sortValue** (integer) - **includeInGlobalTurnover** (boolean) #### Response Example (200) ```json { "paging": { "offset": 0, "limit": 0, "total": 0 }, "data": [ { "id": 0, "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 0, "includeInGlobalTurnover": true } ] } ``` #### Error Responses - **401**: Unauthorized - **403**: Your application isn't assigned to the appropriate scope, so it can't perform this action. - **429**: Too many requests ``` -------------------------------- ### Create Revenue Unit Input Model Source: https://developer.planday.com/api/revenue Use this model to create a new revenue unit. The 'name' field is mandatory. Requires 'revenue set' scope. ```json { "departmentId": 0, "name": "string", "description": "string", "allowPurchases": true, "allowSale": true, "sortValue": 100, "includeInGlobalTurnover": true } ``` -------------------------------- ### Get Daily Budgets Source: https://developer.planday.com/api/revenue Retrieve daily budgets by specifying a date range and optionally filtering by department IDs. Requires 'revenue read' scope. ```http GET https://openapi.planday.com/revenue/v1.0/budgets?from=2026-04-29&to=2026-04-29&departmentIds=1,2 ```