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:

ShapeReturned byExtra fields
List itemGET /employeescurrent_earning
DetailGET /employees/:employee_idEverything 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

FieldTypeDescription
employee_idintegerUnique identifier for this employee record.
first_namestringFirst name.
last_namestringLast name.
middle_namestring | nullMiddle name or initial, if provided.
emailstringPrimary email address.
nicknamestring | nullPreferred name / display name.
dobstring | nullDate of birth in YYYY-MM-DD format.

Employment status fields

FieldTypeDescription
is_activebooleanWhether the employee is currently active. Inactive employees have been offboarded or dismissed.
statusstring | nullFreeform employment status (e.g. "active", "dismissed").
onboarding_statusstringWhere the employee is in the onboarding flow. Values: "completed", "needs_attention", "blocking".
start_datedate-time | nullThe employee's start date at the company.

Classification fields

FieldTypeDescription
employment_typestring | nullThe classification of this employee record. See Employment Types below.
timetrack_onlyboolean | nullWhether this employee is excluded from payroll. See Timetrack Only below.
contractor_typestring | nullFor contractors, indicates the contractor sub-type (e.g. "individual", "business"). Null for non-contractors.

Contact fields

FieldTypeDescription
mobile_phonestring | nullMobile phone number.
home_phonestring | nullHome phone number.
recovery_emailstring | null(Detail only) Alternate email for account recovery.
work_phone_extstring | null(Detail only) Work phone with extension.

Time tracking fields

FieldTypeDescription
daily_time_limitnumber | null(Detail only) Maximum hours per day this employee should work. Used for alerts, not hard enforcement.
weekly_time_limitnumber | null(Detail only) Maximum hours per week.
paid_lunch_timeinteger | null(Detail only) Paid lunch time in minutes.
lunch_in_overtimeboolean | null(Detail only) Whether paid lunch minutes count toward overtime calculations.

Organizational fields

FieldTypeDescription
departmentobject | nullThe department the employee belongs to, with department_id and name. Null if unassigned.
pay_schedule_groupobject | nullThe pay schedule group (e.g. "Weekly", "Biweekly") the employee is assigned to, with pay_schedule_group_id and name. Null if unassigned.
addressobject | nullThe employee's home address with address_line_1, address_line_2, city, state, zip, and country.

Earnings fields

FieldTypeDescription
current_earningobject | nullThe most recent earning record with an effective date on or before today. See Earnings below. Null if no earning record exists.
earning_historyarray(Detail only) All earning records ordered by start_date descending. Includes both current and future scheduled earnings.

Metadata

FieldTypeDescription
created_atdate-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:

ValueDescription
adminA 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.
employeeA 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.
contractorAn 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 employee and contractor types have earning records (current_earning / earning_history). Admins do not have compensation data.
  • Contractor fields: The contractor_type field is only populated for contractor records. It describes whether the contractor is an individual or a business entity.
  • Manager type: Only admin types can have a manager type assigned (see Manager Types).
  • Workplace: Only employee types 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_active status, earnings, and other per-record fields.
  • The GET /employees endpoint returns both records as separate items in the list.
  • You can filter by employment_type to 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 400 error if the person already has an active record of that type. But inviting the same email as a different type (e.g. adding an admin record for someone who already has an employee record) is perfectly valid.


Timetrack Only

The timetrack_only flag controls whether an employee is included in payroll processing.

timetrack_onlyMeaning
false (default)The employee is a full participant — they appear in time tracking and payroll runs.
trueThe 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_only applies to employee and contractor types only. It is always false for admin types.
  • On timetracking plans, timetrack_only is 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_only defaults to false if omitted, meaning the employee will be included in payroll.
  • When timetrack_only is true, payroll-specific fields like workplace, 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.

ValueDescription
admin_managerFull administrative access — can manage company settings, employees, payroll, and time tracking.
payroll_managerCan manage payroll operations — view and process payroll, manage earnings — but cannot change company settings.
timesheet_managerCan 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_type field is not accepted. Attempting to set it on a non-premium plan returns a 400 error.


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.

FieldTypeDescription
employee_earnings_idintegerUnique identifier for this earning record.
start_datedate-timeEffective date for this earning configuration.
payment_unitstring | nullHow the employee is paid. Values: "hour", "salary", "hourly_salary", "yearly", "weekly", "biweekly", "monthly".
salary_typestring | nullFor salaried employees, the pay period the salary figure represents. Values: "yearly", "quarterly", "monthly", "semimonthly", "weekly", "biweekly".
payment_amountnumber | nullHourly rate (for hourly payment units).
salarynumber | nullSalary amount per the salary_type period.
overtime_amountnumber | nullOvertime rate (for hourly workers).
default_hoursnumber | nullDefault weekly hours for this employee.
pto_payment_amountnumber | nullHourly 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_history array, letting you see all past and scheduled future compensation changes.
  • The list endpoint returns only current_earning for 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:

ParameterTypeDescription
is_active"true" | "false"Filter by active status.
department_idintegerFilter by department.
statusstringFilter by employment status (e.g. "active", "dismissed").
employment_typestringFilter by employment type: "admin", "employee", or "contractor".
namestringSearch 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_id to 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.