curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"employee_id": "<id>",
"work_assignment_ids": [
"<id>"
]
}
]
'import requests
url = "https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates"
payload = [
{
"employee_id": "<id>",
"work_assignment_ids": ["<id>"]
}
]
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([{employee_id: '<id>', work_assignment_ids: ['<id>']}])
};
fetch('https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates', 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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates",
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([
[
'employee_id' => '<id>',
'work_assignment_ids' => [
'<id>'
]
]
]),
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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates"
payload := strings.NewReader("[\n {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates")
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 {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"data": [
{
"employee_id": "<id>",
"work_assignment_ids": [
"<id>"
],
"estimated_first_day_worked": null,
"estimated_last_day_worked": null,
"estimated_first_day_employed": "2026-01-01",
"estimated_last_day_employed": "2026-01-31"
}
]
}Estimate employment dates
Estimate the first and last day each employee worked and was employed. The estimate comes from payroll data, not from hire or termination dates. Pay periods on approved or paid payrolls set the range, ignoring historical payrolls and corrections. estimated_first_day_worked and estimated_last_day_worked ignore 0paystubs.‘estimatedfirstdayemployed‘and‘estimatedlastdayemployed‘alsocount0 pay stubs that record hours, such as unpaid leave. A pay rate that starts inside the first pay period moves the first day later, and a pay rate that ends inside the last pay period moves the last day earlier.
curl --request POST \
--url https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"employee_id": "<id>",
"work_assignment_ids": [
"<id>"
]
}
]
'import requests
url = "https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates"
payload = [
{
"employee_id": "<id>",
"work_assignment_ids": ["<id>"]
}
]
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([{employee_id: '<id>', work_assignment_ids: ['<id>']}])
};
fetch('https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates', 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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates",
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([
[
'employee_id' => '<id>',
'work_assignment_ids' => [
'<id>'
]
]
]),
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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates"
payload := strings.NewReader("[\n {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\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://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.nmbr.co/services/payroll/calculations/estimated_employment_dates")
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 {\n \"employee_id\": \"<id>\",\n \"work_assignment_ids\": [\n \"<id>\"\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"data": [
{
"employee_id": "<id>",
"work_assignment_ids": [
"<id>"
],
"estimated_first_day_worked": null,
"estimated_last_day_worked": null,
"estimated_first_day_employed": "2026-01-01",
"estimated_last_day_employed": "2026-01-31"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Response
OK
Hide child attributes
Hide child attributes
The employee.
The work assignments the estimate was calculated from.
The estimated first day worked, or null when the employee has never been paid.
The estimated last day worked, or null when the employee has never been paid.
The estimated first day employed, or null when the employee has never been paid and has no recorded hours.
The estimated last day employed. Unlike estimated_last_day_worked, this counts $0 pay periods that record hours, such as unpaid leave. Unpaid leave counts only when it is recorded as a line item. null when the employee has never been paid and has no recorded hours.

