PurrOSDocs

Endpoint reference

Every PurrOS API endpoint, with the scope and permission it needs and the feature it belongs to. Search, filter, or browse by area.

All paths are relative to /api/v1. This reference follows the API's route table (api/internal/catalog/routes.go). The full request and response schemas are in the OpenAPI spec your server serves at /api/v1/openapi.json, which lists only enabled features.

Endpoints of switched-off features return 404 feature_disabled.

Who can call what

LabelMeaning
KeyThe scope an integration key needs. — means integration keys can't call it.
PeopleThe permission a person needs, through a signed-in session or a personal API key. self means any signed-in person, for their own data only; (session) means a browser session is required, not a personal key; anyone means any signed-in person; — means people can't call it (data feeds are for integrations). Owners can call everything open to people.
FeatureThe feature switch the endpoint belongs to. No feature means it's part of the always-on platform core.

When a person holds the permission with a reach narrower than Everyone, the request must stay inside it: filter lists with locationId (or employeeId), and records are checked against their location or employee. Anything outside returns 403 out_of_reach. See Users, roles & permissions.

Conventions used throughout (see Conventions):

  • Lists are cursor-paginated (limit, cursor → nextCursor) and most accept updatedSince.
  • Resources with an externalId can be read and upserted at …/external/{externalId}.
  • DELETE archives (soft delete); history is kept.
  • PATCH is a JSON merge patch and accepts If-Match with the record's version.
  • Batch endpoints (202) are idempotent on source + externalId and return per-record results. See Data ingestion.
  • Actions on a record use a colon: POST /employees/{id}:terminate.

Browse by area

Search all endpoints

Filter by method
Filter by caller
350 endpoints

Authentication

Open reference →
  • GET/auth/api-keys

    Your personal API keys

    Keynot allowed
    Peopleself (session)
  • POST/auth/api-keys

    Create a personal API key

    Keynot allowed
    Peopleapi_keys.personal (session)
  • DELETE/auth/api-keys/{id}

    Revoke one of your personal API keys

    Keynot allowed
    Peopleself (session)
  • POST/auth/invitations:accept

    Accept an invitation and set a password

    Keypublic
    Peoplepublic
  • POST/auth/magic-link

    Email a single-use sign-in link

    Keypublic
    Peoplepublic
  • POST/auth/magic-link:redeem

    Sign in with a magic link

    Keypublic
    Peoplepublic
  • POST/auth/mfa/recovery-codes:regenerate

    Replace your recovery codes

    Keynot allowed
    Peopleself (session)
  • POST/auth/mfa/totp:confirm

    Turn on two-factor authentication with a first code

    Keynot allowed
    Peopleself (session)
  • POST/auth/mfa/totp:disable

    Turn off two-factor authentication

    Keynot allowed
    Peopleself (session)
  • POST/auth/mfa/totp:setup

    Start setting up an authenticator app

    Keynot allowed
    Peopleself (session)
  • POST/auth/password

    Change your password

    Keynot allowed
    Peopleself (session)
  • POST/auth/password-reset

    Email a password reset link

    Keypublic
    Peoplepublic
  • POST/auth/password-reset:complete

    Choose a new password with a reset link

    Keypublic
    Peoplepublic
  • GET/auth/session

    The signed-in person: role, permissions, assignments and enabled features

    Keynot allowed
    Peopleself
  • GET/auth/sessions

    Your active sessions and devices

    Keynot allowed
    Peopleself (session)
  • DELETE/auth/sessions/{id}

    Sign out one of your sessions

    Keynot allowed
    Peopleself (session)
  • POST/auth/sign-in

    Sign in with email and password

    Keypublic
    Peoplepublic
  • POST/auth/sign-in/mfa

    Finish signing in with an authenticator or recovery code

    Keynot allowed
    Peopleself (session)
  • POST/auth/sign-out

    Sign out this session

    Keynot allowed
    Peopleself (session)

Users & Roles

Open reference →
  • POST/roles

    Create a role

    Keynot allowed
    Peopleroles.manage (Everyone)
  • PATCH/roles/{id}

    Change a role

    Keynot allowed
    Peopleroles.manage (Everyone)
  • DELETE/roles/{id}

    Delete a role

    Keynot allowed
    Peopleroles.manage (Everyone)
  • GET/settings/authentication

    Sign-in settings

    Keynot allowed
    Peoplesettings.manage (Everyone)
  • PATCH/settings/authentication

    Change sign-in settings

    Keynot allowed
    Peoplesettings.manage (Everyone)
  • POST/users

    Invite someone

    Keynot allowed
    Peopleusers.manage (Everyone)
  • PATCH/users/{id}

    Change someone's name, role, employee link or assignments

    Keynot allowed
    Peopleusers.manage (Everyone)
  • POST/users/{id}:deactivate

    Deactivate an account

    Keynot allowed
    Peopleusers.manage (Everyone)
  • POST/users/{id}:reactivate

    Reactivate an account

    Keynot allowed
    Peopleusers.manage (Everyone)
  • POST/users/{id}:reset-sign-in

    Reset someone's sign-in

    Keynot allowed
    Peopleusers.manage (Everyone)
  • GET/features

    Features and whether they are enabled

    Keyany key
    Peopleanyone
  • GET/me

    The calling API key

    Keyany key
    Peopleanyone
  • GET/openapi.json

    OpenAPI document for enabled features

    Keypublic
    Peoplepublic
  • GET/permissions

    Permission catalog for enabled features

    Keyany key
    Peopleanyone

