Integration guide · v1

HarmonyWFM REST API

Everything your team needs to read from and write to HarmonyWFM: employees, time, time off, scheduling, attendance points and every company configuration object your active modules expose. HarmonyWFM issues the API key — the integration itself is built and operated on your side.

1. What you get, and what you build

HarmonyWFM provides
  • A company-scoped API key (Settings → Integrations)
  • The endpoints described in this document
  • Signed outbound webhooks and delivery logs
  • Uptime of the API itself
Your team provides
  • The client / middleware that calls the API
  • Secure storage and rotation of the key
  • A public HTTPS endpoint if you want webhooks
  • Field mapping, scheduling, retries and monitoring

2. Setup checklist

  1. In HarmonyWFM, open Settings → Integrations → API keys. Name the key after the system that will use it (e.g. "ADP payroll export").
  2. Choose the scope. Leave write access off unless the integration must change data. Keys carry read and optionally write.
  3. Copy the hwfm_… value immediately — it is shown once and stored only as a hash. Put it in your secret manager, never in source control.
  4. Call GET /api/public/v1/config to confirm the key works and to see which modules and resources the company has.
  5. Map your fields against the responses, then build your sync. Start read-only in a staging job before enabling writes.
  6. Optional: add a webhook in the same tab, store the whsec_… secret and verify signatures (section 7).

3. Base URL and authentication

Every key is bound to one company. There is no tenant parameter — the key determines which company's data you see, and cross-company access is impossible.

Base URL   https://harmonywfm.com/api/public/v1
Header     Authorization: Bearer hwfm_xxxxxxxxxxxxxxxxxxxxxxxx
Header     Content-Type: application/json   (writes only)

curl -H "Authorization: Bearer hwfm_YOUR_KEY" \
  "https://harmonywfm.com/api/public/v1/config"
  • TLS is required; plain HTTP is rejected.
  • Scope enforcement: GET needs read; POST/PATCH/DELETE need write.
  • Revoking a key in the Integrations tab takes effect immediately.
  • Last-used timestamps are recorded so unused keys can be spotted and retired.

4. Endpoints

Discovery
Start here. Tells you which modules the company owns and exactly which configuration resources your key can reach.
GET
/config
read
List every configuration resource, its module and allowed methods.
GET
/me
read
Key introspection: company, scopes, enabled modules, rate limit remaining, webhook event catalog.
GET
/openapi
read
OpenAPI 3.1 spec for exactly the endpoints this company can call — import into Postman, Insomnia, Zapier/Make or an SDK generator.
GET
/company
read
Company settings + enabled_modules array.
PATCH
/company
write
Update company settings (timezone, badge/employee number formats, web clock, earning labels, escalation).
People
GET
/employees
read
List employees. Optional ?status=active|on_leave|terminated.
POST
/employees
write
Create a new hire (full profile payload supported).
GET
/employees/:id
read
Fetch one employee with every profile field.
PATCH
/employees/:id
write
Update identity, address, lifecycle dates, org assignment, pay/salary and every profile assignment.
Time & attendance
GET
/punches
read
Punches for ?start=&end=&employee_id=.
POST
/punches
write
Import or correct a punch.
PATCH
/punches/:id
write
Edit punch time or type.
DELETE
/punches/:id
write
Remove a punch.
GET
/timecards
read
Timecard export for a date range.
GET
/timecards/:id
read
One timecard with calculated totals.
PATCH
/timecards/:id
write
Submit, approve, unapprove or lock a timecard.
Time off
GET
/pto-requests
read
List requests (?status=&employee_id=).
POST
/pto-requests
write
Create a request on an employee's behalf.
PATCH
/pto-requests/:id
write
Approve, reject or cancel.
Scheduling
GET
/schedules
read
Shifts for ?start=&end=.
POST
/schedules
write
Create an assigned or open shift.
PATCH
/schedules/:id
write
Update or publish a shift.
DELETE
/schedules/:id
write
Delete a shift.
Attendance points
GET
/points
read
Point occurrences.
POST
/points
write
Add a manual occurrence.
PATCH
/points/:id
write
Waive or expire an occurrence.
DELETE
/points/:id
write
Delete an occurrence.
Configuration (generic)
Every resource in the table further down is reachable with these four shapes.
GET
/config/:resource
read
List rows. Any column can be used as a filter: ?is_active=true&location_id=…. Supports ?limit= (max 1000), ?offset=, ?order=.
POST
/config/:resource
write
Create a row. company_id is applied automatically.
GET
/config/:resource/:id
read
Fetch one row.
PATCH
/config/:resource/:id
write
Update a row (PATCH /config/:resource with no id for singleton resources).
DELETE
/config/:resource/:id
write
Delete a row.

5. Configuration resources by module

Resources marked with a module are only reachable when that module is active for the company; otherwise the API returns 403. Singleton resources hold one row per company and are updated with PATCH /config/:resource (no id).

Always available (HR core & PTO)
Included with every subscription.
/config/locationsWorksites with timezone, address and geofence settings.
/config/departmentsDepartment tree, default manager and cost centers.
/config/jobsJob titles, manager flag and default pay settings.
/config/skillsSkill catalog used for scheduling and learning.
/config/job-skill-requirementsSkills required to work a given job.
/config/employee-groupsGroups used for bulk profile assignment and filtering.
/config/custom-field-definitionsCustom employee fields (type, options, required).
/config/custom-field-valuesCustom field values per employee.
/config/change-reason-codesReason codes for effective-dated employee changes.
/config/profile-setup-profilesRole-based navigation / feature visibility profiles.
/config/approval-delegationsTemporary approval delegation between managers.
/config/holiday-calendarsNamed holiday calendars.
/config/holiday-calendar-datesDated holidays inside a calendar.
/config/holiday-calendar-assignmentsCalendar assignment to company, location, department or employee.
/config/employee-emergency-contactsEmergency contacts per employee.
/config/employee-identifiersExternal system IDs mapped to an employee.
/config/employee-credentialsLicenses and certifications with expiry tracking.
/config/employee-skillsSkills held by an employee.
/config/form-templatesCustom form definitions.
/config/form-template-fieldsFields belonging to a form template.
/config/form-assignmentsForms assigned to employees and their responses.
/config/pto-plansAccrual plans, caps, carryover and waiting periods.
/config/pto-plan-tiersTenure-based accrual tiers inside a plan.
/config/pto-profilesBundles of PTO plans assigned to employees.
/config/employee-pto-plan-assignmentsAd-hoc plan assignment per employee.
/config/pto-balancesCurrent balances per employee and plan.
/config/time-off-request-profilesRequest notice, approval chain and limits.
/config/time-off-blackoutsBlackout windows for time off.
/config/time-off-coverage-limitsMax concurrent time off per location/department.
/config/background-checksBackground check requests, vendor, status and adjudication.
/config/employee-documentsDocuments filed against an employee record.
/config/employee-bank-accountsDirect deposit accounts (write-only fields are masked).
/config/employee-tax-withholdingsFederal / state withholding elections.
/config/position-history
read-only
Effective-dated job / position changes.
/config/assignment-history
read-only
Effective-dated location / department changes.
/config/compensation-history
read-only
Effective-dated pay changes.
/config/pto-carryover-events
read-only
Year-end carryover and forfeiture history.
/config/pto-tier-grants
read-only
Tenure-tier grant history.
/config/notifications
read-only
In-app notifications generated for users.
/config/company-modules
read-only
Modules enabled for the company and their expiry.
/config/company-members
read-only
User accounts with access to the company and their role.
/config/background-jobs
read-only
Scheduled job runs and their outcome.
/config/audit-log
read-only
Immutable change history.
Time & Attendance
Requires the "time_attendance" module.
/config/timesheet-profilesRounding, OT/DT, meal & break, overnight and attestation rules.
/config/pay-period-profilesPay frequency, anchor date and lock behavior.
/config/pay-periodsGenerated pay periods (lock / unlock via PATCH).
/config/exception-rulesTime exception rulebook (missing punch, late, long shift…).
/config/rate-profilesAlternate pay rate profiles.
/config/rate-profile-rulesRules inside a rate profile.
/config/premium-pay-profilesShift differentials and premium pay bundles.
/config/premium-pay-rulesIndividual premium rules (time of day, day of week, thresholds).
/config/labor-distribution-profilesCost allocation profiles.
/config/labor-distribution-allocationsAllocation percentages inside a distribution profile.
/config/employee-rate-profilesRate profile assignment per employee.
/config/employee-premium-pay-profilesPremium pay profile assignment per employee.
/config/timecard-days
read-only
Calculated daily totals per timecard.
/config/punch-edit-requestsEmployee-submitted punch corrections.
/config/punch-attestations
read-only
Meal / break attestation answers captured at the clock.
/config/missing-punch-alerts
read-only
Detected missing punches.
/config/time-exception-notesManager notes on time exceptions.
/config/timecards
read-only
Timecard headers and approval status (use /timecards for writes).
Scheduler
Requires the "scheduler" module.
/config/scheduling-settings
singleton
Company-wide scheduling defaults and publishing rules.
/config/shift-templatesReusable shift patterns.
/config/schedule-budgetsHour / cost budgets per period and org unit.
/config/employee-schedule-targetsTarget hours per employee.
/config/availability-profilesEmployee availability windows.
Advanced Scheduling
Requires the "advanced_scheduling" module.
/config/shift-swap-requestsShift swap workflow.
/config/shift-claimsOpen shift claims / bidding.
Attendance Points
Requires the "points" module.
/config/points-settings
singleton
Point values, grace periods, decay and scan schedule.
/config/points-thresholdsDisciplinary thresholds and actions.
/config/points-threshold-events
read-only
Disciplinary threshold triggers.
Compliance Rule Pack
Requires the "compliance" module.
/config/compliance-settings
singleton
Enabled state rule packs and enforcement level.
/config/compliance-violations
read-only
Detected labor-law violations.
/config/break-violations
read-only
Detected meal / rest break violations.
Onboarding
Requires the "onboarding" module.
/config/onboarding-workflowsNew-hire workflow definitions.
/config/onboarding-workflow-stepsSteps inside an onboarding workflow.
/config/onboarding-step-documentsDocuments attached to a workflow step.
/config/onboardingsIndividual onboarding records and status.
/config/offboardingsOffboarding records and status.
/config/offboarding-tasksTasks inside an offboarding.
/config/onboarding-acknowledgements
read-only
Signed policy acknowledgements.
Learning (LMS)
Requires the "lms" module.
/config/learning-modulesCourses.
/config/learning-lessonsLessons inside a course.
/config/learning-seriesCourse series / paths.
/config/learning-series-modulesCourses within a series.
/config/learning-profilesLearning profiles assigned to groups of employees.
/config/learning-profile-itemsCourses inside a learning profile.
/config/learning-assignment-rulesAuto-assignment rules by job, location or department.
/config/learning-assignmentsAssignments and completion status.
/config/learning-quizzesQuizzes attached to lessons.
/config/learning-quiz-questionsQuiz questions.
/config/learning-lesson-progress
read-only
Per-lesson progress.
/config/learning-quiz-attempts
read-only
Quiz attempts and scores.
/config/learning-certificates
read-only
Issued completion certificates.
Expense Management
Requires the "expenses" module.
/config/expense-settings
singleton
Categories, limits and approval defaults.
/config/expense-approversApproval chain configuration.
/config/expense-submittersWho may submit expenses.
/config/expense-requestsExpense reports and their status.
/config/expense-itemsLine items on an expense report.
Compensation
Requires the "compensation" module.
/config/comp-bandsSalary bands per job / level / geo.
/config/comp-cyclesMerit / comp review cycles.
/config/comp-cycle-itemsPer-employee proposals inside a cycle.
Advanced Reports
Requires the "advanced_reports" module.
/config/saved-reportsSaved report definitions.
/config/report-subscriptionsScheduled report email delivery.
Performance Reviews
Requires the "performance" module.
/config/review-templatesReview templates and rating scales.
/config/review-sectionsSections inside a review template.
/config/review-questionsQuestions inside a review section.
/config/reviewsReview cycles per employee and their stage/status.
/config/review-responsesAnswers submitted on a review.
/config/review-outcomesRating, merit and promotion outcomes.
Home Care (EVV & eMAR)
Requires the "home_care" module.
/config/hc-clientsHome care clients / patients.
/config/hc-client-contactsClient family and emergency contacts.
/config/hc-client-authorizationsPayer authorizations, units and date ranges.
/config/hc-care-teamCaregivers assigned to a client.
/config/hc-care-tasksCare plan task catalog per client.
/config/hc-care-plan-versionsPublished care plan versions.
/config/hc-visitsScheduled and completed visits (EVV).
/config/hc-visit-tasksTask completion per visit.
/config/hc-visit-events
read-only
EVV clock-in / clock-out event log.
/config/hc-visit-exceptionsMissed, late and out-of-geofence visits.
/config/hc-visit-recurrencesRecurring visit patterns.
/config/hc-medicationsClient medication list (eMAR).
/config/hc-med-administrationsMedication administration records.
/config/hc-vitalsVitals captured during a visit.
/config/hc-incidentsIncident reports and follow-up.
Meeting Tracker
Requires the "meeting_tracker" module.
/config/meetingsMeetings, agendas, recaps and AI summaries.
/config/meeting-seriesRecurring meeting series.
/config/meeting-attendeesAttendance per meeting.
/config/meeting-todosAction items created in meetings.
/config/meeting-winsRecognition / wins logged in meetings.

6. Request and response shapes

# List with filters, paging and ordering
GET /api/public/v1/config/locations?is_active=true&limit=50&offset=0&order=name

{ "resource": "locations", "count": 2, "data": [ { "id": "…", "name": "Detroit Plant", … } ] }

# Create
POST /api/public/v1/config/departments
{ "name": "Maintenance", "code": "MNT" }
→ 201 { "resource": "departments", "data": { "id": "…", … } }

# Update a singleton
PATCH /api/public/v1/config/points-settings
{ "late_points": 0.5, "ncns_points": 4 }

# New hire
POST /api/public/v1/employees
{ "first_name": "Dana", "last_name": "Reyes", "email": "dana@acme.com",
  "hire_date": "2026-09-01", "location_id": "…", "job_id": "…",
  "pay_type": "hourly", "hourly_rate": 24.5 }
200 / 201Success. Reads return { data }, writes return the affected record.
400Validation error. Body: { "error": "…" }.
401Missing or invalid API key.
403Key lacks the required scope, or the module isn't enabled for the company.
404Unknown resource or record not found in this company.
405Method not allowed for that resource (read-only or singleton).
500Server error — safe to retry with backoff.

Fields id, company_id, created_at and updated_at are managed by HarmonyWFM and ignored if sent. Dates use YYYY-MM-DD; timestamps are ISO-8601 UTC. Punch and shift times are stored in UTC and displayed in the employee's location timezone.

