The Employee Object
The employee object is the core record for anyone who works at a company in Friday — whether they're a full-payroll employee, a contractor, or an administrator. This guide explains every field on the employee object, what the key enumerations mean, and how the same person can appear as multiple employee records.
Overview
When you call GET /employees or GET /employees/:employee_id, you get back an employee object (or a list of them). Each object represents a single employment relationship between a person and a company under a specific role.
There are two shapes of the employee object:
| Shape | Returned by | Extra fields |
|---|---|---|
| List item | GET /employees | current_earning |
| Detail | GET /employees/:employee_id | Everything in the list item, plus recovery_email, work_phone_ext, daily_time_limit, weekly_time_limit, paid_lunch_time, lunch_in_overtime, created_at, and earning_history |
The detail shape is a superset of the list shape — every field on the list item is present on the detail object.
Field Reference
Core identity fields
| Field | Type | Description |
|---|---|---|
employee_id | integer | Unique identifier for this employee record. |
first_name | string | First name. |
last_name | string | Last name. |
middle_name | string | null | Middle name or initial, if provided. |
email | string | Primary email address. |
nickname | string | null | Preferred name / display name. |
dob | string | null | Date of birth in YYYY-MM-DD format. |
Employment status fields
| Field | Type | Description |
|---|---|---|
is_active | boolean | Whether the employee is currently active. Inactive employees have been offboarded or dismissed. |
status | string | null | Freeform employment status (e.g. "active", "dismissed"). |
onboarding_status | string | Where the employee is in the onboarding flow. Values: "completed", "needs_attention", "blocking". |
start_date | date-time | null | The employee's start date at the company. |
Classification fields
| Field | Type | Description |
|---|---|---|
employment_type | string | null | The classification of this employee record. See Employment Types below. |
timetrack_only | boolean | null | Whether this employee is excluded from payroll. See Timetrack Only below. |
contractor_type | string | null | For contractors, indicates the contractor sub-type (e.g. "individual", "business"). Null for non-contractors. |
Contact fields
| Field | Type | Description |
|---|---|---|
mobile_phone | string | null | Mobile phone number. |
home_phone | string | null | Home phone number. |
recovery_email | string | null | (Detail only) Alternate email for account recovery. |
work_phone_ext | string | null | (Detail only) Work phone with extension. |
Time tracking fields
| Field | Type | Description |
|---|---|---|
daily_time_limit | number | null | (Detail only) Maximum hours per day this employee should work. Used for alerts, not hard enforcement. |
weekly_time_limit | number | null | (Detail only) Maximum hours per week. |
paid_lunch_time | integer | null | (Detail only) Paid lunch time in minutes. |
lunch_in_overtime | boolean | null | (Detail only) Whether paid lunch minutes count toward overtime calculations. |
Organizational fields
| Field | Type | Description |
|---|---|---|
department | object | null | The department the employee belongs to, with department_id and name. Null if unassigned. |
pay_schedule_group | object | null | The pay schedule group (e.g. "Weekly", "Biweekly") the employee is assigned to, with pay_schedule_group_id and name. Null if unassigned. |
address | object | null | The employee's home address with address_line_1, address_line_2, city, state, zip, and country. |
Earnings fields
| Field | Type | Description |
|---|---|---|
current_earning | object | null | The most recent earning record with an effective date on or before today. See Earnings below. Null if no earning record exists. |
earning_history | array | (Detail only) All earning records ordered by start_date descending. Includes both current and future scheduled earnings. |
Metadata
| Field | Type | Description |
|---|---|---|
created_at | date-time | (Detail only) When this employee record was created. |
Employment Types
Every employee record has an employment_type that describes the person's role within the company. There are three possible values:
| Value | Description |
|---|---|
admin | A company administrator. Admins manage the company, its settings, and its employees within Friday. They do not have their own payroll records — they are management-level users. |
employee | A standard W-2 employee. Employees can clock in/out, be included in payroll runs, accrue PTO, and receive pay stubs. This is the most common type. |
contractor | An independent contractor (1099). Contractors have a simpler payroll profile — no tax withholding, no benefits — but can still track time and be paid through Friday. |
How employment types affect the data
- Earnings: Only
employeeandcontractortypes have earning records (current_earning/earning_history). Admins do not have compensation data. - Contractor fields: The
contractor_typefield is only populated forcontractorrecords. It describes whether the contractor is an individual or a business entity. - Manager type: Only
admintypes can have a manager type assigned (see Manager Types). - Workplace: Only
employeetypes are required to have a payroll workplace on payroll/premium plans.
One Person, Multiple Records
A single person (identified by email) can be invited to the same company under different employment types. For example, someone might be both an admin and an employee at the same company. When this happens:
- The person has two separate employee records, each with its own
employee_id. - Each record has its own
employment_type,is_activestatus, earnings, and other per-record fields. - The
GET /employeesendpoint returns both records as separate items in the list. - You can filter by
employment_typeto see only one type at a time.
This is common in small businesses where an owner or manager handles both administrative duties and regular work, or where a contractor is later hired as a full-time employee but retains their contractor record for historical purposes.
Duplicate check — The API prevents inviting the same email with the same employment type twice. You'll receive a
400error if the person already has an active record of that type. But inviting the same email as a different type (e.g. adding anadminrecord for someone who already has anemployeerecord) is perfectly valid.
Timetrack Only
The timetrack_only flag controls whether an employee is included in payroll processing.
timetrack_only | Meaning |
|---|---|
false (default) | The employee is a full participant — they appear in time tracking and payroll runs. |
true | The employee participates in time tracking (clock in/out, time records, reports) but is excluded from payroll. No pay stubs, no tax calculations, no payroll deductions. |
When to use timetrack only
Timetrack-only is useful when you need to track someone's hours but don't process their pay through Friday. Common scenarios:
- Employees paid through a separate payroll system
- Seasonal or temporary workers who only need time tracking
- Volunteers whose hours need to be recorded
Rules
timetrack_onlyapplies toemployeeandcontractortypes only. It is alwaysfalseforadmintypes.- On timetracking plans,
timetrack_onlyis not accepted in the invite request because all employees on a timetracking plan are inherently time-track-only (payroll is not available). - On payroll/premium plans,
timetrack_onlydefaults tofalseif omitted, meaning the employee will be included in payroll. - When
timetrack_onlyistrue, payroll-specific fields likeworkplace,payment_unit, and wage fields are not required during invitation.
Manager Types
Admin employees can optionally be assigned a manager_type that defines the scope of their administrative permissions. Manager types are only available on premium plans.
| Value | Description |
|---|---|
admin_manager | Full administrative access — can manage company settings, employees, payroll, and time tracking. |
payroll_manager | Can manage payroll operations — view and process payroll, manage earnings — but cannot change company settings. |
timesheet_manager | Can manage time tracking — approve timesheets, edit time records — but cannot access payroll or company settings. |
If no manager_type is set, an admin has the default admin permissions.
Plan requirement — Manager types are a premium feature. On timetracking and payroll plans, the
manager_typefield is not accepted. Attempting to set it on a non-premium plan returns a400error.
Earnings
Earnings represent an employee's compensation configuration. Each earning record has an effective start_date, and the current earning is the most recent record with a start date on or before today.
| Field | Type | Description |
|---|---|---|
employee_earnings_id | integer | Unique identifier for this earning record. |
start_date | date-time | Effective date for this earning configuration. |
payment_unit | string | null | How the employee is paid. Values: "hour", "salary", "hourly_salary", "yearly", "weekly", "biweekly", "monthly". |
salary_type | string | null | For salaried employees, the pay period the salary figure represents. Values: "yearly", "quarterly", "monthly", "semimonthly", "weekly", "biweekly". |
payment_amount | number | null | Hourly rate (for hourly payment units). |
salary | number | null | Salary amount per the salary_type period. |
overtime_amount | number | null | Overtime rate (for hourly workers). |
default_hours | number | null | Default weekly hours for this employee. |
pto_payment_amount | number | null | Hourly rate used when paying out PTO. |
How earnings work
- When you invite an employee with wage fields (
payment_unit,payment_amount, etc.), an initial earning record is created. - The detail endpoint returns the full
earning_historyarray, letting you see all past and scheduled future compensation changes. - The list endpoint returns only
current_earningfor efficiency. - Admins typically don't have earning records since they are not compensated through the payroll system.
Example: List Item
{
"employee_id": 25,
"first_name": "John",
"last_name": "Doe",
"middle_name": null,
"email": "[email protected]",
"nickname": null,
"dob": "1990-05-15",
"is_active": true,
"onboarding_status": "completed",
"start_date": "2023-06-01T00:00:00.000Z",
"status": "active",
"mobile_phone": "+1-555-987-6543",
"home_phone": null,
"contractor_type": null,
"timetrack_only": false,
"employment_type": "employee",
"department": {
"department_id": 5,
"name": "Engineering"
},
"pay_schedule_group": {
"pay_schedule_group_id": 3,
"name": "Biweekly"
},
"address": {
"address_line_1": "123 Main St",
"address_line_2": "Apt 4B",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"current_earning": {
"employee_earnings_id": 42,
"start_date": "2024-01-01T00:00:00.000Z",
"payment_unit": "hour",
"salary_type": null,
"payment_amount": 35.00,
"salary": null,
"overtime_amount": 1.5,
"default_hours": 40,
"pto_payment_amount": 35.00
}
}Example: Detail Object
{
"employee_id": 25,
"first_name": "John",
"last_name": "Doe",
"middle_name": null,
"email": "[email protected]",
"nickname": null,
"dob": "1990-05-15",
"is_active": true,
"onboarding_status": "completed",
"start_date": "2023-06-01T00:00:00.000Z",
"status": "active",
"mobile_phone": "+1-555-987-6543",
"home_phone": null,
"contractor_type": null,
"timetrack_only": false,
"employment_type": "employee",
"department": {
"department_id": 5,
"name": "Engineering"
},
"pay_schedule_group": {
"pay_schedule_group_id": 3,
"name": "Biweekly"
},
"address": {
"address_line_1": "123 Main St",
"address_line_2": "Apt 4B",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"recovery_email": "[email protected]",
"work_phone_ext": null,
"daily_time_limit": 8,
"weekly_time_limit": 40,
"paid_lunch_time": 30,
"lunch_in_overtime": false,
"created_at": "2023-06-01T14:30:00.000Z",
"current_earning": {
"employee_earnings_id": 42,
"start_date": "2024-01-01T00:00:00.000Z",
"payment_unit": "hour",
"salary_type": null,
"payment_amount": 35.00,
"salary": null,
"overtime_amount": 1.5,
"default_hours": 40,
"pto_payment_amount": 35.00
},
"earning_history": [
{
"employee_earnings_id": 42,
"start_date": "2024-01-01T00:00:00.000Z",
"payment_unit": "hour",
"salary_type": null,
"payment_amount": 35.00,
"salary": null,
"overtime_amount": 1.5,
"default_hours": 40,
"pto_payment_amount": 35.00
},
{
"employee_earnings_id": 18,
"start_date": "2023-06-01T00:00:00.000Z",
"payment_unit": "hour",
"salary_type": null,
"payment_amount": 28.00,
"salary": null,
"overtime_amount": 1.5,
"default_hours": 40,
"pto_payment_amount": 28.00
}
]
}Filtering Employees
The GET /employees endpoint supports several query parameters for filtering:
| Parameter | Type | Description |
|---|---|---|
is_active | "true" | "false" | Filter by active status. |
department_id | integer | Filter by department. |
status | string | Filter by employment status (e.g. "active", "dismissed"). |
employment_type | string | Filter by employment type: "admin", "employee", or "contractor". |
name | string | Search by first or last name (case-insensitive partial match). |
Remember that if a person has multiple employee records (e.g. both admin and employee), filtering by employment_type=employee will return only their employee record, not their admin record.
What's Next
- Invite employees — See the Inviting an Employee guide for a walkthrough of the invite endpoint, including which fields are required for each employment type and plan.
- Update employees — Use
PATCH /employees/:employee_idto update profile fields, addresses, departments, and workplaces. - Track time — Once employees exist, you can clock them in and out via the Time Records endpoints.
- Process payroll — Employees with earnings are included in payroll runs. See the Payroll Processing guide.
Updated about 9 hours ago