Integration self-service

Open reference →
  • GET/integrations/self

    The calling integration's registration

    Keyintegration key
    Peoplenot allowed
  • GET/integrations/self/config

    Config values entered by the admin

    Keyintegration key
    Peoplenot allowed
  • POST/integrations/self/health

    Send a heartbeat and status message

    Keyintegration key
    Peoplenot allowed
  • POST/integrations/self/logs

    Add a log message to the integration's log

    Keyintegration key
    Peoplenot allowed

Integrations

Open reference →
  • GET/integrations

    List integrations; status filters

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • POST/integrations

    Register an integration from its manifest; returns its API key and webhook secret once

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • GET/integrations/{id}

    An integration with its manifest, config (secrets masked), API keys and webhook endpoints

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • DELETE/integrations/{id}

    Remove an integration with its keys, config, logs and webhook endpoint

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • PUT/integrations/{id}/manifest

    Replace its manifest, e.g. for a new version

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • PATCH/integrations/{id}/config

    Change config values (null removes one)

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • POST/integrations/{id}:pause

    Pause it: its keys are refused and its webhooks wait

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • POST/integrations/{id}:resume

    Resume it

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • POST/integrations/{id}:rotate-key

    Issue a new API key; the old ones keep working for graceMinutes

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • GET/integrations/{id}/logs

    Messages it logged; level and from filter

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • GET/integrations/{id}/batches

    Ingestion batches it sent, with created, updated and rejected counts; from and rejectedOnly filter

    Keynot allowed
    Peopleintegrations.manage (Everyone)
  • GET/attachments

    List attachments

    Keyattachments:read
    Peopleattachments.read
  • POST/attachments

    Upload a file

    Keyattachments:write
    Peopleanyone
  • GET/attachments/{id}

    Get an attachment's details

    Keyattachments:read
    Peopleuploader, the employee concerned, or attachments.read
  • DELETE/attachments/{id}

    Delete an attachment

    Keyattachments:write
    Peopleuploader, or attachments.manage
  • GET/attachments/{id}/content

    Download an attachment

    Keyattachments:read
    Peopleuploader, the employee concerned, or attachments.read
  • GET/me/attachments

    Files you uploaded or that concern you

    Keynot allowed
    Peopleself

Organization

Open reference →
  • GET/org-units

    List org units (regions, districts…); parentId filters

    Keyorganization:read
    Peopleanyone
  • POST/org-units

    Create an org unit

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/org-units/{id}

    Get an org unit

    Keyorganization:read
    Peopleanyone
  • PATCH/org-units/{id}

    Update an org unit (e.g. move it under another parent)

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • DELETE/org-units/{id}

    Archive an org unit (only once it contains no active units or locations)

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/org-units/external/{externalId}

    Get an org unit by external ID

    Keyorganization:read
    Peopleanyone
  • PUT/org-units/external/{externalId}

    Create or replace an org unit by external ID

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/locations

    List locations; orgUnitId, status and includeArchived filter

    Keyorganization:read
    Peopleanyone
  • POST/locations

    Create a location

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/locations/{id}

    Get a location

    Keyorganization:read
    Peopleanyone
  • PATCH/locations/{id}

    Update a location's profile

    Keyorganization:write
    Peopleorganization.manage
  • DELETE/locations/{id}

    Archive (close) a location; history is kept

    Keyorganization:write
    Peopleorganization.manage
  • GET/locations/external/{externalId}

    Get a location by external ID

    Keyorganization:read
    Peopleanyone
  • PUT/locations/external/{externalId}

    Create or replace a location by external ID

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/departments

    List departments

    Keyorganization:read
    Peopleanyone
  • POST/departments

    Create a department

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/departments/{id}

    Get a department

    Keyorganization:read
    Peopleanyone
  • PATCH/departments/{id}

    Update a department

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • DELETE/departments/{id}

    Archive a department

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/departments/external/{externalId}

    Get a department by external ID

    Keyorganization:read
    Peopleanyone
  • PUT/departments/external/{externalId}

    Create or replace a department by external ID

    Keyorganization:write
    Peopleorganization.manage (Everyone)
  • GET/roles

    List roles and their permissions

    Keyorganization:read
    Peopleusers.read
  • GET/roles/{id}

    Get a role

    Keyorganization:read
    Peopleusers.read
  • GET/users

    List user accounts with their role and assignments

    Keyorganization:read
    Peopleusers.read
  • GET/users/{id}

    Get a user

    Keyorganization:read
    Peopleusers.read
  • GET/employees

    List employees

    Keypeople:read
    Peopleemployees.read
    Featurepeople
  • POST/employees

    Create an employee

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • GET/employees/external/{externalId}

    Get an employee by external ID

    Keypeople:read
    Peopleemployees.read
    Featurepeople
  • PUT/employees/external/{externalId}

    Create or replace an employee by external ID

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • GET/employees/{employeeId}/documents

    List employee documents

    Keypeople:read
    Peopledocuments.read
    Featurepeople.documents
  • POST/employees/{employeeId}/documents

    Create an employee document

    Keypeople:write
    Peopledocuments.manage
    Featurepeople.documents
  • GET/employees/{employeeId}/documents/{id}

    Get an employee document

    Keypeople:read
    Peopledocuments.read
    Featurepeople.documents
  • PATCH/employees/{employeeId}/documents/{id}

    Update an employee document (partial)

    Keypeople:write
    Peopledocuments.manage
    Featurepeople.documents
  • DELETE/employees/{employeeId}/documents/{id}

    Archive an employee document

    Keypeople:write
    Peopledocuments.manage
    Featurepeople.documents
  • GET/employees/{id}

    Get an employee

    Keypeople:read
    Peopleemployees.read
    Featurepeople
  • PATCH/employees/{id}

    Update an employee (partial)

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • DELETE/employees/{id}

    Archive an employee

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • GET/employees/{id}/pay-rates

    Pay rate history (newest first)

    Keypayroll:read
    Peoplepay.read
    Featurepeople
  • POST/employees/{id}/pay-rates

    Add a pay rate

    Keypayroll:write
    Peoplepay.write
    Featurepeople
  • GET/employees/{id}/skills

    An employee's skills and certifications

    Keypeople:read
    Peopleemployees.read
    Featurepeople.skills
  • PUT/employees/{id}/skills/{skillId}

    Give an employee a skill or certification

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills
  • DELETE/employees/{id}/skills/{skillId}

    Remove a skill from an employee

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills
  • POST/employees/{id}:rehire

    Rehire a terminated employee

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • POST/employees/{id}:terminate

    Terminate an employee

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • POST/employees/{id}:transfer

    Transfer an employee (location, department, position or manager)

    Keypeople:write
    Peopleemployees.write
    Featurepeople
  • GET/payslips

    List payslips

    Keypayroll:read
    Peoplepay.read
    Featureemployee_area.payslips
  • POST/payslips

    Send payslips from your payroll provider

    Keypayroll:write
    Peoplenot allowed
    Featureemployee_area.payslips
  • GET/skills

    List skills

    Keypeople:read
    Peopleemployees.read
    Featurepeople.skills
  • POST/skills

    Create a skill

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills
  • GET/skills/external/{externalId}

    Get a skill by external ID

    Keypeople:read
    Peopleemployees.read
    Featurepeople.skills
  • PUT/skills/external/{externalId}

    Create or replace a skill by external ID

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills
  • GET/skills/{id}

    Get a skill

    Keypeople:read
    Peopleemployees.read
    Featurepeople.skills
  • PATCH/skills/{id}

    Update a skill (partial)

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills
  • DELETE/skills/{id}

    Archive a skill

    Keypeople:write
    Peopleskills.manage
    Featurepeople.skills

