Visma Cloud Payroll (Spiris Lon) API

REST API for Spiris Lon / Visma Cloud Payroll covering employees, employments, salary transactions, absences, pay periods, payslips and accounting output. Published as OpenAPI 3.0.4 in two live versions, V2 (68 paths / 88 operations) and V1 (73 paths / 63 operations), served from vlsapi.vismaonline.com and sharing the Visma Online IdentityServer with eAccounting.

Operations 88

GET /v2/agreements Get agreements
POST /v2/agreements Creates an agreement.
GET /v2/agreements/{agreementId} Get agreement by id
GET /v2/breakrules Get break rules
POST /v2/breakrules Create a break rule
GET /v2/breakrules/{breakRuleId} Get break rule by id
POST /v2/shortcuts/careofsickchild Create a care of sick child shortcut
GET /v2/shortcuts/careofsickchild/{shortcutId} Get a care of sick child shortcut by id
PUT /v2/shortcuts/careofsickchild/{shortcutId} Update a care of sick child shortcut
DELETE /v2/shortcuts/careofsickchild/{shortcutId} Delete a care of sick child shortcut
GET /v2/shortcuts/careofsickchild/{startDate}/{endDate} Get care of sick child shortcuts between dates
GET /v2/employees Get all employees
POST /v2/employees Create employee
GET /v2/employees/{employeeId} Get employee by id
POST /v2/employees/{employeeId}/workschedules Create employee work schedule
POST /v2/employees/{employeeId}/agreements Create employee agreement
GET /v2/externalperiods Get external periods
POST /v2/externalperiods Create an external period
GET /v2/externalperiods/{externalPeriodId} Get external period by unique identifier
DELETE /v2/externalperiods/{externalPeriodId} Delete an external period
GET /v2/externalperiods/{employeeId}/{deviationDate} Get external period by employee and deviation date
POST /v2/shortcuts/holiday Create a holiday shortcut
GET /v2/shortcuts/holiday/{shortcutId} Get a holiday shortcut by id
PUT /v2/shortcuts/holiday/{shortcutId} Update a holiday shortcut
DELETE /v2/shortcuts/holiday/{shortcutId} Delete a holiday shortcut
GET /v2/shortcuts/holiday/{startDate}/{endDate} Get holiday shortcuts between dates
POST /v2/shortcuts/hoursworked Create an hours worked shortcut
GET /v2/shortcuts/hoursworked/{shortcutId} Get an hours worked shortcut by id
PUT /v2/shortcuts/hoursworked/{shortcutId} Update an hours worked shortcut
DELETE /v2/shortcuts/hoursworked/{shortcutId} Delete an hours worked shortcut
GET /v2/shortcuts/hoursworked/{startDate}/{endDate} Get hours worked shortcuts between dates
POST /v2/shortcuts/otherabsence Create an other absence shortcut
GET /v2/shortcuts/otherabsence/{shortcutId} Get an other absence shortcut by id
PUT /v2/shortcuts/otherabsence/{shortcutId} Update an other absence shortcut
DELETE /v2/shortcuts/otherabsence/{shortcutId} Delete an other absence shortcut
GET /v2/shortcuts/otherabsence/{startDate}/{endDate} Get other absence shortcuts between dates
POST /v2/shortcuts/otheradditiondeduction Create other addition and deduction shortcut
GET /v2/shortcuts/otheradditiondeduction/{shortcutId} Get other addition and deduction shortcut by id
PUT /v2/shortcuts/otheradditiondeduction/{shortcutId} Update other addition and deduction shortcut
DELETE /v2/shortcuts/otheradditiondeduction/{shortcutId} Delete other addition and deduction shortcut
GET /v2/shortcuts/otheradditiondeduction/{startDate}/{endDate} Get other addition and deduction shortcuts between dates
POST /v2/shortcuts/overtime Create an overtime shortcut
GET /v2/shortcuts/overtime/{shortcutId} Get an overtime shortcut by id
PUT /v2/shortcuts/overtime/{shortcutId} Update an overtime shortcut
DELETE /v2/shortcuts/overtime/{shortcutId} Delete an overtime shortcut
GET /v2/shortcuts/overtime/{startDate}/{endDate} Get overtime shortcuts between dates
POST /v2/shortcuts/parentalleave Create a parental leave shortcut
GET /v2/shortcuts/parentalleave/{shortcutId} Get a parental leave shortcut by id
PUT /v2/shortcuts/parentalleave/{shortcutId} Update a parental leave shortcut
DELETE /v2/shortcuts/parentalleave/{shortcutId} Delete a parental leave shortcut
GET /v2/shortcuts/parentalleave/{startDate}/{endDate} Get parental leave shortcuts between dates
GET /v2/paycodes Gets paycodes
GET /v2/paycodes/{paycodeId} Gets a paycode by id
GET /v2/paycodes/travelandexpense Gets paycodes to use for travel and expense shortcut.
GET /v2/paycodes/otheradditiondeduction Gets paycodes to use for other addition deduction shortcut.
GET /v2/payrollsettings Get payroll settings.
GET /v2/payslips/wagerun/{wagerunId} Gets payslips for specified wage run
GET /v2/payslips/{payslipId} Gets payslip by id
GET /v2/payslips/{employeeId}/withdetails Gets all employees payslips with employee details
POST /v2/shortcuts/sickleave Create a sick leave shortcut
GET /v2/shortcuts/sickleave/{shortcutId} Get a sick leave shortcut by id
PUT /v2/shortcuts/sickleave/{shortcutId} Update a sick leave shortcut
DELETE /v2/shortcuts/sickleave/{shortcutId} Delete a sick leave shortcut
GET /v2/shortcuts/sickleave/{startDate}/{endDate} Get sick leave shortcuts between dates
POST /v2/shortcuts/timebank Create a timebank shortcut
GET /v2/shortcuts/timebank/{shortcutId} Get a timebank shortcut by id
PUT /v2/shortcuts/timebank/{shortcutId} Update a timebank shortcut
DELETE /v2/shortcuts/timebank/{shortcutId} Delete a timebank shortcut
GET /v2/shortcuts/timebank/{startDate}/{endDate} Get timebank shortcuts between dates
GET /v2/timeruleannualdates Get time rule annual dates
POST /v2/timeruleannualdates Create an annual date for time rule
GET /v2/timeruleannualdates/{timeRuleAnnualDateId} Get time rule annual date by unique identifier
POST /v2/shortcuts/travelandexpense Create a travel and expense shortcut
GET /v2/shortcuts/travelandexpense/{shortcutId} Get a travel and expense shortcut by id
PUT /v2/shortcuts/travelandexpense/{shortcutId} Update a travel and expense shortcut
DELETE /v2/shortcuts/travelandexpense/{shortcutId} Delete a travel and expense shortcut
GET /v2/shortcuts/travelandexpense/{startDate}/{endDate} Get travel and expense shortcuts between dates
GET /v2/wageruns Get wage runs
GET /v2/wageruns/{wagerunId} Get wage run by unique identifier
GET /v2/workdayoverrides Get work day overrides
POST /v2/workdayoverrides Create a work day override
GET /v2/workdayoverrides/{workDayOverrideId} Get work day override by unique identifier
GET /v2/workschedules Get work schedules
POST /v2/workschedules Create a work schedule
GET /v2/workschedules/{workScheduleId} Get work schedule by unique identifier
GET /v2/workscheduletimeadjustments Get work schedule time adjustments
POST /v2/workscheduletimeadjustments Create a work schedule time adjustment
GET /v2/workscheduletimeadjustments/{workScheduleTimeAdjustmentId} Get work schedule time adjustment by unique identifier

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/visma-payroll-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

