Read Papershift absences, vacation, time tracking and shifts; request and review absences.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: put an employee on a shift (or, with application true, record them as having applied for it). The employee is typically notified of the assignment. An already assigned user is re-assigned. Returns the shift's assigned and applied users. POST /assignments.
Employee to assign.
Papershift shift id.
True = record as an application instead of assigning directly.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE: put an employee on a shift (or, with application true, record them as having applied for it). The employee is typically notified of the assignment. An already assigned user is re-assigned. Returns the shift's assigned and applied users. POST /assignments.
| Argument | Type | Description |
|---|---|---|
| user_id* | integer | Employee to assign. |
| shift_id* | integer | Papershift shift id. |
| application | boolean | True = record as an application instead of assigning directly. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"shift_id",
"user_id"
],
"properties": {
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Employee to assign.",
"exclusiveMinimum": 0
},
"shift_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift shift id.",
"exclusiveMinimum": 0
},
"application": {
"type": "boolean",
"description": "True = record as an application instead of assigning directly."
}
}
}WRITE: confirm (approve) a worked-time entry so it counts as final for payroll and balances. Find ids with papershift_list_time_trackings. PUT /working_sessions/confirm.
| Argument | Type | Description |
|---|---|---|
| time_tracking_id* | integer | Papershift time tracking (working session) id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"time_tracking_id"
],
"properties": {
"time_tracking_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift time tracking (working session) id.",
"exclusiveMinimum": 0
}
}
}WRITE: record an absence (vacation, sick leave, ...) for an employee. Get the absence type id from papershift_list_absence_types and the user id from papershift_list_users. Whether it counts immediately or waits for approval depends on the absence type and the account's approval rules; the employee may be notified. Papershift calculates the paid hours and vacation days. POST /absences.
| Argument | Type | Description |
|---|---|---|
| ends_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| user_id* | integer | Employee the absence is for. |
| full_day | boolean | True for whole-day absences. |
| starts_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| time_zone | string | IANA time zone of the times, e.g. Europe/Berlin (recommended). |
| absence_type_id* | integer | Absence type id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id",
"absence_type_id",
"starts_at",
"ends_at"
],
"properties": {
"ends_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Employee the absence is for.",
"exclusiveMinimum": 0
},
"full_day": {
"type": "boolean",
"description": "True for whole-day absences."
},
"starts_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"time_zone": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:\\/[A-Za-z0-9_+-]+){0,2}$",
"maxLength": 64,
"description": "IANA time zone of the times, e.g. Europe/Berlin (recommended)."
},
"absence_type_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Absence type id.",
"exclusiveMinimum": 0
}
}
}WRITE: plan a new shift in a location and working area for a number of employees. Set visible to true only if employees should see it right away (default: left to the account's setting). Assign people afterwards with papershift_assign_user_to_shift. POST /shifts.
| Argument | Type | Description |
|---|---|---|
| note | string | Optional note shown on the shift. |
| ends_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| tag_ids | array | Tag ids to put on the shift (papershift_list_tags). |
| visible | boolean | Whether employees can see the shift (published). |
| starts_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| location_id* | integer | Location of the shift. |
| working_area_id* | integer | Working area of the shift. |
| number_of_employees* |
WRITE: add a worked-time entry for an employee after the fact (start, end and break minutes) in a location and working area. It changes the employee's recorded hours and balance. Ids from papershift_list_locations, papershift_list_working_areas and papershift_list_users. POST /working_sessions.
| Argument | Type | Description |
|---|---|---|
| ends_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| user_id* | integer | Employee who worked. |
| starts_at* | string | ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00. |
| location_id* | integer | Location the work was done in. |
| manual_pause | integer | Break length in minutes. |
| working_area_id* | integer | Working area the work was done in. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id",
"location_id",
"working_area_id",
"starts_at",
"ends_at"
],
"properties": {
"ends_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Employee who worked.",
"exclusiveMinimum": 0
},
"starts_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Location the work was done in.",
"exclusiveMinimum": 0
},
"manual_pause": {
"type": "integer",
"maximum": 1440,
"minimum": 0,
"description": "Break length in minutes."
},
"working_area_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Working area the work was done in.",
"exclusiveMinimum": 0
}
}
}One absence by id, with its status, confirmation, hours and vacation days. GET /absences?id=.
| Argument | Type | Description |
|---|---|---|
| absence_id* | integer | Papershift absence id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"absence_id"
],
"properties": {
"absence_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift absence id.",
"exclusiveMinimum": 0
}
}
}The Papershift account this API key belongs to (id and name). A quick way to check the connection. GET /accounts.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}One location by id. GET /locations?id=.
| Argument | Type | Description |
|---|---|---|
| location_id* | integer | Papershift location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift location id.",
"exclusiveMinimum": 0
}
}
}One shift by id. GET /shifts?id=.
| Argument | Type | Description |
|---|---|---|
| shift_id* | integer | Papershift shift id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"shift_id"
],
"properties": {
"shift_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift shift id.",
"exclusiveMinimum": 0
}
}
}One worked-time entry by id, with its breaks, tags and break total. GET /working_sessions?id=.
| Argument | Type | Description |
|---|---|---|
| time_tracking_id* | integer | Papershift time tracking (working session) id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"time_tracking_id"
],
"properties": {
"time_tracking_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift time tracking (working session) id.",
"exclusiveMinimum": 0
}
}
}One employee by id: contact data, status, locations, working areas, tags and profile fields. GET /users?id=.
| Argument | Type | Description |
|---|---|---|
| user_id* | integer | Papershift user id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id"
],
"properties": {
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
}
}
}List the absence types of a location (vacation, sick leave, ...) with id, title and rules. Use the ids to create absences. GET /absence_types.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| location_id* | integer | Papershift location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift location id.",
"exclusiveMinimum": 0
}
}
}List absences (vacation, sick leave, ...) that fall between two dates, optionally for one employee or location. Shows type title, times, hours, vacation days and whether it is confirmed. 25 per page. GET /absences.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id | integer | Only this employee. |
| range_end* | string | Last day of the range, yyyy-mm-dd. |
| location_id | integer | Only this location. |
| range_start* | string | First day of the range, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"range_start",
"range_end"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this employee.",
"exclusiveMinimum": 0
},
"range_end": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day of the range, yyyy-mm-dd."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this location.",
"exclusiveMinimum": 0
},
"range_start": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day of the range, yyyy-mm-dd."
}
}
}The times an employee has marked as available between two dates. 25 per page. GET /availabilities.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id* | integer | Papershift user id. |
| end_date* | string | Last day, yyyy-mm-dd. |
| start_date* | string | First day, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id",
"start_date",
"end_date"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day, yyyy-mm-dd."
},
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day, yyyy-mm-dd."
}
}
}An employee's daily evaluations: target, planned and actual hours, vacation and compensation per day. Use it for overtime and balance questions. 25 per page. GET /evaluations.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id* | integer | Papershift user id. |
| range_end | string | Last day, yyyy-mm-dd (default: today). |
| range_start* | string | First day, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id",
"range_start"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
},
"range_end": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day, yyyy-mm-dd (default: today)."
},
"range_start": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day, yyyy-mm-dd."
}
}
}List all locations (sites/companies inside the account) with id, name and status. Most other tools need a location id from here. GET /locations.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}An employee's payroll entries (paid hours, salary, bonus, time-account start/end per period). Sensitive pay data. 25 per page. GET /payrolls.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id* | integer | Papershift user id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
}
}
}Who is assigned to a shift and who has applied for it (user id and name). GET /assignments?shift_id=.
| Argument | Type | Description |
|---|---|---|
| shift_id* | integer | Papershift shift id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"shift_id"
],
"properties": {
"shift_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift shift id.",
"exclusiveMinimum": 0
}
}
}List planned shifts of a location between two dates, optionally for one working area or tags. Shows start, end, number of employees needed, note and visibility. Assigned employees: papershift_list_shift_assignments. 25 per page. GET /shifts.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| tag_ids | array | Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags. |
| range_end* | string | Last day, yyyy-mm-dd. |
| location_id* | integer | Papershift location id. |
| range_start* | string | First day, yyyy-mm-dd. |
| working_area_id | integer | Only this working area. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id",
"range_start",
"range_end"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"maxItems": 50,
"minItems": 1,
"description": "Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags."
},
"range_end": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day, yyyy-mm-dd."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift location id.",
"exclusiveMinimum": 0
},
"range_start": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day, yyyy-mm-dd."
},
"working_area_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this working area.",
"exclusiveMinimum": 0
}
}
}List the tags of a location (labels on shifts, time trackings and employees). GET /filters.
| Argument | Type | Description |
|---|---|---|
| location_id* | integer | Papershift location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift location id.",
"exclusiveMinimum": 0
}
}
}An employee's contractual target hours (weekly/monthly rhythm and hours per weekday) over time. 25 per page. GET /target_hours.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id* | integer | Papershift user id. |
| end_date | string | Only entries up to this date, yyyy-mm-dd. |
| start_date | string | Only entries from this date, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Only entries up to this date, yyyy-mm-dd."
},
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Only entries from this date, yyyy-mm-dd."
}
}
}List worked-time entries (clock-ins) from a start date, optionally to an end date and for one employee. Shows start, end, break time, location, employee and whether confirmed. 25 per page. GET /working_sessions.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id | integer | Only this employee. |
| range_end | string | Last day, yyyy-mm-dd (default: no end). |
| range_start* | string | First day, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"range_start"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this employee.",
"exclusiveMinimum": 0
},
"range_end": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day, yyyy-mm-dd (default: no end)."
},
"range_start": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day, yyyy-mm-dd."
}
}
}List employees (users) with name, email, status, contract basics and their location, working-area and tag ids. Filter by location, working area or tag. 25 per page. GET /users.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| tag_ids | array | Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags. |
| location_id | integer | Only employees of this location. |
| working_area_id | integer | Only employees in this working area. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"maxItems": 50,
"minItems": 1,
"description": "Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only employees of this location.",
"exclusiveMinimum": 0
},
"working_area_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only employees in this working area.",
"exclusiveMinimum": 0
}
}
}An employee's vacation entitlements (planned days, spent days, expiry, carry-over) for the given period. Use it to answer 'how many vacation days does X have left'. 25 per page. GET /vacation_entitlements.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page. |
| user_id* | integer | Papershift user id. |
| end_date | string | Only entitlements up to this date, yyyy-mm-dd. |
| start_date | string | Only entitlements from this date, yyyy-mm-dd. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_id"
],
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift user id.",
"exclusiveMinimum": 0
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Only entitlements up to this date, yyyy-mm-dd."
},
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Only entitlements from this date, yyyy-mm-dd."
}
}
}List working areas (departments/stations shifts are planned in), optionally for one location. Use the ids for shifts and time trackings. GET /working_areas.
| Argument | Type | Description |
|---|---|---|
| location_id | integer | Only the working areas of this location. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only the working areas of this location.",
"exclusiveMinimum": 0
}
}
}WRITE: decide on an absence request. action 'confirm' approves it (it then counts against vacation days and the plan), 'reject' declines it, 'reset' puts a decided absence back to pending. The employee is typically notified of the decision. Find ids with papershift_list_absences. PUT /absences/{confirm|reject|reset}.
| Argument | Type | Description |
|---|---|---|
| action* | string | The decision. |
| absence_id* | integer | Papershift absence id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"absence_id",
"action"
],
"properties": {
"action": {
"enum": [
"confirm",
"reject",
"reset"
],
"type": "string",
"description": "The decision."
},
"absence_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Papershift absence id.",
"exclusiveMinimum": 0
}
}
}| integer |
| How many employees the shift needs. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id",
"working_area_id",
"starts_at",
"ends_at",
"number_of_employees"
],
"properties": {
"note": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "Optional note shown on the shift."
},
"ends_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"tag_ids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"maxItems": 50,
"minItems": 1,
"description": "Tag ids to put on the shift (papershift_list_tags)."
},
"visible": {
"type": "boolean",
"description": "Whether employees can see the shift (published)."
},
"starts_at": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00."
},
"location_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Location of the shift.",
"exclusiveMinimum": 0
},
"working_area_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Working area of the shift.",
"exclusiveMinimum": 0
},
"number_of_employees": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "How many employees the shift needs."
}
}
}