Time & Attendance

Open reference →
  • GET/labor-rule-sets

    List labor rule sets

    Keytime:read
    Peopletimesheets.read
    Featuretime
  • POST/labor-rule-sets

    Create a labor rule set

    Keytime:write
    Peoplelabor_rules.manage
    Featuretime
  • GET/labor-rule-sets/{id}

    Get a labor rule set

    Keytime:read
    Peopletimesheets.read
    Featuretime
  • PATCH/labor-rule-sets/{id}

    Update a labor rule set (partial)

    Keytime:write
    Peoplelabor_rules.manage
    Featuretime
  • GET/pay-periods

    List pay periods (newest first)

    Keypayroll:read
    Peopletimesheets.read
    Featuretime
  • POST/pay-periods

    Create a pay period

    Keypayroll:write
    Peoplepay_periods.lock
    Featuretime
  • GET/pay-periods/{id}

    Get a pay period

    Keypayroll:read
    Peopletimesheets.read
    Featuretime
  • GET/pay-periods/{id}/export

    Export hours for payroll

    Keypayroll:read
    Peoplepayroll.export
    Featuretime.payroll_export
  • POST/pay-periods/{id}:lock

    Lock a pay period (final payroll approval)

    Keypayroll:write
    Peoplepay_periods.lock
    Featuretime
  • GET/punch-corrections

    List punch corrections

    Keytime:read
    Peoplepunches.correct
    Featuretime
  • POST/punch-corrections/{id}:approve

    Approve a punch correction

    Keytime:write
    Peoplepunches.correct
    Featuretime
  • POST/punch-corrections/{id}:reject

    Reject a punch correction

    Keytime:write
    Peoplepunches.correct
    Featuretime
  • POST/time-off/adjustments

    Add or deduct time-off hours (accruals, corrections)

    Keytime:write
    Peopletime_off.approve
    Featuretime.time_off
  • GET/time-off/balances

    Time-off balances per employee and type

    Keytime:read
    Peopletime_off.read
    Featuretime.time_off
  • GET/time-off/requests

    List time-off requests

    Keytime:read
    Peopletime_off.read
    Featuretime.time_off
  • POST/time-off/requests

    Request time off

    Keytime:write
    Peopletime_off.approve
    Featuretime.time_off
  • POST/time-off/requests/{id}:approve

    Approve a time-off request (deducts the balance)

    Keytime:write
    Peopletime_off.approve
    Featuretime.time_off
  • POST/time-off/requests/{id}:cancel

    Cancel a time-off request (restores the balance if it was approved)

    Keytime:write
    Peopletime_off.approve
    Featuretime.time_off
  • POST/time-off/requests/{id}:reject

    Reject a time-off request

    Keytime:write
    Peopletime_off.approve
    Featuretime.time_off
  • GET/time-off/types

    List time off types

    Keytime:read
    Peopleanyone
    Featuretime.time_off
  • POST/time-off/types

    Create a time off type

    Keytime:write
    Peoplesettings.manage
    Featuretime.time_off
  • GET/time-off/types/external/{externalId}

    Get a time off type by external ID

    Keytime:read
    Peopleanyone
    Featuretime.time_off
  • PUT/time-off/types/external/{externalId}

    Create or replace a time off type by external ID

    Keytime:write
    Peoplesettings.manage
    Featuretime.time_off
  • GET/time-off/types/{id}

    Get a time off type

    Keytime:read
    Peopleanyone
    Featuretime.time_off
  • PATCH/time-off/types/{id}

    Update a time off type (partial)

    Keytime:write
    Peoplesettings.manage
    Featuretime.time_off
  • DELETE/time-off/types/{id}

    Archive a time off type

    Keytime:write
    Peoplesettings.manage
    Featuretime.time_off
  • GET/time/punches

    List punches

    Keytime:read
    Peoplepunches.read
    Featuretime
  • POST/time/punches:batch

    Send punches in bulk

    Keytime:write
    Peoplenot allowed
    Featuretime
  • GET/timesheets

    List timesheets

    Keytime:read
    Peopletimesheets.read
    Featuretime
  • GET/timesheets/{id}

    Get a timesheet with daily detail and exceptions

    Keytime:read
    Peopletimesheets.read
    Featuretime
  • POST/timesheets/{id}:approve

    Approve a timesheet (manager step)

    Keytime:write
    Peopletimesheets.approve
    Featuretime
  • POST/timesheets/{id}:reject

    Reject a timesheet

    Keytime:write
    Peopletimesheets.approve
    Featuretime
  • POST/timesheets:build

    Build or refresh timesheets from punches

    Keytime:write
    Peopletimesheets.approve
    Featuretime