7. Webhooks

Add an endpoint under Settings → Integrations → Webhooks, pick events, and store the signing secret. Each delivery is a POST with a JSON body and these headers: x-harmony-event, x-harmony-timestamp (unix seconds) and x-harmony-signature.

punch.createdA punch is recorded from any source.
timecard.approvedA timecard moves to approved.
pay_period.lockedA pay period is locked for payroll.
pto.requestedAn employee submits time off.
pto.approvedA time-off request is approved.
employee.createdA new hire record is created.
employee.terminatedAn employee is terminated.
points.assessedAttendance points are assessed.
// Node — verify the signature before trusting the payload
import crypto from "node:crypto";

app.post("/hooks/harmony", express.raw({ type: "*/*" }), (req, res) => {
  const ts = req.header("x-harmony-timestamp");
  const sig = req.header("x-harmony-signature");
  const body = req.body.toString("utf8");
  const expected = crypto
    .createHmac("sha256", process.env.HARMONY_WEBHOOK_SECRET)
    .update(`${ts}.${body}`)
    .digest("hex");

  if (!sig || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)))
    return res.status(401).end();
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.status(400).end();

  const { event, company_id, sent_at, data } = JSON.parse(body);
  // enqueue and return quickly
  res.status(200).end();
});
  • Respond within 10 seconds with a 2xx; anything else is logged as a failure.
  • Deliveries are logged in the Integrations tab with status, duration and error.
  • Use the Send test button to fire a signed ping while you build.
  • Handle duplicates idempotently — treat the payload id as the dedupe key.

8. Operating guidance

  • Page large reads with limit/offset; keep batches ≤ 500.
  • Retry 5xx and network failures with exponential backoff; never retry 4xx blindly.
  • Sync incrementally where possible — filter on updated_at or a date range instead of pulling everything each run.
  • Write to payroll-relevant objects (punches, timecards) before the pay period locks; locked periods reject edits.
  • Use separate keys per integration so one can be revoked without breaking others.
  • Rotate keys on a schedule and whenever staff with access leave.

Questions about a specific field or object? Call GET /api/public/v1/config for the live catalog for that company — it always reflects the modules currently active.