curl --request POST \
--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.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
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 => "POST",
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("POST", 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.post("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::Post.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{
"employee": {
"customer_id": "<string>",
"employee_id": "<string>",
"contract_id": "<string>",
"start_date": "<string>",
"contract_set": true,
"voided_draft_run_ids": [
"<string>"
],
"party_id": "<string>",
"reimbursement_account_reused": true
},
"workspace": {
"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>"
}Add an employee
NOT available to API keys — requires an interactive admin or existing approver session. Adds an employee to payroll. Salary and rate fields are integer cents; withholding/pension rates are basis points (10000 = 100%).
curl --request POST \
--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.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
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 => "POST",
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("POST", 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.post("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::Post.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{
"employee": {
"customer_id": "<string>",
"employee_id": "<string>",
"contract_id": "<string>",
"start_date": "<string>",
"contract_set": true,
"voided_draft_run_ids": [
"<string>"
],
"party_id": "<string>",
"reimbursement_account_reused": true
},
"workspace": {
"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
Created employee identifiers and updated payroll workspace.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes