Simplify Workfeed schemas and endpoint descriptions:

- Removed unnecessary query parameters and pagination fields from `employees`, `shifts`, and `departments` endpoints.
- Standardized `description` fields with explicit API request details.
- Consolidated schema components (e.g., `WorkfeedPagination`) and enhanced examples for clarity.
- Updated API URL from `https://api.workfeed.io` to the new production endpoint.
- Improved shift schemas with granular fields for approvals, breaks, and comments.
This commit is contained in:
Jeppe Bundgaard
2026-03-24 11:37:16 +01:00
parent 44031da7b1
commit eeef782705
+137 -246
View File
@@ -7682,42 +7682,8 @@ paths:
tags: tags:
- Modules - Modules
summary: List Workfeed employees summary: List Workfeed employees
description: List employees from Workfeed with optional filtering and pagination description: List employees from Workfeed (`GET /companies/{CompanyID}/employees`)
operationId: workfeedListEmployees operationId: workfeedListEmployees
parameters:
- name: search
in: query
required: false
schema:
type: string
description: Search term for employee lookup
- name: departmentId
in: query
required: false
schema:
type: string
description: Filter by Workfeed department identifier
- name: includeInactive
in: query
required: false
schema:
oneOf:
- type: boolean
- type: string
description: Include inactive employees (`true`/`false`)
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses: responses:
'200': '200':
description: Workfeed employees retrieved successfully description: Workfeed employees retrieved successfully
@@ -7753,52 +7719,35 @@ paths:
tags: tags:
- Modules - Modules
summary: List Workfeed shifts summary: List Workfeed shifts
description: List Workfeed shifts with optional timeframe and pagination filters description: List Workfeed shifts (`GET /companies/{CompanyID}/shifts`)
operationId: workfeedListShifts operationId: workfeedListShifts
parameters: parameters:
- name: from - name: startFrom
in: query
required: true
schema:
type: string
format: date-time
description: Only return shifts starting on or after this timestamp (ISO 8601)
- name: startTo
in: query
required: true
schema:
type: string
format: date-time
description: Only return shifts starting before this timestamp (ISO 8601)
- name: employeeID
in: query in: query
required: false required: false
schema: schema:
type: string type: string
description: Shift start range filter (provider-specific date/time format) description: Filter shifts by employee ID
- name: to - name: released
in: query in: query
required: false required: false
schema: schema:
type: string type: boolean
description: Shift end range filter (provider-specific date/time format) description: Filter by released/published status
- name: departmentId
in: query
required: false
schema:
type: string
description: Filter by Workfeed department identifier
- name: employeeId
in: query
required: false
schema:
type: string
description: Filter by Workfeed employee identifier
- name: status
in: query
required: false
schema:
type: string
description: Filter by shift status
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses: responses:
'200': '200':
description: Workfeed shifts retrieved successfully description: Workfeed shifts retrieved successfully
@@ -7834,28 +7783,8 @@ paths:
tags: tags:
- Modules - Modules
summary: List Workfeed departments summary: List Workfeed departments
description: List departments from Workfeed with optional filtering and pagination description: List departments from Workfeed (`GET /companies/{CompanyID}/departments`)
operationId: workfeedListDepartments operationId: workfeedListDepartments
parameters:
- name: search
in: query
required: false
schema:
type: string
description: Search term for department lookup
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
description: Page size limit
- name: cursor
in: query
required: false
schema:
type: string
description: Cursor for paginated navigation
responses: responses:
'200': '200':
description: Workfeed departments retrieved successfully description: Workfeed departments retrieved successfully
@@ -8653,7 +8582,7 @@ paths:
- module: workfeed - module: workfeed
variable: api_url variable: api_url
type: string type: string
value: https://api.workfeed.io value: https://europe-west1-production-eu-327a3.cloudfunctions.net/api
- module: workfeed - module: workfeed
variable: api_key variable: api_key
type: string type: string
@@ -10145,7 +10074,7 @@ components:
module: { type: string, enum: [workfeed] } module: { type: string, enum: [workfeed] }
variable: { type: string, enum: [api_url] } variable: { type: string, enum: [api_url] }
type: { type: string, enum: [string] } type: { type: string, enum: [string] }
value: { type: string, example: "https://api.workfeed.io" } value: { type: string, example: "https://europe-west1-production-eu-327a3.cloudfunctions.net/api" }
required: [module, variable, type, value] required: [module, variable, type, value]
WorkfeedConfigApiKeyEntry: WorkfeedConfigApiKeyEntry:
@@ -10391,7 +10320,7 @@ components:
- module: workfeed - module: workfeed
variable: api_url variable: api_url
type: string type: string
value: https://api.workfeed.io value: https://europe-west1-production-eu-327a3.cloudfunctions.net/api
- module: workfeed - module: workfeed
variable: api_key variable: api_key
type: string type: string
@@ -10522,169 +10451,102 @@ components:
additionalProperties: true additionalProperties: true
required: [data] required: [data]
WorkfeedPagination:
type: object
description: Cursor-based pagination metadata returned by Workfeed list endpoints
properties:
cursor:
type: string
nullable: true
description: Cursor used for the current page
example: eyJpZCI6IjEyMyJ9
nextCursor:
type: string
nullable: true
description: Cursor token for the next page
example: eyJpZCI6IjEyNCJ9
previousCursor:
type: string
nullable: true
description: Cursor token for the previous page (if provided)
limit:
type: integer
nullable: true
minimum: 1
example: 50
total:
type: integer
nullable: true
minimum: 0
example: 184
additionalProperties: true
WorkfeedAddress:
type: object
properties:
line1: { type: string, nullable: true, example: "Main Street 1" }
line2: { type: string, nullable: true, example: "2nd floor" }
postalCode: { type: string, nullable: true, example: "2100" }
city: { type: string, nullable: true, example: "Copenhagen" }
region: { type: string, nullable: true, example: "Hovedstaden" }
country: { type: string, nullable: true, example: "DK" }
additionalProperties: true
WorkfeedDepartment: WorkfeedDepartment:
type: object type: object
properties: properties:
id: { type: string, example: "dep_01J5P2B0BC9Q2X7H8Y7JQ1M2N3" } id: { type: string, example: "PKHaOSgFA4uguOqmLfWv" }
externalId: { type: string, nullable: true, example: "truckwash_north" } name: { type: string, example: "API Testing Account 😎" }
name: { type: string, example: "North Facility" } isDeleted: { type: boolean, example: false }
timezone: { type: string, nullable: true, example: "Europe/Copenhagen" } createTime: { type: string, format: date-time, example: "2023-10-25T09:43:06.650Z" }
active: { type: boolean, nullable: true, example: true } updateTime: { type: string, format: date-time, example: "2023-10-25T09:43:06.650Z" }
address:
$ref: '#/components/schemas/WorkfeedAddress'
createdAt: { type: string, format: date-time, nullable: true, example: "2026-03-10T08:15:00Z" }
updatedAt: { type: string, format: date-time, nullable: true, example: "2026-03-22T14:05:31Z" }
additionalProperties: true additionalProperties: true
WorkfeedEmployee: WorkfeedEmployee:
type: object type: object
properties: properties:
id: { type: string, example: "emp_01J5P2F2A0CQKBBX4P8M3Y7R5P" } id: { type: string, example: "J9QAIiTG0nRC1OsC5YvHfLWdDHn1" }
externalId: { type: string, nullable: true, example: "tw_10042" } firstname: { type: string, example: "API 2" }
firstName: { type: string, nullable: true, example: "Anne" } lastname: { type: string, example: "Test 2" }
lastName: { type: string, nullable: true, example: "Nielsen" } email: { type: string, nullable: true, example: "test2@example.com" }
fullName: { type: string, nullable: true, example: "Anne Nielsen" } phone: { type: string, nullable: true, example: "12345678" }
email: { type: string, nullable: true, example: "anne.nielsen@example.com" } roleIDs:
phone: { type: string, nullable: true, example: "+4540123456" } type: array
jobTitle: { type: string, nullable: true, example: "Shift Lead" } items: { type: string }
active: { type: boolean, nullable: true, example: true } example: ["hLbEKIPTlMh3ehotXl0w"]
departmentId: { type: string, nullable: true, example: "dep_01J5P2B0BC9Q2X7H8Y7JQ1M2N3" } departmentIDs:
departmentName: { type: string, nullable: true, example: "North Facility" } type: array
department: items: { type: string }
$ref: '#/components/schemas/WorkfeedDepartment' example: ["PKHaOSgFA4uguOqmLfWv"]
hourlyRate: { type: number, format: float, nullable: true, example: 185.5 } primaryDepartmentID: { type: string, nullable: true }
currency: { type: string, nullable: true, example: "DKK" } street: { type: string, nullable: true, example: "" }
startDate: { type: string, format: date, nullable: true, example: "2025-09-01" } city: { type: string, nullable: true, example: "" }
endDate: { type: string, format: date, nullable: true } zip: { type: string, nullable: true, example: "" }
createdAt: { type: string, format: date-time, nullable: true, example: "2026-03-10T08:15:00Z" } accessLevel: { type: string, nullable: true, example: "employee" }
updatedAt: { type: string, format: date-time, nullable: true, example: "2026-03-22T14:05:31Z" } wage: { type: number, nullable: true }
minHours: { type: number, nullable: true }
maxHours: { type: number, nullable: true }
isDeleted: { type: boolean, example: false }
ssn: { type: string, nullable: true, example: "" }
imageURL: { type: string, nullable: true, format: uri }
createTime: { type: string, format: date-time, example: "2023-10-28T18:22:45.695Z" }
updateTime: { type: string, format: date-time, example: "2023-10-28T18:34:37.191Z" }
additionalProperties: true
WorkfeedShiftComment:
type: object
properties:
message: { type: string, nullable: true, example: "Comments! 😍" }
creatorID: { type: string, nullable: true, example: "API" }
createdOn: { type: string, format: date-time, nullable: true, example: "2023-10-27T09:43:36.542Z" }
additionalProperties: true
WorkfeedShiftCustomBreak:
type: object
properties:
creatorID: { type: string, nullable: true, example: "automatic" }
duration: { type: number, nullable: true, example: 1 }
createdOn: { type: string, format: date-time, nullable: true, example: "2023-10-27T09:10:30.336Z" }
additionalProperties: true
WorkfeedShiftApproval:
type: object
properties:
approver: { type: string, nullable: true, example: "automatic" }
date: { type: string, format: date-time, nullable: true, example: "2023-12-27T09:10:30.336Z" }
originalStart: { type: string, format: date-time, nullable: true, example: "2023-12-07T09:10:30.336Z" }
originalEnd: { type: string, format: date-time, nullable: true, example: "2023-12-08T09:10:30.336Z" }
additionalProperties: true additionalProperties: true
WorkfeedShift: WorkfeedShift:
type: object type: object
properties: properties:
id: { type: string, example: "shf_01J5P3X9D35R9C6BDZ1S0R4V6Q" } id: { type: string, example: "Trcu7MKFomu5y5zv1B8G" }
title: { type: string, nullable: true, example: "Morning Shift" } start: { type: string, format: date-time, example: "2023-10-23T08:00:00.000Z" }
status: { type: string, nullable: true, example: "published" } end: { type: string, format: date-time, example: "2023-10-23T16:00:00.000Z" }
employeeId: { type: string, nullable: true, example: "emp_01J5P2F2A0CQKBBX4P8M3Y7R5P" } employeeID: { type: string, nullable: true }
employeeName: { type: string, nullable: true, example: "Anne Nielsen" } roleID: { type: string, nullable: true, example: "hLbEKIPTlMh3ehotXl0w" }
departmentId: { type: string, nullable: true, example: "dep_01J5P2B0BC9Q2X7H8Y7JQ1M2N3" } departmentID: { type: string, nullable: true, example: "PKHaOSgFA4uguOqmLfWv" }
departmentName: { type: string, nullable: true, example: "North Facility" } released: { type: boolean, example: false }
startAt: { type: string, format: date-time, nullable: true, example: "2026-03-24T06:00:00Z" } isForSale: { type: boolean, nullable: true, example: false }
endAt: { type: string, format: date-time, nullable: true, example: "2026-03-24T14:00:00Z" } comment:
breakMinutes: { type: integer, nullable: true, minimum: 0, example: 30 } allOf:
durationMinutes: { type: integer, nullable: true, minimum: 0, example: 450 } - $ref: '#/components/schemas/WorkfeedShiftComment'
published: { type: boolean, nullable: true, example: true }
notes: { type: string, nullable: true, example: "Covering lane A and B" }
createdAt: { type: string, format: date-time, nullable: true, example: "2026-03-20T12:00:00Z" }
updatedAt: { type: string, format: date-time, nullable: true, example: "2026-03-23T11:42:19Z" }
additionalProperties: true
WorkfeedEmployeeListData:
type: object
description: Employee list payload from Workfeed. Supports both normalized and provider-native collection keys.
properties:
items:
type: array
items:
$ref: '#/components/schemas/WorkfeedEmployee'
results:
type: array
items:
$ref: '#/components/schemas/WorkfeedEmployee'
pagination:
$ref: '#/components/schemas/WorkfeedPagination'
cursor:
type: string
nullable: true nullable: true
nextCursor: customBreak:
type: string allOf:
- $ref: '#/components/schemas/WorkfeedShiftCustomBreak'
nullable: true nullable: true
additionalProperties: true overlappingLeaveID: { type: string, nullable: true }
approval:
WorkfeedShiftListData: allOf:
type: object - $ref: '#/components/schemas/WorkfeedShiftApproval'
description: Shift list payload from Workfeed. Supports both normalized and provider-native collection keys. nullable: true
properties: grossPay: { type: number, nullable: true }
items: tagIDs:
type: array type: array
items: items: { type: string }
$ref: '#/components/schemas/WorkfeedShift' createTime: { type: string, format: date-time, example: "2023-10-27T09:10:30.336Z" }
results: updateTime: { type: string, format: date-time, example: "2023-10-27T09:10:30.422Z" }
type: array
items:
$ref: '#/components/schemas/WorkfeedShift'
pagination:
$ref: '#/components/schemas/WorkfeedPagination'
cursor:
type: string
nullable: true
nextCursor:
type: string
nullable: true
additionalProperties: true
WorkfeedDepartmentListData:
type: object
description: Department list payload from Workfeed. Supports both normalized and provider-native collection keys.
properties:
items:
type: array
items:
$ref: '#/components/schemas/WorkfeedDepartment'
results:
type: array
items:
$ref: '#/components/schemas/WorkfeedDepartment'
pagination:
$ref: '#/components/schemas/WorkfeedPagination'
cursor:
type: string
nullable: true
nextCursor:
type: string
nullable: true
additionalProperties: true additionalProperties: true
WorkfeedEmployeeListResponse: WorkfeedEmployeeListResponse:
@@ -10693,7 +10555,9 @@ components:
- type: object - type: object
properties: properties:
data: data:
$ref: '#/components/schemas/WorkfeedEmployeeListData' type: array
items:
$ref: '#/components/schemas/WorkfeedEmployee'
required: [data] required: [data]
WorkfeedEmployeeSingleResponse: WorkfeedEmployeeSingleResponse:
@@ -10711,7 +10575,9 @@ components:
- type: object - type: object
properties: properties:
data: data:
$ref: '#/components/schemas/WorkfeedShiftListData' type: array
items:
$ref: '#/components/schemas/WorkfeedShift'
required: [data] required: [data]
WorkfeedShiftSingleResponse: WorkfeedShiftSingleResponse:
@@ -10729,7 +10595,9 @@ components:
- type: object - type: object
properties: properties:
data: data:
$ref: '#/components/schemas/WorkfeedDepartmentListData' type: array
items:
$ref: '#/components/schemas/WorkfeedDepartment'
required: [data] required: [data]
DepartmentWeatherTimelineResponse: DepartmentWeatherTimelineResponse:
@@ -13356,6 +13224,29 @@ components:
type: number type: number
description: Target value for the goal description: Target value for the goal
example: 100 example: 100
target_duration:
type: string
nullable: true
description: |
Optional advanced target duration mode.
Accepted values: ENTIRE_DURATION, WEEKS, MONTHS, YEARS.
When omitted, legacy target behavior is preserved for backward compatibility.
The canonical field name is snake_case `target_duration`.
For backward-compatibility the API also accepts camelCase `targetDuration` on input.
enum: [ENTIRE_DURATION, WEEKS, MONTHS, YEARS]
example: WEEKS
target_duration_every:
type: integer
nullable: true
minimum: 1
description: |
Optional cadence value used with `target_duration` WEEKS, MONTHS, or YEARS.
Example: with `target_duration=WEEKS` and `target_duration_every=2`,
the target applies every second week.
Ignored when `target_duration=ENTIRE_DURATION`.
The canonical field name is snake_case `target_duration_every`.
For backward-compatibility the API also accepts camelCase `targetDurationEvery` on input.
example: 1
label: label:
type: string type: string
description: Optional short label/title for this goal criteria (max 255 characters) description: Optional short label/title for this goal criteria (max 255 characters)