Time and Attendance

Send shifts, breaks, and classified hours for hourly employees, and correct them after payroll has run.

This guide covers the day-to-day work of an integration that records hourly employees' time: which of the two ways to send hours fits your data, what each request needs, how Everee turns hours into wages, and what to do when hours are wrong. It's a companion to the Guide to the Timesheets API, which documents every field and error code.

📘

Payroll Infrastructure

This guide is for hosted payroll. In Payroll Infrastructure, you add each worker's pay to a payroll run as items instead: see Running payroll. Hours go on the run as items with a pay code, unitCount and unitRate, and you classify overtime yourself: see Pay codes and gross pay basics. Creating shifts or classified hours for a Payroll Infrastructure company returns 400.

Hours are for hourly W-2 employees. Contractors and flat amounts go through payable items.


Shifts or classified hours?

Send hours one of two ways.

ShiftsClassified hours
You sendEach shift's start and end time, with breaksTotals for a pay period, already split into regular, overtime, and double time
Everee classifies overtimeYes, by federal and state rulesNo. You classify before sending
BreaksYesNo
Shift detail on the pay stubYesNo
When to sendAs each shift completesOnce per pay period, for the whole period
EndpointCreate a shiftUpdate classified hours (bulk)

Prefer shifts when you can. Everee shows shift details on workers' pay stubs, which labor law requires in some places, such as California. Real break times also make a better audit trail. Use classified hours only if all you have are pre-classified totals, for example because another system calculates overtime.

Everything else in this guide applies to both.


What every hour needs

Each request carries the data Everee needs to calculate wages and taxes correctly. For an integration that serves staffing or multi-site employers, the first three aren't optional.

DataFieldWhy
Where it was workedworkLocationIdSets the tax jurisdiction for the wages. If you leave it out, the worker's default work location is used, which may be wrong
Pay rateeffectiveHourlyPayRateThe regular rate to calculate wages from. If you leave it out, the rate on the worker's profile is used
Workers' Comp classworkersCompClassCodeThe class code, not its name. It's matched in the state the shift was worked, and rejected if no such class exists there
Cost allocationcostCentersUp to three tags, like client or job, that follow the wages into reports and journals
Display pay ratedisplayHourlyPayRateA rate to show on the pay stub when it differs from the rate used to calculate wages

Both requests accept all of these. Work locations and cost center types must exist before you refer to them. See Setting up your organization.


Sending shifts

POST https://api.everee.com/integration/v1/labor/timesheet/worked-shifts

{
  "externalWorkerId": "emp-1042",
  "shiftStartEpochSeconds": 1792051200,
  "shiftEndEpochSeconds": 1792080000,
  "createBreaks": [
    { "segmentConfigCode": "DEFAULT_UNPAID", "breakDuration": "PT30M" }
  ],
  "effectiveHourlyPayRate": { "amount": "22.50", "currency": "USD" },
  "workLocationId": 1234,
  "workersCompClassCode": "8810",
  "costCenters": [{ "type": "clientId", "value": "290" }]
}
  • Identify the worker with externalWorkerId or Everee's workerId.
  • Times are Unix epoch seconds. A shift can't be in the future, can't end before it starts, and must be at least one minute long.
  • Record a lunch as a break inside one shift, not as two shifts. Breaks must fall within the shift and can't overlap each other. DEFAULT_UNPAID is built in. Everee can set up other paid or unpaid break types on request.
  • Give each break either its start and end times or its duration, not both. See Sending breaks.
  • Send each shift as soon as it's complete, so your customer's admins can review and edit it before payroll.
  • To change or remove a shift, update it or delete it, using the shift ID from the create response. List shifts or retrieve one to check what Everee holds.

Sending breaks

Each item in createBreaks names a break type with segmentConfigCode and gives the break's timing in one of two ways.

Start and end timesDuration
FieldsbreakStartEpochSeconds, with breakEndEpochSecondsbreakDuration
Use it whenYour system records when the break started and endedYour system records only how long the break was
Example{ "segmentConfigCode": "DEFAULT_UNPAID", "breakStartEpochSeconds": 1792065600, "breakEndEpochSeconds": 1792067400 }{ "segmentConfigCode": "DEFAULT_UNPAID", "breakDuration": "PT30M" }
  • A break takes one form or the other, and one request can't mix them. Send a duration that is a positive whole number of seconds in ISO 8601 format, like PT30M for 30 minutes or PT1H for an hour. Fractions of a second are rejected.
  • Everee places duration breaks for you. It puts them at the end of the shift, back to back, in the order you list them: the first break ends when the shift ends, the second ends when the first starts, and so on. Pay is the same wherever a break sits, but the break times shown on the shift won't match when the break actually happened. If that matters to you, send start and end times.
  • Duration breaks need the shift's end time, so they're rejected on a shift that is still open. A break that would run past the start of the shift is rejected, because breaks must fall within the shift.
  • The same two forms work when you update a shift.

How overtime works

By default, Everee classifies every shift for overtime and double time under the FLSA and each state's rules, based on the worker's legal work location. You send raw punch times and Everee does the rest. For custom overtime rules, contact [email protected]. The rules are described in Overtime Classification Rules.

If another system classifies your hours, Everee can be set up to accept fully-classified shifts. You then send fullyClassifiedHours on each shift, and Everee uses them as they are. Contact support to enable it.


Sending classified hours

POST https://api.everee.com/integration/v1/labor/classified-hours/bulk

