curl --request PATCH \
--url https://api.app.lastaccountingcompany.com/portal/payroll/employees \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "<string>",
"period": "<string>",
"employee_id": "<string>",
"employee_key": "<string>",
"name": "<string>",
"tax_identifier": "<string>",
"iban": "<string>",
"bic": "<string>",
"start_date": "<string>",
"end_date": "<string>",
"contract_id": "<string>",
"employment_type": "<string>",
"monthly_salary_cents": 123,
"hourly_rate_cents": 123,
"weekly_hours": 123,
"withholding_basis_points": 123,
"pension_basis_points": 123,
"tax_card_additional_basis_points": 123,
"tax_card_income_ceiling_cents": 123,
"tax_card_effective_from": "<string>",
"reuse_person_reimbursement_account": true
}
'import requests
url = "https://api.app.lastaccountingcompany.com/portal/payroll/employees"
payload = {
"customer_id": "<string>",
"period": "<string>",
"employee_id": "<string>",
"employee_key": "<string>",
"name": "<string>",
"tax_identifier": "<string>",
"iban": "<string>",
"bic": "<string>",
"start_date": "<string>",
"end_date": "<string>",
"contract_id": "<string>",
"employment_type": "<string>",
"monthly_salary_cents": 123,
"hourly_rate_cents": 123,
"weekly_hours": 123,
"withholding_basis_points": 123,
"pension_basis_points": 123,
"tax_card_additional_basis_points": 123,
"tax_card_income_ceiling_cents": 123,
"tax_card_effective_from": "<string>",
"reuse_person_reimbursement_account": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: '<string>',
period: '<string>',
employee_id: '<string>',
employee_key: '<string>',
name: '<string>',
tax_identifier: '<string>',
iban: '<string>',
bic: '<string>',
start_date: '<string>',
end_date: '<string>',
contract_id: '<string>',
employment_type: '<string>',
monthly_salary_cents: 123,
hourly_rate_cents: 123,
weekly_hours: 123,
withholding_basis_points: 123,
pension_basis_points: 123,
tax_card_additional_basis_points: 123,
tax_card_income_ceiling_cents: 123,
tax_card_effective_from: '<string>',
reuse_person_reimbursement_account: true
})
};
fetch('https://api.app.lastaccountingcompany.com/portal/payroll/employees', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.app.lastaccountingcompany.com/portal/payroll/employees",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'period' => '<string>',
'employee_id' => '<string>',
'employee_key' => '<string>',
'name' => '<string>',
'tax_identifier' => '<string>',
'iban' => '<string>',
'bic' => '<string>',
'start_date' => '<string>',
'end_date' => '<string>',
'contract_id' => '<string>',
'employment_type' => '<string>',
'monthly_salary_cents' => 123,
'hourly_rate_cents' => 123,
'weekly_hours' => 123,
'withholding_basis_points' => 123,
'pension_basis_points' => 123,
'tax_card_additional_basis_points' => 123,
'tax_card_income_ceiling_cents' => 123,
'tax_card_effective_from' => '<string>',
'reuse_person_reimbursement_account' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.app.lastaccountingcompany.com/portal/payroll/employees"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.app.lastaccountingcompany.com/portal/payroll/employees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.lastaccountingcompany.com/portal/payroll/employees")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}"
response = http.request(request)
puts response.read_body{
"known_people": [
{
"party_id": "<string>",
"resource": {
"uri": "<string>",
"revision": "<string>"
},
"name": "<string>",
"email": "<string>",
"saved_account_last4": "<string>",
"linked_employee_id": "<string>"
}
],
"run": {
"payment_blocked_reason": "superseded_run",
"bank_paid_date": "2023-12-25",
"payment_date_reported": true,
"payment_instructions": {
"salary_total_cents": 1,
"salary_lines": [
{
"employee_id": "<string>",
"payee_name": "<string>",
"amount_cents": 2,
"status": "ready",
"iban": "<string>"
}
]
},
"payment_reconciliation": {
"lines": [
{
"review_revision": "<string>",
"bank_transaction_id": "<string>",
"bank_booking_date": "2023-12-25",
"bank_description": "<string>",
"bank_counterparty_name": "<string>",
"bank_reference": "<string>",
"state": "confirmed"
}
]
}
}
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}Update an employee
NOT available to API keys — requires an interactive admin or existing approver session. Partially updates an employee identified by employee_id or employee_key. Same units as creation: integer cents and basis points.
curl --request PATCH \
--url https://api.app.lastaccountingcompany.com/portal/payroll/employees \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "<string>",
"period": "<string>",
"employee_id": "<string>",
"employee_key": "<string>",
"name": "<string>",
"tax_identifier": "<string>",
"iban": "<string>",
"bic": "<string>",
"start_date": "<string>",
"end_date": "<string>",
"contract_id": "<string>",
"employment_type": "<string>",
"monthly_salary_cents": 123,
"hourly_rate_cents": 123,
"weekly_hours": 123,
"withholding_basis_points": 123,
"pension_basis_points": 123,
"tax_card_additional_basis_points": 123,
"tax_card_income_ceiling_cents": 123,
"tax_card_effective_from": "<string>",
"reuse_person_reimbursement_account": true
}
'import requests
url = "https://api.app.lastaccountingcompany.com/portal/payroll/employees"
payload = {
"customer_id": "<string>",
"period": "<string>",
"employee_id": "<string>",
"employee_key": "<string>",
"name": "<string>",
"tax_identifier": "<string>",
"iban": "<string>",
"bic": "<string>",
"start_date": "<string>",
"end_date": "<string>",
"contract_id": "<string>",
"employment_type": "<string>",
"monthly_salary_cents": 123,
"hourly_rate_cents": 123,
"weekly_hours": 123,
"withholding_basis_points": 123,
"pension_basis_points": 123,
"tax_card_additional_basis_points": 123,
"tax_card_income_ceiling_cents": 123,
"tax_card_effective_from": "<string>",
"reuse_person_reimbursement_account": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_id: '<string>',
period: '<string>',
employee_id: '<string>',
employee_key: '<string>',
name: '<string>',
tax_identifier: '<string>',
iban: '<string>',
bic: '<string>',
start_date: '<string>',
end_date: '<string>',
contract_id: '<string>',
employment_type: '<string>',
monthly_salary_cents: 123,
hourly_rate_cents: 123,
weekly_hours: 123,
withholding_basis_points: 123,
pension_basis_points: 123,
tax_card_additional_basis_points: 123,
tax_card_income_ceiling_cents: 123,
tax_card_effective_from: '<string>',
reuse_person_reimbursement_account: true
})
};
fetch('https://api.app.lastaccountingcompany.com/portal/payroll/employees', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.app.lastaccountingcompany.com/portal/payroll/employees",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'period' => '<string>',
'employee_id' => '<string>',
'employee_key' => '<string>',
'name' => '<string>',
'tax_identifier' => '<string>',
'iban' => '<string>',
'bic' => '<string>',
'start_date' => '<string>',
'end_date' => '<string>',
'contract_id' => '<string>',
'employment_type' => '<string>',
'monthly_salary_cents' => 123,
'hourly_rate_cents' => 123,
'weekly_hours' => 123,
'withholding_basis_points' => 123,
'pension_basis_points' => 123,
'tax_card_additional_basis_points' => 123,
'tax_card_income_ceiling_cents' => 123,
'tax_card_effective_from' => '<string>',
'reuse_person_reimbursement_account' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.app.lastaccountingcompany.com/portal/payroll/employees"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.app.lastaccountingcompany.com/portal/payroll/employees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.lastaccountingcompany.com/portal/payroll/employees")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"period\": \"<string>\",\n \"employee_id\": \"<string>\",\n \"employee_key\": \"<string>\",\n \"name\": \"<string>\",\n \"tax_identifier\": \"<string>\",\n \"iban\": \"<string>\",\n \"bic\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\",\n \"contract_id\": \"<string>\",\n \"employment_type\": \"<string>\",\n \"monthly_salary_cents\": 123,\n \"hourly_rate_cents\": 123,\n \"weekly_hours\": 123,\n \"withholding_basis_points\": 123,\n \"pension_basis_points\": 123,\n \"tax_card_additional_basis_points\": 123,\n \"tax_card_income_ceiling_cents\": 123,\n \"tax_card_effective_from\": \"<string>\",\n \"reuse_person_reimbursement_account\": true\n}"
response = http.request(request)
puts response.read_body{
"known_people": [
{
"party_id": "<string>",
"resource": {
"uri": "<string>",
"revision": "<string>"
},
"name": "<string>",
"email": "<string>",
"saved_account_last4": "<string>",
"linked_employee_id": "<string>"
}
],
"run": {
"payment_blocked_reason": "superseded_run",
"bank_paid_date": "2023-12-25",
"payment_date_reported": true,
"payment_instructions": {
"salary_total_cents": 1,
"salary_lines": [
{
"employee_id": "<string>",
"payee_name": "<string>",
"amount_cents": 2,
"status": "ready",
"iban": "<string>"
}
]
},
"payment_reconciliation": {
"lines": [
{
"review_revision": "<string>",
"bank_transaction_id": "<string>",
"bank_booking_date": "2023-12-25",
"bank_description": "<string>",
"bank_counterparty_name": "<string>",
"bank_reference": "<string>",
"state": "confirmed"
}
]
}
}
}{
"error": "<string>",
"detail": "<string>"
}{
"error": "<string>",
"detail": "<string>"
}Authorizations
Firebase ID token from an interactive portal session. Required for interactive operations (payroll, company settings, API-key management) and invoice decisions allowed by the member's review permissions.
Body
Employee create/update input. Salary and rate fields are integer cents; withholding and pension rates are basis points (10000 = 100%). Identify an existing employee with employee_id or employee_key when updating.
Target company. Optional for API keys.
Payroll period, YYYY-MM.
Finnish personal identity code (henkilötunnus).
Employment start, YYYY-MM-DD.
Employment end, YYYY-MM-DD.
Monthly salary in integer cents.
Hourly rate in integer cents.
Base withholding rate in basis points.
Employee pension rate in basis points.
Additional withholding rate in basis points.
Tax-card income ceiling in integer cents.
Tax card effective-from date, YYYY-MM-DD.
The exact canonical person (business.party resource, at the revision you were shown) this payroll employee is. Once linked, a reimbursement for that person with no explicit reimbursement account of its own is paid at the account saved here, so the account is entered once. The reference is refused if its revision is stale, if the party is not an employee of this company, if it was merged into another record, or if it — or this employee — is already linked to a different counterpart. An update carrying only employee_id and expected_party links an existing employee without touching any employment term.
Show child attributes
Show child attributes
Save the linked person's existing reimbursement account as this employee's payment account instead of entering it again. Requires expected_party (or an already linked employee) and must not be sent together with iban. Refused when that person has no saved reimbursement account, or when this employee already has a different salary account.
Response
Updated payroll workspace.
The payroll workspace for a period: employees, employer settings, and runs. Amounts are integer cents; rates are basis points. Interior shapes beyond the documented payment evidence fields vary and are returned as-is.
The employee parties this company already reimburses, offered to the employee form so a new or existing payroll employee can be bound to the person they already are. Each entry carries the exact business.party reference — revision included — to send back as expected_party; a picker that showed one person cannot commit a link to whoever that id names by the time it is saved. Only the last four digits of a saved reimbursement account travel with this read, and only under the admin/approver payroll role this whole workspace already requires.
Show child attributes
Show child attributes
Show child attributes
Show child attributes