Scheduling & Forecasting

Open reference →
  • GET/availability

    List availabilitys

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • POST/availability

    Create an availability

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • GET/availability/{id}

    Get an availability

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • PATCH/availability/{id}

    Update an availability (partial)

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • DELETE/availability/{id}

    Archive an availability

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • POST/demand-drivers

    Send demand drivers (appointments, foot traffic, orders…)

    Keyscheduling:write
    Peoplenot allowed
    Featurescheduling
  • GET/forecasts

    Forecast a demand driver

    Keyscheduling:read
    Peopleforecasts.read
    Featurescheduling.forecasting
  • POST/forecasts/adjustments

    Adjust a day's forecast by a percentage

    Keyscheduling:write
    Peopleforecasts.manage
    Featurescheduling.forecasting
  • GET/schedules

    A location's schedule with hours and estimated cost

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • POST/schedules:publish

    Publish draft shifts for a location and period

    Keyscheduling:write
    Peopleschedules.publish
    Featurescheduling
  • GET/shift-swaps

    List shift swap requests

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling.shift_swaps
  • POST/shift-swaps

    Request a shift swap

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling.shift_swaps
  • POST/shift-swaps/{id}:approve

    Approve a swap (reassigns the shift)

    Keyscheduling:write
    Peopleshift_swaps.approve
    Featurescheduling.shift_swaps
  • POST/shift-swaps/{id}:reject

    Reject a swap

    Keyscheduling:write
    Peopleshift_swaps.approve
    Featurescheduling.shift_swaps
  • GET/shifts

    List shifts

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • POST/shifts

    Create a shift

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • GET/shifts/external/{externalId}

    Get a shift by external ID

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • PUT/shifts/external/{externalId}

    Create or replace a shift by external ID

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • GET/shifts/{id}

    Get a shift

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • PATCH/shifts/{id}

    Update a shift (partial)

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling
  • POST/shifts/{id}:claim

    Assign an open shift to an employee

    Keyscheduling:write
    Peopleschedules.manage
    Featurescheduling.open_shifts
  • GET/staffing-needs

    Staff needed vs scheduled, hour by hour

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • GET/staffing-rules

    List staffing rules

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • POST/staffing-rules

    Create a staffing rule

    Keyscheduling:write
    Peoplestaffing_rules.manage
    Featurescheduling
  • GET/staffing-rules/{id}

    Get a staffing rule

    Keyscheduling:read
    Peopleschedules.read
    Featurescheduling
  • PATCH/staffing-rules/{id}

    Update a staffing rule (partial)

    Keyscheduling:write
    Peoplestaffing_rules.manage
    Featurescheduling
  • DELETE/staffing-rules/{id}

    Archive a staffing rule

    Keyscheduling:write
    Peoplestaffing_rules.manage
    Featurescheduling

Cash Management