{
  "earningDate": "2026-10-07",
  "classifiedHoursPerWorker": [
    {
      "externalWorkerId": "emp-1042",
      "classifiedHours": [
        {
          "payRate": { "amount": "22.50", "currency": "USD" },
          "workLocationId": "1234",
          "regularHoursWorked": "40.00",
          "flsaQualifiedOvertimeHoursWorked": "6.50"
        }
      ]
    }
  ]
}
  • earningDate is any date within the pay period.
  • Overtime is sent in two fields, flsaQualifiedOvertimeHoursWorked for weekly overtime over 40 hours and nonFlsaQualifiedOvertimeHoursWorked for everything else. The older single overtime field was retired in April 2026. See Complying with the OBBBA overtime rule.
🚧

Each call replaces hours. It never adds to them

A call replaces everything Everee holds for that worker, pay period, and work location. If you send a worker's Monday hours in one call and Tuesday's in another, only Tuesday's survive, and nothing warns you. Always send a worker's complete hours for a location in a single call. Hours at other locations are left alone.


What happens next

Hours stay editable until their pay period is paid.

sent ──► editable ──► payroll approved and paid ──► locked
         (add, edit, delete freely)                  (changes need a correction)

Hours become part of the worker's payroll payment on their regular cycle, and the payment is approved. Follow it with the payment.paid webhook. See Sending pay to Everee.


Correcting hours after payroll

Once a pay period is paid, its hours are locked, because they were used to move money. When hours were missed or wrong, you send a timesheet correction.

Corrections use the same endpoints, plus correction-authorized=true:

POST https://api.everee.com/integration/v1/labor/timesheet/worked-shifts?correction-authorized=true

Without the parameter, a change to paid hours is rejected with Already Finalized Payments. This is deliberate. You can run a day-to-day integration that never creates corrections, and handle the rare ones by hand (in hosted payroll, in the Everee admin portal).

Everee works out the difference between what was paid and what should have been paid:

OutcomeWhat happens
OverpaymentEveree records a deduction on the worker's profile that withholds the overpaid amount from their next payment
UnderpaymentThe worker is paid the difference. correctionPaymentTimeframe decides when

correctionPaymentTimeframe accepts:

ValueMeaning
NEXT_PAYROLL_PAYMENTAdd it to the worker's next regular payment. The default
IMMEDIATELYPay it right away, off-cycle
EXTERNALLY_PAIDYou've already paid it outside Everee

If you don't send correctionPaymentTimeframe, Everee uses NEXT_PAYROLL_PAYMENT, except for a worker who has separated or who isn't paid through regular payroll, where it pays the correction IMMEDIATELY, because there's no next regular payment to add it to.

Pick one policy and use it every time, so workers know what to expect. The corrected hours appear on the pay stub as a Prior Period Correction.

Two limits to know about:

  • A shift's start or end time can't move by more than 48 hours in one update. To move it further, delete the shift and create a new one.
  • The taxCalculationConfigCode of paid hours can't change.

Matching shifts to payments

To tie each shift to the payment that paid it, and to the funding behind that payment:

  • Every shift carries its payment. payableDetails.paymentId is on every shift Everee returns: when you create, update, retrieve, or list shifts. It's the same ID as the payment's id in the Payment Data API, and Payment Data also gives you the payment's payDate and fundingId. To read one payment on its own, use the Worker Payment History API.
  • It's empty until the shift's pay has been assigned to a payment. A single payment can hold the pay for several shifts.
  • List the shifts of a payment with List shifts and one or more payment-id values.

Finding corrections

When you correct a paid shift by editing it, or when a change to one shift reclassifies another paid shift, Everee doesn't change the paid shift. It archives it and creates a new shift for the corrected hours, and links the two:

FieldOn which shiftWhat it tells you
correctionForShiftIdThe new shiftThe ID of the original shift it corrects
correctedByShiftIdThe original shiftThe ID of the shift that replaced it
workedShiftCorrectionTypeEitherThe kind of change: CREATION, EDIT, RECLASSIFICATION, DELETION, or NO_CHANGE

If you delete a paid shift, Everee archives it and marks it DELETION, and there's no replacement shift.

The new shift has its own paymentId, the payment that pays the difference, and its regular, overtime, and double time hours and amounts are recalculated in shiftDurations. To find the first payment and pay date of a corrected shift, follow correctionForShiftId to the original and read its paymentId. You already hold both shift IDs from your create calls.

Wage lines in the Payment Data API aren't labeled as corrections. To tell which lines of a payment came from corrections, list the shifts with that payment-id and look for ones with a correctionForShiftId.


Errors you'll meet

ErrorWhat to do
Resource Not Found (404)A worker, work location, Workers' Comp class, or break code doesn't exist. The message says which
Employee Is Not Hourly (400)The worker is salaried. Don't send hours for them
Employee Not Active (400)The shift is dated after the worker's recorded separation date
Already Finalized Payments (400)The period is paid. Send a correction if it's intended
Shift Exists In The Future (400)Send hours after they're worked
Overlapping Break Segments or Break Segments Are Escaping (400)Fix the breaks so they sit inside the shift and don't overlap
A break needs either breakStartEpochSeconds ... or a positive whole-second breakDuration, not both (422)Send one form per break, with a positive whole-second breakDuration like PT30M, or breakStartEpochSeconds with breakEndEpochSeconds. Don't send both for the same break

To see exactly what Everee received for a failed call, see Diagnosing a failed request.

When you send classified hours for many workers at once, Everee can report every failing worker and entry in one response, and saves nothing unless all of them are valid. See Errors in bulk requests.

The Timesheets guide lists them all.


Checklist

  • Create work locations, and give every worker a default one.
  • Send workLocationId, effectiveHourlyPayRate, and workersCompClassCode with every shift, or every block of classified hours.
  • Send shifts with breaks when you can.
  • Send a worker's classified hours for a location in one call.
  • Choose a correctionPaymentTimeframe policy.
  • Send FLSA and non-FLSA overtime separately if you classify hours yourself.

Next steps


Did this page help you?