visma-payroll-api-v2-openapi.json Raw ↑
{
  "openapi": "3.0.4",
  "info": {
    "title": "Spiris Lön API V2",
    "description": "Visit our complete [Spiris Lön/Cloud Payroll API docs](https://developer.vismaonline.com) for how to get started, more information about authentication, error handling, query customization and more.",
    "contact": {
      "email": "api@spiris.se"
    },
    "version": "v2"
  },
  "servers": [
    {
      "url": "https://vlsapi.vismaonline.com/"
    }
  ],
  "paths": {
    "/v2/agreements": {
      "get": {
        "tags": [
          "Agreements"
        ],
        "summary": "Get agreements",
        "description": "Get all agreements or add query parameters to filter the results.  The response will include a paginated list of agreements.\r\n  \r\n\r\n",
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseOfAgreementResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Agreements"
        ],
        "summary": "Creates an agreement.",
        "description": "Creates an agreement.\r\n\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CreateAgreementRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgreementResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/agreements/{agreementId}": {
      "get": {
        "tags": [
          "Agreements"
        ],
        "summary": "Get agreement by id",
        "description": " Gets an agreement by specified id.\r\n\r\n",
        "parameters": [
          {
            "name": "agreementId",
            "in": "path",
            "description": "Id of the agreement",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The agreement with the specified id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgreementResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/breakrules": {
      "get": {
        "tags": [
          "BreakRule"
        ],
        "summary": "Get break rules",
        "description": "Get all break rules or add query parameters to filter the results. The response will include a paginated list of break rules.\r\n\r\n\r\n",
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseOfBreakRuleResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "BreakRule"
        ],
        "summary": "Create a break rule",
        "description": "Create a break rule with properties specified in the request body\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CreateBreakRuleRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Resource created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BreakRuleResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/breakrules/{breakRuleId}": {
      "get": {
        "tags": [
          "BreakRule"
        ],
        "summary": "Get break rule by id",
        "description": "Gets a specific break rule by ID. Query options can be applied to customize the response. The response contains the requested break rule.\r\n\r\n\r\n",
        "parameters": [
          {
            "name": "breakRuleId",
            "in": "path",
            "description": "The Id of the break rule",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BreakRuleResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/shortcuts/careofsickchild": {
      "post": {
        "tags": [
          "CareOfSickChild"
        ],
        "summary": "Create a care of sick child shortcut",
        "description": "Create a new care of sick child shortcut for an employee. The shortcut will be registered based on the specified registration method (time, hours, or percentage). If the end date is in a different month than the start date, the shortcut will be split into separate shortcuts for each month.\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CareOfSickChildRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CareOfSickChildResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/shortcuts/careofsickchild/{shortcutId}": {
      "get": {
        "tags": [
          "CareOfSickChild"
        ],
        "summary": "Get a care of sick child shortcut by id",
        "description": "Get a specific care of sick child shortcut by its unique identifier. Use query parameters to select specific properties in the response.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The care of sick child shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CareOfSickChildResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "CareOfSickChild"
        ],
        "summary": "Update a care of sick child shortcut",
        "description": "Update an existing care of sick child shortcut by replacing its content. Only shortcuts that have not been read (imported by a payroll administrator) can be updated. The shortcut must belong to the same third-party client that created it.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CareOfSickChildRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CareOfSickChildResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "CareOfSickChild"
        ],
        "summary": "Delete a care of sick child shortcut",
        "description": "Delete a care of sick child shortcut by its unique identifier. Only shortcuts that have not been read (imported by a payroll administrator) can be deleted. The shortcut must belong to the same third-party client that created it.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful"
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/shortcuts/careofsickchild/{startDate}/{endDate}": {
      "get": {
        "tags": [
          "CareOfSickChild"
        ],
        "summary": "Get care of sick child shortcuts between dates",
        "description": "Get all care of sick child shortcuts within a specified date range. Use query parameters to filter the results or include only shortcuts created by the same client.\r\n\r\n",
        "parameters": [
          {
            "name": "startDate",
            "in": "path",
            "description": "Start date in format yyyy-MM-dd",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "endDate",
            "in": "path",
            "description": "End date in format yyyy-MM-dd",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "includeOnlySameClientShortcuts",
            "in": "query",
            "description": "If true, only includes shortcuts created by the same client",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CareOfSickChildResponse"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/migration/companysettings": { },
    "/v2/migration/company/completeguide": { },
    "/v2/migration/company/mtmigrationguidestatuscompleted": { },
    "/v2/migration/company/guidestate": { },
    "/v2/migration/employees": { },
    "/v2/migration/employees/{employeeId}": { },
    "/v2/employees": {
      "get": {
        "tags": [
          "Employees"
        ],
        "summary": "Get all employees",
        "description": "Retrieves a paginated list of all employees in the company. \r\nYou can use query options ($filter, $select, $orderby, $top, $skip) to customize your request.\r\nThe endpoint includes both active and draft employees but excludes deleted employees. Limited employees are also included in the results.\r\n\r\n\r\n",
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseOfEmployeeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Employees"
        ],
        "summary": "Create employee",
        "description": "Create employee in this company.\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/CreateEmployeeRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Resource created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateEmployeeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/employees/{employeeId}": {
      "get": {
        "tags": [
          "Employees"
        ],
        "summary": "Get employee by id",
        "description": "Retrieves a specific employee by their unique identifier. The response includes comprehensive employee information such as personal details, contact information, address, employment status and other associated information.\nYou can use OData query options like `$select` to retrieve only specific fields from the employee record.\n\n\r\n\r\n",
        "parameters": [
          {
            "name": "employeeId",
            "in": "path",
            "description": "Id of the employee",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/employees/{employeeId}/workschedules": {
      "post": {
        "tags": [
          "Employees"
        ],
        "summary": "Create employee work schedule",
        "description": "Add a work schedule to an employee.\r\n\r\n",
        "parameters": [
          {
            "name": "employeeId",
            "in": "path",
            "description": "Id of employee",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/AddWorkScheduleToEmployeeRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddWorkScheduleToEmployeeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/employees/{employeeId}/agreements": {
      "post": {
        "tags": [
          "Employees"
        ],
        "summary": "Create employee agreement",
        "description": "Add an agreement to an employee.\r\n\r\n",
        "parameters": [
          {
            "name": "employeeId",
            "in": "path",
            "description": "Id of employee",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/AddAgreementToEmployeeRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddAgreementToEmployeeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/externalperiods": {
      "get": {
        "tags": [
          "ExternalPeriods"
        ],
        "summary": "Get external periods",
        "description": "Get external periods.\n\r\n\r\n",
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedResponseOfExternalPeriodResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "ExternalPeriods"
        ],
        "summary": "Create an external period",
        "description": "Create an external period.\n\nThe request is validated as follows:\n\n- A project/cost-center distribution is required.\n- Within each of `Project`, `CostCenter1`, `CostCenter2` and `CostCenter3`, percentages must be non-negative and total at most 100%. An allocation with a percentage of 0 is kept and applied as a 0% row on the payslip; it is not discarded.\n- Referenced projects and cost center items must exist on the company, and each cost center item must belong to the cost center dimension it is supplied under.\n- For requests that carry a project/cost-center distribution, `DeviationPeriodToDate` must match the employee's payroll period settings (the last day of a month, or the company's configured payment period day).\n- The period cannot be earlier than the employee's latest locked payslip.\n\nA validation failure returns `400 Bad Request` with a message describing the failing rule.\n\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ExternalPeriodRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPeriodResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/externalperiods/{externalPeriodId}": {
      "get": {
        "tags": [
          "ExternalPeriods"
        ],
        "summary": "Get external period by unique identifier",
        "description": "Get external period by unique identifier.\n\r\n\r\n",
        "parameters": [
          {
            "name": "externalPeriodId",
            "in": "path",
            "description": "The external period unique identifier",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPeriodResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "ExternalPeriods"
        ],
        "summary": "Delete an external period",
        "description": "Delete an external period.\n\r\n\r\n",
        "parameters": [
          {
            "name": "externalPeriodId",
            "in": "path",
            "description": "The external period unique identifier",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful"
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/externalperiods/{employeeId}/{deviationDate}": {
      "get": {
        "tags": [
          "ExternalPeriods"
        ],
        "summary": "Get external period by employee and deviation date",
        "description": "Get external period by employee and deviation date.\n\r\n\r\n",
        "parameters": [
          {
            "name": "employeeId",
            "in": "path",
            "description": "The unique identifier of the employee",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "deviationDate",
            "in": "path",
            "description": "The deviation date in format yyyy-MM-dd",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalPeriodResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/shortcuts/holiday": {
      "post": {
        "tags": [
          "Holiday"
        ],
        "summary": "Create a holiday shortcut",
        "description": "Create a new holiday shortcut for an employee. The shortcut will be registered based on the specified registration method (time, hours or percentage).\r\n\r\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/HolidayRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HolidayResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      }
    },
    "/v2/shortcuts/holiday/{shortcutId}": {
      "get": {
        "tags": [
          "Holiday"
        ],
        "summary": "Get a holiday shortcut by id",
        "description": "Get a specific holiday shortcut by its unique identifier. Use query parameters to select specific properties in the response.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The holiday shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HolidayResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Holiday"
        ],
        "summary": "Update a holiday shortcut",
        "description": "Update an existing holiday shortcut by replacing its content. Only shortcuts that have not been read (imported by a payroll administrator) can be updated. The shortcut must belong to the same third-party client that created it.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/HolidayRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Request successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HolidayResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommonExtendedBadRequest"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Holiday"
        ],
        "summary": "Delete a holiday shortcut",
        "description": "Delete a holiday shortcut by its unique identifier. Only shortcuts that have not been read (imported by a payroll administrator) can be deleted. The shortcut must belong to the same third-party client that created it.\r\n\r\n",
        "parameters": [
          {
            "name": "shortcutId",
            "in": "path",
            "description": "The shortcut id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Request successful"
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
 

# --- truncated at 32 KB (418 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/visma/refs/heads/main/openapi/visma-payroll-api-v2-openapi.json