Open reference →
  • POST/cash/bank-transactions

    Send bank transactions for deposit verification

    Keycash:write
    Peoplenot allowed
    Featurecash
  • GET/cash/business-days

    Daily cash summary for a location

    Keycash:read
    Peoplecash.read
    Featurecash
  • POST/cash/business-days/{locationId}/{date}:close

    Close a business day

    Keycash:write
    Peoplecash.manage
    Featurecash
  • GET/cash/counts

    List counts

    Keycash:read
    Peoplecash.read
    Featurecash
  • POST/cash/counts

    Record a drawer, skim or safe count

    Keycash:write
    Peoplecash.count
    Featurecash
  • GET/cash/deposits

    List deposits

    Keycash:read
    Peoplecash.read
    Featurecash
  • POST/cash/deposits

    Record a bank deposit

    Keycash:write
    Peoplecash.deposits
    Featurecash
  • POST/cash/settlements

    Send card processor and platform payouts

    Keycash:write
    Peoplenot allowed
    Featurecash
  • POST/cash/tenders

    Send tender totals per drawer or shift from the POS

    Keycash:write
    Peoplenot allowed
    Featurecash
  • POST/inventory/adjustments

    Adjust stock

    Keyinventory:write
    Peopleinventory.adjust
    Featureinventory
  • POST/inventory/waste

    Record waste or shrink

    Keyinventory:write
    Peoplewaste.record
    Featureinventory.waste
  • GET/items

    List items

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • POST/items

    Create an item

    Keyinventory:write
    Peopleitems.manage
    Featureinventory
  • GET/items/external/{externalId}

    Get an item by external ID

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • PUT/items/external/{externalId}

    Create or replace an item by external ID

    Keyinventory:write
    Peopleitems.manage
    Featureinventory
  • GET/items/{id}

    Get an item

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • PATCH/items/{id}

    Update an item (partial)

    Keyinventory:write
    Peopleitems.manage
    Featureinventory
  • GET/stock-counts

    List stock counts

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • POST/stock-counts

    Enter a stock count

    Keyinventory:write
    Peoplestock_counts.count
    Featureinventory
  • GET/stock-counts/{id}

    Get a stock count with variances

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • POST/stock-counts/{id}:cancel

    Cancel an open count

    Keyinventory:write
    Peoplestock_counts.manage
    Featureinventory
  • POST/stock-counts/{id}:post

    Post a count to the stock ledger

    Keyinventory:write
    Peoplestock_counts.manage
    Featureinventory
  • GET/stock-levels

    Stock on hand, reserved and available

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • POST/stock-levels:configure

    Set par level and reorder point for an item at a location

    Keyinventory:write
    Peopleitems.manage
    Featureinventory
  • GET/stock-movements

    The stock ledger

    Keyinventory:read
    Peopleinventory.read
    Featureinventory
  • GET/transfers

    List transfers

    Keyinventory:read
    Peopleinventory.read
    Featureinventory.transfers
  • POST/transfers

    Send stock to another location

    Keyinventory:write
    Peopletransfers.manage
    Featureinventory.transfers
  • GET/transfers/{id}

    Get a transfer

    Keyinventory:read
    Peopleinventory.read
    Featureinventory.transfers
  • POST/transfers/{id}:receive

    Confirm what arrived

    Keyinventory:write
    Peopletransfers.manage
    Featureinventory.transfers
  • GET/usage-recipes/{itemId}

    What one unit of a sold item uses

    Keyinventory:read
    Peopleinventory.read
    Featureinventory.usage_recipes
  • PUT/usage-recipes/{itemId}

    Replace a usage recipe

    Keyinventory:write
    Peopleusage_recipes.manage
    Featureinventory.usage_recipes

Purchasing & Ordering

Open reference →
  • GET/purchase-orders

    List purchase orders

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • POST/purchase-orders

    Create a purchase order

    Keypurchasing:write
    Peopleorders.create
    Featurepurchasing
  • GET/purchase-orders/{id}

    Get a purchase order

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • POST/purchase-orders/{id}:approve

    Approve a purchase order

    Keypurchasing:write
    Peoplepurchase_orders.approve
    Featurepurchasing
  • POST/purchase-orders/{id}:cancel

    Cancel a purchase order

    Keypurchasing:write
    Peopleorders.create
    Featurepurchasing
  • POST/purchase-orders/{id}:receive

    Receive a delivery

    Keypurchasing:write
    Peoplegoods_receipts.create
    Featurepurchasing
  • POST/purchase-orders/{id}:send

    Mark a purchase order as sent to the supplier

    Keypurchasing:write
    Peopleorders.create
    Featurepurchasing
  • GET/suggested-orders

    Suggested order for a supplier and location

    Keypurchasing:read
    Peopleorders.create
    Featurepurchasing.suggested_orders
  • GET/supplier-invoices

    List supplier invoices

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • POST/supplier-invoices

    Record a supplier invoice and match it

    Keypurchasing:write
    Peopleinvoices.match
    Featurepurchasing
  • POST/supplier-invoices/{id}:approve

    Approve a supplier invoice (accept any differences)

    Keypurchasing:write
    Peopleinvoices.match
    Featurepurchasing.invoice_matching
  • POST/supplier-invoices/{id}:dispute

    Dispute a supplier invoice

    Keypurchasing:write
    Peopleinvoices.match
    Featurepurchasing.invoice_matching
  • GET/suppliers

    List suppliers

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • POST/suppliers

    Create a supplier

    Keypurchasing:write
    Peoplesuppliers.manage
    Featurepurchasing
  • GET/suppliers/external/{externalId}

    Get a supplier by external ID

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • PUT/suppliers/external/{externalId}

    Create or replace a supplier by external ID

    Keypurchasing:write
    Peoplesuppliers.manage
    Featurepurchasing
  • GET/suppliers/{id}

    Get a supplier

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • PATCH/suppliers/{id}

    Update a supplier (partial)

    Keypurchasing:write
    Peoplesuppliers.manage
    Featurepurchasing
  • DELETE/suppliers/{id}

    Archive a supplier

    Keypurchasing:write
    Peoplesuppliers.manage
    Featurepurchasing
  • GET/suppliers/{id}/catalog

    A supplier's catalog (order guide)

    Keypurchasing:read
    Peoplepurchasing.read
    Featurepurchasing
  • PUT/suppliers/{id}/catalog

    Replace a supplier's catalog

    Keypurchasing:write
    Peoplesuppliers.manage
    Featurepurchasing
  • GET/customers

    List customers

    Keysales:read
    Peoplesales.read
    Featuresales.orders
  • POST/customers

    Create a customer

    Keysales:write
    Peoplecustomers.manage
    Featuresales.orders
  • GET/customers/external/{externalId}

    Get a customer by external ID

    Keysales:read
    Peoplesales.read
    Featuresales.orders
  • PUT/customers/external/{externalId}

    Create or replace a customer by external ID

    Keysales:write
    Peoplecustomers.manage
    Featuresales.orders
  • GET/customers/{id}

    Get a customer

    Keysales:read
    Peoplesales.read
    Featuresales.orders
  • PATCH/customers/{id}

    Update a customer (partial)

    Keysales:write
    Peoplecustomers.manage
    Featuresales.orders
  • DELETE/customers/{id}

    Archive a customer

    Keysales:write
    Peoplecustomers.manage
    Featuresales.orders
  • GET/invoices

    List invoices

    Keysales:read
    Peoplesales.read
    Featuresales.invoicing
  • GET/invoices/{id}

    Get an invoice

    Keysales:read
    Peoplesales.read
    Featuresales.invoicing
  • GET/invoices/{id}/pdf

    Download an invoice as PDF

    Keysales:read
    Peoplesales.read
    Featuresales.invoicing
  • POST/invoices/{id}:pay

    Record payment of an invoice

    Keysales:write
    Peopleinvoices.issue
    Featuresales.invoicing
  • POST/invoices/{id}:void

    Void an invoice

    Keysales:write
    Peopleinvoices.issue
    Featuresales.invoicing
  • GET/sales-orders

    List sales orders

    Keysales:read
    Peoplesales.read
    Featuresales.orders
  • POST/sales-orders

    Create a sales order (reserves stock)

    Keysales:write
    Peoplesales_orders.manage
    Featuresales.orders
  • PUT/sales-orders/external/{externalId}

    Create or update an order from another system (e.g. an online store)

    Keysales:write
    Peoplesales_orders.manage
    Featuresales.orders
  • GET/sales-orders/{id}

    Get a sales order

    Keysales:read
    Peoplesales.read
    Featuresales.orders
  • POST/sales-orders/{id}:cancel

    Cancel an order (releases reserved stock)

    Keysales:write
    Peoplesales_orders.manage
    Featuresales.orders
  • POST/sales-orders/{id}:invoice

    Issue an invoice for an order

    Keysales:write
    Peopleinvoices.issue
    Featuresales.invoicing
  • POST/sales-orders/{id}:ship

    Ship an order (deducts stock)

    Keysales:write
    Peoplesales_orders.manage
    Featuresales.orders
  • GET/sales-summaries

    List sales summaries

    Keysales:read
    Peoplesales.read
    Featuresales.feeds
  • POST/sales-summaries

    Send hourly or daily sales totals

    Keysales:write
    Peoplenot allowed
    Featuresales.feeds
  • GET/sales/transactions

    List sales transactions

    Keysales:read
    Peoplesales.read
    Featuresales.feeds
  • POST/sales/transactions:batch

    Send sales transactions from a POS or online store

    Keysales:write
    Peoplenot allowed
    Featuresales.feeds
  • GET/sales/unmapped-items

    Items in sales feeds that aren't linked to a PurrOS item

    Keysales:read
    Peoplesales.read
    Featuresales.feeds
  • POST/sales/unmapped-items:map

    Link an unmapped item reference to a PurrOS item

    Keysales:write
    Peoplesales.unmapped.resolve
    Featuresales.feeds

Forms, Checklists & Compliance

Open reference →
  • GET/audits

    List scored audits

    Keyoperations:read
    Peopleaudits.read
    Featureoperations.audits
  • GET/corrective-actions

    List corrective actions

    Keyoperations:read
    Peoplecorrective_actions.manage
    Featureoperations.corrective_actions
  • POST/corrective-actions

    Create a corrective action

    Keyoperations:write
    Peoplecorrective_actions.manage
    Featureoperations.corrective_actions
  • GET/corrective-actions/{id}

    Get a corrective action

    Keyoperations:read
    Peoplecorrective_actions.manage
    Featureoperations.corrective_actions
  • PATCH/corrective-actions/{id}

    Update a corrective action (partial)

    Keyoperations:write
    Peoplecorrective_actions.manage
    Featureoperations.corrective_actions
  • POST/corrective-actions/{id}:close

    Close a corrective action with its resolution

    Keyoperations:write
    Peoplecorrective_actions.manage
    Featureoperations.corrective_actions
  • GET/form-submissions

    List submissions

    Keyoperations:read
    Peoplechecklists.manage
    Featureoperations
  • POST/form-submissions

    Submit a completed form or checklist

    Keyoperations:write
    Peoplechecklists.complete
    Featureoperations
  • GET/form-submissions/{id}

    Get a submission with per-question results

    Keyoperations:read
    Peoplechecklists.manage
    Featureoperations
  • GET/forms

    List forms

    Keyoperations:read
    Peoplechecklists.complete
    Featureoperations
  • POST/forms

    Create a form

    Keyoperations:write
    Peopleforms.manage
    Featureoperations
  • GET/forms/external/{externalId}

    Get a form by external ID

    Keyoperations:read
    Peoplechecklists.complete
    Featureoperations
  • PUT/forms/external/{externalId}

    Create or replace a form by external ID

    Keyoperations:write
    Peopleforms.manage
    Featureoperations
  • GET/forms/{id}

    Get a form

    Keyoperations:read
    Peoplechecklists.complete
    Featureoperations
  • PATCH/forms/{id}

    Update a form (partial)

    Keyoperations:write
    Peopleforms.manage
    Featureoperations
  • DELETE/forms/{id}

    Archive a form

    Keyoperations:write
    Peopleforms.manage
    Featureoperations
  • POST/sensor-readings

    Send sensor readings

    Keyoperations:write
    Peoplenot allowed
    Featureoperations.sensors
  • GET/sensors

    List sensors

    Keyoperations:read
    Peoplesensors.manage
    Featureoperations.sensors
  • POST/sensors

    Create a sensor

    Keyoperations:write
    Peoplesensors.manage
    Featureoperations.sensors
  • GET/sensors/external/{externalId}

    Get a sensor by external ID

    Keyoperations:read
    Peoplesensors.manage
    Featureoperations.sensors
  • PUT/sensors/external/{externalId}

    Create or replace a sensor by external ID

    Keyoperations:write
    Peoplesensors.manage
    Featureoperations.sensors
  • GET/sensors/{id}

    Get a sensor

    Keyoperations:read
    Peoplesensors.manage
    Featureoperations.sensors
  • PATCH/sensors/{id}

    Update a sensor (partial)

    Keyoperations:write
    Peoplesensors.manage
    Featureoperations.sensors
  • DELETE/sensors/{id}

    Archive a sensor

    Keyoperations:write
    Peoplesensors.manage
    Featureoperations.sensors
  • GET/sensors/{id}/readings

    Recent readings for a sensor (newest first, up to 1,000)

    Keyoperations:read
    Peoplesensors.manage
    Featureoperations.sensors

Equipment & Assets

Open reference →
  • GET/assets

    List assets

    Keyequipment:read
    Peopleequipment.read
    Featureequipment
  • POST/assets

    Create an asset

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment
  • GET/assets/external/{externalId}

    Get an asset by external ID

    Keyequipment:read
    Peopleequipment.read
    Featureequipment
  • PUT/assets/external/{externalId}

    Create or replace an asset by external ID

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment
  • GET/assets/{id}

    Get an asset

    Keyequipment:read
    Peopleequipment.read
    Featureequipment
  • PATCH/assets/{id}

    Update an asset (partial)

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment
  • DELETE/assets/{id}

    Archive an asset

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment
  • POST/assets/{id}/meter-readings

    Record a meter reading (hours, km…)

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment
  • POST/assets/{id}:maintained

    Record that maintenance was done

    Keyequipment:write
    Peopleequipment.manage
    Featureequipment.maintenance
  • GET/maintenance/due

    Assets due for maintenance by date or meter

    Keyequipment:read
    Peopleequipment.read
    Featureequipment.maintenance
  • GET/work-orders

    List work orders

    Keyequipment:read
    Peopleequipment.read
    Featureequipment.work_orders
  • POST/work-orders

    Create a work order

    Keyequipment:write
    Peoplework_orders.create
    Featureequipment.work_orders
  • GET/work-orders/external/{externalId}

    Get a work order by external ID

    Keyequipment:read
    Peopleequipment.read
    Featureequipment.work_orders
  • PUT/work-orders/external/{externalId}

    Create or replace a work order by external ID

    Keyequipment:write
    Peoplework_orders.manage
    Featureequipment.work_orders
  • GET/work-orders/{id}

    Get a work order

    Keyequipment:read
    Peopleequipment.read
    Featureequipment.work_orders
  • PATCH/work-orders/{id}

    Update a work order (partial)

    Keyequipment:write
    Peoplework_orders.manage
    Featureequipment.work_orders

Communication

Open reference →
  • GET/announcements

    List announcements

    Keycommunication:read
    Peopleanyone
    Featurecommunication.announcements
  • POST/announcements

    Create an announcement

    Keycommunication:write
    Peopleannouncements.send
    Featurecommunication.announcements
  • GET/announcements/{id}

    Get an announcement

    Keycommunication:read
    Peopleanyone
    Featurecommunication.announcements
  • PATCH/announcements/{id}

    Update an announcement (partial)

    Keycommunication:write
    Peopleannouncements.send
    Featurecommunication.announcements
  • DELETE/announcements/{id}

    Archive an announcement

    Keycommunication:write
    Peopleannouncements.send
    Featurecommunication.announcements
  • GET/announcements/{id}/acknowledgments

    Who has acknowledged an announcement

    Keycommunication:read
    Peopleannouncements.send
    Featurecommunication.announcements
  • POST/announcements/{id}:acknowledge

    Record that an employee read an announcement

    Keycommunication:write
    Peopleannouncements.send
    Featurecommunication.announcements
  • GET/calendar-events

    List calendar events

    Keycommunication:read
    Peopleanyone
    Featurecommunication.calendar
  • POST/calendar-events

    Create a calendar event

    Keycommunication:write
    Peoplecalendar.manage
    Featurecommunication.calendar
  • GET/calendar-events/external/{externalId}

    Get a calendar event by external ID

    Keycommunication:read
    Peopleanyone
    Featurecommunication.calendar
  • PUT/calendar-events/external/{externalId}

    Create or replace a calendar event by external ID

    Keycommunication:write
    Peoplecalendar.manage
    Featurecommunication.calendar
  • GET/calendar-events/{id}

    Get a calendar event

    Keycommunication:read
    Peopleanyone
    Featurecommunication.calendar
  • PATCH/calendar-events/{id}

    Update a calendar event (partial)

    Keycommunication:write
    Peoplecalendar.manage
    Featurecommunication.calendar
  • DELETE/calendar-events/{id}

    Archive a calendar event

    Keycommunication:write
    Peoplecalendar.manage
    Featurecommunication.calendar

Team Displays

Open reference →
  • GET/display-metrics

    Live display metrics

    Keyreports:read
    Peopleanyone
    Featuredisplays
  • POST/display-metrics

    Push live numbers to team displays

    Keyreports:write
    Peoplenot allowed
    Featuredisplays
  • GET/recognitions

    Recent shout-outs (newest first)

    Keycommunication:read
    Peopleanyone
    Featuredisplays.gamification
  • POST/recognitions

    Post a shout-out

    Keycommunication:write
    Peoplerecognition.give
    Featuredisplays.gamification

Reports & Insights

Open reference →
  • GET/alert-rules

    List alert rules

    Keyreports:read
    Peoplereports.read
    Featureinsights
  • POST/alert-rules

    Create an alert rule

    Keyreports:write
    Peoplealerts.manage
    Featureinsights
  • GET/alert-rules/{id}

    Get an alert rule

    Keyreports:read
    Peoplereports.read
    Featureinsights
  • PATCH/alert-rules/{id}

    Update an alert rule (partial)

    Keyreports:write
    Peoplealerts.manage
    Featureinsights
  • DELETE/alert-rules/{id}

    Archive an alert rule

    Keyreports:write
    Peoplealerts.manage
    Featureinsights
  • GET/kpis

    Headline KPIs for a date range

    Keyreports:read
    Peoplereports.read
    Featureinsights
  • GET/recommendations

    Recommended actions

    Keyreports:read
    Peoplerecommendations.read
    Featureinsights.recommendations
  • GET/reports

    List the available reports

    Keyreports:read
    Peoplereports.read
    Featureinsights
  • GET/reports/{key}

    Run a report

    Keyreports:read
    Peoplereports.read
    Featureinsights

Employee Area

Open reference →
  • GET/me/activity

    Changes made to your record: who, what and when

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/announcements

    Announcements for you, newest first

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/announcements/{id}:acknowledge

    Acknowledge an announcement

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/availability

    Your availability

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/availability

    Add an availability window

    Keynot allowed
    Peopleself
    Featureemployee_area
  • DELETE/me/availability/{id}

    Remove an availability window

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/documents

    Documents shared with you

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/export

    Download everything PurrOS stores about you (ZIP of JSON and CSV)

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/open-shifts

    Published open shifts you can pick up

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/pay

    Your pay rate history and estimated gross pay per pay period

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/payslips

    Your payslips

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/profile

    Your profile

    Keynot allowed
    Peopleself
    Featureemployee_area
  • PATCH/me/profile

    Update your contact details and emergency contacts

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/punch-corrections

    Your punch correction requests

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/punch-corrections

    Ask your manager to fix a missed or wrong punch

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/punch-corrections/{id}:cancel

    Cancel a pending correction request

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/punches

    Your punches (from/to are RFC 3339 times)

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/shift-swaps

    Swap requests you made or were offered

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/shift-swaps

    Offer one of your shifts to a co-worker

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/shifts

    Your published shifts (from/to are RFC 3339 times)

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/shifts/{id}:claim

    Pick up an open shift at your location

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/time-off/balances

    Your time-off balances

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/time-off/requests

    Your time-off requests

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/time-off/requests

    Request time off

    Keynot allowed
    Peopleself
    Featureemployee_area
  • POST/me/time-off/requests/{id}:cancel

    Cancel one of your time-off requests

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/me/timesheets

    Your timesheets

    Keynot allowed
    Peopleself
    Featureemployee_area
  • GET/webhook-endpoints

    List endpoints; integrationId (or none for standalone) and status filter

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • POST/webhook-endpoints

    Add a standalone endpoint; returns its signing secret once

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • GET/webhook-endpoints/{id}

    Get an endpoint

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • PATCH/webhook-endpoints/{id}

    Change its URL, events or description, or disable and re-enable it

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • DELETE/webhook-endpoints/{id}

    Delete a standalone endpoint and its delivery log

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • POST/webhook-endpoints/{id}:rotate-secret

    New signing secret, returned once

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • POST/webhook-endpoints/{id}:ping

    Send a webhook.ping test event

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • POST/webhook-endpoints/{id}:retry-failed

    Queue every failed delivery again

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • GET/webhook-endpoints/{id}/deliveries

    Its deliveries; status, eventType and from filter

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • GET/webhook-deliveries/{id}

    A delivery with the event body exactly as sent

    Keynot allowed
    Peoplewebhooks.manage (Everyone)
  • POST/webhook-deliveries/{id}:retry

    Send a delivery again

    Keynot allowed
    Peoplewebhooks.manage (Everyone)